@azure/msal-browser 3.19.1 → 3.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/IPublicClientApplication.d.ts +53 -53
- package/dist/app/IPublicClientApplication.mjs +105 -105
- package/dist/app/PublicClientApplication.d.ts +293 -293
- package/dist/app/PublicClientApplication.mjs +364 -364
- package/dist/app/PublicClientNext.d.ts +276 -276
- package/dist/app/PublicClientNext.mjs +354 -354
- package/dist/broker/nativeBroker/NativeMessageHandler.d.ts +62 -62
- package/dist/broker/nativeBroker/NativeMessageHandler.mjs +254 -254
- package/dist/broker/nativeBroker/NativeRequest.d.ts +45 -45
- package/dist/broker/nativeBroker/NativeResponse.d.ts +48 -48
- package/dist/broker/nativeBroker/NativeStatusCodes.d.ts +7 -7
- package/dist/broker/nativeBroker/NativeStatusCodes.mjs +11 -11
- package/dist/cache/AccountManager.d.ts +48 -48
- package/dist/cache/AccountManager.mjs +126 -126
- package/dist/cache/AsyncMemoryStorage.d.ts +50 -50
- package/dist/cache/AsyncMemoryStorage.mjs +131 -131
- package/dist/cache/BrowserCacheManager.d.ts +410 -385
- package/dist/cache/BrowserCacheManager.d.ts.map +1 -1
- package/dist/cache/BrowserCacheManager.mjs +1364 -1294
- package/dist/cache/BrowserCacheManager.mjs.map +1 -1
- package/dist/cache/BrowserStorage.d.ts +11 -11
- package/dist/cache/BrowserStorage.mjs +32 -32
- package/dist/cache/DatabaseStorage.d.ts +56 -56
- package/dist/cache/DatabaseStorage.mjs +200 -200
- package/dist/cache/IAsyncStorage.d.ts +27 -27
- package/dist/cache/ITokenCache.d.ts +11 -11
- package/dist/cache/IWindowStorage.d.ts +27 -27
- package/dist/cache/MemoryStorage.d.ts +11 -11
- package/dist/cache/MemoryStorage.mjs +31 -31
- package/dist/cache/TokenCache.d.ts +77 -77
- package/dist/cache/TokenCache.mjs +195 -195
- package/dist/config/Configuration.d.ts +213 -208
- package/dist/config/Configuration.d.ts.map +1 -1
- package/dist/config/Configuration.mjs +128 -128
- package/dist/config/Configuration.mjs.map +1 -1
- package/dist/controllers/ControllerFactory.d.ts +5 -5
- package/dist/controllers/ControllerFactory.mjs +25 -25
- package/dist/controllers/IController.d.ts +60 -60
- package/dist/controllers/NestedAppAuthController.d.ts +202 -202
- package/dist/controllers/NestedAppAuthController.mjs +473 -473
- package/dist/controllers/StandardController.d.ts +405 -405
- package/dist/controllers/StandardController.d.ts.map +1 -1
- package/dist/controllers/StandardController.mjs +1334 -1316
- package/dist/controllers/StandardController.mjs.map +1 -1
- package/dist/controllers/UnknownOperatingContextController.d.ts +86 -86
- package/dist/controllers/UnknownOperatingContextController.mjs +256 -256
- package/dist/crypto/BrowserCrypto.d.ts +52 -52
- package/dist/crypto/BrowserCrypto.mjs +151 -151
- package/dist/crypto/CryptoOps.d.ts +74 -74
- package/dist/crypto/CryptoOps.mjs +176 -176
- package/dist/crypto/PkceGenerator.d.ts +8 -8
- package/dist/crypto/PkceGenerator.mjs +54 -54
- package/dist/crypto/SignedHttpRequest.d.ts +30 -30
- package/dist/crypto/SignedHttpRequest.mjs +39 -39
- package/dist/encode/Base64Decode.d.ts +9 -9
- package/dist/encode/Base64Decode.mjs +36 -36
- package/dist/encode/Base64Encode.d.ts +19 -19
- package/dist/encode/Base64Encode.mjs +43 -43
- package/dist/error/BrowserAuthError.d.ts +256 -255
- package/dist/error/BrowserAuthError.d.ts.map +1 -1
- package/dist/error/BrowserAuthError.mjs +265 -264
- package/dist/error/BrowserAuthError.mjs.map +1 -1
- package/dist/error/BrowserAuthErrorCodes.d.ts +47 -46
- package/dist/error/BrowserAuthErrorCodes.d.ts.map +1 -1
- package/dist/error/BrowserAuthErrorCodes.mjs +53 -52
- package/dist/error/BrowserAuthErrorCodes.mjs.map +1 -1
- package/dist/error/BrowserConfigurationAuthError.d.ts +33 -33
- package/dist/error/BrowserConfigurationAuthError.mjs +40 -40
- package/dist/error/BrowserConfigurationAuthError.mjs.map +1 -1
- package/dist/error/BrowserConfigurationAuthErrorCodes.d.ts +3 -3
- package/dist/error/BrowserConfigurationAuthErrorCodes.mjs +7 -7
- package/dist/error/NativeAuthError.d.ts +29 -29
- package/dist/error/NativeAuthError.mjs +60 -60
- package/dist/error/NativeAuthErrorCodes.d.ts +2 -2
- package/dist/error/NativeAuthErrorCodes.mjs +6 -6
- package/dist/error/NestedAppAuthError.d.ts +14 -14
- package/dist/error/NestedAppAuthError.mjs +23 -23
- package/dist/event/EventHandler.d.ts +41 -41
- package/dist/event/EventHandler.mjs +125 -125
- package/dist/event/EventMessage.d.ts +25 -25
- package/dist/event/EventMessage.mjs +68 -68
- package/dist/event/EventType.d.ts +29 -29
- package/dist/event/EventType.mjs +32 -32
- package/dist/index.d.ts +40 -40
- package/dist/index.mjs +1 -1
- package/dist/interaction_client/BaseInteractionClient.d.ts +50 -50
- package/dist/interaction_client/BaseInteractionClient.mjs +106 -106
- package/dist/interaction_client/HybridSpaAuthorizationCodeClient.d.ts +4 -4
- package/dist/interaction_client/HybridSpaAuthorizationCodeClient.mjs +10 -10
- package/dist/interaction_client/NativeInteractionClient.d.ts +151 -143
- package/dist/interaction_client/NativeInteractionClient.d.ts.map +1 -1
- package/dist/interaction_client/NativeInteractionClient.mjs +624 -584
- package/dist/interaction_client/NativeInteractionClient.mjs.map +1 -1
- package/dist/interaction_client/PopupClient.d.ts +118 -105
- package/dist/interaction_client/PopupClient.d.ts.map +1 -1
- package/dist/interaction_client/PopupClient.mjs +460 -434
- package/dist/interaction_client/PopupClient.mjs.map +1 -1
- package/dist/interaction_client/RedirectClient.d.ts +50 -50
- package/dist/interaction_client/RedirectClient.d.ts.map +1 -1
- package/dist/interaction_client/RedirectClient.mjs +349 -317
- package/dist/interaction_client/RedirectClient.mjs.map +1 -1
- package/dist/interaction_client/SilentAuthCodeClient.d.ts +23 -23
- package/dist/interaction_client/SilentAuthCodeClient.mjs +57 -57
- package/dist/interaction_client/SilentCacheClient.d.ts +16 -16
- package/dist/interaction_client/SilentCacheClient.mjs +42 -42
- package/dist/interaction_client/SilentIframeClient.d.ts +32 -32
- package/dist/interaction_client/SilentIframeClient.d.ts.map +1 -1
- package/dist/interaction_client/SilentIframeClient.mjs +111 -101
- package/dist/interaction_client/SilentIframeClient.mjs.map +1 -1
- package/dist/interaction_client/SilentRefreshClient.d.ts +20 -20
- package/dist/interaction_client/SilentRefreshClient.mjs +47 -47
- package/dist/interaction_client/StandardInteractionClient.d.ts +48 -48
- package/dist/interaction_client/StandardInteractionClient.mjs +199 -199
- package/dist/interaction_handler/InteractionHandler.d.ts +33 -33
- package/dist/interaction_handler/InteractionHandler.mjs +93 -93
- package/dist/interaction_handler/RedirectHandler.d.ts +32 -32
- package/dist/interaction_handler/RedirectHandler.d.ts.map +1 -1
- package/dist/interaction_handler/RedirectHandler.mjs +135 -134
- package/dist/interaction_handler/RedirectHandler.mjs.map +1 -1
- package/dist/interaction_handler/SilentHandler.d.ts +13 -13
- package/dist/interaction_handler/SilentHandler.mjs +134 -134
- package/dist/naa/AccountInfo.d.ts +11 -11
- package/dist/naa/AuthBridge.d.ts +8 -8
- package/dist/naa/AuthResult.d.ts +6 -6
- package/dist/naa/BridgeAccountContext.d.ts +12 -12
- package/dist/naa/BridgeCapabilities.d.ts +3 -3
- package/dist/naa/BridgeError.d.ts +9 -9
- package/dist/naa/BridgeError.mjs +7 -7
- package/dist/naa/BridgeProxy.d.ts +67 -67
- package/dist/naa/BridgeProxy.d.ts.map +1 -1
- package/dist/naa/BridgeProxy.mjs +153 -148
- package/dist/naa/BridgeProxy.mjs.map +1 -1
- package/dist/naa/BridgeRequest.d.ts +7 -7
- package/dist/naa/BridgeRequestEnvelope.d.ts +12 -12
- package/dist/naa/BridgeResponseEnvelope.d.ts +13 -13
- package/dist/naa/BridgeStatusCode.d.ts +11 -11
- package/dist/naa/BridgeStatusCode.mjs +14 -14
- package/dist/naa/IBridgeProxy.d.ts +10 -10
- package/dist/naa/InitContext.d.ts +8 -8
- package/dist/naa/TokenRequest.d.ts +18 -18
- package/dist/naa/TokenResponse.d.ts +13 -13
- package/dist/naa/mapping/NestedAppAuthAdapter.d.ts +35 -35
- package/dist/naa/mapping/NestedAppAuthAdapter.mjs +179 -179
- package/dist/navigation/INavigationClient.d.ts +16 -16
- package/dist/navigation/NavigationClient.d.ts +22 -22
- package/dist/navigation/NavigationClient.mjs +40 -40
- package/dist/navigation/NavigationOptions.d.ts +12 -12
- package/dist/network/FetchClient.d.ts +26 -26
- package/dist/network/FetchClient.mjs +99 -99
- package/dist/operatingcontext/BaseOperatingContext.d.ts +41 -41
- package/dist/operatingcontext/BaseOperatingContext.mjs +94 -94
- package/dist/operatingcontext/NestedAppOperatingContext.d.ts +34 -34
- package/dist/operatingcontext/NestedAppOperatingContext.mjs +71 -71
- package/dist/operatingcontext/StandardOperatingContext.d.ts +25 -25
- package/dist/operatingcontext/StandardOperatingContext.mjs +43 -43
- package/dist/operatingcontext/UnknownOperatingContext.d.ts +25 -25
- package/dist/operatingcontext/UnknownOperatingContext.mjs +42 -42
- package/dist/packageMetadata.d.ts +2 -2
- package/dist/packageMetadata.mjs +4 -4
- package/dist/request/AuthorizationCodeRequest.d.ts +8 -8
- package/dist/request/AuthorizationUrlRequest.d.ts +8 -8
- package/dist/request/ClearCacheRequest.d.ts +10 -10
- package/dist/request/EndSessionPopupRequest.d.ts +18 -18
- package/dist/request/EndSessionRequest.d.ts +15 -15
- package/dist/request/InitializeApplicationRequest.d.ts +8 -8
- package/dist/request/PopupRequest.d.ts +34 -34
- package/dist/request/PopupWindowAttributes.d.ts +15 -15
- package/dist/request/RedirectRequest.d.ts +40 -35
- package/dist/request/RedirectRequest.d.ts.map +1 -1
- package/dist/request/RequestHelpers.d.ts +13 -13
- package/dist/request/RequestHelpers.mjs +53 -53
- package/dist/request/SilentRequest.d.ts +33 -33
- package/dist/request/SsoSilentRequest.d.ts +29 -29
- package/dist/response/AuthenticationResult.d.ts +4 -4
- package/dist/response/ResponseHandler.d.ts +7 -7
- package/dist/response/ResponseHandler.mjs +36 -36
- package/dist/telemetry/BrowserPerformanceClient.d.ts +38 -34
- package/dist/telemetry/BrowserPerformanceClient.d.ts.map +1 -1
- package/dist/telemetry/BrowserPerformanceClient.mjs +163 -163
- package/dist/telemetry/BrowserPerformanceClient.mjs.map +1 -1
- package/dist/telemetry/BrowserPerformanceMeasurement.d.ts +21 -21
- package/dist/telemetry/BrowserPerformanceMeasurement.mjs +92 -92
- package/dist/utils/BrowserConstants.d.ts +182 -180
- package/dist/utils/BrowserConstants.d.ts.map +1 -1
- package/dist/utils/BrowserConstants.mjs +214 -212
- package/dist/utils/BrowserConstants.mjs.map +1 -1
- package/dist/utils/BrowserProtocolUtils.d.ts +11 -11
- package/dist/utils/BrowserProtocolUtils.mjs +21 -21
- package/dist/utils/BrowserUtils.d.ts +75 -75
- package/dist/utils/BrowserUtils.mjs +157 -157
- package/lib/msal-browser.cjs +19028 -18759
- package/lib/msal-browser.cjs.map +1 -1
- package/lib/msal-browser.js +19028 -18759
- package/lib/msal-browser.js.map +1 -1
- package/lib/msal-browser.min.js +65 -65
- package/package.json +2 -2
- package/src/cache/BrowserCacheManager.ts +95 -0
- package/src/config/Configuration.ts +9 -1
- package/src/controllers/StandardController.ts +30 -12
- package/src/error/BrowserAuthError.ts +2 -0
- package/src/error/BrowserAuthErrorCodes.ts +1 -0
- package/src/interaction_client/NativeInteractionClient.ts +105 -54
- package/src/interaction_client/PopupClient.ts +202 -117
- package/src/interaction_client/RedirectClient.ts +62 -2
- package/src/interaction_client/SilentIframeClient.ts +41 -3
- package/src/interaction_handler/RedirectHandler.ts +1 -0
- package/src/naa/BridgeProxy.ts +7 -2
- package/src/packageMetadata.ts +1 -1
- package/src/request/RedirectRequest.ts +5 -0
- package/src/telemetry/BrowserPerformanceClient.ts +1 -1
- package/src/utils/BrowserConstants.ts +2 -0
|
@@ -1,143 +1,143 @@
|
|
|
1
|
-
/*! @azure/msal-browser v3.
|
|
1
|
+
/*! @azure/msal-browser v3.21.0 2024-08-13 */
|
|
2
2
|
'use strict';
|
|
3
3
|
import { PerformanceEvents, invokeAsync, invoke, ServerResponseType } from '@azure/msal-common';
|
|
4
4
|
import { createBrowserAuthError } from '../error/BrowserAuthError.mjs';
|
|
5
5
|
import { DEFAULT_IFRAME_TIMEOUT_MS } from '../config/Configuration.mjs';
|
|
6
6
|
import { emptyNavigateUri, monitorWindowTimeout } from '../error/BrowserAuthErrorCodes.mjs';
|
|
7
7
|
|
|
8
|
-
/*
|
|
9
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
10
|
-
* Licensed under the MIT License.
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* Creates a hidden iframe to given URL using user-requested scopes as an id.
|
|
14
|
-
* @param urlNavigate
|
|
15
|
-
* @param userRequestScopes
|
|
16
|
-
*/
|
|
17
|
-
async function initiateAuthRequest(requestUrl, performanceClient, logger, correlationId, navigateFrameWait) {
|
|
18
|
-
performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerInitiateAuthRequest, correlationId);
|
|
19
|
-
if (!requestUrl) {
|
|
20
|
-
// Throw error if request URL is empty.
|
|
21
|
-
logger.info("Navigate url is empty");
|
|
22
|
-
throw createBrowserAuthError(emptyNavigateUri);
|
|
23
|
-
}
|
|
24
|
-
if (navigateFrameWait) {
|
|
25
|
-
return invokeAsync(loadFrame, PerformanceEvents.SilentHandlerLoadFrame, logger, performanceClient, correlationId)(requestUrl, navigateFrameWait, performanceClient, correlationId);
|
|
26
|
-
}
|
|
27
|
-
return invoke(loadFrameSync, PerformanceEvents.SilentHandlerLoadFrameSync, logger, performanceClient, correlationId)(requestUrl);
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Monitors an iframe content window until it loads a url with a known hash, or hits a specified timeout.
|
|
31
|
-
* @param iframe
|
|
32
|
-
* @param timeout
|
|
33
|
-
*/
|
|
34
|
-
async function monitorIframeForHash(iframe, timeout, pollIntervalMilliseconds, performanceClient, logger, correlationId, responseType) {
|
|
35
|
-
performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerMonitorIframeForHash, correlationId);
|
|
36
|
-
return new Promise((resolve, reject) => {
|
|
37
|
-
if (timeout < DEFAULT_IFRAME_TIMEOUT_MS) {
|
|
38
|
-
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.`);
|
|
39
|
-
}
|
|
40
|
-
/*
|
|
41
|
-
* Polling for iframes can be purely timing based,
|
|
42
|
-
* since we don't need to account for interaction.
|
|
43
|
-
*/
|
|
44
|
-
const timeoutId = window.setTimeout(() => {
|
|
45
|
-
window.clearInterval(intervalId);
|
|
46
|
-
reject(createBrowserAuthError(monitorWindowTimeout));
|
|
47
|
-
}, timeout);
|
|
48
|
-
const intervalId = window.setInterval(() => {
|
|
49
|
-
let href = "";
|
|
50
|
-
const contentWindow = iframe.contentWindow;
|
|
51
|
-
try {
|
|
52
|
-
/*
|
|
53
|
-
* Will throw if cross origin,
|
|
54
|
-
* which should be caught and ignored
|
|
55
|
-
* since we need the interval to keep running while on STS UI.
|
|
56
|
-
*/
|
|
57
|
-
href = contentWindow ? contentWindow.location.href : "";
|
|
58
|
-
}
|
|
59
|
-
catch (e) { }
|
|
60
|
-
if (!href || href === "about:blank") {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
let responseString = "";
|
|
64
|
-
if (contentWindow) {
|
|
65
|
-
if (responseType === ServerResponseType.QUERY) {
|
|
66
|
-
responseString = contentWindow.location.search;
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
responseString = contentWindow.location.hash;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
window.clearTimeout(timeoutId);
|
|
73
|
-
window.clearInterval(intervalId);
|
|
74
|
-
resolve(responseString);
|
|
75
|
-
}, pollIntervalMilliseconds);
|
|
76
|
-
}).finally(() => {
|
|
77
|
-
invoke(removeHiddenIframe, PerformanceEvents.RemoveHiddenIframe, logger, performanceClient, correlationId)(iframe);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* @hidden
|
|
82
|
-
* Loads iframe with authorization endpoint URL
|
|
83
|
-
* @ignore
|
|
84
|
-
* @deprecated
|
|
85
|
-
*/
|
|
86
|
-
function loadFrame(urlNavigate, navigateFrameWait, performanceClient, correlationId) {
|
|
87
|
-
performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerLoadFrame, correlationId);
|
|
88
|
-
/*
|
|
89
|
-
* This trick overcomes iframe navigation in IE
|
|
90
|
-
* IE does not load the page consistently in iframe
|
|
91
|
-
*/
|
|
92
|
-
return new Promise((resolve, reject) => {
|
|
93
|
-
const frameHandle = createHiddenIframe();
|
|
94
|
-
window.setTimeout(() => {
|
|
95
|
-
if (!frameHandle) {
|
|
96
|
-
reject("Unable to load iframe");
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
frameHandle.src = urlNavigate;
|
|
100
|
-
resolve(frameHandle);
|
|
101
|
-
}, navigateFrameWait);
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* @hidden
|
|
106
|
-
* Loads the iframe synchronously when the navigateTimeFrame is set to `0`
|
|
107
|
-
* @param urlNavigate
|
|
108
|
-
* @param frameName
|
|
109
|
-
* @param logger
|
|
110
|
-
*/
|
|
111
|
-
function loadFrameSync(urlNavigate) {
|
|
112
|
-
const frameHandle = createHiddenIframe();
|
|
113
|
-
frameHandle.src = urlNavigate;
|
|
114
|
-
return frameHandle;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* @hidden
|
|
118
|
-
* Creates a new hidden iframe or gets an existing one for silent token renewal.
|
|
119
|
-
* @ignore
|
|
120
|
-
*/
|
|
121
|
-
function createHiddenIframe() {
|
|
122
|
-
const authFrame = document.createElement("iframe");
|
|
123
|
-
authFrame.className = "msalSilentIframe";
|
|
124
|
-
authFrame.style.visibility = "hidden";
|
|
125
|
-
authFrame.style.position = "absolute";
|
|
126
|
-
authFrame.style.width = authFrame.style.height = "0";
|
|
127
|
-
authFrame.style.border = "0";
|
|
128
|
-
authFrame.setAttribute("sandbox", "allow-scripts allow-same-origin allow-forms");
|
|
129
|
-
document.body.appendChild(authFrame);
|
|
130
|
-
return authFrame;
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* @hidden
|
|
134
|
-
* Removes a hidden iframe from the page.
|
|
135
|
-
* @ignore
|
|
136
|
-
*/
|
|
137
|
-
function removeHiddenIframe(iframe) {
|
|
138
|
-
if (document.body === iframe.parentNode) {
|
|
139
|
-
document.body.removeChild(iframe);
|
|
140
|
-
}
|
|
8
|
+
/*
|
|
9
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
10
|
+
* Licensed under the MIT License.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Creates a hidden iframe to given URL using user-requested scopes as an id.
|
|
14
|
+
* @param urlNavigate
|
|
15
|
+
* @param userRequestScopes
|
|
16
|
+
*/
|
|
17
|
+
async function initiateAuthRequest(requestUrl, performanceClient, logger, correlationId, navigateFrameWait) {
|
|
18
|
+
performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerInitiateAuthRequest, correlationId);
|
|
19
|
+
if (!requestUrl) {
|
|
20
|
+
// Throw error if request URL is empty.
|
|
21
|
+
logger.info("Navigate url is empty");
|
|
22
|
+
throw createBrowserAuthError(emptyNavigateUri);
|
|
23
|
+
}
|
|
24
|
+
if (navigateFrameWait) {
|
|
25
|
+
return invokeAsync(loadFrame, PerformanceEvents.SilentHandlerLoadFrame, logger, performanceClient, correlationId)(requestUrl, navigateFrameWait, performanceClient, correlationId);
|
|
26
|
+
}
|
|
27
|
+
return invoke(loadFrameSync, PerformanceEvents.SilentHandlerLoadFrameSync, logger, performanceClient, correlationId)(requestUrl);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Monitors an iframe content window until it loads a url with a known hash, or hits a specified timeout.
|
|
31
|
+
* @param iframe
|
|
32
|
+
* @param timeout
|
|
33
|
+
*/
|
|
34
|
+
async function monitorIframeForHash(iframe, timeout, pollIntervalMilliseconds, performanceClient, logger, correlationId, responseType) {
|
|
35
|
+
performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerMonitorIframeForHash, correlationId);
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
if (timeout < DEFAULT_IFRAME_TIMEOUT_MS) {
|
|
38
|
+
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.`);
|
|
39
|
+
}
|
|
40
|
+
/*
|
|
41
|
+
* Polling for iframes can be purely timing based,
|
|
42
|
+
* since we don't need to account for interaction.
|
|
43
|
+
*/
|
|
44
|
+
const timeoutId = window.setTimeout(() => {
|
|
45
|
+
window.clearInterval(intervalId);
|
|
46
|
+
reject(createBrowserAuthError(monitorWindowTimeout));
|
|
47
|
+
}, timeout);
|
|
48
|
+
const intervalId = window.setInterval(() => {
|
|
49
|
+
let href = "";
|
|
50
|
+
const contentWindow = iframe.contentWindow;
|
|
51
|
+
try {
|
|
52
|
+
/*
|
|
53
|
+
* Will throw if cross origin,
|
|
54
|
+
* which should be caught and ignored
|
|
55
|
+
* since we need the interval to keep running while on STS UI.
|
|
56
|
+
*/
|
|
57
|
+
href = contentWindow ? contentWindow.location.href : "";
|
|
58
|
+
}
|
|
59
|
+
catch (e) { }
|
|
60
|
+
if (!href || href === "about:blank") {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
let responseString = "";
|
|
64
|
+
if (contentWindow) {
|
|
65
|
+
if (responseType === ServerResponseType.QUERY) {
|
|
66
|
+
responseString = contentWindow.location.search;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
responseString = contentWindow.location.hash;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
window.clearTimeout(timeoutId);
|
|
73
|
+
window.clearInterval(intervalId);
|
|
74
|
+
resolve(responseString);
|
|
75
|
+
}, pollIntervalMilliseconds);
|
|
76
|
+
}).finally(() => {
|
|
77
|
+
invoke(removeHiddenIframe, PerformanceEvents.RemoveHiddenIframe, logger, performanceClient, correlationId)(iframe);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* @hidden
|
|
82
|
+
* Loads iframe with authorization endpoint URL
|
|
83
|
+
* @ignore
|
|
84
|
+
* @deprecated
|
|
85
|
+
*/
|
|
86
|
+
function loadFrame(urlNavigate, navigateFrameWait, performanceClient, correlationId) {
|
|
87
|
+
performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerLoadFrame, correlationId);
|
|
88
|
+
/*
|
|
89
|
+
* This trick overcomes iframe navigation in IE
|
|
90
|
+
* IE does not load the page consistently in iframe
|
|
91
|
+
*/
|
|
92
|
+
return new Promise((resolve, reject) => {
|
|
93
|
+
const frameHandle = createHiddenIframe();
|
|
94
|
+
window.setTimeout(() => {
|
|
95
|
+
if (!frameHandle) {
|
|
96
|
+
reject("Unable to load iframe");
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
frameHandle.src = urlNavigate;
|
|
100
|
+
resolve(frameHandle);
|
|
101
|
+
}, navigateFrameWait);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* @hidden
|
|
106
|
+
* Loads the iframe synchronously when the navigateTimeFrame is set to `0`
|
|
107
|
+
* @param urlNavigate
|
|
108
|
+
* @param frameName
|
|
109
|
+
* @param logger
|
|
110
|
+
*/
|
|
111
|
+
function loadFrameSync(urlNavigate) {
|
|
112
|
+
const frameHandle = createHiddenIframe();
|
|
113
|
+
frameHandle.src = urlNavigate;
|
|
114
|
+
return frameHandle;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* @hidden
|
|
118
|
+
* Creates a new hidden iframe or gets an existing one for silent token renewal.
|
|
119
|
+
* @ignore
|
|
120
|
+
*/
|
|
121
|
+
function createHiddenIframe() {
|
|
122
|
+
const authFrame = document.createElement("iframe");
|
|
123
|
+
authFrame.className = "msalSilentIframe";
|
|
124
|
+
authFrame.style.visibility = "hidden";
|
|
125
|
+
authFrame.style.position = "absolute";
|
|
126
|
+
authFrame.style.width = authFrame.style.height = "0";
|
|
127
|
+
authFrame.style.border = "0";
|
|
128
|
+
authFrame.setAttribute("sandbox", "allow-scripts allow-same-origin allow-forms");
|
|
129
|
+
document.body.appendChild(authFrame);
|
|
130
|
+
return authFrame;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* @hidden
|
|
134
|
+
* Removes a hidden iframe from the page.
|
|
135
|
+
* @ignore
|
|
136
|
+
*/
|
|
137
|
+
function removeHiddenIframe(iframe) {
|
|
138
|
+
if (document.body === iframe.parentNode) {
|
|
139
|
+
document.body.removeChild(iframe);
|
|
140
|
+
}
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
export { initiateAuthRequest, monitorIframeForHash };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
export type AccountInfo = {
|
|
2
|
-
homeAccountId?: string;
|
|
3
|
-
environment: string;
|
|
4
|
-
tenantId?: string;
|
|
5
|
-
username: string;
|
|
6
|
-
localAccountId?: string;
|
|
7
|
-
name?: string;
|
|
8
|
-
idToken?: string;
|
|
9
|
-
platformBrokerId?: string;
|
|
10
|
-
idTokenClaims?: object;
|
|
11
|
-
};
|
|
1
|
+
export type AccountInfo = {
|
|
2
|
+
homeAccountId?: string;
|
|
3
|
+
environment: string;
|
|
4
|
+
tenantId?: string;
|
|
5
|
+
username: string;
|
|
6
|
+
localAccountId?: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
idToken?: string;
|
|
9
|
+
platformBrokerId?: string;
|
|
10
|
+
idTokenClaims?: object;
|
|
11
|
+
};
|
|
12
12
|
//# sourceMappingURL=AccountInfo.d.ts.map
|
package/dist/naa/AuthBridge.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export type AuthBridgeResponse = string | {
|
|
2
|
-
data: string;
|
|
3
|
-
};
|
|
4
|
-
export interface AuthBridge {
|
|
5
|
-
addEventListener: (eventName: string, callback: (response: AuthBridgeResponse) => void) => void;
|
|
6
|
-
postMessage: (message: string) => void;
|
|
7
|
-
removeEventListener: (eventName: string, callback: (response: AuthBridgeResponse) => void) => void;
|
|
8
|
-
}
|
|
1
|
+
export type AuthBridgeResponse = string | {
|
|
2
|
+
data: string;
|
|
3
|
+
};
|
|
4
|
+
export interface AuthBridge {
|
|
5
|
+
addEventListener: (eventName: string, callback: (response: AuthBridgeResponse) => void) => void;
|
|
6
|
+
postMessage: (message: string) => void;
|
|
7
|
+
removeEventListener: (eventName: string, callback: (response: AuthBridgeResponse) => void) => void;
|
|
8
|
+
}
|
|
9
9
|
//# sourceMappingURL=AuthBridge.d.ts.map
|
package/dist/naa/AuthResult.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AccountInfo } from "./AccountInfo";
|
|
2
|
-
import { TokenResponse } from "./TokenResponse";
|
|
3
|
-
export type AuthResult = {
|
|
4
|
-
token: TokenResponse;
|
|
5
|
-
account: AccountInfo;
|
|
6
|
-
};
|
|
1
|
+
import { AccountInfo } from "./AccountInfo";
|
|
2
|
+
import { TokenResponse } from "./TokenResponse";
|
|
3
|
+
export type AuthResult = {
|
|
4
|
+
token: TokenResponse;
|
|
5
|
+
account: AccountInfo;
|
|
6
|
+
};
|
|
7
7
|
//# sourceMappingURL=AuthResult.d.ts.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AccountContext is used to pass account information when the bridge is initialized
|
|
3
|
-
*
|
|
4
|
-
* NAA (MetaOS) apps are created and destroyed for the same session multiple times.
|
|
5
|
-
* `AccountContext` helps in booting up the cached account when the bridge
|
|
6
|
-
* is recreated for a new NAA instance in the same auth session.
|
|
7
|
-
*/
|
|
8
|
-
export interface AccountContext {
|
|
9
|
-
homeAccountId: string;
|
|
10
|
-
environment: string;
|
|
11
|
-
tenantId: string;
|
|
12
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* AccountContext is used to pass account information when the bridge is initialized
|
|
3
|
+
*
|
|
4
|
+
* NAA (MetaOS) apps are created and destroyed for the same session multiple times.
|
|
5
|
+
* `AccountContext` helps in booting up the cached account when the bridge
|
|
6
|
+
* is recreated for a new NAA instance in the same auth session.
|
|
7
|
+
*/
|
|
8
|
+
export interface AccountContext {
|
|
9
|
+
homeAccountId: string;
|
|
10
|
+
environment: string;
|
|
11
|
+
tenantId: string;
|
|
12
|
+
}
|
|
13
13
|
//# sourceMappingURL=BridgeAccountContext.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export interface BridgeCapabilities {
|
|
2
|
-
queryAccount?: boolean;
|
|
3
|
-
}
|
|
1
|
+
export interface BridgeCapabilities {
|
|
2
|
+
queryAccount?: boolean;
|
|
3
|
+
}
|
|
4
4
|
//# sourceMappingURL=BridgeCapabilities.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { BridgeStatusCode } from "./BridgeStatusCode";
|
|
2
|
-
export type BridgeError = {
|
|
3
|
-
status: BridgeStatusCode;
|
|
4
|
-
code?: string;
|
|
5
|
-
subError?: string;
|
|
6
|
-
description?: string;
|
|
7
|
-
properties?: object;
|
|
8
|
-
};
|
|
9
|
-
export declare function isBridgeError(error: unknown): error is BridgeError;
|
|
1
|
+
import { BridgeStatusCode } from "./BridgeStatusCode";
|
|
2
|
+
export type BridgeError = {
|
|
3
|
+
status: BridgeStatusCode;
|
|
4
|
+
code?: string;
|
|
5
|
+
subError?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
properties?: object;
|
|
8
|
+
};
|
|
9
|
+
export declare function isBridgeError(error: unknown): error is BridgeError;
|
|
10
10
|
//# sourceMappingURL=BridgeError.d.ts.map
|
package/dist/naa/BridgeError.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/*! @azure/msal-browser v3.
|
|
1
|
+
/*! @azure/msal-browser v3.21.0 2024-08-13 */
|
|
2
2
|
'use strict';
|
|
3
|
-
/*
|
|
4
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
5
|
-
* Licensed under the MIT License.
|
|
6
|
-
*/
|
|
7
|
-
function isBridgeError(error) {
|
|
8
|
-
return error.status !== undefined;
|
|
3
|
+
/*
|
|
4
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
5
|
+
* Licensed under the MIT License.
|
|
6
|
+
*/
|
|
7
|
+
function isBridgeError(error) {
|
|
8
|
+
return error.status !== undefined;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export { isBridgeError };
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
import { AuthBridge } from "./AuthBridge";
|
|
2
|
-
import { AuthResult } from "./AuthResult";
|
|
3
|
-
import { BridgeCapabilities } from "./BridgeCapabilities";
|
|
4
|
-
import { AccountContext } from "./BridgeAccountContext";
|
|
5
|
-
import { BridgeRequest } from "./BridgeRequest";
|
|
6
|
-
import { IBridgeProxy } from "./IBridgeProxy";
|
|
7
|
-
import { InitContext } from "./InitContext";
|
|
8
|
-
import { TokenRequest } from "./TokenRequest";
|
|
9
|
-
declare global {
|
|
10
|
-
interface Window {
|
|
11
|
-
nestedAppAuthBridge: AuthBridge;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* BridgeProxy
|
|
16
|
-
* Provides a proxy for accessing a bridge to a host app and/or
|
|
17
|
-
* platform broker
|
|
18
|
-
*/
|
|
19
|
-
export declare class BridgeProxy implements IBridgeProxy {
|
|
20
|
-
static bridgeRequests: BridgeRequest[];
|
|
21
|
-
sdkName: string;
|
|
22
|
-
sdkVersion: string;
|
|
23
|
-
capabilities?: BridgeCapabilities;
|
|
24
|
-
accountContext?: AccountContext;
|
|
25
|
-
/**
|
|
26
|
-
* initializeNestedAppAuthBridge - Initializes the bridge to the host app
|
|
27
|
-
* @returns a promise that resolves to an InitializeBridgeResponse or rejects with an Error
|
|
28
|
-
* @remarks This method will be called by the create factory method
|
|
29
|
-
* @remarks If the bridge is not available, this method will throw an error
|
|
30
|
-
*/
|
|
31
|
-
protected static initializeNestedAppAuthBridge(): Promise<InitContext>;
|
|
32
|
-
/**
|
|
33
|
-
* getTokenInteractive - Attempts to get a token interactively from the bridge
|
|
34
|
-
* @param request A token request
|
|
35
|
-
* @returns a promise that resolves to an auth result or rejects with a BridgeError
|
|
36
|
-
*/
|
|
37
|
-
getTokenInteractive(request: TokenRequest): Promise<AuthResult>;
|
|
38
|
-
/**
|
|
39
|
-
* getTokenSilent Attempts to get a token silently from the bridge
|
|
40
|
-
* @param request A token request
|
|
41
|
-
* @returns a promise that resolves to an auth result or rejects with a BridgeError
|
|
42
|
-
*/
|
|
43
|
-
getTokenSilent(request: TokenRequest): Promise<AuthResult>;
|
|
44
|
-
private getToken;
|
|
45
|
-
getHostCapabilities(): BridgeCapabilities | null;
|
|
46
|
-
getAccountContext(): AccountContext | null;
|
|
47
|
-
/**
|
|
48
|
-
* A method used to send a request to the bridge
|
|
49
|
-
* @param request A token request
|
|
50
|
-
* @returns a promise that resolves to a response of provided type or rejects with a BridgeError
|
|
51
|
-
*/
|
|
52
|
-
private sendRequest;
|
|
53
|
-
private static validateBridgeResultOrThrow;
|
|
54
|
-
/**
|
|
55
|
-
* Private constructor for BridgeProxy
|
|
56
|
-
* @param sdkName The name of the SDK being used to make requests on behalf of the app
|
|
57
|
-
* @param sdkVersion The version of the SDK being used to make requests on behalf of the app
|
|
58
|
-
* @param capabilities The capabilities of the bridge / SDK / platform broker
|
|
59
|
-
*/
|
|
60
|
-
private constructor();
|
|
61
|
-
/**
|
|
62
|
-
* Factory method for creating an implementation of IBridgeProxy
|
|
63
|
-
* @returns A promise that resolves to a BridgeProxy implementation
|
|
64
|
-
*/
|
|
65
|
-
static create(): Promise<IBridgeProxy>;
|
|
66
|
-
}
|
|
67
|
-
export default BridgeProxy;
|
|
1
|
+
import { AuthBridge } from "./AuthBridge";
|
|
2
|
+
import { AuthResult } from "./AuthResult";
|
|
3
|
+
import { BridgeCapabilities } from "./BridgeCapabilities";
|
|
4
|
+
import { AccountContext } from "./BridgeAccountContext";
|
|
5
|
+
import { BridgeRequest } from "./BridgeRequest";
|
|
6
|
+
import { IBridgeProxy } from "./IBridgeProxy";
|
|
7
|
+
import { InitContext } from "./InitContext";
|
|
8
|
+
import { TokenRequest } from "./TokenRequest";
|
|
9
|
+
declare global {
|
|
10
|
+
interface Window {
|
|
11
|
+
nestedAppAuthBridge: AuthBridge;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* BridgeProxy
|
|
16
|
+
* Provides a proxy for accessing a bridge to a host app and/or
|
|
17
|
+
* platform broker
|
|
18
|
+
*/
|
|
19
|
+
export declare class BridgeProxy implements IBridgeProxy {
|
|
20
|
+
static bridgeRequests: BridgeRequest[];
|
|
21
|
+
sdkName: string;
|
|
22
|
+
sdkVersion: string;
|
|
23
|
+
capabilities?: BridgeCapabilities;
|
|
24
|
+
accountContext?: AccountContext;
|
|
25
|
+
/**
|
|
26
|
+
* initializeNestedAppAuthBridge - Initializes the bridge to the host app
|
|
27
|
+
* @returns a promise that resolves to an InitializeBridgeResponse or rejects with an Error
|
|
28
|
+
* @remarks This method will be called by the create factory method
|
|
29
|
+
* @remarks If the bridge is not available, this method will throw an error
|
|
30
|
+
*/
|
|
31
|
+
protected static initializeNestedAppAuthBridge(): Promise<InitContext>;
|
|
32
|
+
/**
|
|
33
|
+
* getTokenInteractive - Attempts to get a token interactively from the bridge
|
|
34
|
+
* @param request A token request
|
|
35
|
+
* @returns a promise that resolves to an auth result or rejects with a BridgeError
|
|
36
|
+
*/
|
|
37
|
+
getTokenInteractive(request: TokenRequest): Promise<AuthResult>;
|
|
38
|
+
/**
|
|
39
|
+
* getTokenSilent Attempts to get a token silently from the bridge
|
|
40
|
+
* @param request A token request
|
|
41
|
+
* @returns a promise that resolves to an auth result or rejects with a BridgeError
|
|
42
|
+
*/
|
|
43
|
+
getTokenSilent(request: TokenRequest): Promise<AuthResult>;
|
|
44
|
+
private getToken;
|
|
45
|
+
getHostCapabilities(): BridgeCapabilities | null;
|
|
46
|
+
getAccountContext(): AccountContext | null;
|
|
47
|
+
/**
|
|
48
|
+
* A method used to send a request to the bridge
|
|
49
|
+
* @param request A token request
|
|
50
|
+
* @returns a promise that resolves to a response of provided type or rejects with a BridgeError
|
|
51
|
+
*/
|
|
52
|
+
private sendRequest;
|
|
53
|
+
private static validateBridgeResultOrThrow;
|
|
54
|
+
/**
|
|
55
|
+
* Private constructor for BridgeProxy
|
|
56
|
+
* @param sdkName The name of the SDK being used to make requests on behalf of the app
|
|
57
|
+
* @param sdkVersion The version of the SDK being used to make requests on behalf of the app
|
|
58
|
+
* @param capabilities The capabilities of the bridge / SDK / platform broker
|
|
59
|
+
*/
|
|
60
|
+
private constructor();
|
|
61
|
+
/**
|
|
62
|
+
* Factory method for creating an implementation of IBridgeProxy
|
|
63
|
+
* @returns A promise that resolves to a BridgeProxy implementation
|
|
64
|
+
*/
|
|
65
|
+
static create(): Promise<IBridgeProxy>;
|
|
66
|
+
}
|
|
67
|
+
export default BridgeProxy;
|
|
68
68
|
//# sourceMappingURL=BridgeProxy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BridgeProxy.d.ts","sourceRoot":"","sources":["../../src/naa/BridgeProxy.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAsB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"BridgeProxy.d.ts","sourceRoot":"","sources":["../../src/naa/BridgeProxy.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAsB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI9C,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,mBAAmB,EAAE,UAAU,CAAC;KACnC;CACJ;AAED;;;;GAIG;AACH,qBAAa,WAAY,YAAW,YAAY;IAC5C,MAAM,CAAC,cAAc,EAAE,aAAa,EAAE,CAAM;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;;;OAKG;qBACoB,6BAA6B,IAAI,OAAO,CAAC,WAAW,CAAC;IAkE5E;;;;OAIG;IACI,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAItE;;;;OAIG;IACI,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;YAInD,QAAQ;IAaf,mBAAmB,IAAI,kBAAkB,GAAG,IAAI;IAIhD,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAIjD;;;;OAIG;IACH,OAAO,CAAC,WAAW;IA8BnB,OAAO,CAAC,MAAM,CAAC,2BAA2B;IAU1C;;;;;OAKG;IACH,OAAO;IAYP;;;OAGG;WACiB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAStD;AAED,eAAe,WAAW,CAAC"}
|