@burnt-labs/expo-satya-attest 3.10.1 → 3.10.2
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/CHANGELOG.md +16 -0
- package/PUBLISHING.md +17 -16
- package/README.md +5 -4
- package/android/build.gradle +2 -2
- package/build/components/providerAttest/useProviderAttestFlow.d.ts.map +1 -1
- package/build/components/providerAttest/useProviderAttestFlow.js +0 -1
- package/build/components/providerAttest/useProviderAttestFlow.js.map +1 -1
- package/build/components/providerAttest/useProviderNavigationHandlers.d.ts +1 -2
- package/build/components/providerAttest/useProviderNavigationHandlers.d.ts.map +1 -1
- package/build/components/providerAttest/useProviderNavigationHandlers.js +6 -24
- package/build/components/providerAttest/useProviderNavigationHandlers.js.map +1 -1
- package/build/sdkMetadata.generated.d.ts +1 -1
- package/build/sdkMetadata.generated.js +1 -1
- package/build/sdkMetadata.generated.js.map +1 -1
- package/build/tee/client.d.ts +1 -1
- package/ios/Frameworks/libsatya_ffi-rs.xcframework/Info.plist +5 -5
- package/ios/Frameworks/libsatya_ffi-rs.xcframework/ios-arm64/libsatya_ffi.a +1 -1
- package/ios/Frameworks/libsatya_ffi-rs.xcframework/ios-arm64_x86_64-simulator/libsatya_ffi.a +1 -1
- package/ios/SatyaAttest.podspec +1 -1
- package/package.json +1 -1
- package/src/components/providerAttest/useProviderAttestFlow.ts +0 -1
- package/src/components/providerAttest/useProviderNavigationHandlers.ts +4 -29
- package/src/sdkMetadata.generated.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.10.2 - 2026-09-25
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- Managed OAuth popups now finish their callback in the original popup instead
|
|
8
|
+
of being closed and reloaded in the main WebView when they return to the
|
|
9
|
+
opener's origin. This fixes Kraken Google login becoming stuck after consent.
|
|
10
|
+
- Preserve explicit popup messaging, close and opener navigation so providers
|
|
11
|
+
can complete their own login handoff.
|
|
12
|
+
|
|
13
|
+
### Upgrade
|
|
14
|
+
|
|
15
|
+
- Update the SDK JavaScript bundle. This patch introduces no native runtime,
|
|
16
|
+
public API, provider configuration/schema or verifier changes from 3.10.1.
|
|
17
|
+
Native rebuild requirements for upgrades from earlier versions still apply.
|
|
18
|
+
|
|
3
19
|
## 3.10.1 - 2026-09-22
|
|
4
20
|
|
|
5
21
|
### Fixed
|
package/PUBLISHING.md
CHANGED
|
@@ -12,16 +12,17 @@ for a plug-and-play Expo SDK.
|
|
|
12
12
|
|
|
13
13
|
## Release preparation
|
|
14
14
|
|
|
15
|
-
The next prepared patch release is **3.10.
|
|
16
|
-
This patch
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
15
|
+
The next prepared patch release is **3.10.2**. Version 3.10.1 is already published.
|
|
16
|
+
This patch preserves managed OAuth popups until their callback completes instead
|
|
17
|
+
of automatically reloading the callback in the main WebView. It fixes Kraken
|
|
18
|
+
Google login and preserves explicit popup messaging, close and opener navigation.
|
|
19
|
+
Consumers must update the SDK JavaScript bundle. No new native runtime, provider
|
|
20
|
+
configuration/schema or verifier deployment is required over 3.10.1; native
|
|
21
|
+
rebuild requirements from earlier releases still apply.
|
|
22
|
+
|
|
23
|
+
Kraken Google login was confirmed on physical iOS and Android devices. Additional
|
|
24
|
+
provider Google-login checks were reported successful by the tester. These login
|
|
25
|
+
checks do not establish full proof-generation or provider-session matrix coverage.
|
|
25
26
|
|
|
26
27
|
A version bump or passing package checks does not establish native device readiness:
|
|
27
28
|
complete the gates below before tagging a stable release.
|
|
@@ -57,7 +58,7 @@ Local cookie cleanup does not reset remote hosted TeeLS sessions.
|
|
|
57
58
|
The package check requires both native session managers, the WebView snapshot
|
|
58
59
|
helper, adapter script, Android keep rules and public JS/declarations. Host tests
|
|
59
60
|
use synthetic stores and adapter fixtures; they are not substitutes for device
|
|
60
|
-
cookie isolation tests. Until the app builds and device matrix pass, treat 3.10.
|
|
61
|
+
cookie isolation tests. Until the app builds and device matrix pass, treat 3.10.2
|
|
61
62
|
as release preparation, not a validated stable release.
|
|
62
63
|
|
|
63
64
|
## TEE release requirements
|
|
@@ -265,7 +266,7 @@ internal/module_scripts/
|
|
|
265
266
|
After the release gates pass and publication is authorized, use the consolidated
|
|
266
267
|
`publish-expo-satya-attest.yml` workflow. A stable tag must match the committed
|
|
267
268
|
package version and point to a commit on `main`; for this prepared release the
|
|
268
|
-
package-specific tag is `expo-satya-attest-v3.10.
|
|
269
|
+
package-specific tag is `expo-satya-attest-v3.10.2`. Creating/pushing that tag starts
|
|
269
270
|
publication. Manual workflow dispatch is a dry-run.
|
|
270
271
|
|
|
271
272
|
The workflow builds native artifacts, runs the release checks, and publishes
|
|
@@ -283,13 +284,13 @@ Every push to `main` publishes a snapshot package to the public npm registry wit
|
|
|
283
284
|
unique prerelease version:
|
|
284
285
|
|
|
285
286
|
```text
|
|
286
|
-
3.10.
|
|
287
|
+
3.10.3-snapshot.<run>.<attempt>.sha-<commit>
|
|
287
288
|
```
|
|
288
289
|
|
|
289
290
|
The snapshot job (in `publish-expo-satya-attest.yml`) increments the package's patch base
|
|
290
|
-
in CI before publishing. For example, if `package.json` is `3.10.
|
|
291
|
-
is based on `3.10.
|
|
292
|
-
`3.10.
|
|
291
|
+
in CI before publishing. For example, if `package.json` is `3.10.2`, the snapshot version
|
|
292
|
+
is based on `3.10.3`:
|
|
293
|
+
`3.10.3-snapshot.<run>.<attempt>.sha-<commit>`. Snapshots are development builds and
|
|
293
294
|
do not imply completion of the physical-device gates.
|
|
294
295
|
|
|
295
296
|
Snapshots use the `snapshot` dist-tag so test apps do not need to know the generated
|
package/README.md
CHANGED
|
@@ -5,10 +5,11 @@ the Rust `satya-sdk` / `satya-ffi` pipeline for artifact construction and verifi
|
|
|
5
5
|
policy, while Swift and Kotlin provide platform-specific WebView capture, native HTTPS
|
|
6
6
|
replay, hardware-backed signing, and platform attestation evidence.
|
|
7
7
|
|
|
8
|
-
**3.10.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
**3.10.2 patch preparation:** Managed OAuth callbacks now finish in their
|
|
9
|
+
original popup, fixing Kraken Google login after consent. Update the SDK
|
|
10
|
+
JavaScript bundle; no native runtime or provider-schema changes are introduced
|
|
11
|
+
from 3.10.1. See the [changelog](./CHANGELOG.md) and
|
|
12
|
+
[release requirements](./PUBLISHING.md#release-preparation).
|
|
12
13
|
|
|
13
14
|
The SDK supports native app attestation, opt-in [TEE replay](./TEE_REPLAY.md),
|
|
14
15
|
single-endpoint and composite proofs, provider-selective partial completion,
|
package/android/build.gradle
CHANGED
|
@@ -4,14 +4,14 @@ plugins {
|
|
|
4
4
|
}
|
|
5
5
|
|
|
6
6
|
group = 'expo.modules.satyaattest'
|
|
7
|
-
version = '3.10.
|
|
7
|
+
version = '3.10.2'
|
|
8
8
|
|
|
9
9
|
android {
|
|
10
10
|
namespace "expo.modules.satyaattest"
|
|
11
11
|
defaultConfig {
|
|
12
12
|
consumerProguardFiles 'consumer-rules.pro'
|
|
13
13
|
versionCode 1
|
|
14
|
-
versionName "3.10.
|
|
14
|
+
versionName "3.10.2"
|
|
15
15
|
// StrongBox key attestation needs API 28+; basic Keystore attestation API 24+.
|
|
16
16
|
minSdkVersion 24
|
|
17
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useProviderAttestFlow.d.ts","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderAttestFlow.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAUlF,OAAO,EACL,kBAAkB,EAIlB,iBAAiB,EACjB,uCAAuC,EAEvC,sBAAsB,EAEtB,gBAAgB,EAChB,cAAc,EACf,MAAM,SAAS,CAAC;AAyBjB,OAAO,EACL,uBAAuB,EAIxB,MAAM,aAAa,CAAC;AAGrB,wBAAgB,qBAAqB,CACnC,EACE,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,qBAAwC,EACxC,eAAe,EACf,MAAM,EAAE,cAAc,EACtB,aAAqB,EACrB,iBAAyB,EACzB,WAAW,EACX,WAAoC,EACpC,QAAgB,EAChB,SAAiB,EACjB,UAAU,EACV,YAAsB,EACtB,QAAgB,EAChB,KAAK,EAAE,SAAS,EAChB,mBAA0B,EAC1B,gBAAgB,EAAE,eAAe,EACjC,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,QAAQ,EACR,eAAe,GAChB,EAAE,uCAAuC,EAC1C,cAAc,UAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"useProviderAttestFlow.d.ts","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderAttestFlow.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAUlF,OAAO,EACL,kBAAkB,EAIlB,iBAAiB,EACjB,uCAAuC,EAEvC,sBAAsB,EAEtB,gBAAgB,EAChB,cAAc,EACf,MAAM,SAAS,CAAC;AAyBjB,OAAO,EACL,uBAAuB,EAIxB,MAAM,aAAa,CAAC;AAGrB,wBAAgB,qBAAqB,CACnC,EACE,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,qBAAwC,EACxC,eAAe,EACf,MAAM,EAAE,cAAc,EACtB,aAAqB,EACrB,iBAAyB,EACzB,WAAW,EACX,WAAoC,EACpC,QAAgB,EAChB,SAAiB,EACjB,UAAU,EACV,YAAsB,EACtB,QAAgB,EAChB,KAAK,EAAE,SAAS,EAChB,mBAA0B,EAC1B,gBAAgB,EAAE,eAAe,EACjC,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,QAAQ,EACR,eAAe,GAChB,EAAE,uCAAuC,EAC1C,cAAc,UAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA07BtB;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,UAAU,CAAC,OAAO,qBAAqB,CAAC,EACxC,eAAe,GAAG,aAAa,CAChC,GAAG;IACF,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gCAAgC,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACnD,CAAC"}
|
|
@@ -719,7 +719,6 @@ export function useProviderAttestFlow({ providerId, sessionPolicy, resolveSessio
|
|
|
719
719
|
const { handleNavigationStateChange, handleOpenWindow, handlePopupNavigationStateChange, handlePopupOpenWindow, handlePopupShouldStartLoadWithRequest, handleShouldStartLoadWithRequest, } = useProviderNavigationHandlers({
|
|
720
720
|
emitProgress,
|
|
721
721
|
managedPopup,
|
|
722
|
-
navigateOpenerFromPopup,
|
|
723
722
|
onLoginNavigation: signalLoginNavigation,
|
|
724
723
|
onLoginSubmitted: signalLoginSubmitted,
|
|
725
724
|
openManagedPopup,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useProviderAttestFlow.js","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderAttestFlow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAa,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAyB,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EACL,oBAAoB,EAEpB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAEL,oBAAoB,GAUrB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,6BAA6B,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AACpC,OAAO,iBAAiB,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAgC,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,oCAAoC,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAO/D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEnF,MAAM,UAAU,qBAAqB,CACnC,EACE,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,qBAAqB,GAAG,gBAAgB,EACxC,eAAe,EACf,MAAM,EAAE,cAAc,EACtB,aAAa,GAAG,KAAK,EACrB,iBAAiB,GAAG,KAAK,EACzB,WAAW,EACX,WAAW,GAAG,sBAAsB,EACpC,QAAQ,GAAG,KAAK,EAChB,SAAS,GAAG,KAAK,EACjB,UAAU,EACV,YAAY,GAAG,OAAO,EACtB,QAAQ,GAAG,KAAK,EAChB,KAAK,EAAE,SAAS,EAChB,mBAAmB,GAAG,IAAI,EAC1B,gBAAgB,EAAE,eAAe,EACjC,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,QAAQ,EACR,eAAe,GACyB,EAC1C,cAAc,GAAG,IAAI;IAErB,MAAM,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAC;IAC1E,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxF,QAAQ,GAAG,QAAQ,IAAI,CAAC,aAAa,IAAI,CAAC,oBAAoB,CAAC;IAC/D,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,cAAc,IAAI,cAAc,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,wEAAwE;IACxE,+DAA+D;IAC/D,MAAM,EACJ,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,cAAc,GACf,GAAG,gBAAgB,CAClB,cAAc,IAAI,qBAAqB,EAAE,CAAC,eAAe,KAAK,YAAY;QACxE,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,SAAS,CACd,CAAC;IACF,MAAM,sBAAsB,GAAG,MAAM,CAAyB,IAAI,CAAC,CAAC;IACpE,MAAM,qBAAqB,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IAC7D,MAAM,iBAAiB,GAAG,MAAM,CAAiC,IAAI,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,sEAAsE;IACtE,uEAAuE;IACvE,MAAM,qBAAqB,GAAG,MAAM,CAA4B,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAC1E,iBAAiB,CAAC,6BAA6B,EAAE,CAClD,CAAC;IACF,MAAM,4BAA4B,GAAG,WAAW,CAAC,GAAG,EAAE;QACpD,0BAA0B,CAAC,iBAAiB,CAAC,6BAA6B,EAAE,CAAC,CAAC;IAChF,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,YAAY;YAAE,eAAe,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAyB,MAAM,CAAC,CAAC;IACnE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,kEAAkE;IAClE,iEAAiE;IACjE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAChE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAiB,IAAI,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAA0B,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAiC,IAAI,CAAC,CAAC;IAC7F,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAA0B,IAAI,CAAC,CAAC;IACtF,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAClF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAA2B,IAAI,CAAC,CAAC;IACjF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAqB,oBAAoB,CAAC,CAAC;IAC7F,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAqB,oBAAoB,CAAC,CAAC;IACzF,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IAClG,MAAM,CAAC,wBAAwB,EAAE,2BAA2B,CAAC,GAAG,QAAQ,CACtE,QAAQ,CAAC,EAAE,KAAK,SAAS,CAC1B,CAAC;IACF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,2DAA2D;IAC3D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClE,iFAAiF;IACjF,oDAAoD;IACpD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,MAAM,wBAAwB,GAAG,2BAA2B,CAAC;QAC3D,QAAQ,EAAE,CAAC,CAAC,eAAe;QAC3B,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,iCAAiC,GAAG,WAAW,CAAC,KAAK,IAAsB,EAAE;QACjF,8EAA8E;QAC9E,6EAA6E;QAC7E,6EAA6E;QAC7E,2EAA2E;QAC3E,2EAA2E;QAC3E,2EAA2E;QAC3E,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAC3C,IAAI,CAAC;YACH,OAAO,MAAM,iBAAiB,CAAC,iBAAiB,EAAE,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,8BAA8B,GAAG,WAAW,CAChD,KAAK,EAAE,SAAkB,EAAoB,EAAE;QAC7C,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAC3C,IAAI,OAAO,iBAAiB,CAAC,wBAAwB,KAAK,UAAU,EAAE,CAAC;YACrE,OAAO,CAAC,SAAS,CAAC;QACpB,CAAC;QACD,IAAI,CAAC;YACH,IAAI,MAAM,iBAAiB,CAAC,wBAAwB,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;QACvE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,6BAA6B,GAAG,wBAAwB,CAAC,SAAS,CAAC;IACzE,MAAM,2BAA2B,GAAG,wBAAwB,CAAC,OAAO,CAAC;IAErE,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;IAE3C,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,QAAmC,EAAE,EAAE;QACtC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzB,wEAAwE;QACxE,iEAAiE;QACjE,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;QACvC,UAAU,EAAE,CAAC;YACX,SAAS,EAAE,YAAY,EAAE;YACzB,YAAY,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;YACzD,GAAG,QAAQ;SACZ,CAAC,CAAC;IACL,CAAC,EACD,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,CAAC,CAC5D,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,MAAM,CAAC,iBAAiB,CAAC,CAAC,QAAuB,EAAE,EAAE;YAC1D,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ;gBAAE,OAAO;YACxC,YAAY,CAAC;gBACX,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,UAAU,IAAI,UAAU,IAAI,gBAAgB,EAAE,UAAU;gBACvF,KAAK,EAAE,QAAQ,CAAC,KAAK;aACtB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,EAAE;QACD,MAAM;QACN,YAAY;QACZ,UAAU;QACV,gBAAgB,EAAE,UAAU;QAC5B,QAAQ,EAAE,QAAQ,CAAC,UAAU;KAC9B,CAAC,CAAC;IAEH,+EAA+E;IAC/E,qEAAqE;IACrE,MAAM,aAAa,GAAG,WAAW,CAC/B,CACE,iBAAqC,EACrC,OAAgC,EAChC,SAAkB,EAClB,EAAE;QACF,IAAI,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAC1E,sBAAsB,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3F,CAAC,EACD,CAAC,WAAW,EAAE,iBAAiB,CAAC,CACjC,CAAC;IAEF,MAAM,IAAI,GAAG,WAAW,CACtB,CAAC,KAAc,EAAE,EAAE;QACjB,MAAM,eAAe,GACnB,QAAQ,EAAE,QAAQ,CAAC,UAAU,IAAI,UAAU,IAAI,gBAAgB,EAAE,UAAU,CAAC;QAC9E,MAAM,SAAS,GAAG,YAAY,CAC5B,KAAK,EACL,cAAc,CAAC,UAAU,EACzB,eAAe,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CACrE,CAAC;QACF,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YAC5E,UAAU,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACzC,CAAC;QACD,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;QACjC,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE;YACtC,UAAU,EAAE,eAAe;YAC3B,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,KAAK,EAAE,SAAS,CAAC,OAAO;SACzB,CAAC,CAAC;QACH,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5B,YAAY,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QACrC,iBAAiB,CACf,OAAO,SAAS,CAAC,OAAO,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CACvF,CAAC;QACF,YAAY,CAAC;YACX,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,OAAO,EAAE,CAAC;YACV,UAAU,EAAE,eAAe;YAC3B,KAAK,EAAE,SAAS,CAAC,WAAW;SAC7B,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAA4B,CAAC;QACjE,iEAAiE;QACjE,sEAAsE;QACtE,MAAM,iBAAiB,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,SAAS,CAAC;QAC1D,MAAM,kBAAkB,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,CAAC;QAC7D,MAAM,kBAAkB,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,CAAC;QAC7D,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE;YAChC,UAAU,EAAE,eAAe;YAC3B,SAAS,EAAE,SAAS,CAAC,IAAI;YACzB,oEAAoE;YACpE,YAAY,EAAE,SAAS,CAAC,OAAO;YAC/B,QAAQ,EAAE,SAAS,CAAC,KAAK;YACzB,SAAS,EAAE,OAAO,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YACzE,UAAU,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACnE,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,SAAS,EAAE,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YACxE,iBAAiB,EAAE,OAAO,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;YACxF,kBAAkB,EAAE,OAAO,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;YAC3F,kBAAkB,EAAE,OAAO,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;SAC5F,CAAC,CAAC;QACH,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACrB,aAAa,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC,EACD;QACE,UAAU;QACV,YAAY;QACZ,OAAO;QACP,KAAK;QACL,UAAU;QACV,gBAAgB,EAAE,UAAU;QAC5B,aAAa;QACb,QAAQ,EAAE,QAAQ,CAAC,UAAU;KAC9B,CACF,CAAC;IAEF,6EAA6E;IAC7E,6EAA6E;IAC7E,wEAAwE;IACxE,MAAM,qBAAqB,GAAG,WAAW,CACvC,CAAC,MAA+C,EAAE,EAAE;QAClD,UAAU,EAAE,CAAC;YACX,GAAG,MAAM;YACT,SAAS,EAAE,YAAY,EAAE;YACzB,YAAY,EAAE,eAAe,EAAE;SAChC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,CAAC,CAC5C,CAAC;IAEF,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,GAAG,qBAAqB,CAAC;QAC5E,wFAAwF;QACxF,wBAAwB,EAAE,GAAG,EAAE,CAAC,qBAAqB;QACrD,mBAAmB;QACnB,MAAM;QACN,YAAY;QACZ,UAAU;QACV,YAAY;QACZ,IAAI;QACJ,UAAU,EAAE,qBAAqB;QACjC,sBAAsB;QACtB,eAAe;QACf,gBAAgB;QAChB,aAAa;QACb,UAAU;QACV,eAAe;QACf,UAAU;QACV,eAAe;QACf,aAAa;KACd,CAAC,CAAC;IAEH,6EAA6E;IAC7E,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,YAAY,GAAG,kBAAkB,CACrC;QACE,UAAU;QACV,kBAAkB,EAAE,gBAAgB,EAAE,UAAU;QAChD,KAAK,EAAE,eAAe,EAAE,KAAK;QAC7B,cAAc;KACf,EACD,qBAAqB,EAAE,CACxB,CAAC;IACF,MAAM,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACpE,MAAM,WAAW,GAAsB;QACrC,wBAAwB,EAAE,GAAG,EAAE,CAAC,qBAAqB;QACrD,WAAW,EAAE,cAAc;QAC3B,SAAS,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM;QACvD,mBAAmB,EAAE,eAAe,EAAE,mBAAmB;QACzD,YAAY;QACZ,UAAU;QACV,mBAAmB;QACnB,WAAW,EAAE,eAAe,EAAE,WAAW,IAAI,EAAE;QAC/C,KAAK,EAAE,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QACnE,eAAe,EAAE,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;QAC9F,cAAc,EAAE,CAAC,QAA+B,EAAE,EAAE,CACjD,QAAiD,CAAC,WAAW,IAAI,QAAQ;QAC5E,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;YACvD,qBAAqB,CACnB,oBAAoB,CAClB,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAC5D,YAAY,EAAE,EACd,MAAM,EACN,SAAS,EACT,QAAQ,EACR,QAAQ,CACT,CACF,CAAC;YACF,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,aAAa,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACzC,IAAI,mBAAmB;gBAAE,eAAe,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,YAAY;KACb,CAAC;IACF,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IACjE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,YAAY;YAAE,cAAc,CAAC,MAAM,EAAE,CAAC;IAC7C,CAAC,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,WAAW,CAC3B,KAAK,EAAE,OAAgC,EAAE,QAA+B,EAAE,EAAE;QAC1E,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC;QACzC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;QAChC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,UAAU,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,QAAQ,KAAK,eAAe,CAAC,OAAO;gBACtC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAChE,CAAC;gBAAS,CAAC;YACT,IAAI,QAAQ,KAAK,eAAe,CAAC,OAAO,EAAE,CAAC;gBACzC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC,EACD,CAAC,YAAY,CAAC,IAAI,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,CAAC,CACrE,CAAC;IAEF,2EAA2E;IAC3E,4EAA4E;IAC5E,6EAA6E;IAC7E,8EAA8E;IAC9E,2EAA2E;IAC3E,cAAc;IACd,EAAE;IACF,4EAA4E;IAC5E,MAAM,sBAAsB,GAAG,WAAW,CACxC,KAAK,EACH,eAA0C,EAC1C,QAA+B,EAC/B,uBAAgC,EAChC,EAAE;QACF,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC;YACzC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,UAAU,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,gBAAgB,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACvD,yBAAyB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,CAChE,CAAC;gBACF,MAAM,kBAAkB,CAAC,gBAAgB,EAAE,QAAQ,EAAE,uBAAuB,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,QAAQ,KAAK,eAAe,CAAC,OAAO;oBACtC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAChE,CAAC;oBAAS,CAAC;gBACT,IAAI,QAAQ,KAAK,eAAe,CAAC,OAAO,EAAE,CAAC;oBACzC,UAAU,CAAC,KAAK,CAAC,CAAC;oBAClB,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;gBACnC,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,eAAe,CAAC,eAAe,EAAE,QAAQ,EAAE,uBAAuB,CAAC,CAAC;IAC5E,CAAC,EACD,CAAC,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,CAAC,IAAI,CAAC,CAC3E,CAAC;IAEF,MAAM,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,GAAG,6BAA6B,CAAC;QAC7F,YAAY;QACZ,UAAU;QACV,IAAI;QACJ,iBAAiB;QACjB,gBAAgB;QAChB,QAAQ;QACR,eAAe,EAAE,sBAAsB;QACvC,kBAAkB;KACnB,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,YAAY,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5F,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,wBAAwB,CAAC;QACvD,eAAe;QACf,aAAa;QACb,oBAAoB;QACpB,wBAAwB;QACxB,YAAY,EAAE,oBAAoB;YAChC,CAAC,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,CAAC,OAAO,CAAC;YACrE,CAAC,CAAC,SAAS;QACb,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;YACnC,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACvC,cAAc,CAAC,OAAO,CACpB,QAAQ,EACR,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAChD,oCAAoC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC1D,CAAC;YACJ,CAAC;QACH,CAAC;QACD,UAAU;QACV,UAAU;QACV,WAAW;QACX,gBAAgB;QAChB,QAAQ;QACR,qBAAqB;QACrB,eAAe;QACf,aAAa;QACb,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,eAAe;QACf,gBAAgB;QAChB,YAAY;QACZ,QAAQ;QACR,YAAY;QACZ,kBAAkB;QAClB,mBAAmB;QACnB,IAAI;QACJ,qBAAqB;QACrB,6BAA6B;QAC7B,2BAA2B;QAC3B,4BAA4B;QAC5B,QAAQ;QACR,YAAY;QACZ,OAAO;QACP,sBAAsB;QACtB,eAAe;QACf,gBAAgB;QAChB,qBAAqB;QACrB,iBAAiB;QACjB,SAAS;QACT,WAAW;QACX,qBAAqB;QACrB,UAAU;QACV,kBAAkB;QAClB,UAAU;QACV,WAAW;QACX,kBAAkB;QAClB,qBAAqB;QACrB,aAAa;QACb,eAAe;QACf,eAAe;QACf,oBAAoB;QACpB,cAAc;QACd,0BAA0B;QAC1B,2BAA2B;QAC3B,eAAe;QACf,gBAAgB;QAChB,cAAc;KACf,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,OAAgC,EAAE,QAA+B,EAAE,EAAE;QACpE,MAAM,aAAa,GACjB,YAAY,CAAC,IAAI,KAAK,YAAY;YAChC,CAAC,CAAC,yBAAyB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC;YACjE,CAAC,CAAC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;QACnE,IAAI,aAAa,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,wCAAwC,EAAE;gBACnE,IAAI,EAAE,OAAO,CAAC,GAAG;gBACjB,EAAE,EAAE,aAAa,CAAC,GAAG;gBACrB,cAAc,EAAE,aAAa,CAAC,OAAO,CAAC,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,aAAa;aACtF,CAAC,CAAC;QACL,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,2CAA2C,EAAE;YACtE,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,gBAAgB,CAAC,aAAa,CAAC;SACzC,CAAC,CAAC;QACH,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAClC,iBAAiB,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC7C,YAAY,CAAC;YACX,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,WAAW,mBAAmB,CAAC,QAAQ,CAAC,mBAAmB;YACpE,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,QAAQ,CAAC,UAAU;SAChC,CAAC,CAAC;QACH,UAAU,CAAC,cAAc,CAAC,eAAe,EAAE;YACzC,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,UAAU,EAAE,QAAQ,CAAC,kBAAkB;YACvC,GAAG,6BAA6B,CAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,GAAG,CAAC;YACzE,MAAM,EAAE,aAAa,CAAC,MAAM;SAC7B,CAAC,CAAC;QACH,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,EACD,CAAC,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,CAClF,CAAC;IAEF,MAAM,iBAAiB,GACrB,QAAQ,EAAE,QAAQ,CAAC,UAAU,IAAI,UAAU,IAAI,gBAAgB,EAAE,UAAU,CAAC;IAE9E,0EAA0E;IAC1E,0EAA0E;IAC1E,wEAAwE;IACxE,oEAAoE;IACpE,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,OAAgC,EAAE,EAAE;QACnC,UAAU,CACR,cAAc,CAAC,cAAc,EAC7B;YACE,UAAU,EAAE,iBAAiB;YAC7B,iBAAiB,EAAE,OAAO,EAAE,MAAM,IAAI,YAAY;YAClD,aAAa,EAAE,OAAO,EAAE,QAAQ;YAChC,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;YAC7C,gBAAgB,EAAE,OAAO,EAAE,WAAW;YACtC,cAAc,EAAE,mBAAmB,EAAE;YACrC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;SAC3E,EACD,EAAE,cAAc,EAAE,IAAI,EAAE,CACzB,CAAC;IACJ,CAAC,EACD,CAAC,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAC3F,CAAC;IAEF,MAAM,EACJ,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,EACrB,qBAAqB,GACtB,GAAG,yBAAyB,CAAC;QAC5B,YAAY;QACZ,YAAY;QACZ,cAAc,EAAE,WAAW,CAAC,GAAG;QAC/B,QAAQ;QACR,UAAU,EAAE,iBAAiB;QAC7B,gBAAgB;QAChB,eAAe;QACf,cAAc;QACd,oBAAoB;QACpB,2BAA2B;QAC3B,aAAa;QACb,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,IAAI,YAAY,EAAE,CAAC;YACjB,iBAAiB,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC,CAAC;IAEjD,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAE/D,MAAM,uBAAuB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/C,4EAA4E;QAC5E,4BAA4B;QAC5B,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YAC1B,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QACD,kBAAkB,EAAE,CAAC;IACvB,CAAC,EAAE,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEpC,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACtE,MAAM,qBAAqB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAChF,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,IAAI,eAAe,IAAI,wBAAwB,CAAC,OAAO;YAAE,OAAO;QAChE,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;IAC7B,CAAC,EAAE,CAAC,eAAe,EAAE,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;IAExD,MAAM,6BAA6B,GAAG,WAAW,CAC/C,CAAC,YAAqC,EAAE,EAAE;QACxC,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;QACrC,sEAAsE;QACtE,wEAAwE;QACxE,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACjC,yEAAyE;QACzE,wEAAwE;QACxE,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,8BAA8B,CAAC,IAAI,CAAC;aACjC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YACxB,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACtE,IAAI,SAAS;gBAAE,OAAO;YACtB,mEAAmE;YACnE,oEAAoE;YACpE,MAAM,MAAM,GAAG,MAAM,iCAAiC,EAAE,CAAC;YACzD,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACtE,mEAAmE;YACnE,mEAAmE;YACnE,kCAAkC;YAClC,IAAI,CAAC,MAAM;gBAAE,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,sCAAsC,CAAC,CAAC;YAChF,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QACL,wBAAwB,CAAC,6BAA6B,EAAE,CAAC;IAC3D,CAAC,EACD;QACE,SAAS;QACT,kBAAkB;QAClB,8BAA8B;QAC9B,wBAAwB,CAAC,6BAA6B;KACvD,CACF,CAAC;IAEF,MAAM,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,MAAM,iBAAiB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,6BAA6B,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAClE,MAAM,8BAA8B,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IACnE,MAAM,oBAAoB,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACpE,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,KAAK,CAAC;IACzD,2EAA2E;IAC3E,6EAA6E;IAC7E,eAAe,CAAC,GAAG,EAAE;QACnB,oBAAoB,CAAC,OAAO,GAAG,iBAAiB,CAAC;IACnD,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,2EAA2E;IAC3E,2EAA2E;IAC3E,qEAAqE;IACrE,6EAA6E;IAC7E,mDAAmD;IACnD,MAAM,oBAAoB,GAAG,WAAW,CACtC,CAAC,MAAsC,EAAW,EAAE;QAClD,wEAAwE;QACxE,yEAAyE;QACzE,yEAAyE;QACzE,0EAA0E;QAC1E,uEAAuE;QACvE,0CAA0C;QAC1C,IAAI,oBAAoB,CAAC,OAAO,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9D,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,IAAI,6BAA6B,CAAC,OAAO,KAAK,YAAY;YAAE,OAAO,KAAK,CAAC;QACzE,6BAA6B,CAAC,OAAO,GAAG,YAAY,CAAC;QACrD,8BAA8B,CAAC,OAAO,GAAG,IAAI,CAAC;QAC9C,MAAM,GAAG,GAAG,EAAE,iBAAiB,CAAC,OAAO,CAAC;QACxC,8BAA8B,CAAC,IAAI,CAAC;aACjC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;YAClB,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACtE,6BAA6B,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7C,IAAI,iBAAiB,CAAC,OAAO,KAAK,GAAG,EAAE,CAAC;gBACtC,IAAI,SAAS,EAAE,CAAC;oBACd,8BAA8B,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;wBAC/C,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,2CAA2C,CAAC,CAAC;oBAC1E,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;gBACrC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,0DAA0D,CAAC,CAAC;gBACvF,OAAO;YACT,CAAC;YACD,wBAAwB,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAChE,IAAI,8BAA8B,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;gBAC5D,wBAAwB,CAAC,yBAAyB,EAAE,CAAC;YACvD,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC,EAAE,CAAC;gBAC7D,6BAA6B,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC7C,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;YACvC,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,uDAAuD,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QACL,OAAO,IAAI,CAAC;IACd,CAAC,EACD;QACE,8BAA8B;QAC9B,wBAAwB,CAAC,yBAAyB;QAClD,wBAAwB,CAAC,oBAAoB;KAC9C,CACF,CAAC;IAEF,MAAM,yBAAyB,GAAG,WAAW,CAC3C,CAAC,YAAqC,EAAE,EAAE;QACxC,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,8BAA8B,CAAC,OAAO,GAAG,YAAY,CAAC;QACtD,IAAI,oBAAoB,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;YACpD,wBAAwB,CAAC,yBAAyB,EAAE,CAAC;QACvD,CAAC;QACD,kBAAkB,CAAC,YAAY,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;IACjE,CAAC,EACD,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,yBAAyB,CAAC,CACzE,CAAC;IAEF,MAAM,yBAAyB,GAAG,WAAW,CAAC,GAAG,EAAE;QACjD,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;QACrC,8BAA8B,CAAC,OAAO,GAAG,IAAI,CAAC;QAC9C,6BAA6B,CAAC,OAAO,GAAG,IAAI,CAAC;QAC7C,iBAAiB,CAAC,OAAO,IAAI,CAAC,CAAC;QAC/B,oBAAoB,CAAC,OAAO,GAAG,UAAU,CAAC;QAC1C,wBAAwB,CAAC,yBAAyB,EAAE,CAAC;IACvD,CAAC,EAAE,CAAC,wBAAwB,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAEzD,6EAA6E;IAC7E,6EAA6E;IAC7E,4EAA4E;IAC5E,6EAA6E;IAC7E,oEAAoE;IACpE,MAAM,qBAAqB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7C,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,IACE,oBAAoB,CAAC,OAAO,KAAK,cAAc;YAC/C,6BAA6B,CAAC,OAAO,KAAK,YAAY,EACtD,CAAC;YACD,OAAO;QACT,CAAC;QACD,8BAA8B,CAAC,OAAO,GAAG,YAAY,CAAC;QACtD,IAAI,oBAAoB,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;YACpD,wBAAwB,CAAC,wBAAwB,EAAE,CAAC;QACtD,CAAC;IACH,CAAC,EAAE,CAAC,wBAAwB,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAExD,yEAAyE;IACzE,uEAAuE;IACvE,qEAAqE;IACrE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,iBAAiB,KAAK,cAAc,EAAE,CAAC;YACzC,mBAAmB,CAAC,OAAO,GAAG,IAAI,CAAC;YACnC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,OAAO;YAAE,OAAO;QACzC,mBAAmB,CAAC,OAAO,GAAG,KAAK,CAAC;QACpC,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;QACrC,iEAAiE;QACjE,IAAI,iBAAiB,KAAK,UAAU;YAAE,OAAO;QAC7C,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,8BAA8B,CAAC,KAAK,CAAC;aAClC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjB,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACtE,IAAI,CAAC,QAAQ;gBAAE,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,2CAA2C,CAAC,CAAC;QACzF,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC,EAAE,CAAC,iBAAiB,EAAE,8BAA8B,CAAC,CAAC,CAAC;IAExD,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,8BAA8B,CAAC,KAAK,CAAC;aAClC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjB,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACtE,IAAI,QAAQ,EAAE,CAAC;gBACb,wBAAwB,CAAC,gBAAgB,EAAE,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,kDAAkD,CAAC,CAAC;gBAC/E,SAAS,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,SAAS,EAAE,8BAA8B,EAAE,wBAAwB,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAE3F,MAAM,aAAa,GAAG,yBAAyB,CAAC;QAC9C,SAAS;QACT,gBAAgB;QAChB,iBAAiB;QACjB,WAAW;QACX,qBAAqB;QACrB,gBAAgB,EAAE,oBAAoB;QACtC,qBAAqB,EAAE,yBAAyB;QAChD,qBAAqB,EAAE,yBAAyB;QAChD,yBAAyB,EAAE,6BAA6B;QACxD,yBAAyB,EAAE,6BAA6B;QACxD,uBAAuB;QACvB,gBAAgB;QAChB,iBAAiB;QACjB,yBAAyB;QACzB,6BAA6B;QAC7B,qBAAqB;QACrB,qBAAqB;QACrB,gBAAgB;QAChB,QAAQ;QACR,gBAAgB,EAAE,uBAAuB;QACzC,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,EACJ,2BAA2B,EAC3B,gBAAgB,EAChB,gCAAgC,EAChC,qBAAqB,EACrB,qCAAqC,EACrC,gCAAgC,GACjC,GAAG,6BAA6B,CAAC;QAChC,YAAY;QACZ,YAAY;QACZ,uBAAuB;QACvB,iBAAiB,EAAE,qBAAqB;QACxC,gBAAgB,EAAE,oBAAoB;QACtC,gBAAgB;QAChB,UAAU;QACV,gBAAgB;QAChB,QAAQ;QACR,gBAAgB;QAChB,cAAc;QACd,aAAa;QACb,MAAM;QACN,YAAY;QACZ,UAAU;KACX,CAAC,CAAC;IAEH,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;QACpD,QAAQ;QACR,gBAAgB;QAChB,qBAAqB;QACrB,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,GAAG,0BAA0B,CAAC;QAC9F,qBAAqB;QACrB,2BAA2B,EAAE,IAAI;QACjC,gBAAgB,EAAE,uBAAuB;QACzC,YAAY;QACZ,eAAe;QACf,QAAQ;QACR,YAAY;QACZ,YAAY;QACZ,UAAU;QACV,YAAY;QACZ,0BAA0B;QAC1B,2BAA2B;KAC5B,CAAC,CAAC;IAEH,MAAM,KAAK,GACT,UAAU,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;IAC7F,MAAM,YAAY,GAAG,CAAC,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC;IACjD,MAAM,qBAAqB,GAAG,4BAA4B,CAAC,wBAAwB,CAAC,KAAK,EAAE;QACzF,QAAQ,EAAE,CAAC,CAAC,eAAe;QAC3B,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,YAAY,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC;IACtD,MAAM,8BAA8B,GAAG,qBAAqB,IAAI,CAAC,CAAC,KAAK,CAAC;IACxE,SAAS,CAAC,GAAG,EAAE;QACb,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ;YAAE,OAAO;QACvC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,8BAA8B,CAAC,8BAA8B,CAAC;aAC3D,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YACxB,IAAI,SAAS,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACnF,IAAI,SAAS;gBAAE,OAAO;YACtB,IAAI,8BAA8B,EAAE,CAAC;gBACnC,MAAM,iCAAiC,EAAE,CAAC;gBAC1C,IAAI,SAAS,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;oBAAE,OAAO;YACrF,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,SAAS,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACnF,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE;QACD,SAAS;QACT,iCAAiC;QACjC,YAAY;QACZ,8BAA8B;QAC9B,QAAQ;QACR,8BAA8B;KAC/B,CAAC,CAAC;IACH,2EAA2E;IAC3E,4EAA4E;IAC5E,6DAA6D;IAC7D,MAAM,cAAc,GAClB,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,IAAI,CAAC,qBAAqB,IAAI,WAAW,CAAC;IACjF,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,IAAI,UAAU,IAAI,EAAE,CAAC;IACzD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,gBAAgB,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACjD,OAAO;QACL,qBAAqB;QACrB,WAAW;QACX,eAAe;QACf,SAAS;QACT,iBAAiB;QACjB,YAAY;QACZ,QAAQ;QACR,iBAAiB;QACjB,kBAAkB;QAClB,KAAK;QACL,SAAS;QACT,cAAc;QACd,kBAAkB;QAClB,aAAa;QACb,uBAAuB;QACvB,2BAA2B;QAC3B,gBAAgB;QAChB,gCAAgC;QAChC,qBAAqB;QACrB,qCAAqC;QACrC,gCAAgC;QAChC,YAAY;QACZ,YAAY;QACZ,qBAAqB;QACrB,uBAAuB;QACvB,kBAAkB;QAClB,YAAY;QACZ,gBAAgB;QAChB,WAAW;QACX,aAAa;QACb,qBAAqB;QACrB,uBAAuB;QACvB,YAAY;QACZ,QAAQ;QACR,KAAK;QACL,SAAS,EAAE,YAAY,EAAE;QACzB,YAAY,EAAE,eAAe,EAAE;QAC/B,eAAe;QACf,iBAAiB;QACjB,wBAAwB;QACxB,YAAY;QACZ,mBAAmB;QACnB,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,YAAY;QACZ,QAAQ;QACR,eAAe;QACf,OAAO;QACP,gBAAgB;QAChB,UAAU;QACV,cAAc;QACd,gBAAgB;QAChB,cAAc;QACd,KAAK;QACL,KAAK;QACL,eAAe;QACf,UAAU;QACV,MAAM;QACN,YAAY;QACZ,UAAU;QACV,gBAAgB;QAChB,+BAA+B,EAAE,wBAAwB,CAAC,OAAO;QACjE,+BAA+B,EAAE,wBAAwB,CAAC,OAAO;KAClE,CAAC;AACJ,CAAC","sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Platform, type View } from 'react-native';\n\nimport { selectProviderFlow } from './flowSelection';\nimport { providerDisplayName, type ResolvedProvider } from './providerResolution';\nimport { prepareTeeCapturedRequest, rewriteForNativeReplay } from './replayRewrite';\nimport { teeAttestationResult } from './tee/teeResult';\nimport {\n TeeBundlePreparation,\n type TeeReplaySwapArgs,\n useTeeReplayBundleSwap,\n useTeeReplaySwap,\n} from './tee/useTeeReplaySwap';\nimport { resolveTheme } from './theme';\nimport {\n BrowserChromeState,\n EMPTY_BROWSER_CHROME,\n LoginCompletionDetails,\n LoginSubmitAttempt,\n ManagedPopupState,\n SatyaModeAwareProviderAttestButtonProps,\n SatyaModeAwareProviderAttestationResult,\n SatyaProviderFlowPhase,\n SatyaProviderFlowProgress,\n WebViewComponent,\n WebViewRefLike,\n} from './types';\nimport { endpointMatchTelemetryContext, hostFromUrl, isSecureUrl } from './urlUtils';\nimport { useCompositeCaptureController } from './useCompositeCaptureController';\nimport { useEdgeSwipeBack } from './useEdgeSwipeBack';\nimport { useFunnelEmitter } from './useFunnelEmitter';\nimport { useHtmlCaptureTrigger } from './useHtmlCaptureTrigger';\nimport { useManagedPopupController } from './useManagedPopupController';\nimport { useNativeReplayRunner } from './useNativeReplayRunner';\nimport { useProviderFlowLifecycle } from './useProviderFlowLifecycle';\nimport { useProviderInjectedScripts } from './useProviderInjectedScripts';\nimport { useProviderMessageHandler } from './useProviderMessageHandler';\nimport { useProviderNavigationHandlers } from './useProviderNavigationHandlers';\nimport { useVerificationPresentation } from './useVerificationPresentation';\nimport {\n isCurrentPresentationFlow,\n shouldConcealProviderContent,\n} from './verificationPresentation';\nimport SatyaAttestModule from '../../SatyaAttestModule';\nimport { SatyaMobileClient } from '../../SatyaMobileClient';\nimport { isSatyaDebugEnabled, satyaDebug, summarizeRequest } from '../../debugLog';\nimport { reportSatyaDiagnostics, type SatyaDiagnosticsOutcome } from '../../diagnostics';\nimport { ProviderSessionController } from '../../providerSessions';\nimport { getSatyaRuntimeConfig, isPartialEndpointsAllowedForProvider } from '../../satyaConfig';\nimport { SdkFunnelEvent } from '../../sdkEventLog';\nimport { asTeeError, teeErrorLogData } from '../../tee/errors';\nimport {\n CapturedProviderRequest,\n SatyaProgress,\n SatyaProviderLoginSubmitSignal,\n SatyaProviderTemplate,\n} from '../../types';\nimport { satyaError, SatyaErrorCode, asSatyaError } from '../../types/error.types';\n\nexport function useProviderAttestFlow(\n {\n providerId,\n sessionPolicy,\n resolveSessionPolicy,\n endpointId,\n proofPlanId,\n providerTemplate,\n spkiPins,\n providerPolicyRefresh = 'verifier-first',\n transportConfig,\n client: providedClient,\n verifyBackend = false,\n reportDiagnostics = false,\n diagnostics,\n buttonLabel = 'Generate Attestation',\n disabled = false,\n autoStart = false,\n modalTitle,\n presentation = 'sheet',\n prefetch = false,\n theme: themeProp,\n autoCloseOnComplete = true,\n WebViewComponent: providedWebView,\n webViewUserAgent,\n webViewProps,\n onProgress,\n onRequestCaptured,\n onComplete,\n onError,\n onCancel,\n onCopySessionId,\n }: SatyaModeAwareProviderAttestButtonProps,\n allowTeeReplay = true\n) {\n const [providerSession] = useState(() => new ProviderSessionController());\n const [providerSessionHandle, setProviderSessionHandle] = useState<string | null>(null);\n prefetch = prefetch && !sessionPolicy && !resolveSessionPolicy;\n const fallbackClient = useMemo(() => new SatyaMobileClient(), []);\n const client = providedClient ?? fallbackClient;\n const webRef = useRef<WebViewRefLike | null>(null);\n const popupRef = useRef<WebViewRefLike | null>(null);\n const webHostRef = useRef<View | null>(null);\n const popupHostRef = useRef<View | null>(null);\n const replayStartedRef = useRef(false);\n const flowSequenceRef = useRef(0);\n // Funnel logging: sessionId is stable per mounted flow (one user task),\n // reused across retries; attemptIndex increments per openFlow.\n const {\n emitFunnel,\n beginFunnelAttempt,\n emitFunnelCancelled,\n getSessionId,\n getAttemptIndex,\n getAttemptElapsedMs,\n setFunnelPhase,\n } = useFunnelEmitter(\n allowTeeReplay && getSatyaRuntimeConfig().attestationMode === 'tee-replay'\n ? 'tee-replay'\n : undefined\n );\n const flowAbortControllerRef = useRef<AbortController | null>(null);\n const htmlCaptureFetchedRef = useRef<Set<string>>(new Set());\n const pendingRequestRef = useRef<CapturedProviderRequest | null>(null);\n const bearerRef = useRef<string | null>(null);\n const loggedInRef = useRef(false);\n // Correlates the login submission with its own response so a rejected\n // submission can uncover immediately instead of waiting out the timer.\n const loginSubmitAttemptRef = useRef<LoginSubmitAttempt | null>(null);\n const [webViewBridgeCapability, setWebViewBridgeCapability] = useState(() =>\n SatyaAttestModule.createWebViewBridgeCapability()\n );\n const renewWebViewBridgeCapability = useCallback(() => {\n setWebViewBridgeCapability(SatyaAttestModule.createWebViewBridgeCapability());\n }, []);\n const [modalVisible, setModalVisible] = useState(false);\n useEffect(() => {\n if (!modalVisible) providerSession.release().catch(() => undefined);\n }, [modalVisible, providerSession]);\n const [phase, setPhase] = useState<SatyaProviderFlowPhase>('idle');\n const [error, setError] = useState<string | null>(null);\n // Typed code alongside the message so the UI can tell a permanent\n // authorization refusal from a transient failure worth retrying.\n const [errorCode, setErrorCode] = useState<string | null>(null);\n const [errorRetryable, setErrorRetryable] = useState<boolean | null>(null);\n const clearError = useCallback(() => {\n setError(null);\n setErrorCode(null);\n setErrorRetryable(null);\n }, []);\n const [resolved, setResolved] = useState<ResolvedProvider | null>(null);\n const [capturedRequest, setCapturedRequest] = useState<CapturedProviderRequest | null>(null);\n const [ResolvedWebView, setResolvedWebView] = useState<WebViewComponent | null>(null);\n const [effectiveUserAgent, setEffectiveUserAgent] = useState<string | null>(null);\n const [webViewUrl, setWebViewUrl] = useState<string | null>(null);\n const [managedPopup, setManagedPopup] = useState<ManagedPopupState | null>(null);\n const [browserChrome, setBrowserChrome] = useState<BrowserChromeState>(EMPTY_BROWSER_CHROME);\n const [popupChrome, setPopupChrome] = useState<BrowserChromeState>(EMPTY_BROWSER_CHROME);\n const [mainDocumentScriptReady, setMainDocumentScriptReady] = useState(Platform.OS !== 'android');\n const [popupDocumentScriptReady, setPopupDocumentScriptReady] = useState(\n Platform.OS !== 'android'\n );\n const [running, setRunning] = useState(false);\n // Gates the fade-in cover until each WebView first paints.\n const [contentReady, setContentReady] = useState(false);\n const [popupContentReady, setPopupContentReady] = useState(false);\n // Load-start→load-end only; NOT browserChrome.loading, which SPA nav events keep\n // re-asserting after the page has already rendered.\n const [pageLoading, setPageLoading] = useState(false);\n\n const verificationPresentation = useVerificationPresentation({\n captured: !!capturedRequest,\n error: !!error,\n modalVisible,\n });\n\n const closeNativePopupWindowsFailClosed = useCallback(async (): Promise<boolean> => {\n // Native popup WebViews are an Android-only mechanism and `closePopupWindows`\n // is declared only in the Kotlin module, so on iOS there is nothing to close\n // and the call itself would throw. Both current callers are already gated by\n // `setNativePopupWindowsConcealed` returning true off Android, which makes\n // this unreachable there today — state the platform assumption rather than\n // leaving it to depend on a caller's short-circuit, and match the sibling.\n if (Platform.OS !== 'android') return true;\n try {\n return await SatyaAttestModule.closePopupWindows();\n } catch {\n return false;\n }\n }, []);\n\n const setNativePopupWindowsConcealed = useCallback(\n async (concealed: boolean): Promise<boolean> => {\n if (Platform.OS !== 'android') return true;\n if (typeof SatyaAttestModule.setPopupWindowsConcealed !== 'function') {\n return !concealed;\n }\n try {\n if (await SatyaAttestModule.setPopupWindowsConcealed(concealed)) return true;\n } catch {\n // The caller applies flow scoping before taking any fallback action.\n }\n return false;\n },\n []\n );\n\n const beginVerificationPresentation = verificationPresentation.beginFlow;\n const endVerificationPresentation = verificationPresentation.endFlow;\n\n const debugEnabled = isSatyaDebugEnabled();\n\n const emitProgress = useCallback(\n (progress: SatyaProviderFlowProgress) => {\n setFunnelPhase(progress.phase);\n setPhase(progress.phase);\n // Stamp the correlation ids so hosts see them on EVERY progress update,\n // not only on the terminal result. Fields set by the caller win.\n const attemptIndex = getAttemptIndex();\n onProgress?.({\n sessionId: getSessionId(),\n attemptIndex: attemptIndex > 0 ? attemptIndex : undefined,\n ...progress,\n });\n },\n [getAttemptIndex, getSessionId, onProgress, setFunnelPhase]\n );\n\n useEffect(() => {\n return client.subscribeProgress((progress: SatyaProgress) => {\n if (progress.phase === 'failed') return;\n emitProgress({\n phase: progress.phase,\n message: progress.message,\n percent: progress.percent,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n error: progress.error,\n });\n });\n }, [\n client,\n emitProgress,\n providerId,\n providerTemplate?.providerId,\n resolved?.template.providerId,\n ]);\n\n // Opt-in, fire-and-forget outcome report to the Satya observability collector.\n // No-ops unless `reportDiagnostics` is enabled with a collector URL.\n const reportOutcome = useCallback(\n (\n outcomeProviderId: string | undefined,\n outcome: SatyaDiagnosticsOutcome,\n latencyMs?: number\n ) => {\n if (!reportDiagnostics || !diagnostics?.url || !outcomeProviderId) return;\n reportSatyaDiagnostics(diagnostics, { provider: outcomeProviderId, outcome, latencyMs });\n },\n [diagnostics, reportDiagnostics]\n );\n\n const fail = useCallback(\n (cause: unknown) => {\n const errorProviderId =\n resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId;\n const nextError = asSatyaError(\n cause,\n SatyaErrorCode.UNEXPECTED,\n errorProviderId ? { providerId: errorProviderId, phase } : { phase }\n );\n if (nextError.code.startsWith('SATYA_TEE_') && !nextError.context?.teeStage) {\n asTeeError(nextError, 'configuration');\n }\n replayStartedRef.current = false;\n setRunning(false);\n satyaDebug.error('flow', 'flow failed', {\n providerId: errorProviderId,\n errorId: nextError.errorId,\n code: nextError.code,\n stage: nextError.stage,\n error: nextError.message,\n });\n setError(nextError.message);\n setErrorCode(nextError.code ?? null);\n setErrorRetryable(\n typeof nextError.context?.retryable === 'boolean' ? nextError.context.retryable : null\n );\n emitProgress({\n phase: 'failed',\n message: nextError.message,\n percent: 1,\n providerId: errorProviderId,\n error: nextError.diagnostics,\n });\n const ctx = (nextError.context ?? {}) as Record<string, unknown>;\n // The verifier's v2 envelope lands under serverCode/serverClass/\n // serverStage (satyaErrorFromEnvelope); older paths used errorCode/*.\n const verifierErrorCode = ctx.serverCode ?? ctx.errorCode;\n const verifierErrorClass = ctx.serverClass ?? ctx.errorClass;\n const verifierErrorStage = ctx.serverStage ?? ctx.errorStage;\n emitFunnel(SdkFunnelEvent.Failed, {\n providerId: errorProviderId,\n errorCode: nextError.code,\n // Raw message — scrubbed of secrets + length-capped in sdkEventLog.\n errorMessage: nextError.message,\n sdkStage: nextError.stage,\n retryable: typeof ctx.retryable === 'boolean' ? ctx.retryable : undefined,\n httpStatus: typeof ctx.status === 'number' ? ctx.status : undefined,\n ...(ctx.mode === 'tee-replay' ? teeErrorLogData(nextError) : {}),\n errorId: nextError.errorId,\n requestId: typeof ctx.requestId === 'string' ? ctx.requestId : undefined,\n verifierErrorCode: typeof verifierErrorCode === 'string' ? verifierErrorCode : undefined,\n verifierErrorClass: typeof verifierErrorClass === 'string' ? verifierErrorClass : undefined,\n verifierErrorStage: typeof verifierErrorStage === 'string' ? verifierErrorStage : undefined,\n });\n onError?.(nextError);\n reportOutcome(errorProviderId, 'failed');\n },\n [\n emitFunnel,\n emitProgress,\n onError,\n phase,\n providerId,\n providerTemplate?.providerId,\n reportOutcome,\n resolved?.template.providerId,\n ]\n );\n\n // Surface sessionId + attemptIndex on the onComplete result so host apps can\n // correlate a successful attestation with its session (the modal auto-closes\n // on success, so flow.sessionId is otherwise unreadable at that point).\n const onCompleteWithSession = useCallback(\n (result: SatyaModeAwareProviderAttestationResult) => {\n onComplete?.({\n ...result,\n sessionId: getSessionId(),\n attemptIndex: getAttemptIndex(),\n });\n },\n [getAttemptIndex, getSessionId, onComplete]\n );\n\n const { runReplay: runNativeReplay, runBundleReplay } = useNativeReplayRunner({\n // Late messages must retain their retired handle instead of selecting the shared store.\n getProviderSessionHandle: () => providerSessionHandle,\n autoCloseOnComplete,\n client,\n emitProgress,\n emitFunnel,\n getSessionId,\n fail,\n onComplete: onCompleteWithSession,\n flowAbortControllerRef,\n flowSequenceRef,\n replayStartedRef,\n reportOutcome,\n clearError,\n setModalVisible,\n setRunning,\n transportConfig,\n verifyBackend,\n });\n\n // TEE replay reuses everything above and changes only the post-capture step.\n // Selection is read from the live runtime config rather than a prop so a\n // mode set by initSatyaAttest applies without threading it through callers.\n const teeSelection = selectProviderFlow(\n {\n providerId,\n providerTemplateId: providerTemplate?.providerId,\n appId: transportConfig?.appId,\n allowTeeReplay,\n },\n getSatyaRuntimeConfig()\n );\n const [teePreparation] = useState(() => new TeeBundlePreparation());\n const teeSwapArgs: TeeReplaySwapArgs = {\n getProviderSessionHandle: () => providerSessionHandle,\n preparation: teePreparation,\n getSignal: () => flowAbortControllerRef.current?.signal,\n verifierBearerToken: transportConfig?.verifierBearerToken,\n getSessionId,\n emitFunnel,\n getAttemptElapsedMs,\n verifierUrl: transportConfig?.verifierUrl ?? '',\n appId: teeSelection.type === 'tee-replay' ? teeSelection.appId : '',\n replayServerUrl: teeSelection.type === 'tee-replay' ? teeSelection.replayServerUrl : undefined,\n rawProviderFor: (template: SatyaProviderTemplate) =>\n (template as unknown as { rawProvider?: unknown }).rawProvider ?? template,\n onOutcome: ({ verify, artifacts, template, requests }) => {\n onCompleteWithSession(\n teeAttestationResult(\n teeSelection.type === 'tee-replay' ? teeSelection.appId : '',\n getSessionId(),\n verify,\n artifacts,\n template,\n requests\n )\n );\n emitProgress({ phase: 'verified', message: 'TEE replay verified', percent: 1 });\n reportOutcome(template.providerId, 'ok');\n if (autoCloseOnComplete) setModalVisible(false);\n },\n emitProgress,\n };\n useEffect(() => () => teePreparation.cancel(), [teePreparation]);\n useEffect(() => {\n if (!modalVisible) teePreparation.cancel();\n }, [modalVisible, teePreparation]);\n const runTeeReplay = useTeeReplaySwap(teeSwapArgs);\n const runTeeReplayBundle = useTeeReplayBundleSwap(teeSwapArgs);\n\n const runReplay = useCallback(\n async (request: CapturedProviderRequest, template: SatyaProviderTemplate) => {\n if (teeSelection.type !== 'tee-replay') return runNativeReplay(request, template);\n const sequence = flowSequenceRef.current;\n replayStartedRef.current = true;\n setRunning(true);\n clearError();\n try {\n await runTeeReplay(request, template);\n } catch (cause) {\n if (sequence === flowSequenceRef.current)\n fail(asSatyaError(cause, SatyaErrorCode.TEE_REPLAY_FAILED));\n } finally {\n if (sequence === flowSequenceRef.current) {\n setRunning(false);\n replayStartedRef.current = false;\n }\n }\n },\n [teeSelection.type, runNativeReplay, runTeeReplay, clearError, fail]\n );\n\n // The composite controller is wired straight to the NATIVE runner, so this\n // must dispatch on mode: without it, a provider with a composite proof plan\n // silently produced an App Attestation artifact while the caller believed it\n // was in TEE mode - the exact downgrade the `unsupported` selection exists to\n // prevent, and one that only appeared on device because Kaggle publishes a\n // proof plan.\n //\n // The verifier-issued selection commits both strict and partial completion.\n const runBundleReplayForMode = useCallback(\n async (\n orderedRequests: CapturedProviderRequest[],\n template: SatyaProviderTemplate,\n partialEndpointsAllowed: boolean\n ) => {\n if (teeSelection.type === 'tee-replay') {\n const sequence = flowSequenceRef.current;\n replayStartedRef.current = true;\n setRunning(true);\n clearError();\n try {\n const preparedRequests = orderedRequests.map((request) =>\n prepareTeeCapturedRequest(request, template, bearerRef.current)\n );\n await runTeeReplayBundle(preparedRequests, template, partialEndpointsAllowed);\n } catch (cause) {\n if (sequence === flowSequenceRef.current)\n fail(asSatyaError(cause, SatyaErrorCode.TEE_REPLAY_FAILED));\n } finally {\n if (sequence === flowSequenceRef.current) {\n setRunning(false);\n replayStartedRef.current = false;\n }\n }\n return;\n }\n await runBundleReplay(orderedRequests, template, partialEndpointsAllowed);\n },\n [clearError, fail, runBundleReplay, runTeeReplayBundle, teeSelection.type]\n );\n\n const { clearCompositeCapture, handleCompositeCaptureMessage } = useCompositeCaptureController({\n emitProgress,\n emitFunnel,\n fail,\n onRequestCaptured,\n replayStartedRef,\n resolved,\n runBundleReplay: runBundleReplayForMode,\n setCapturedRequest,\n });\n\n const unsupportedSelection = teeSelection.type === 'unsupported' ? teeSelection : undefined;\n\n const { openFlow, closeFlow } = useProviderFlowLifecycle({\n providerSession,\n sessionPolicy,\n resolveSessionPolicy,\n setProviderSessionHandle,\n startupError: unsupportedSelection\n ? satyaError(unsupportedSelection.code, unsupportedSelection.message)\n : undefined,\n onCaptureStart: (template, signal) => {\n if (teeSelection.type === 'tee-replay') {\n teePreparation.prepare(\n template,\n { ...teeSwapArgs, signal, getSignal: undefined },\n isPartialEndpointsAllowedForProvider(template.providerId)\n );\n }\n },\n providerId,\n endpointId,\n proofPlanId,\n providerTemplate,\n spkiPins,\n providerPolicyRefresh,\n transportConfig,\n verifyBackend,\n autoStart,\n disabled,\n prefetch,\n providedWebView,\n webViewUserAgent,\n debugEnabled,\n onCancel,\n emitProgress,\n beginFunnelAttempt,\n emitFunnelCancelled,\n fail,\n clearCompositeCapture,\n beginVerificationPresentation,\n endVerificationPresentation,\n renewWebViewBridgeCapability,\n resolved,\n modalVisible,\n running,\n flowAbortControllerRef,\n flowSequenceRef,\n replayStartedRef,\n htmlCaptureFetchedRef,\n pendingRequestRef,\n bearerRef,\n loggedInRef,\n loginSubmitAttemptRef,\n setRunning,\n setCapturedRequest,\n clearError,\n setResolved,\n setResolvedWebView,\n setEffectiveUserAgent,\n setWebViewUrl,\n setManagedPopup,\n setContentReady,\n setPopupContentReady,\n setPageLoading,\n setMainDocumentScriptReady,\n setPopupDocumentScriptReady,\n setModalVisible,\n setBrowserChrome,\n setPopupChrome,\n });\n\n const captureAndReplay = useCallback(\n (request: CapturedProviderRequest, template: SatyaProviderTemplate) => {\n const replayRequest =\n teeSelection.type === 'tee-replay'\n ? prepareTeeCapturedRequest(request, template, bearerRef.current)\n : rewriteForNativeReplay(request, template, bearerRef.current);\n if (replayRequest.url !== request.url) {\n satyaDebug.info('capture', 'rewrote captured URL for native replay', {\n from: request.url,\n to: replayRequest.url,\n injectedBearer: replayRequest.headers.authorization !== request.headers.authorization,\n });\n }\n satyaDebug.info('capture', 'request captured — starting native replay', {\n providerId: template.providerId,\n request: summarizeRequest(replayRequest),\n });\n setCapturedRequest(replayRequest);\n onRequestCaptured?.(replayRequest, template);\n emitProgress({\n phase: 'requestCaptured',\n message: `Matched ${providerDisplayName(template)} request captured`,\n percent: 0.08,\n providerId: template.providerId,\n });\n emitFunnel(SdkFunnelEvent.EndpointMatched, {\n providerId: template.providerId,\n endpointId: template.selectedEndpointId,\n ...endpointMatchTelemetryContext(template.proofTarget, replayRequest.url),\n method: replayRequest.method,\n });\n runReplay(replayRequest, template).catch(fail);\n },\n [emitFunnel, emitProgress, fail, onRequestCaptured, runReplay, teeSelection.type]\n );\n\n const currentProviderId =\n resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId;\n\n // LOGIN_COMPLETED fires once per attempt from whichever login-done signal\n // arrives first: `__satyaReady` (via signalUserInteractionComplete) or an\n // accepted `auth.submitSignal` response. logData fields are derived and\n // PII-free (closed enums, registry-declared ids, buckets, timings).\n const emitLoginCompleted = useCallback(\n (details?: LoginCompletionDetails) => {\n emitFunnel(\n SdkFunnelEvent.LoginCompleted,\n {\n providerId: currentProviderId,\n loginSignalSource: details?.source ?? 'satyaReady',\n loginSignalId: details?.signalId,\n submitStatusClass: details?.submitStatusClass,\n loginBodyMatched: details?.bodyMatched,\n loginLatencyMs: getAttemptElapsedMs(),\n captureMode: resolved?.template.selectedProofPlan ? 'composite' : 'single',\n },\n { oncePerAttempt: true }\n );\n },\n [currentProviderId, emitFunnel, getAttemptElapsedMs, resolved?.template.selectedProofPlan]\n );\n\n const {\n closeManagedPopup,\n navigateOpenerFromPopup,\n openManagedPopup,\n relayOpenerToPopupMessage,\n relayOpenerToPopupPortMessage,\n relayPopupPortMessage,\n relayPopupPostMessage,\n } = useManagedPopupController({\n emitProgress,\n managedPopup,\n popupChromeUrl: popupChrome.url,\n popupRef,\n providerId: currentProviderId,\n setBrowserChrome,\n setManagedPopup,\n setPopupChrome,\n setPopupContentReady,\n setPopupDocumentScriptReady,\n setWebViewUrl,\n webRef,\n });\n\n const handleHardwareBack = useCallback(() => {\n if (managedPopup) {\n closeManagedPopup();\n return;\n }\n closeFlow(true);\n }, [closeFlow, closeManagedPopup, managedPopup]);\n\n const edgeSwipeHandlers = useEdgeSwipeBack(handleHardwareBack);\n\n const handleModalRequestClose = useCallback(() => {\n // iOS sheet swipe-dismiss is native, so cancel the whole flow; Android back\n // pops an open popup first.\n if (Platform.OS === 'ios') {\n closeFlow(true);\n return;\n }\n handleHardwareBack();\n }, [closeFlow, handleHardwareBack]);\n\n const markContentReady = useCallback(() => setContentReady(true), []);\n const markPopupContentReady = useCallback(() => setPopupContentReady(true), []);\n const markLoadStart = useCallback(() => setPageLoading(true), []);\n const markLoadEnd = useCallback(() => setPageLoading(false), []);\n\n const handleReload = useCallback(() => {\n if (capturedRequest || verificationPresentation.covered) return;\n setPageLoading(true);\n webRef.current?.reload?.();\n }, [capturedRequest, verificationPresentation.covered]);\n\n const signalUserInteractionComplete = useCallback(\n (loginDetails?: LoginCompletionDetails) => {\n loginSubmitAttemptRef.current = null;\n // The message handler invokes this when `__satyaReady` arrives (which\n // also triggers the post-login cover below) — the LOGIN_COMPLETED site.\n emitLoginCompleted(loginDetails);\n // Native Android popup WebViews sit above React. Queue their concealment\n // before scheduling the React cover so no popup remains visibly on top.\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(true)\n .then(async (concealed) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (concealed) return;\n // Older/failing native binaries cannot hide a popup in place. Only\n // close popups after confirming this is still the originating flow.\n const closed = await closeNativePopupWindowsFailClosed();\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n // Closing one popup is not a persistent concealment mechanism: the\n // background page could open another. End this unsupported attempt\n // regardless of the close result.\n if (!closed) satyaDebug.warn('webview', 'could not close native popup windows');\n closeFlow(true);\n })\n .catch(() => {\n if (isCurrentPresentationFlow(flowSequenceRef, flowSequence)) closeFlow(true);\n });\n verificationPresentation.signalUserInteractionComplete();\n },\n [\n closeFlow,\n emitLoginCompleted,\n setNativePopupWindowsConcealed,\n verificationPresentation.signalUserInteractionComplete,\n ]\n );\n\n const pendingConcealedRef = useRef(false);\n // Native popup concealment is asynchronous. Keep correlation outside React\n // state so a response/navigation that arrives before concealment completes\n // can still promote the eventual provisional cover to the accepted window.\n const loginSubmitArmRef = useRef(0);\n const loginSubmitConcealSequenceRef = useRef<number | null>(null);\n const loginSubmitAcceptedSequenceRef = useRef<number | null>(null);\n const presentationStateRef = useRef(verificationPresentation.state);\n const presentationState = verificationPresentation.state;\n // Bridge callbacks may run before passive effects. A layout effect updates\n // the guard as part of the commit, before native events can deliver a retry.\n useLayoutEffect(() => {\n presentationStateRef.current = presentationState;\n }, [presentationState]);\n\n // The pre-emptive cover is a guess about what the user just did, so unlike\n // the confirmed cover it must degrade instead of failing closed: if native\n // popups cannot be concealed we simply do not cover, leaving today's\n // behavior. Ending a flow the user has not yet completed would be worse than\n // briefly showing the page we were trying to hide.\n const signalLoginSubmitted = useCallback(\n (signal: SatyaProviderLoginSubmitSignal): boolean => {\n // Only an uncovered provider view can be pre-emptively covered. Without\n // this guard a late signal — after the user returned to the provider, or\n // once the confirmed cover owns the screen — would still conceal Android\n // popups while the reducer refuses to cover, hiding them behind a visible\n // page. Also collapse duplicate bridge/navigation signals while native\n // concealment for this flow is in flight.\n if (presentationStateRef.current !== 'provider') return false;\n const flowSequence = flowSequenceRef.current;\n if (loginSubmitConcealSequenceRef.current === flowSequence) return false;\n loginSubmitConcealSequenceRef.current = flowSequence;\n loginSubmitAcceptedSequenceRef.current = null;\n const arm = ++loginSubmitArmRef.current;\n setNativePopupWindowsConcealed(true)\n .then((concealed) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n loginSubmitConcealSequenceRef.current = null;\n if (loginSubmitArmRef.current !== arm) {\n if (concealed) {\n setNativePopupWindowsConcealed(false).catch(() => {\n satyaDebug.warn('webview', 'could not restore native popup visibility');\n });\n }\n return;\n }\n if (!concealed) {\n loginSubmitAttemptRef.current = null;\n satyaDebug.warn('webview', 'skipping pre-emptive login cover: popups not concealable');\n return;\n }\n verificationPresentation.signalLoginSubmitted(signal.timeoutMs);\n if (loginSubmitAcceptedSequenceRef.current === flowSequence) {\n verificationPresentation.signalLoginSubmitAccepted();\n }\n })\n .catch(() => {\n if (isCurrentPresentationFlow(flowSequenceRef, flowSequence)) {\n loginSubmitConcealSequenceRef.current = null;\n loginSubmitAttemptRef.current = null;\n }\n satyaDebug.warn('webview', 'skipping pre-emptive login cover: conceal call failed');\n });\n return true;\n },\n [\n setNativePopupWindowsConcealed,\n verificationPresentation.signalLoginSubmitAccepted,\n verificationPresentation.signalLoginSubmitted,\n ]\n );\n\n const signalLoginSubmitAccepted = useCallback(\n (loginDetails?: LoginCompletionDetails) => {\n const flowSequence = flowSequenceRef.current;\n loginSubmitAcceptedSequenceRef.current = flowSequence;\n if (presentationStateRef.current === 'pendingLogin') {\n verificationPresentation.signalLoginSubmitAccepted();\n }\n emitLoginCompleted(loginDetails ?? { source: 'submitSignal' });\n },\n [emitLoginCompleted, verificationPresentation.signalLoginSubmitAccepted]\n );\n\n const signalLoginSubmitRejected = useCallback(() => {\n loginSubmitAttemptRef.current = null;\n loginSubmitAcceptedSequenceRef.current = null;\n loginSubmitConcealSequenceRef.current = null;\n loginSubmitArmRef.current += 1;\n presentationStateRef.current = 'provider';\n verificationPresentation.signalLoginSubmitRejected();\n }, [verificationPresentation.signalLoginSubmitRejected]);\n\n // Navigation while the provisional cover is up means the submission is still\n // resolving — a rejected login re-renders the form in place instead. Holding\n // here stops the cover lapsing mid-redirect and flashing the destination. A\n // navigation may race the asynchronous native concealment, so remember it as\n // accepted even before the React presentation reaches pendingLogin.\n const signalLoginNavigation = useCallback(() => {\n const flowSequence = flowSequenceRef.current;\n if (\n presentationStateRef.current !== 'pendingLogin' &&\n loginSubmitConcealSequenceRef.current !== flowSequence\n ) {\n return;\n }\n loginSubmitAcceptedSequenceRef.current = flowSequence;\n if (presentationStateRef.current === 'pendingLogin') {\n verificationPresentation.extendLoginSubmitPending();\n }\n }, [verificationPresentation.extendLoginSubmitPending]);\n\n // Restoring popups is driven off the state itself rather than the reject\n // callback, because the provisional cover also lapses on its own timer\n // inside the presentation hook. Both routes land back on 'provider'.\n useEffect(() => {\n if (presentationState === 'pendingLogin') {\n pendingConcealedRef.current = true;\n return;\n }\n if (!pendingConcealedRef.current) return;\n pendingConcealedRef.current = false;\n loginSubmitAttemptRef.current = null;\n // A promotion to the confirmed cover must keep popups concealed.\n if (presentationState !== 'provider') return;\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(false)\n .then((restored) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (!restored) satyaDebug.warn('webview', 'could not restore concealed native popups');\n })\n .catch(() => {});\n }, [presentationState, setNativePopupWindowsConcealed]);\n\n const returnToProvider = useCallback(() => {\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(false)\n .then((restored) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (restored) {\n verificationPresentation.returnToProvider();\n } else {\n satyaDebug.warn('webview', 'could not restore concealed native popup windows');\n closeFlow(true);\n }\n })\n .catch(() => {\n if (isCurrentPresentationFlow(flowSequenceRef, flowSequence)) closeFlow(true);\n });\n }, [closeFlow, setNativePopupWindowsConcealed, verificationPresentation.returnToProvider]);\n\n const handleMessage = useProviderMessageHandler({\n bearerRef,\n captureAndReplay,\n closeManagedPopup,\n loggedInRef,\n loginSubmitAttemptRef,\n onLoginSubmitted: signalLoginSubmitted,\n onLoginSubmitAccepted: signalLoginSubmitAccepted,\n onLoginSubmitRejected: signalLoginSubmitRejected,\n onUserInteractionComplete: signalUserInteractionComplete,\n onCompositeCaptureMessage: handleCompositeCaptureMessage,\n navigateOpenerFromPopup,\n openManagedPopup,\n pendingRequestRef,\n relayOpenerToPopupMessage,\n relayOpenerToPopupPortMessage,\n relayPopupPortMessage,\n relayPopupPostMessage,\n replayStartedRef,\n resolved,\n bridgeCapability: webViewBridgeCapability,\n webViewProps,\n });\n\n const {\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n } = useProviderNavigationHandlers({\n emitProgress,\n managedPopup,\n navigateOpenerFromPopup,\n onLoginNavigation: signalLoginNavigation,\n onLoginSubmitted: signalLoginSubmitted,\n openManagedPopup,\n providerId,\n providerTemplate,\n resolved,\n setBrowserChrome,\n setPopupChrome,\n setWebViewUrl,\n webRef,\n webViewProps,\n webViewUrl,\n });\n\n const maybeTriggerHtmlCapture = useHtmlCaptureTrigger({\n resolved,\n replayStartedRef,\n htmlCaptureFetchedRef,\n webRef,\n });\n\n const { mainInjectedScript, popupInjectedScript, useNativePopups } = useProviderInjectedScripts({\n providerSessionHandle,\n onSessionPreparationFailure: fail,\n bridgeCapability: webViewBridgeCapability,\n modalVisible,\n ResolvedWebView,\n resolved,\n managedPopup,\n debugEnabled,\n webHostRef,\n popupHostRef,\n setMainDocumentScriptReady,\n setPopupDocumentScriptReady,\n });\n\n const title =\n modalTitle ?? (resolved ? providerDisplayName(resolved.template) : 'Provider Attestation');\n const isProcessing = !!capturedRequest && !error;\n const isVerificationCovered = shouldConcealProviderContent(verificationPresentation.state, {\n captured: !!capturedRequest,\n error: !!error,\n });\n const preparing = modalVisible && !resolved && !error;\n const nativePopupConcealmentRequired = isVerificationCovered || !!error;\n useEffect(() => {\n // Before provider resolution there cannot be a provider-owned popup, so do\n // not treat an older native binary as a terminal concealment failure yet.\n if (!modalVisible || !resolved) return;\n let cancelled = false;\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(nativePopupConcealmentRequired)\n .then(async (concealed) => {\n if (cancelled || !isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (concealed) return;\n if (nativePopupConcealmentRequired) {\n await closeNativePopupWindowsFailClosed();\n if (cancelled || !isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n }\n closeFlow(true);\n })\n .catch(() => {\n if (cancelled || !isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n closeFlow(true);\n });\n return () => {\n cancelled = true;\n };\n }, [\n closeFlow,\n closeNativePopupWindowsFailClosed,\n modalVisible,\n nativePopupConcealmentRequired,\n resolved,\n setNativePopupWindowsConcealed,\n ]);\n // Browser-style loading line: tracks a document's load-start→load-end, not\n // attestation. Suppressed while the verification cover conceals the page so\n // background navigations don't telegraph through the chrome.\n const webViewLoading =\n !!resolved && !error && !isProcessing && !isVerificationCovered && pageLoading;\n const theme = resolveTheme(themeProp);\n const currentUrl = browserChrome.url || webViewUrl || '';\n const secureHost = hostFromUrl(currentUrl);\n const secureConnection = isSecureUrl(currentUrl);\n return {\n providerSessionHandle,\n buttonLabel,\n capturedRequest,\n closeFlow,\n closeManagedPopup,\n contentReady,\n disabled,\n edgeSwipeHandlers,\n effectiveUserAgent,\n error,\n errorCode,\n errorRetryable,\n handleHardwareBack,\n handleMessage,\n handleModalRequestClose,\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n handleReload,\n isProcessing,\n isVerificationCovered,\n mainDocumentScriptReady,\n mainInjectedScript,\n managedPopup,\n markContentReady,\n markLoadEnd,\n markLoadStart,\n markPopupContentReady,\n maybeTriggerHtmlCapture,\n modalVisible,\n openFlow,\n phase,\n sessionId: getSessionId(),\n attemptIndex: getAttemptIndex(),\n onCopySessionId,\n popupContentReady,\n popupDocumentScriptReady,\n popupHostRef,\n popupInjectedScript,\n popupRef,\n prefetch,\n preparing,\n presentation,\n resolved,\n ResolvedWebView,\n running,\n secureConnection,\n secureHost,\n webViewLoading,\n setBrowserChrome,\n setPopupChrome,\n theme,\n title,\n useNativePopups,\n webHostRef,\n webRef,\n webViewProps,\n webViewUrl,\n returnToProvider,\n verificationPresentationPending: verificationPresentation.pending,\n verificationPresentationStalled: verificationPresentation.stalled,\n };\n}\n\nexport type ProviderAttestFlow = Omit<\n ReturnType<typeof useProviderAttestFlow>,\n 'markLoadStart' | 'markLoadEnd'\n> & {\n markLoadStart: (url?: string) => void;\n markLoadEnd: (url?: string) => void;\n isTeelsFlow?: boolean;\n handleContentProcessDidTerminate?: (event: unknown) => void;\n handleRenderProcessGone?: (event: unknown) => void;\n handleWebViewError?: (event: unknown) => void;\n handleWebViewHttpError?: (event: unknown) => void;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"useProviderAttestFlow.js","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderAttestFlow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAa,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAyB,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EACL,oBAAoB,EAEpB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAEL,oBAAoB,GAUrB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,6BAA6B,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AACpC,OAAO,iBAAiB,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAgC,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,oCAAoC,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAO/D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEnF,MAAM,UAAU,qBAAqB,CACnC,EACE,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,qBAAqB,GAAG,gBAAgB,EACxC,eAAe,EACf,MAAM,EAAE,cAAc,EACtB,aAAa,GAAG,KAAK,EACrB,iBAAiB,GAAG,KAAK,EACzB,WAAW,EACX,WAAW,GAAG,sBAAsB,EACpC,QAAQ,GAAG,KAAK,EAChB,SAAS,GAAG,KAAK,EACjB,UAAU,EACV,YAAY,GAAG,OAAO,EACtB,QAAQ,GAAG,KAAK,EAChB,KAAK,EAAE,SAAS,EAChB,mBAAmB,GAAG,IAAI,EAC1B,gBAAgB,EAAE,eAAe,EACjC,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,QAAQ,EACR,eAAe,GACyB,EAC1C,cAAc,GAAG,IAAI;IAErB,MAAM,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAC;IAC1E,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxF,QAAQ,GAAG,QAAQ,IAAI,CAAC,aAAa,IAAI,CAAC,oBAAoB,CAAC;IAC/D,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,cAAc,IAAI,cAAc,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,wEAAwE;IACxE,+DAA+D;IAC/D,MAAM,EACJ,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,cAAc,GACf,GAAG,gBAAgB,CAClB,cAAc,IAAI,qBAAqB,EAAE,CAAC,eAAe,KAAK,YAAY;QACxE,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,SAAS,CACd,CAAC;IACF,MAAM,sBAAsB,GAAG,MAAM,CAAyB,IAAI,CAAC,CAAC;IACpE,MAAM,qBAAqB,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IAC7D,MAAM,iBAAiB,GAAG,MAAM,CAAiC,IAAI,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,sEAAsE;IACtE,uEAAuE;IACvE,MAAM,qBAAqB,GAAG,MAAM,CAA4B,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAC1E,iBAAiB,CAAC,6BAA6B,EAAE,CAClD,CAAC;IACF,MAAM,4BAA4B,GAAG,WAAW,CAAC,GAAG,EAAE;QACpD,0BAA0B,CAAC,iBAAiB,CAAC,6BAA6B,EAAE,CAAC,CAAC;IAChF,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,YAAY;YAAE,eAAe,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAyB,MAAM,CAAC,CAAC;IACnE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,kEAAkE;IAClE,iEAAiE;IACjE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAChE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAiB,IAAI,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAA0B,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAiC,IAAI,CAAC,CAAC;IAC7F,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAA0B,IAAI,CAAC,CAAC;IACtF,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAClF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAA2B,IAAI,CAAC,CAAC;IACjF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAqB,oBAAoB,CAAC,CAAC;IAC7F,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAqB,oBAAoB,CAAC,CAAC;IACzF,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IAClG,MAAM,CAAC,wBAAwB,EAAE,2BAA2B,CAAC,GAAG,QAAQ,CACtE,QAAQ,CAAC,EAAE,KAAK,SAAS,CAC1B,CAAC;IACF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,2DAA2D;IAC3D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClE,iFAAiF;IACjF,oDAAoD;IACpD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,MAAM,wBAAwB,GAAG,2BAA2B,CAAC;QAC3D,QAAQ,EAAE,CAAC,CAAC,eAAe;QAC3B,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,iCAAiC,GAAG,WAAW,CAAC,KAAK,IAAsB,EAAE;QACjF,8EAA8E;QAC9E,6EAA6E;QAC7E,6EAA6E;QAC7E,2EAA2E;QAC3E,2EAA2E;QAC3E,2EAA2E;QAC3E,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAC3C,IAAI,CAAC;YACH,OAAO,MAAM,iBAAiB,CAAC,iBAAiB,EAAE,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,8BAA8B,GAAG,WAAW,CAChD,KAAK,EAAE,SAAkB,EAAoB,EAAE;QAC7C,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAC3C,IAAI,OAAO,iBAAiB,CAAC,wBAAwB,KAAK,UAAU,EAAE,CAAC;YACrE,OAAO,CAAC,SAAS,CAAC;QACpB,CAAC;QACD,IAAI,CAAC;YACH,IAAI,MAAM,iBAAiB,CAAC,wBAAwB,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;QACvE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,6BAA6B,GAAG,wBAAwB,CAAC,SAAS,CAAC;IACzE,MAAM,2BAA2B,GAAG,wBAAwB,CAAC,OAAO,CAAC;IAErE,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;IAE3C,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,QAAmC,EAAE,EAAE;QACtC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzB,wEAAwE;QACxE,iEAAiE;QACjE,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;QACvC,UAAU,EAAE,CAAC;YACX,SAAS,EAAE,YAAY,EAAE;YACzB,YAAY,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;YACzD,GAAG,QAAQ;SACZ,CAAC,CAAC;IACL,CAAC,EACD,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,CAAC,CAC5D,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,MAAM,CAAC,iBAAiB,CAAC,CAAC,QAAuB,EAAE,EAAE;YAC1D,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ;gBAAE,OAAO;YACxC,YAAY,CAAC;gBACX,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,UAAU,IAAI,UAAU,IAAI,gBAAgB,EAAE,UAAU;gBACvF,KAAK,EAAE,QAAQ,CAAC,KAAK;aACtB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,EAAE;QACD,MAAM;QACN,YAAY;QACZ,UAAU;QACV,gBAAgB,EAAE,UAAU;QAC5B,QAAQ,EAAE,QAAQ,CAAC,UAAU;KAC9B,CAAC,CAAC;IAEH,+EAA+E;IAC/E,qEAAqE;IACrE,MAAM,aAAa,GAAG,WAAW,CAC/B,CACE,iBAAqC,EACrC,OAAgC,EAChC,SAAkB,EAClB,EAAE;QACF,IAAI,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAC1E,sBAAsB,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3F,CAAC,EACD,CAAC,WAAW,EAAE,iBAAiB,CAAC,CACjC,CAAC;IAEF,MAAM,IAAI,GAAG,WAAW,CACtB,CAAC,KAAc,EAAE,EAAE;QACjB,MAAM,eAAe,GACnB,QAAQ,EAAE,QAAQ,CAAC,UAAU,IAAI,UAAU,IAAI,gBAAgB,EAAE,UAAU,CAAC;QAC9E,MAAM,SAAS,GAAG,YAAY,CAC5B,KAAK,EACL,cAAc,CAAC,UAAU,EACzB,eAAe,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CACrE,CAAC;QACF,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YAC5E,UAAU,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACzC,CAAC;QACD,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;QACjC,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE;YACtC,UAAU,EAAE,eAAe;YAC3B,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,KAAK,EAAE,SAAS,CAAC,OAAO;SACzB,CAAC,CAAC;QACH,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5B,YAAY,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QACrC,iBAAiB,CACf,OAAO,SAAS,CAAC,OAAO,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CACvF,CAAC;QACF,YAAY,CAAC;YACX,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,OAAO,EAAE,CAAC;YACV,UAAU,EAAE,eAAe;YAC3B,KAAK,EAAE,SAAS,CAAC,WAAW;SAC7B,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAA4B,CAAC;QACjE,iEAAiE;QACjE,sEAAsE;QACtE,MAAM,iBAAiB,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,SAAS,CAAC;QAC1D,MAAM,kBAAkB,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,CAAC;QAC7D,MAAM,kBAAkB,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,CAAC;QAC7D,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE;YAChC,UAAU,EAAE,eAAe;YAC3B,SAAS,EAAE,SAAS,CAAC,IAAI;YACzB,oEAAoE;YACpE,YAAY,EAAE,SAAS,CAAC,OAAO;YAC/B,QAAQ,EAAE,SAAS,CAAC,KAAK;YACzB,SAAS,EAAE,OAAO,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YACzE,UAAU,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACnE,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,SAAS,EAAE,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YACxE,iBAAiB,EAAE,OAAO,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;YACxF,kBAAkB,EAAE,OAAO,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;YAC3F,kBAAkB,EAAE,OAAO,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;SAC5F,CAAC,CAAC;QACH,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACrB,aAAa,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC,EACD;QACE,UAAU;QACV,YAAY;QACZ,OAAO;QACP,KAAK;QACL,UAAU;QACV,gBAAgB,EAAE,UAAU;QAC5B,aAAa;QACb,QAAQ,EAAE,QAAQ,CAAC,UAAU;KAC9B,CACF,CAAC;IAEF,6EAA6E;IAC7E,6EAA6E;IAC7E,wEAAwE;IACxE,MAAM,qBAAqB,GAAG,WAAW,CACvC,CAAC,MAA+C,EAAE,EAAE;QAClD,UAAU,EAAE,CAAC;YACX,GAAG,MAAM;YACT,SAAS,EAAE,YAAY,EAAE;YACzB,YAAY,EAAE,eAAe,EAAE;SAChC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,CAAC,CAC5C,CAAC;IAEF,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,GAAG,qBAAqB,CAAC;QAC5E,wFAAwF;QACxF,wBAAwB,EAAE,GAAG,EAAE,CAAC,qBAAqB;QACrD,mBAAmB;QACnB,MAAM;QACN,YAAY;QACZ,UAAU;QACV,YAAY;QACZ,IAAI;QACJ,UAAU,EAAE,qBAAqB;QACjC,sBAAsB;QACtB,eAAe;QACf,gBAAgB;QAChB,aAAa;QACb,UAAU;QACV,eAAe;QACf,UAAU;QACV,eAAe;QACf,aAAa;KACd,CAAC,CAAC;IAEH,6EAA6E;IAC7E,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,YAAY,GAAG,kBAAkB,CACrC;QACE,UAAU;QACV,kBAAkB,EAAE,gBAAgB,EAAE,UAAU;QAChD,KAAK,EAAE,eAAe,EAAE,KAAK;QAC7B,cAAc;KACf,EACD,qBAAqB,EAAE,CACxB,CAAC;IACF,MAAM,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACpE,MAAM,WAAW,GAAsB;QACrC,wBAAwB,EAAE,GAAG,EAAE,CAAC,qBAAqB;QACrD,WAAW,EAAE,cAAc;QAC3B,SAAS,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM;QACvD,mBAAmB,EAAE,eAAe,EAAE,mBAAmB;QACzD,YAAY;QACZ,UAAU;QACV,mBAAmB;QACnB,WAAW,EAAE,eAAe,EAAE,WAAW,IAAI,EAAE;QAC/C,KAAK,EAAE,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QACnE,eAAe,EAAE,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;QAC9F,cAAc,EAAE,CAAC,QAA+B,EAAE,EAAE,CACjD,QAAiD,CAAC,WAAW,IAAI,QAAQ;QAC5E,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;YACvD,qBAAqB,CACnB,oBAAoB,CAClB,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAC5D,YAAY,EAAE,EACd,MAAM,EACN,SAAS,EACT,QAAQ,EACR,QAAQ,CACT,CACF,CAAC;YACF,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,aAAa,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACzC,IAAI,mBAAmB;gBAAE,eAAe,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,YAAY;KACb,CAAC;IACF,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IACjE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,YAAY;YAAE,cAAc,CAAC,MAAM,EAAE,CAAC;IAC7C,CAAC,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,WAAW,CAC3B,KAAK,EAAE,OAAgC,EAAE,QAA+B,EAAE,EAAE;QAC1E,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC;QACzC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;QAChC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,UAAU,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,QAAQ,KAAK,eAAe,CAAC,OAAO;gBACtC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAChE,CAAC;gBAAS,CAAC;YACT,IAAI,QAAQ,KAAK,eAAe,CAAC,OAAO,EAAE,CAAC;gBACzC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC,EACD,CAAC,YAAY,CAAC,IAAI,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,CAAC,CACrE,CAAC;IAEF,2EAA2E;IAC3E,4EAA4E;IAC5E,6EAA6E;IAC7E,8EAA8E;IAC9E,2EAA2E;IAC3E,cAAc;IACd,EAAE;IACF,4EAA4E;IAC5E,MAAM,sBAAsB,GAAG,WAAW,CACxC,KAAK,EACH,eAA0C,EAC1C,QAA+B,EAC/B,uBAAgC,EAChC,EAAE;QACF,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC;YACzC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,UAAU,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,gBAAgB,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACvD,yBAAyB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,CAChE,CAAC;gBACF,MAAM,kBAAkB,CAAC,gBAAgB,EAAE,QAAQ,EAAE,uBAAuB,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,QAAQ,KAAK,eAAe,CAAC,OAAO;oBACtC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAChE,CAAC;oBAAS,CAAC;gBACT,IAAI,QAAQ,KAAK,eAAe,CAAC,OAAO,EAAE,CAAC;oBACzC,UAAU,CAAC,KAAK,CAAC,CAAC;oBAClB,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;gBACnC,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,eAAe,CAAC,eAAe,EAAE,QAAQ,EAAE,uBAAuB,CAAC,CAAC;IAC5E,CAAC,EACD,CAAC,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,CAAC,IAAI,CAAC,CAC3E,CAAC;IAEF,MAAM,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,GAAG,6BAA6B,CAAC;QAC7F,YAAY;QACZ,UAAU;QACV,IAAI;QACJ,iBAAiB;QACjB,gBAAgB;QAChB,QAAQ;QACR,eAAe,EAAE,sBAAsB;QACvC,kBAAkB;KACnB,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,YAAY,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5F,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,wBAAwB,CAAC;QACvD,eAAe;QACf,aAAa;QACb,oBAAoB;QACpB,wBAAwB;QACxB,YAAY,EAAE,oBAAoB;YAChC,CAAC,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,CAAC,OAAO,CAAC;YACrE,CAAC,CAAC,SAAS;QACb,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;YACnC,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACvC,cAAc,CAAC,OAAO,CACpB,QAAQ,EACR,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAChD,oCAAoC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC1D,CAAC;YACJ,CAAC;QACH,CAAC;QACD,UAAU;QACV,UAAU;QACV,WAAW;QACX,gBAAgB;QAChB,QAAQ;QACR,qBAAqB;QACrB,eAAe;QACf,aAAa;QACb,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,eAAe;QACf,gBAAgB;QAChB,YAAY;QACZ,QAAQ;QACR,YAAY;QACZ,kBAAkB;QAClB,mBAAmB;QACnB,IAAI;QACJ,qBAAqB;QACrB,6BAA6B;QAC7B,2BAA2B;QAC3B,4BAA4B;QAC5B,QAAQ;QACR,YAAY;QACZ,OAAO;QACP,sBAAsB;QACtB,eAAe;QACf,gBAAgB;QAChB,qBAAqB;QACrB,iBAAiB;QACjB,SAAS;QACT,WAAW;QACX,qBAAqB;QACrB,UAAU;QACV,kBAAkB;QAClB,UAAU;QACV,WAAW;QACX,kBAAkB;QAClB,qBAAqB;QACrB,aAAa;QACb,eAAe;QACf,eAAe;QACf,oBAAoB;QACpB,cAAc;QACd,0BAA0B;QAC1B,2BAA2B;QAC3B,eAAe;QACf,gBAAgB;QAChB,cAAc;KACf,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,OAAgC,EAAE,QAA+B,EAAE,EAAE;QACpE,MAAM,aAAa,GACjB,YAAY,CAAC,IAAI,KAAK,YAAY;YAChC,CAAC,CAAC,yBAAyB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC;YACjE,CAAC,CAAC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;QACnE,IAAI,aAAa,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,wCAAwC,EAAE;gBACnE,IAAI,EAAE,OAAO,CAAC,GAAG;gBACjB,EAAE,EAAE,aAAa,CAAC,GAAG;gBACrB,cAAc,EAAE,aAAa,CAAC,OAAO,CAAC,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,aAAa;aACtF,CAAC,CAAC;QACL,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,2CAA2C,EAAE;YACtE,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,gBAAgB,CAAC,aAAa,CAAC;SACzC,CAAC,CAAC;QACH,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAClC,iBAAiB,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC7C,YAAY,CAAC;YACX,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,WAAW,mBAAmB,CAAC,QAAQ,CAAC,mBAAmB;YACpE,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,QAAQ,CAAC,UAAU;SAChC,CAAC,CAAC;QACH,UAAU,CAAC,cAAc,CAAC,eAAe,EAAE;YACzC,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,UAAU,EAAE,QAAQ,CAAC,kBAAkB;YACvC,GAAG,6BAA6B,CAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,GAAG,CAAC;YACzE,MAAM,EAAE,aAAa,CAAC,MAAM;SAC7B,CAAC,CAAC;QACH,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,EACD,CAAC,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,CAClF,CAAC;IAEF,MAAM,iBAAiB,GACrB,QAAQ,EAAE,QAAQ,CAAC,UAAU,IAAI,UAAU,IAAI,gBAAgB,EAAE,UAAU,CAAC;IAE9E,0EAA0E;IAC1E,0EAA0E;IAC1E,wEAAwE;IACxE,oEAAoE;IACpE,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,OAAgC,EAAE,EAAE;QACnC,UAAU,CACR,cAAc,CAAC,cAAc,EAC7B;YACE,UAAU,EAAE,iBAAiB;YAC7B,iBAAiB,EAAE,OAAO,EAAE,MAAM,IAAI,YAAY;YAClD,aAAa,EAAE,OAAO,EAAE,QAAQ;YAChC,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;YAC7C,gBAAgB,EAAE,OAAO,EAAE,WAAW;YACtC,cAAc,EAAE,mBAAmB,EAAE;YACrC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;SAC3E,EACD,EAAE,cAAc,EAAE,IAAI,EAAE,CACzB,CAAC;IACJ,CAAC,EACD,CAAC,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAC3F,CAAC;IAEF,MAAM,EACJ,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,EACrB,qBAAqB,GACtB,GAAG,yBAAyB,CAAC;QAC5B,YAAY;QACZ,YAAY;QACZ,cAAc,EAAE,WAAW,CAAC,GAAG;QAC/B,QAAQ;QACR,UAAU,EAAE,iBAAiB;QAC7B,gBAAgB;QAChB,eAAe;QACf,cAAc;QACd,oBAAoB;QACpB,2BAA2B;QAC3B,aAAa;QACb,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,IAAI,YAAY,EAAE,CAAC;YACjB,iBAAiB,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC,CAAC;IAEjD,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAE/D,MAAM,uBAAuB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/C,4EAA4E;QAC5E,4BAA4B;QAC5B,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YAC1B,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QACD,kBAAkB,EAAE,CAAC;IACvB,CAAC,EAAE,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEpC,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACtE,MAAM,qBAAqB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAChF,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,IAAI,eAAe,IAAI,wBAAwB,CAAC,OAAO;YAAE,OAAO;QAChE,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;IAC7B,CAAC,EAAE,CAAC,eAAe,EAAE,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;IAExD,MAAM,6BAA6B,GAAG,WAAW,CAC/C,CAAC,YAAqC,EAAE,EAAE;QACxC,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;QACrC,sEAAsE;QACtE,wEAAwE;QACxE,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACjC,yEAAyE;QACzE,wEAAwE;QACxE,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,8BAA8B,CAAC,IAAI,CAAC;aACjC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YACxB,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACtE,IAAI,SAAS;gBAAE,OAAO;YACtB,mEAAmE;YACnE,oEAAoE;YACpE,MAAM,MAAM,GAAG,MAAM,iCAAiC,EAAE,CAAC;YACzD,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACtE,mEAAmE;YACnE,mEAAmE;YACnE,kCAAkC;YAClC,IAAI,CAAC,MAAM;gBAAE,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,sCAAsC,CAAC,CAAC;YAChF,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QACL,wBAAwB,CAAC,6BAA6B,EAAE,CAAC;IAC3D,CAAC,EACD;QACE,SAAS;QACT,kBAAkB;QAClB,8BAA8B;QAC9B,wBAAwB,CAAC,6BAA6B;KACvD,CACF,CAAC;IAEF,MAAM,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,MAAM,iBAAiB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,6BAA6B,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAClE,MAAM,8BAA8B,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IACnE,MAAM,oBAAoB,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACpE,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,KAAK,CAAC;IACzD,2EAA2E;IAC3E,6EAA6E;IAC7E,eAAe,CAAC,GAAG,EAAE;QACnB,oBAAoB,CAAC,OAAO,GAAG,iBAAiB,CAAC;IACnD,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,2EAA2E;IAC3E,2EAA2E;IAC3E,qEAAqE;IACrE,6EAA6E;IAC7E,mDAAmD;IACnD,MAAM,oBAAoB,GAAG,WAAW,CACtC,CAAC,MAAsC,EAAW,EAAE;QAClD,wEAAwE;QACxE,yEAAyE;QACzE,yEAAyE;QACzE,0EAA0E;QAC1E,uEAAuE;QACvE,0CAA0C;QAC1C,IAAI,oBAAoB,CAAC,OAAO,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9D,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,IAAI,6BAA6B,CAAC,OAAO,KAAK,YAAY;YAAE,OAAO,KAAK,CAAC;QACzE,6BAA6B,CAAC,OAAO,GAAG,YAAY,CAAC;QACrD,8BAA8B,CAAC,OAAO,GAAG,IAAI,CAAC;QAC9C,MAAM,GAAG,GAAG,EAAE,iBAAiB,CAAC,OAAO,CAAC;QACxC,8BAA8B,CAAC,IAAI,CAAC;aACjC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;YAClB,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACtE,6BAA6B,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7C,IAAI,iBAAiB,CAAC,OAAO,KAAK,GAAG,EAAE,CAAC;gBACtC,IAAI,SAAS,EAAE,CAAC;oBACd,8BAA8B,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;wBAC/C,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,2CAA2C,CAAC,CAAC;oBAC1E,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;gBACrC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,0DAA0D,CAAC,CAAC;gBACvF,OAAO;YACT,CAAC;YACD,wBAAwB,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAChE,IAAI,8BAA8B,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;gBAC5D,wBAAwB,CAAC,yBAAyB,EAAE,CAAC;YACvD,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC,EAAE,CAAC;gBAC7D,6BAA6B,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC7C,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;YACvC,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,uDAAuD,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QACL,OAAO,IAAI,CAAC;IACd,CAAC,EACD;QACE,8BAA8B;QAC9B,wBAAwB,CAAC,yBAAyB;QAClD,wBAAwB,CAAC,oBAAoB;KAC9C,CACF,CAAC;IAEF,MAAM,yBAAyB,GAAG,WAAW,CAC3C,CAAC,YAAqC,EAAE,EAAE;QACxC,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,8BAA8B,CAAC,OAAO,GAAG,YAAY,CAAC;QACtD,IAAI,oBAAoB,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;YACpD,wBAAwB,CAAC,yBAAyB,EAAE,CAAC;QACvD,CAAC;QACD,kBAAkB,CAAC,YAAY,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;IACjE,CAAC,EACD,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,yBAAyB,CAAC,CACzE,CAAC;IAEF,MAAM,yBAAyB,GAAG,WAAW,CAAC,GAAG,EAAE;QACjD,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;QACrC,8BAA8B,CAAC,OAAO,GAAG,IAAI,CAAC;QAC9C,6BAA6B,CAAC,OAAO,GAAG,IAAI,CAAC;QAC7C,iBAAiB,CAAC,OAAO,IAAI,CAAC,CAAC;QAC/B,oBAAoB,CAAC,OAAO,GAAG,UAAU,CAAC;QAC1C,wBAAwB,CAAC,yBAAyB,EAAE,CAAC;IACvD,CAAC,EAAE,CAAC,wBAAwB,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAEzD,6EAA6E;IAC7E,6EAA6E;IAC7E,4EAA4E;IAC5E,6EAA6E;IAC7E,oEAAoE;IACpE,MAAM,qBAAqB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7C,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,IACE,oBAAoB,CAAC,OAAO,KAAK,cAAc;YAC/C,6BAA6B,CAAC,OAAO,KAAK,YAAY,EACtD,CAAC;YACD,OAAO;QACT,CAAC;QACD,8BAA8B,CAAC,OAAO,GAAG,YAAY,CAAC;QACtD,IAAI,oBAAoB,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;YACpD,wBAAwB,CAAC,wBAAwB,EAAE,CAAC;QACtD,CAAC;IACH,CAAC,EAAE,CAAC,wBAAwB,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAExD,yEAAyE;IACzE,uEAAuE;IACvE,qEAAqE;IACrE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,iBAAiB,KAAK,cAAc,EAAE,CAAC;YACzC,mBAAmB,CAAC,OAAO,GAAG,IAAI,CAAC;YACnC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,OAAO;YAAE,OAAO;QACzC,mBAAmB,CAAC,OAAO,GAAG,KAAK,CAAC;QACpC,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;QACrC,iEAAiE;QACjE,IAAI,iBAAiB,KAAK,UAAU;YAAE,OAAO;QAC7C,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,8BAA8B,CAAC,KAAK,CAAC;aAClC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjB,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACtE,IAAI,CAAC,QAAQ;gBAAE,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,2CAA2C,CAAC,CAAC;QACzF,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC,EAAE,CAAC,iBAAiB,EAAE,8BAA8B,CAAC,CAAC,CAAC;IAExD,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,8BAA8B,CAAC,KAAK,CAAC;aAClC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjB,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACtE,IAAI,QAAQ,EAAE,CAAC;gBACb,wBAAwB,CAAC,gBAAgB,EAAE,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,kDAAkD,CAAC,CAAC;gBAC/E,SAAS,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,SAAS,EAAE,8BAA8B,EAAE,wBAAwB,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAE3F,MAAM,aAAa,GAAG,yBAAyB,CAAC;QAC9C,SAAS;QACT,gBAAgB;QAChB,iBAAiB;QACjB,WAAW;QACX,qBAAqB;QACrB,gBAAgB,EAAE,oBAAoB;QACtC,qBAAqB,EAAE,yBAAyB;QAChD,qBAAqB,EAAE,yBAAyB;QAChD,yBAAyB,EAAE,6BAA6B;QACxD,yBAAyB,EAAE,6BAA6B;QACxD,uBAAuB;QACvB,gBAAgB;QAChB,iBAAiB;QACjB,yBAAyB;QACzB,6BAA6B;QAC7B,qBAAqB;QACrB,qBAAqB;QACrB,gBAAgB;QAChB,QAAQ;QACR,gBAAgB,EAAE,uBAAuB;QACzC,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,EACJ,2BAA2B,EAC3B,gBAAgB,EAChB,gCAAgC,EAChC,qBAAqB,EACrB,qCAAqC,EACrC,gCAAgC,GACjC,GAAG,6BAA6B,CAAC;QAChC,YAAY;QACZ,YAAY;QACZ,iBAAiB,EAAE,qBAAqB;QACxC,gBAAgB,EAAE,oBAAoB;QACtC,gBAAgB;QAChB,UAAU;QACV,gBAAgB;QAChB,QAAQ;QACR,gBAAgB;QAChB,cAAc;QACd,aAAa;QACb,MAAM;QACN,YAAY;QACZ,UAAU;KACX,CAAC,CAAC;IAEH,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;QACpD,QAAQ;QACR,gBAAgB;QAChB,qBAAqB;QACrB,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,GAAG,0BAA0B,CAAC;QAC9F,qBAAqB;QACrB,2BAA2B,EAAE,IAAI;QACjC,gBAAgB,EAAE,uBAAuB;QACzC,YAAY;QACZ,eAAe;QACf,QAAQ;QACR,YAAY;QACZ,YAAY;QACZ,UAAU;QACV,YAAY;QACZ,0BAA0B;QAC1B,2BAA2B;KAC5B,CAAC,CAAC;IAEH,MAAM,KAAK,GACT,UAAU,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;IAC7F,MAAM,YAAY,GAAG,CAAC,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC;IACjD,MAAM,qBAAqB,GAAG,4BAA4B,CAAC,wBAAwB,CAAC,KAAK,EAAE;QACzF,QAAQ,EAAE,CAAC,CAAC,eAAe;QAC3B,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,YAAY,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC;IACtD,MAAM,8BAA8B,GAAG,qBAAqB,IAAI,CAAC,CAAC,KAAK,CAAC;IACxE,SAAS,CAAC,GAAG,EAAE;QACb,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ;YAAE,OAAO;QACvC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,8BAA8B,CAAC,8BAA8B,CAAC;aAC3D,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YACxB,IAAI,SAAS,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACnF,IAAI,SAAS;gBAAE,OAAO;YACtB,IAAI,8BAA8B,EAAE,CAAC;gBACnC,MAAM,iCAAiC,EAAE,CAAC;gBAC1C,IAAI,SAAS,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;oBAAE,OAAO;YACrF,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,SAAS,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,YAAY,CAAC;gBAAE,OAAO;YACnF,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE;QACD,SAAS;QACT,iCAAiC;QACjC,YAAY;QACZ,8BAA8B;QAC9B,QAAQ;QACR,8BAA8B;KAC/B,CAAC,CAAC;IACH,2EAA2E;IAC3E,4EAA4E;IAC5E,6DAA6D;IAC7D,MAAM,cAAc,GAClB,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,IAAI,CAAC,qBAAqB,IAAI,WAAW,CAAC;IACjF,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,IAAI,UAAU,IAAI,EAAE,CAAC;IACzD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,gBAAgB,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACjD,OAAO;QACL,qBAAqB;QACrB,WAAW;QACX,eAAe;QACf,SAAS;QACT,iBAAiB;QACjB,YAAY;QACZ,QAAQ;QACR,iBAAiB;QACjB,kBAAkB;QAClB,KAAK;QACL,SAAS;QACT,cAAc;QACd,kBAAkB;QAClB,aAAa;QACb,uBAAuB;QACvB,2BAA2B;QAC3B,gBAAgB;QAChB,gCAAgC;QAChC,qBAAqB;QACrB,qCAAqC;QACrC,gCAAgC;QAChC,YAAY;QACZ,YAAY;QACZ,qBAAqB;QACrB,uBAAuB;QACvB,kBAAkB;QAClB,YAAY;QACZ,gBAAgB;QAChB,WAAW;QACX,aAAa;QACb,qBAAqB;QACrB,uBAAuB;QACvB,YAAY;QACZ,QAAQ;QACR,KAAK;QACL,SAAS,EAAE,YAAY,EAAE;QACzB,YAAY,EAAE,eAAe,EAAE;QAC/B,eAAe;QACf,iBAAiB;QACjB,wBAAwB;QACxB,YAAY;QACZ,mBAAmB;QACnB,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,YAAY;QACZ,QAAQ;QACR,eAAe;QACf,OAAO;QACP,gBAAgB;QAChB,UAAU;QACV,cAAc;QACd,gBAAgB;QAChB,cAAc;QACd,KAAK;QACL,KAAK;QACL,eAAe;QACf,UAAU;QACV,MAAM;QACN,YAAY;QACZ,UAAU;QACV,gBAAgB;QAChB,+BAA+B,EAAE,wBAAwB,CAAC,OAAO;QACjE,+BAA+B,EAAE,wBAAwB,CAAC,OAAO;KAClE,CAAC;AACJ,CAAC","sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Platform, type View } from 'react-native';\n\nimport { selectProviderFlow } from './flowSelection';\nimport { providerDisplayName, type ResolvedProvider } from './providerResolution';\nimport { prepareTeeCapturedRequest, rewriteForNativeReplay } from './replayRewrite';\nimport { teeAttestationResult } from './tee/teeResult';\nimport {\n TeeBundlePreparation,\n type TeeReplaySwapArgs,\n useTeeReplayBundleSwap,\n useTeeReplaySwap,\n} from './tee/useTeeReplaySwap';\nimport { resolveTheme } from './theme';\nimport {\n BrowserChromeState,\n EMPTY_BROWSER_CHROME,\n LoginCompletionDetails,\n LoginSubmitAttempt,\n ManagedPopupState,\n SatyaModeAwareProviderAttestButtonProps,\n SatyaModeAwareProviderAttestationResult,\n SatyaProviderFlowPhase,\n SatyaProviderFlowProgress,\n WebViewComponent,\n WebViewRefLike,\n} from './types';\nimport { endpointMatchTelemetryContext, hostFromUrl, isSecureUrl } from './urlUtils';\nimport { useCompositeCaptureController } from './useCompositeCaptureController';\nimport { useEdgeSwipeBack } from './useEdgeSwipeBack';\nimport { useFunnelEmitter } from './useFunnelEmitter';\nimport { useHtmlCaptureTrigger } from './useHtmlCaptureTrigger';\nimport { useManagedPopupController } from './useManagedPopupController';\nimport { useNativeReplayRunner } from './useNativeReplayRunner';\nimport { useProviderFlowLifecycle } from './useProviderFlowLifecycle';\nimport { useProviderInjectedScripts } from './useProviderInjectedScripts';\nimport { useProviderMessageHandler } from './useProviderMessageHandler';\nimport { useProviderNavigationHandlers } from './useProviderNavigationHandlers';\nimport { useVerificationPresentation } from './useVerificationPresentation';\nimport {\n isCurrentPresentationFlow,\n shouldConcealProviderContent,\n} from './verificationPresentation';\nimport SatyaAttestModule from '../../SatyaAttestModule';\nimport { SatyaMobileClient } from '../../SatyaMobileClient';\nimport { isSatyaDebugEnabled, satyaDebug, summarizeRequest } from '../../debugLog';\nimport { reportSatyaDiagnostics, type SatyaDiagnosticsOutcome } from '../../diagnostics';\nimport { ProviderSessionController } from '../../providerSessions';\nimport { getSatyaRuntimeConfig, isPartialEndpointsAllowedForProvider } from '../../satyaConfig';\nimport { SdkFunnelEvent } from '../../sdkEventLog';\nimport { asTeeError, teeErrorLogData } from '../../tee/errors';\nimport {\n CapturedProviderRequest,\n SatyaProgress,\n SatyaProviderLoginSubmitSignal,\n SatyaProviderTemplate,\n} from '../../types';\nimport { satyaError, SatyaErrorCode, asSatyaError } from '../../types/error.types';\n\nexport function useProviderAttestFlow(\n {\n providerId,\n sessionPolicy,\n resolveSessionPolicy,\n endpointId,\n proofPlanId,\n providerTemplate,\n spkiPins,\n providerPolicyRefresh = 'verifier-first',\n transportConfig,\n client: providedClient,\n verifyBackend = false,\n reportDiagnostics = false,\n diagnostics,\n buttonLabel = 'Generate Attestation',\n disabled = false,\n autoStart = false,\n modalTitle,\n presentation = 'sheet',\n prefetch = false,\n theme: themeProp,\n autoCloseOnComplete = true,\n WebViewComponent: providedWebView,\n webViewUserAgent,\n webViewProps,\n onProgress,\n onRequestCaptured,\n onComplete,\n onError,\n onCancel,\n onCopySessionId,\n }: SatyaModeAwareProviderAttestButtonProps,\n allowTeeReplay = true\n) {\n const [providerSession] = useState(() => new ProviderSessionController());\n const [providerSessionHandle, setProviderSessionHandle] = useState<string | null>(null);\n prefetch = prefetch && !sessionPolicy && !resolveSessionPolicy;\n const fallbackClient = useMemo(() => new SatyaMobileClient(), []);\n const client = providedClient ?? fallbackClient;\n const webRef = useRef<WebViewRefLike | null>(null);\n const popupRef = useRef<WebViewRefLike | null>(null);\n const webHostRef = useRef<View | null>(null);\n const popupHostRef = useRef<View | null>(null);\n const replayStartedRef = useRef(false);\n const flowSequenceRef = useRef(0);\n // Funnel logging: sessionId is stable per mounted flow (one user task),\n // reused across retries; attemptIndex increments per openFlow.\n const {\n emitFunnel,\n beginFunnelAttempt,\n emitFunnelCancelled,\n getSessionId,\n getAttemptIndex,\n getAttemptElapsedMs,\n setFunnelPhase,\n } = useFunnelEmitter(\n allowTeeReplay && getSatyaRuntimeConfig().attestationMode === 'tee-replay'\n ? 'tee-replay'\n : undefined\n );\n const flowAbortControllerRef = useRef<AbortController | null>(null);\n const htmlCaptureFetchedRef = useRef<Set<string>>(new Set());\n const pendingRequestRef = useRef<CapturedProviderRequest | null>(null);\n const bearerRef = useRef<string | null>(null);\n const loggedInRef = useRef(false);\n // Correlates the login submission with its own response so a rejected\n // submission can uncover immediately instead of waiting out the timer.\n const loginSubmitAttemptRef = useRef<LoginSubmitAttempt | null>(null);\n const [webViewBridgeCapability, setWebViewBridgeCapability] = useState(() =>\n SatyaAttestModule.createWebViewBridgeCapability()\n );\n const renewWebViewBridgeCapability = useCallback(() => {\n setWebViewBridgeCapability(SatyaAttestModule.createWebViewBridgeCapability());\n }, []);\n const [modalVisible, setModalVisible] = useState(false);\n useEffect(() => {\n if (!modalVisible) providerSession.release().catch(() => undefined);\n }, [modalVisible, providerSession]);\n const [phase, setPhase] = useState<SatyaProviderFlowPhase>('idle');\n const [error, setError] = useState<string | null>(null);\n // Typed code alongside the message so the UI can tell a permanent\n // authorization refusal from a transient failure worth retrying.\n const [errorCode, setErrorCode] = useState<string | null>(null);\n const [errorRetryable, setErrorRetryable] = useState<boolean | null>(null);\n const clearError = useCallback(() => {\n setError(null);\n setErrorCode(null);\n setErrorRetryable(null);\n }, []);\n const [resolved, setResolved] = useState<ResolvedProvider | null>(null);\n const [capturedRequest, setCapturedRequest] = useState<CapturedProviderRequest | null>(null);\n const [ResolvedWebView, setResolvedWebView] = useState<WebViewComponent | null>(null);\n const [effectiveUserAgent, setEffectiveUserAgent] = useState<string | null>(null);\n const [webViewUrl, setWebViewUrl] = useState<string | null>(null);\n const [managedPopup, setManagedPopup] = useState<ManagedPopupState | null>(null);\n const [browserChrome, setBrowserChrome] = useState<BrowserChromeState>(EMPTY_BROWSER_CHROME);\n const [popupChrome, setPopupChrome] = useState<BrowserChromeState>(EMPTY_BROWSER_CHROME);\n const [mainDocumentScriptReady, setMainDocumentScriptReady] = useState(Platform.OS !== 'android');\n const [popupDocumentScriptReady, setPopupDocumentScriptReady] = useState(\n Platform.OS !== 'android'\n );\n const [running, setRunning] = useState(false);\n // Gates the fade-in cover until each WebView first paints.\n const [contentReady, setContentReady] = useState(false);\n const [popupContentReady, setPopupContentReady] = useState(false);\n // Load-start→load-end only; NOT browserChrome.loading, which SPA nav events keep\n // re-asserting after the page has already rendered.\n const [pageLoading, setPageLoading] = useState(false);\n\n const verificationPresentation = useVerificationPresentation({\n captured: !!capturedRequest,\n error: !!error,\n modalVisible,\n });\n\n const closeNativePopupWindowsFailClosed = useCallback(async (): Promise<boolean> => {\n // Native popup WebViews are an Android-only mechanism and `closePopupWindows`\n // is declared only in the Kotlin module, so on iOS there is nothing to close\n // and the call itself would throw. Both current callers are already gated by\n // `setNativePopupWindowsConcealed` returning true off Android, which makes\n // this unreachable there today — state the platform assumption rather than\n // leaving it to depend on a caller's short-circuit, and match the sibling.\n if (Platform.OS !== 'android') return true;\n try {\n return await SatyaAttestModule.closePopupWindows();\n } catch {\n return false;\n }\n }, []);\n\n const setNativePopupWindowsConcealed = useCallback(\n async (concealed: boolean): Promise<boolean> => {\n if (Platform.OS !== 'android') return true;\n if (typeof SatyaAttestModule.setPopupWindowsConcealed !== 'function') {\n return !concealed;\n }\n try {\n if (await SatyaAttestModule.setPopupWindowsConcealed(concealed)) return true;\n } catch {\n // The caller applies flow scoping before taking any fallback action.\n }\n return false;\n },\n []\n );\n\n const beginVerificationPresentation = verificationPresentation.beginFlow;\n const endVerificationPresentation = verificationPresentation.endFlow;\n\n const debugEnabled = isSatyaDebugEnabled();\n\n const emitProgress = useCallback(\n (progress: SatyaProviderFlowProgress) => {\n setFunnelPhase(progress.phase);\n setPhase(progress.phase);\n // Stamp the correlation ids so hosts see them on EVERY progress update,\n // not only on the terminal result. Fields set by the caller win.\n const attemptIndex = getAttemptIndex();\n onProgress?.({\n sessionId: getSessionId(),\n attemptIndex: attemptIndex > 0 ? attemptIndex : undefined,\n ...progress,\n });\n },\n [getAttemptIndex, getSessionId, onProgress, setFunnelPhase]\n );\n\n useEffect(() => {\n return client.subscribeProgress((progress: SatyaProgress) => {\n if (progress.phase === 'failed') return;\n emitProgress({\n phase: progress.phase,\n message: progress.message,\n percent: progress.percent,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n error: progress.error,\n });\n });\n }, [\n client,\n emitProgress,\n providerId,\n providerTemplate?.providerId,\n resolved?.template.providerId,\n ]);\n\n // Opt-in, fire-and-forget outcome report to the Satya observability collector.\n // No-ops unless `reportDiagnostics` is enabled with a collector URL.\n const reportOutcome = useCallback(\n (\n outcomeProviderId: string | undefined,\n outcome: SatyaDiagnosticsOutcome,\n latencyMs?: number\n ) => {\n if (!reportDiagnostics || !diagnostics?.url || !outcomeProviderId) return;\n reportSatyaDiagnostics(diagnostics, { provider: outcomeProviderId, outcome, latencyMs });\n },\n [diagnostics, reportDiagnostics]\n );\n\n const fail = useCallback(\n (cause: unknown) => {\n const errorProviderId =\n resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId;\n const nextError = asSatyaError(\n cause,\n SatyaErrorCode.UNEXPECTED,\n errorProviderId ? { providerId: errorProviderId, phase } : { phase }\n );\n if (nextError.code.startsWith('SATYA_TEE_') && !nextError.context?.teeStage) {\n asTeeError(nextError, 'configuration');\n }\n replayStartedRef.current = false;\n setRunning(false);\n satyaDebug.error('flow', 'flow failed', {\n providerId: errorProviderId,\n errorId: nextError.errorId,\n code: nextError.code,\n stage: nextError.stage,\n error: nextError.message,\n });\n setError(nextError.message);\n setErrorCode(nextError.code ?? null);\n setErrorRetryable(\n typeof nextError.context?.retryable === 'boolean' ? nextError.context.retryable : null\n );\n emitProgress({\n phase: 'failed',\n message: nextError.message,\n percent: 1,\n providerId: errorProviderId,\n error: nextError.diagnostics,\n });\n const ctx = (nextError.context ?? {}) as Record<string, unknown>;\n // The verifier's v2 envelope lands under serverCode/serverClass/\n // serverStage (satyaErrorFromEnvelope); older paths used errorCode/*.\n const verifierErrorCode = ctx.serverCode ?? ctx.errorCode;\n const verifierErrorClass = ctx.serverClass ?? ctx.errorClass;\n const verifierErrorStage = ctx.serverStage ?? ctx.errorStage;\n emitFunnel(SdkFunnelEvent.Failed, {\n providerId: errorProviderId,\n errorCode: nextError.code,\n // Raw message — scrubbed of secrets + length-capped in sdkEventLog.\n errorMessage: nextError.message,\n sdkStage: nextError.stage,\n retryable: typeof ctx.retryable === 'boolean' ? ctx.retryable : undefined,\n httpStatus: typeof ctx.status === 'number' ? ctx.status : undefined,\n ...(ctx.mode === 'tee-replay' ? teeErrorLogData(nextError) : {}),\n errorId: nextError.errorId,\n requestId: typeof ctx.requestId === 'string' ? ctx.requestId : undefined,\n verifierErrorCode: typeof verifierErrorCode === 'string' ? verifierErrorCode : undefined,\n verifierErrorClass: typeof verifierErrorClass === 'string' ? verifierErrorClass : undefined,\n verifierErrorStage: typeof verifierErrorStage === 'string' ? verifierErrorStage : undefined,\n });\n onError?.(nextError);\n reportOutcome(errorProviderId, 'failed');\n },\n [\n emitFunnel,\n emitProgress,\n onError,\n phase,\n providerId,\n providerTemplate?.providerId,\n reportOutcome,\n resolved?.template.providerId,\n ]\n );\n\n // Surface sessionId + attemptIndex on the onComplete result so host apps can\n // correlate a successful attestation with its session (the modal auto-closes\n // on success, so flow.sessionId is otherwise unreadable at that point).\n const onCompleteWithSession = useCallback(\n (result: SatyaModeAwareProviderAttestationResult) => {\n onComplete?.({\n ...result,\n sessionId: getSessionId(),\n attemptIndex: getAttemptIndex(),\n });\n },\n [getAttemptIndex, getSessionId, onComplete]\n );\n\n const { runReplay: runNativeReplay, runBundleReplay } = useNativeReplayRunner({\n // Late messages must retain their retired handle instead of selecting the shared store.\n getProviderSessionHandle: () => providerSessionHandle,\n autoCloseOnComplete,\n client,\n emitProgress,\n emitFunnel,\n getSessionId,\n fail,\n onComplete: onCompleteWithSession,\n flowAbortControllerRef,\n flowSequenceRef,\n replayStartedRef,\n reportOutcome,\n clearError,\n setModalVisible,\n setRunning,\n transportConfig,\n verifyBackend,\n });\n\n // TEE replay reuses everything above and changes only the post-capture step.\n // Selection is read from the live runtime config rather than a prop so a\n // mode set by initSatyaAttest applies without threading it through callers.\n const teeSelection = selectProviderFlow(\n {\n providerId,\n providerTemplateId: providerTemplate?.providerId,\n appId: transportConfig?.appId,\n allowTeeReplay,\n },\n getSatyaRuntimeConfig()\n );\n const [teePreparation] = useState(() => new TeeBundlePreparation());\n const teeSwapArgs: TeeReplaySwapArgs = {\n getProviderSessionHandle: () => providerSessionHandle,\n preparation: teePreparation,\n getSignal: () => flowAbortControllerRef.current?.signal,\n verifierBearerToken: transportConfig?.verifierBearerToken,\n getSessionId,\n emitFunnel,\n getAttemptElapsedMs,\n verifierUrl: transportConfig?.verifierUrl ?? '',\n appId: teeSelection.type === 'tee-replay' ? teeSelection.appId : '',\n replayServerUrl: teeSelection.type === 'tee-replay' ? teeSelection.replayServerUrl : undefined,\n rawProviderFor: (template: SatyaProviderTemplate) =>\n (template as unknown as { rawProvider?: unknown }).rawProvider ?? template,\n onOutcome: ({ verify, artifacts, template, requests }) => {\n onCompleteWithSession(\n teeAttestationResult(\n teeSelection.type === 'tee-replay' ? teeSelection.appId : '',\n getSessionId(),\n verify,\n artifacts,\n template,\n requests\n )\n );\n emitProgress({ phase: 'verified', message: 'TEE replay verified', percent: 1 });\n reportOutcome(template.providerId, 'ok');\n if (autoCloseOnComplete) setModalVisible(false);\n },\n emitProgress,\n };\n useEffect(() => () => teePreparation.cancel(), [teePreparation]);\n useEffect(() => {\n if (!modalVisible) teePreparation.cancel();\n }, [modalVisible, teePreparation]);\n const runTeeReplay = useTeeReplaySwap(teeSwapArgs);\n const runTeeReplayBundle = useTeeReplayBundleSwap(teeSwapArgs);\n\n const runReplay = useCallback(\n async (request: CapturedProviderRequest, template: SatyaProviderTemplate) => {\n if (teeSelection.type !== 'tee-replay') return runNativeReplay(request, template);\n const sequence = flowSequenceRef.current;\n replayStartedRef.current = true;\n setRunning(true);\n clearError();\n try {\n await runTeeReplay(request, template);\n } catch (cause) {\n if (sequence === flowSequenceRef.current)\n fail(asSatyaError(cause, SatyaErrorCode.TEE_REPLAY_FAILED));\n } finally {\n if (sequence === flowSequenceRef.current) {\n setRunning(false);\n replayStartedRef.current = false;\n }\n }\n },\n [teeSelection.type, runNativeReplay, runTeeReplay, clearError, fail]\n );\n\n // The composite controller is wired straight to the NATIVE runner, so this\n // must dispatch on mode: without it, a provider with a composite proof plan\n // silently produced an App Attestation artifact while the caller believed it\n // was in TEE mode - the exact downgrade the `unsupported` selection exists to\n // prevent, and one that only appeared on device because Kaggle publishes a\n // proof plan.\n //\n // The verifier-issued selection commits both strict and partial completion.\n const runBundleReplayForMode = useCallback(\n async (\n orderedRequests: CapturedProviderRequest[],\n template: SatyaProviderTemplate,\n partialEndpointsAllowed: boolean\n ) => {\n if (teeSelection.type === 'tee-replay') {\n const sequence = flowSequenceRef.current;\n replayStartedRef.current = true;\n setRunning(true);\n clearError();\n try {\n const preparedRequests = orderedRequests.map((request) =>\n prepareTeeCapturedRequest(request, template, bearerRef.current)\n );\n await runTeeReplayBundle(preparedRequests, template, partialEndpointsAllowed);\n } catch (cause) {\n if (sequence === flowSequenceRef.current)\n fail(asSatyaError(cause, SatyaErrorCode.TEE_REPLAY_FAILED));\n } finally {\n if (sequence === flowSequenceRef.current) {\n setRunning(false);\n replayStartedRef.current = false;\n }\n }\n return;\n }\n await runBundleReplay(orderedRequests, template, partialEndpointsAllowed);\n },\n [clearError, fail, runBundleReplay, runTeeReplayBundle, teeSelection.type]\n );\n\n const { clearCompositeCapture, handleCompositeCaptureMessage } = useCompositeCaptureController({\n emitProgress,\n emitFunnel,\n fail,\n onRequestCaptured,\n replayStartedRef,\n resolved,\n runBundleReplay: runBundleReplayForMode,\n setCapturedRequest,\n });\n\n const unsupportedSelection = teeSelection.type === 'unsupported' ? teeSelection : undefined;\n\n const { openFlow, closeFlow } = useProviderFlowLifecycle({\n providerSession,\n sessionPolicy,\n resolveSessionPolicy,\n setProviderSessionHandle,\n startupError: unsupportedSelection\n ? satyaError(unsupportedSelection.code, unsupportedSelection.message)\n : undefined,\n onCaptureStart: (template, signal) => {\n if (teeSelection.type === 'tee-replay') {\n teePreparation.prepare(\n template,\n { ...teeSwapArgs, signal, getSignal: undefined },\n isPartialEndpointsAllowedForProvider(template.providerId)\n );\n }\n },\n providerId,\n endpointId,\n proofPlanId,\n providerTemplate,\n spkiPins,\n providerPolicyRefresh,\n transportConfig,\n verifyBackend,\n autoStart,\n disabled,\n prefetch,\n providedWebView,\n webViewUserAgent,\n debugEnabled,\n onCancel,\n emitProgress,\n beginFunnelAttempt,\n emitFunnelCancelled,\n fail,\n clearCompositeCapture,\n beginVerificationPresentation,\n endVerificationPresentation,\n renewWebViewBridgeCapability,\n resolved,\n modalVisible,\n running,\n flowAbortControllerRef,\n flowSequenceRef,\n replayStartedRef,\n htmlCaptureFetchedRef,\n pendingRequestRef,\n bearerRef,\n loggedInRef,\n loginSubmitAttemptRef,\n setRunning,\n setCapturedRequest,\n clearError,\n setResolved,\n setResolvedWebView,\n setEffectiveUserAgent,\n setWebViewUrl,\n setManagedPopup,\n setContentReady,\n setPopupContentReady,\n setPageLoading,\n setMainDocumentScriptReady,\n setPopupDocumentScriptReady,\n setModalVisible,\n setBrowserChrome,\n setPopupChrome,\n });\n\n const captureAndReplay = useCallback(\n (request: CapturedProviderRequest, template: SatyaProviderTemplate) => {\n const replayRequest =\n teeSelection.type === 'tee-replay'\n ? prepareTeeCapturedRequest(request, template, bearerRef.current)\n : rewriteForNativeReplay(request, template, bearerRef.current);\n if (replayRequest.url !== request.url) {\n satyaDebug.info('capture', 'rewrote captured URL for native replay', {\n from: request.url,\n to: replayRequest.url,\n injectedBearer: replayRequest.headers.authorization !== request.headers.authorization,\n });\n }\n satyaDebug.info('capture', 'request captured — starting native replay', {\n providerId: template.providerId,\n request: summarizeRequest(replayRequest),\n });\n setCapturedRequest(replayRequest);\n onRequestCaptured?.(replayRequest, template);\n emitProgress({\n phase: 'requestCaptured',\n message: `Matched ${providerDisplayName(template)} request captured`,\n percent: 0.08,\n providerId: template.providerId,\n });\n emitFunnel(SdkFunnelEvent.EndpointMatched, {\n providerId: template.providerId,\n endpointId: template.selectedEndpointId,\n ...endpointMatchTelemetryContext(template.proofTarget, replayRequest.url),\n method: replayRequest.method,\n });\n runReplay(replayRequest, template).catch(fail);\n },\n [emitFunnel, emitProgress, fail, onRequestCaptured, runReplay, teeSelection.type]\n );\n\n const currentProviderId =\n resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId;\n\n // LOGIN_COMPLETED fires once per attempt from whichever login-done signal\n // arrives first: `__satyaReady` (via signalUserInteractionComplete) or an\n // accepted `auth.submitSignal` response. logData fields are derived and\n // PII-free (closed enums, registry-declared ids, buckets, timings).\n const emitLoginCompleted = useCallback(\n (details?: LoginCompletionDetails) => {\n emitFunnel(\n SdkFunnelEvent.LoginCompleted,\n {\n providerId: currentProviderId,\n loginSignalSource: details?.source ?? 'satyaReady',\n loginSignalId: details?.signalId,\n submitStatusClass: details?.submitStatusClass,\n loginBodyMatched: details?.bodyMatched,\n loginLatencyMs: getAttemptElapsedMs(),\n captureMode: resolved?.template.selectedProofPlan ? 'composite' : 'single',\n },\n { oncePerAttempt: true }\n );\n },\n [currentProviderId, emitFunnel, getAttemptElapsedMs, resolved?.template.selectedProofPlan]\n );\n\n const {\n closeManagedPopup,\n navigateOpenerFromPopup,\n openManagedPopup,\n relayOpenerToPopupMessage,\n relayOpenerToPopupPortMessage,\n relayPopupPortMessage,\n relayPopupPostMessage,\n } = useManagedPopupController({\n emitProgress,\n managedPopup,\n popupChromeUrl: popupChrome.url,\n popupRef,\n providerId: currentProviderId,\n setBrowserChrome,\n setManagedPopup,\n setPopupChrome,\n setPopupContentReady,\n setPopupDocumentScriptReady,\n setWebViewUrl,\n webRef,\n });\n\n const handleHardwareBack = useCallback(() => {\n if (managedPopup) {\n closeManagedPopup();\n return;\n }\n closeFlow(true);\n }, [closeFlow, closeManagedPopup, managedPopup]);\n\n const edgeSwipeHandlers = useEdgeSwipeBack(handleHardwareBack);\n\n const handleModalRequestClose = useCallback(() => {\n // iOS sheet swipe-dismiss is native, so cancel the whole flow; Android back\n // pops an open popup first.\n if (Platform.OS === 'ios') {\n closeFlow(true);\n return;\n }\n handleHardwareBack();\n }, [closeFlow, handleHardwareBack]);\n\n const markContentReady = useCallback(() => setContentReady(true), []);\n const markPopupContentReady = useCallback(() => setPopupContentReady(true), []);\n const markLoadStart = useCallback(() => setPageLoading(true), []);\n const markLoadEnd = useCallback(() => setPageLoading(false), []);\n\n const handleReload = useCallback(() => {\n if (capturedRequest || verificationPresentation.covered) return;\n setPageLoading(true);\n webRef.current?.reload?.();\n }, [capturedRequest, verificationPresentation.covered]);\n\n const signalUserInteractionComplete = useCallback(\n (loginDetails?: LoginCompletionDetails) => {\n loginSubmitAttemptRef.current = null;\n // The message handler invokes this when `__satyaReady` arrives (which\n // also triggers the post-login cover below) — the LOGIN_COMPLETED site.\n emitLoginCompleted(loginDetails);\n // Native Android popup WebViews sit above React. Queue their concealment\n // before scheduling the React cover so no popup remains visibly on top.\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(true)\n .then(async (concealed) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (concealed) return;\n // Older/failing native binaries cannot hide a popup in place. Only\n // close popups after confirming this is still the originating flow.\n const closed = await closeNativePopupWindowsFailClosed();\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n // Closing one popup is not a persistent concealment mechanism: the\n // background page could open another. End this unsupported attempt\n // regardless of the close result.\n if (!closed) satyaDebug.warn('webview', 'could not close native popup windows');\n closeFlow(true);\n })\n .catch(() => {\n if (isCurrentPresentationFlow(flowSequenceRef, flowSequence)) closeFlow(true);\n });\n verificationPresentation.signalUserInteractionComplete();\n },\n [\n closeFlow,\n emitLoginCompleted,\n setNativePopupWindowsConcealed,\n verificationPresentation.signalUserInteractionComplete,\n ]\n );\n\n const pendingConcealedRef = useRef(false);\n // Native popup concealment is asynchronous. Keep correlation outside React\n // state so a response/navigation that arrives before concealment completes\n // can still promote the eventual provisional cover to the accepted window.\n const loginSubmitArmRef = useRef(0);\n const loginSubmitConcealSequenceRef = useRef<number | null>(null);\n const loginSubmitAcceptedSequenceRef = useRef<number | null>(null);\n const presentationStateRef = useRef(verificationPresentation.state);\n const presentationState = verificationPresentation.state;\n // Bridge callbacks may run before passive effects. A layout effect updates\n // the guard as part of the commit, before native events can deliver a retry.\n useLayoutEffect(() => {\n presentationStateRef.current = presentationState;\n }, [presentationState]);\n\n // The pre-emptive cover is a guess about what the user just did, so unlike\n // the confirmed cover it must degrade instead of failing closed: if native\n // popups cannot be concealed we simply do not cover, leaving today's\n // behavior. Ending a flow the user has not yet completed would be worse than\n // briefly showing the page we were trying to hide.\n const signalLoginSubmitted = useCallback(\n (signal: SatyaProviderLoginSubmitSignal): boolean => {\n // Only an uncovered provider view can be pre-emptively covered. Without\n // this guard a late signal — after the user returned to the provider, or\n // once the confirmed cover owns the screen — would still conceal Android\n // popups while the reducer refuses to cover, hiding them behind a visible\n // page. Also collapse duplicate bridge/navigation signals while native\n // concealment for this flow is in flight.\n if (presentationStateRef.current !== 'provider') return false;\n const flowSequence = flowSequenceRef.current;\n if (loginSubmitConcealSequenceRef.current === flowSequence) return false;\n loginSubmitConcealSequenceRef.current = flowSequence;\n loginSubmitAcceptedSequenceRef.current = null;\n const arm = ++loginSubmitArmRef.current;\n setNativePopupWindowsConcealed(true)\n .then((concealed) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n loginSubmitConcealSequenceRef.current = null;\n if (loginSubmitArmRef.current !== arm) {\n if (concealed) {\n setNativePopupWindowsConcealed(false).catch(() => {\n satyaDebug.warn('webview', 'could not restore native popup visibility');\n });\n }\n return;\n }\n if (!concealed) {\n loginSubmitAttemptRef.current = null;\n satyaDebug.warn('webview', 'skipping pre-emptive login cover: popups not concealable');\n return;\n }\n verificationPresentation.signalLoginSubmitted(signal.timeoutMs);\n if (loginSubmitAcceptedSequenceRef.current === flowSequence) {\n verificationPresentation.signalLoginSubmitAccepted();\n }\n })\n .catch(() => {\n if (isCurrentPresentationFlow(flowSequenceRef, flowSequence)) {\n loginSubmitConcealSequenceRef.current = null;\n loginSubmitAttemptRef.current = null;\n }\n satyaDebug.warn('webview', 'skipping pre-emptive login cover: conceal call failed');\n });\n return true;\n },\n [\n setNativePopupWindowsConcealed,\n verificationPresentation.signalLoginSubmitAccepted,\n verificationPresentation.signalLoginSubmitted,\n ]\n );\n\n const signalLoginSubmitAccepted = useCallback(\n (loginDetails?: LoginCompletionDetails) => {\n const flowSequence = flowSequenceRef.current;\n loginSubmitAcceptedSequenceRef.current = flowSequence;\n if (presentationStateRef.current === 'pendingLogin') {\n verificationPresentation.signalLoginSubmitAccepted();\n }\n emitLoginCompleted(loginDetails ?? { source: 'submitSignal' });\n },\n [emitLoginCompleted, verificationPresentation.signalLoginSubmitAccepted]\n );\n\n const signalLoginSubmitRejected = useCallback(() => {\n loginSubmitAttemptRef.current = null;\n loginSubmitAcceptedSequenceRef.current = null;\n loginSubmitConcealSequenceRef.current = null;\n loginSubmitArmRef.current += 1;\n presentationStateRef.current = 'provider';\n verificationPresentation.signalLoginSubmitRejected();\n }, [verificationPresentation.signalLoginSubmitRejected]);\n\n // Navigation while the provisional cover is up means the submission is still\n // resolving — a rejected login re-renders the form in place instead. Holding\n // here stops the cover lapsing mid-redirect and flashing the destination. A\n // navigation may race the asynchronous native concealment, so remember it as\n // accepted even before the React presentation reaches pendingLogin.\n const signalLoginNavigation = useCallback(() => {\n const flowSequence = flowSequenceRef.current;\n if (\n presentationStateRef.current !== 'pendingLogin' &&\n loginSubmitConcealSequenceRef.current !== flowSequence\n ) {\n return;\n }\n loginSubmitAcceptedSequenceRef.current = flowSequence;\n if (presentationStateRef.current === 'pendingLogin') {\n verificationPresentation.extendLoginSubmitPending();\n }\n }, [verificationPresentation.extendLoginSubmitPending]);\n\n // Restoring popups is driven off the state itself rather than the reject\n // callback, because the provisional cover also lapses on its own timer\n // inside the presentation hook. Both routes land back on 'provider'.\n useEffect(() => {\n if (presentationState === 'pendingLogin') {\n pendingConcealedRef.current = true;\n return;\n }\n if (!pendingConcealedRef.current) return;\n pendingConcealedRef.current = false;\n loginSubmitAttemptRef.current = null;\n // A promotion to the confirmed cover must keep popups concealed.\n if (presentationState !== 'provider') return;\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(false)\n .then((restored) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (!restored) satyaDebug.warn('webview', 'could not restore concealed native popups');\n })\n .catch(() => {});\n }, [presentationState, setNativePopupWindowsConcealed]);\n\n const returnToProvider = useCallback(() => {\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(false)\n .then((restored) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (restored) {\n verificationPresentation.returnToProvider();\n } else {\n satyaDebug.warn('webview', 'could not restore concealed native popup windows');\n closeFlow(true);\n }\n })\n .catch(() => {\n if (isCurrentPresentationFlow(flowSequenceRef, flowSequence)) closeFlow(true);\n });\n }, [closeFlow, setNativePopupWindowsConcealed, verificationPresentation.returnToProvider]);\n\n const handleMessage = useProviderMessageHandler({\n bearerRef,\n captureAndReplay,\n closeManagedPopup,\n loggedInRef,\n loginSubmitAttemptRef,\n onLoginSubmitted: signalLoginSubmitted,\n onLoginSubmitAccepted: signalLoginSubmitAccepted,\n onLoginSubmitRejected: signalLoginSubmitRejected,\n onUserInteractionComplete: signalUserInteractionComplete,\n onCompositeCaptureMessage: handleCompositeCaptureMessage,\n navigateOpenerFromPopup,\n openManagedPopup,\n pendingRequestRef,\n relayOpenerToPopupMessage,\n relayOpenerToPopupPortMessage,\n relayPopupPortMessage,\n relayPopupPostMessage,\n replayStartedRef,\n resolved,\n bridgeCapability: webViewBridgeCapability,\n webViewProps,\n });\n\n const {\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n } = useProviderNavigationHandlers({\n emitProgress,\n managedPopup,\n onLoginNavigation: signalLoginNavigation,\n onLoginSubmitted: signalLoginSubmitted,\n openManagedPopup,\n providerId,\n providerTemplate,\n resolved,\n setBrowserChrome,\n setPopupChrome,\n setWebViewUrl,\n webRef,\n webViewProps,\n webViewUrl,\n });\n\n const maybeTriggerHtmlCapture = useHtmlCaptureTrigger({\n resolved,\n replayStartedRef,\n htmlCaptureFetchedRef,\n webRef,\n });\n\n const { mainInjectedScript, popupInjectedScript, useNativePopups } = useProviderInjectedScripts({\n providerSessionHandle,\n onSessionPreparationFailure: fail,\n bridgeCapability: webViewBridgeCapability,\n modalVisible,\n ResolvedWebView,\n resolved,\n managedPopup,\n debugEnabled,\n webHostRef,\n popupHostRef,\n setMainDocumentScriptReady,\n setPopupDocumentScriptReady,\n });\n\n const title =\n modalTitle ?? (resolved ? providerDisplayName(resolved.template) : 'Provider Attestation');\n const isProcessing = !!capturedRequest && !error;\n const isVerificationCovered = shouldConcealProviderContent(verificationPresentation.state, {\n captured: !!capturedRequest,\n error: !!error,\n });\n const preparing = modalVisible && !resolved && !error;\n const nativePopupConcealmentRequired = isVerificationCovered || !!error;\n useEffect(() => {\n // Before provider resolution there cannot be a provider-owned popup, so do\n // not treat an older native binary as a terminal concealment failure yet.\n if (!modalVisible || !resolved) return;\n let cancelled = false;\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(nativePopupConcealmentRequired)\n .then(async (concealed) => {\n if (cancelled || !isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (concealed) return;\n if (nativePopupConcealmentRequired) {\n await closeNativePopupWindowsFailClosed();\n if (cancelled || !isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n }\n closeFlow(true);\n })\n .catch(() => {\n if (cancelled || !isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n closeFlow(true);\n });\n return () => {\n cancelled = true;\n };\n }, [\n closeFlow,\n closeNativePopupWindowsFailClosed,\n modalVisible,\n nativePopupConcealmentRequired,\n resolved,\n setNativePopupWindowsConcealed,\n ]);\n // Browser-style loading line: tracks a document's load-start→load-end, not\n // attestation. Suppressed while the verification cover conceals the page so\n // background navigations don't telegraph through the chrome.\n const webViewLoading =\n !!resolved && !error && !isProcessing && !isVerificationCovered && pageLoading;\n const theme = resolveTheme(themeProp);\n const currentUrl = browserChrome.url || webViewUrl || '';\n const secureHost = hostFromUrl(currentUrl);\n const secureConnection = isSecureUrl(currentUrl);\n return {\n providerSessionHandle,\n buttonLabel,\n capturedRequest,\n closeFlow,\n closeManagedPopup,\n contentReady,\n disabled,\n edgeSwipeHandlers,\n effectiveUserAgent,\n error,\n errorCode,\n errorRetryable,\n handleHardwareBack,\n handleMessage,\n handleModalRequestClose,\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n handleReload,\n isProcessing,\n isVerificationCovered,\n mainDocumentScriptReady,\n mainInjectedScript,\n managedPopup,\n markContentReady,\n markLoadEnd,\n markLoadStart,\n markPopupContentReady,\n maybeTriggerHtmlCapture,\n modalVisible,\n openFlow,\n phase,\n sessionId: getSessionId(),\n attemptIndex: getAttemptIndex(),\n onCopySessionId,\n popupContentReady,\n popupDocumentScriptReady,\n popupHostRef,\n popupInjectedScript,\n popupRef,\n prefetch,\n preparing,\n presentation,\n resolved,\n ResolvedWebView,\n running,\n secureConnection,\n secureHost,\n webViewLoading,\n setBrowserChrome,\n setPopupChrome,\n theme,\n title,\n useNativePopups,\n webHostRef,\n webRef,\n webViewProps,\n webViewUrl,\n returnToProvider,\n verificationPresentationPending: verificationPresentation.pending,\n verificationPresentationStalled: verificationPresentation.stalled,\n };\n}\n\nexport type ProviderAttestFlow = Omit<\n ReturnType<typeof useProviderAttestFlow>,\n 'markLoadStart' | 'markLoadEnd'\n> & {\n markLoadStart: (url?: string) => void;\n markLoadEnd: (url?: string) => void;\n isTeelsFlow?: boolean;\n handleContentProcessDidTerminate?: (event: unknown) => void;\n handleRenderProcessGone?: (event: unknown) => void;\n handleWebViewError?: (event: unknown) => void;\n handleWebViewHttpError?: (event: unknown) => void;\n};\n"]}
|
|
@@ -6,7 +6,6 @@ import type { ProviderPopupMessage } from '../../webview';
|
|
|
6
6
|
interface ProviderNavigationHandlersOptions {
|
|
7
7
|
emitProgress: (progress: SatyaProviderFlowProgress) => void;
|
|
8
8
|
managedPopup: ManagedPopupState | null;
|
|
9
|
-
navigateOpenerFromPopup: (popup: ProviderPopupMessage) => void;
|
|
10
9
|
onLoginNavigation: () => void;
|
|
11
10
|
onLoginSubmitted: (signal: SatyaProviderLoginSubmitSignal) => boolean;
|
|
12
11
|
openManagedPopup: (popup: ProviderPopupMessage, message?: string) => void;
|
|
@@ -20,7 +19,7 @@ interface ProviderNavigationHandlersOptions {
|
|
|
20
19
|
webViewProps?: Record<string, unknown>;
|
|
21
20
|
webViewUrl: string | null;
|
|
22
21
|
}
|
|
23
|
-
export declare function useProviderNavigationHandlers({ emitProgress, managedPopup,
|
|
22
|
+
export declare function useProviderNavigationHandlers({ emitProgress, managedPopup, onLoginNavigation, onLoginSubmitted, openManagedPopup, providerId, providerTemplate, resolved, setBrowserChrome, setPopupChrome, setWebViewUrl, webRef, webViewProps, webViewUrl, }: ProviderNavigationHandlersOptions): {
|
|
24
23
|
handleNavigationStateChange: (event: unknown) => void;
|
|
25
24
|
handleOpenWindow: (event: WebViewNavigationEventLike) => void;
|
|
26
25
|
handlePopupNavigationStateChange: (event: unknown) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useProviderNavigationHandlers.d.ts","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderNavigationHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,OAAO,CAAC;AAIf,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,0BAA0B,EAC1B,cAAc,EACd,iCAAiC,EAClC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"useProviderNavigationHandlers.d.ts","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderNavigationHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,OAAO,CAAC;AAIf,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,0BAA0B,EAC1B,cAAc,EACd,iCAAiC,EAClC,MAAM,SAAS,CAAC;AAajB,OAAO,KAAK,EAAE,8BAA8B,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D,UAAU,iCAAiC;IACzC,YAAY,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC5D,YAAY,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACvC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,gBAAgB,EAAE,CAAC,MAAM,EAAE,8BAA8B,KAAK,OAAO,CAAC;IACtE,gBAAgB,EAAE,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClC,gBAAgB,EAAE,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC/D,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC7D,aAAa,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACvD,MAAM,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,MAAM,EACN,YAAY,EACZ,UAAU,GACX,EAAE,iCAAiC;yCAiJxB,OAAO;8BAhHP,0BAA0B;8CAoK1B,OAAO;mCAlHP,0BAA0B;qDAexB,iCAAiC;gDA/CjC,iCAAiC;EA4K9C"}
|
|
@@ -2,10 +2,10 @@ import { useCallback, useEffect, useRef, } from 'react';
|
|
|
2
2
|
import { WEBVIEW_BOOTSTRAP_URL } from './constants';
|
|
3
3
|
import { loginSubmitSignalsFrom, matchingLoginSubmitNavigationSignal } from './loginSubmitDetector';
|
|
4
4
|
import { providerLoginUrl } from './providerResolution';
|
|
5
|
-
import { isLoadableDocumentUrl, isWebViewSafeUrl,
|
|
5
|
+
import { isLoadableDocumentUrl, isWebViewSafeUrl, parseIntentBrowserFallbackUrl, schemeLabel, } from './urlUtils';
|
|
6
6
|
import { invokeShouldStartLoadWithRequest, invokeWebViewCallback, readBrowserChromeState, } from './webviewRuntime';
|
|
7
7
|
import { satyaDebug, summarizeResponse } from '../../debugLog';
|
|
8
|
-
export function useProviderNavigationHandlers({ emitProgress, managedPopup,
|
|
8
|
+
export function useProviderNavigationHandlers({ emitProgress, managedPopup, onLoginNavigation, onLoginSubmitted, openManagedPopup, providerId, providerTemplate, resolved, setBrowserChrome, setPopupChrome, setWebViewUrl, webRef, webViewProps, webViewUrl, }) {
|
|
9
9
|
const lastMainNavigationRef = useRef(null);
|
|
10
10
|
const lastMainDocumentUrlRef = useRef(null);
|
|
11
11
|
useEffect(() => {
|
|
@@ -176,28 +176,10 @@ export function useProviderNavigationHandlers({ emitProgress, managedPopup, navi
|
|
|
176
176
|
});
|
|
177
177
|
}
|
|
178
178
|
setPopupChrome((current) => ({ ...current, ...nextChrome }));
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
lastMainDocumentUrlRef.current ??
|
|
184
|
-
webViewUrl ??
|
|
185
|
-
(resolved ? providerLoginUrl(resolved.template) : null));
|
|
186
|
-
const initialPopupOrigin = originFromUrl(managedPopup.url);
|
|
187
|
-
const currentPopupOrigin = originFromUrl(url);
|
|
188
|
-
if (openerOrigin &&
|
|
189
|
-
currentPopupOrigin &&
|
|
190
|
-
currentPopupOrigin === openerOrigin &&
|
|
191
|
-
initialPopupOrigin &&
|
|
192
|
-
initialPopupOrigin !== openerOrigin) {
|
|
193
|
-
navigateOpenerFromPopup({
|
|
194
|
-
url,
|
|
195
|
-
target: managedPopup.target ?? null,
|
|
196
|
-
sourceUrl: managedPopup.url ?? null,
|
|
197
|
-
reason: 'popupReturnedToOpenerOrigin',
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
}, [managedPopup, navigateOpenerFromPopup, resolved, setPopupChrome, webViewProps, webViewUrl]);
|
|
179
|
+
// OAuth callbacks must finish in their popup and notify the original
|
|
180
|
+
// opener. Returning to its origin alone must not close or replay them.
|
|
181
|
+
// Explicit opener navigation, postMessage and close use the popup bridge.
|
|
182
|
+
}, [setPopupChrome, webViewProps]);
|
|
201
183
|
return {
|
|
202
184
|
handleNavigationStateChange,
|
|
203
185
|
handleOpenWindow,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useProviderNavigationHandlers.js","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderNavigationHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n type Dispatch,\n type RefObject,\n type SetStateAction,\n} from 'react';\n\nimport { WEBVIEW_BOOTSTRAP_URL } from './constants';\nimport { loginSubmitSignalsFrom, matchingLoginSubmitNavigationSignal } from './loginSubmitDetector';\nimport { providerLoginUrl, type ResolvedProvider } from './providerResolution';\nimport type {\n BrowserChromeState,\n ManagedPopupState,\n SatyaProviderFlowProgress,\n WebViewNavigationEventLike,\n WebViewRefLike,\n WebViewShouldStartLoadRequestLike,\n} from './types';\nimport {\n isLoadableDocumentUrl,\n isWebViewSafeUrl,\n originFromUrl,\n parseIntentBrowserFallbackUrl,\n schemeLabel,\n} from './urlUtils';\nimport {\n invokeShouldStartLoadWithRequest,\n invokeWebViewCallback,\n readBrowserChromeState,\n} from './webviewRuntime';\nimport { satyaDebug, summarizeResponse } from '../../debugLog';\nimport type { SatyaProviderLoginSubmitSignal, SatyaProviderTemplate } from '../../types';\nimport type { ProviderPopupMessage } from '../../webview';\n\ninterface ProviderNavigationHandlersOptions {\n emitProgress: (progress: SatyaProviderFlowProgress) => void;\n managedPopup: ManagedPopupState | null;\n navigateOpenerFromPopup: (popup: ProviderPopupMessage) => void;\n onLoginNavigation: () => void;\n onLoginSubmitted: (signal: SatyaProviderLoginSubmitSignal) => boolean;\n openManagedPopup: (popup: ProviderPopupMessage, message?: string) => void;\n providerId?: string;\n providerTemplate?: SatyaProviderTemplate;\n resolved: ResolvedProvider | null;\n setBrowserChrome: Dispatch<SetStateAction<BrowserChromeState>>;\n setPopupChrome: Dispatch<SetStateAction<BrowserChromeState>>;\n setWebViewUrl: Dispatch<SetStateAction<string | null>>;\n webRef: RefObject<WebViewRefLike | null>;\n webViewProps?: Record<string, unknown>;\n webViewUrl: string | null;\n}\n\nexport function useProviderNavigationHandlers({\n emitProgress,\n managedPopup,\n navigateOpenerFromPopup,\n onLoginNavigation,\n onLoginSubmitted,\n openManagedPopup,\n providerId,\n providerTemplate,\n resolved,\n setBrowserChrome,\n setPopupChrome,\n setWebViewUrl,\n webRef,\n webViewProps,\n webViewUrl,\n}: ProviderNavigationHandlersOptions) {\n const lastMainNavigationRef = useRef<{ loading: boolean; url: string } | null>(null);\n const lastMainDocumentUrlRef = useRef<string | null>(null);\n useEffect(() => {\n lastMainNavigationRef.current = null;\n lastMainDocumentUrlRef.current = null;\n }, [resolved]);\n\n const progressProviderId =\n resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId;\n\n const loadInCurrentWebView = useCallback(\n (url: string, message: string) => {\n setWebViewUrl(url);\n setBrowserChrome((current) => ({\n ...current,\n url,\n loading: true,\n }));\n emitProgress({\n phase: 'waitingForRequest',\n message,\n percent: 0.05,\n providerId: progressProviderId,\n });\n webRef.current?.injectJavaScript?.(\n `try { window.location.assign(${JSON.stringify(url)}); } catch (_) {} true;`\n );\n },\n [emitProgress, progressProviderId, setBrowserChrome, setWebViewUrl, webRef]\n );\n\n const handleOpenWindow = useCallback(\n (event: WebViewNavigationEventLike) => {\n invokeWebViewCallback(webViewProps?.onOpenWindow, event);\n const targetUrl = event.nativeEvent?.targetUrl ?? event.nativeEvent?.url;\n if (!targetUrl) return;\n openManagedPopup({\n url: targetUrl,\n target: null,\n sourceUrl:\n lastMainDocumentUrlRef.current ??\n webViewUrl ??\n (resolved ? providerLoginUrl(resolved.template) : null),\n reason: 'nativeOpenWindow',\n });\n },\n [openManagedPopup, resolved, webViewProps, webViewUrl]\n );\n\n const handleShouldStartLoadWithRequest = useCallback(\n (request: WebViewShouldStartLoadRequestLike) => {\n const hostDecision = invokeShouldStartLoadWithRequest(\n webViewProps?.onShouldStartLoadWithRequest,\n request\n );\n if (hostDecision === false) return false;\n\n const url = request.url;\n if (!url || isWebViewSafeUrl(url)) return true;\n\n const fallbackUrl = parseIntentBrowserFallbackUrl(url);\n satyaDebug.debug('webview', 'blocked non-web navigation (main)', {\n url,\n scheme: schemeLabel(url),\n intentFallback: fallbackUrl,\n });\n if (fallbackUrl) {\n loadInCurrentWebView(fallbackUrl, 'Handling external OAuth fallback inside the WebView');\n } else {\n emitProgress({\n phase: 'waitingForRequest',\n message: `Blocked external navigation to ${schemeLabel(url)}`,\n percent: 0.05,\n providerId: progressProviderId,\n });\n }\n return false;\n },\n [emitProgress, loadInCurrentWebView, progressProviderId, webViewProps]\n );\n\n const handlePopupOpenWindow = useCallback(\n (event: WebViewNavigationEventLike) => {\n invokeWebViewCallback(webViewProps?.onOpenWindow, event);\n const targetUrl = event.nativeEvent?.targetUrl ?? event.nativeEvent?.url;\n if (!targetUrl) return;\n openManagedPopup({\n url: targetUrl,\n target: managedPopup?.target ?? null,\n sourceUrl: managedPopup?.url ?? null,\n reason: 'nestedNativeOpenWindow',\n });\n },\n [managedPopup?.target, managedPopup?.url, openManagedPopup, webViewProps]\n );\n\n const handlePopupShouldStartLoadWithRequest = useCallback(\n (request: WebViewShouldStartLoadRequestLike) => {\n const hostDecision = invokeShouldStartLoadWithRequest(\n webViewProps?.onShouldStartLoadWithRequest,\n request\n );\n if (hostDecision === false) return false;\n\n const url = request.url;\n if (!url || isWebViewSafeUrl(url)) return true;\n\n const fallbackUrl = parseIntentBrowserFallbackUrl(url);\n satyaDebug.debug('webview', 'blocked non-web navigation (popup)', {\n url,\n scheme: schemeLabel(url),\n intentFallback: fallbackUrl,\n });\n if (fallbackUrl) {\n openManagedPopup(\n {\n url: fallbackUrl,\n target: managedPopup?.target ?? null,\n sourceUrl: managedPopup?.url ?? null,\n reason: 'popupIntentFallback',\n },\n 'Handling external OAuth fallback inside the popup WebView'\n );\n } else {\n emitProgress({\n phase: 'waitingForRequest',\n message: `Blocked external popup navigation to ${schemeLabel(url)}`,\n percent: 0.05,\n providerId: progressProviderId,\n });\n }\n return false;\n },\n [\n emitProgress,\n managedPopup?.target,\n managedPopup?.url,\n openManagedPopup,\n progressProviderId,\n webViewProps,\n ]\n );\n\n const handleNavigationStateChange = useCallback(\n (event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onNavigationStateChange, event);\n if (nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n if (nextChrome.url) {\n satyaDebug.debug('webview', 'navigation (main)', {\n url: summarizeResponse({ url: nextChrome.url }).url,\n title: nextChrome.title,\n loading: nextChrome.loading,\n });\n }\n setBrowserChrome((current) => ({ ...current, ...nextChrome }));\n // Navigation events describe a load the native WebView already owns.\n // Writing them back to source can reload an intermediate OAuth URL after\n // the browser has redirected ahead, replaying a one-time handoff token.\n // Keep source for explicit navigation and update only observed state here.\n if (nextChrome.url && isLoadableDocumentUrl(nextChrome.url)) {\n lastMainDocumentUrlRef.current = nextChrome.url;\n }\n const previousNavigation = lastMainNavigationRef.current;\n const isDistinctNavigation =\n !!nextChrome.url &&\n (previousNavigation?.url !== nextChrome.url ||\n (nextChrome.loading === true && previousNavigation?.loading !== true));\n if (nextChrome.url) {\n lastMainNavigationRef.current = {\n loading: nextChrome.loading === true,\n url: nextChrome.url,\n };\n }\n // Form-POST logins never reach the fetch/XHR interceptor, so a navigation\n // to a configured post-login URL is the only pre-emptive cover signal.\n // Presentation-only: it does not gate capture.\n const loginSubmitSignal = matchingLoginSubmitNavigationSignal(\n loginSubmitSignalsFrom(resolved?.template),\n nextChrome.url\n );\n if (loginSubmitSignal && isDistinctNavigation) {\n satyaDebug.info('webview', 'login submit navigation matched — covering provider', {\n signalId: loginSubmitSignal.id,\n url: summarizeResponse({ url: nextChrome.url }).url,\n });\n onLoginSubmitted(loginSubmitSignal);\n }\n // Any main-frame navigation holds an existing provisional cover open; the\n // callback no-ops unless one is up.\n if (isDistinctNavigation) onLoginNavigation();\n },\n [onLoginNavigation, onLoginSubmitted, resolved, setBrowserChrome, webViewProps]\n );\n\n const handlePopupNavigationStateChange = useCallback(\n (event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onNavigationStateChange, event);\n if (nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n if (nextChrome.url) {\n satyaDebug.debug('webview', 'navigation (popup)', {\n url: summarizeResponse({ url: nextChrome.url }).url,\n loading: nextChrome.loading,\n });\n }\n setPopupChrome((current) => ({ ...current, ...nextChrome }));\n\n const url = nextChrome.url;\n if (!url || !managedPopup) return;\n const openerOrigin = originFromUrl(\n managedPopup.sourceUrl ??\n lastMainDocumentUrlRef.current ??\n webViewUrl ??\n (resolved ? providerLoginUrl(resolved.template) : null)\n );\n const initialPopupOrigin = originFromUrl(managedPopup.url);\n const currentPopupOrigin = originFromUrl(url);\n if (\n openerOrigin &&\n currentPopupOrigin &&\n currentPopupOrigin === openerOrigin &&\n initialPopupOrigin &&\n initialPopupOrigin !== openerOrigin\n ) {\n navigateOpenerFromPopup({\n url,\n target: managedPopup.target ?? null,\n sourceUrl: managedPopup.url ?? null,\n reason: 'popupReturnedToOpenerOrigin',\n });\n }\n },\n [managedPopup, navigateOpenerFromPopup, resolved, setPopupChrome, webViewProps, webViewUrl]\n );\n\n return {\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"useProviderNavigationHandlers.js","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderNavigationHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n type Dispatch,\n type RefObject,\n type SetStateAction,\n} from 'react';\n\nimport { WEBVIEW_BOOTSTRAP_URL } from './constants';\nimport { loginSubmitSignalsFrom, matchingLoginSubmitNavigationSignal } from './loginSubmitDetector';\nimport { providerLoginUrl, type ResolvedProvider } from './providerResolution';\nimport type {\n BrowserChromeState,\n ManagedPopupState,\n SatyaProviderFlowProgress,\n WebViewNavigationEventLike,\n WebViewRefLike,\n WebViewShouldStartLoadRequestLike,\n} from './types';\nimport {\n isLoadableDocumentUrl,\n isWebViewSafeUrl,\n parseIntentBrowserFallbackUrl,\n schemeLabel,\n} from './urlUtils';\nimport {\n invokeShouldStartLoadWithRequest,\n invokeWebViewCallback,\n readBrowserChromeState,\n} from './webviewRuntime';\nimport { satyaDebug, summarizeResponse } from '../../debugLog';\nimport type { SatyaProviderLoginSubmitSignal, SatyaProviderTemplate } from '../../types';\nimport type { ProviderPopupMessage } from '../../webview';\n\ninterface ProviderNavigationHandlersOptions {\n emitProgress: (progress: SatyaProviderFlowProgress) => void;\n managedPopup: ManagedPopupState | null;\n onLoginNavigation: () => void;\n onLoginSubmitted: (signal: SatyaProviderLoginSubmitSignal) => boolean;\n openManagedPopup: (popup: ProviderPopupMessage, message?: string) => void;\n providerId?: string;\n providerTemplate?: SatyaProviderTemplate;\n resolved: ResolvedProvider | null;\n setBrowserChrome: Dispatch<SetStateAction<BrowserChromeState>>;\n setPopupChrome: Dispatch<SetStateAction<BrowserChromeState>>;\n setWebViewUrl: Dispatch<SetStateAction<string | null>>;\n webRef: RefObject<WebViewRefLike | null>;\n webViewProps?: Record<string, unknown>;\n webViewUrl: string | null;\n}\n\nexport function useProviderNavigationHandlers({\n emitProgress,\n managedPopup,\n onLoginNavigation,\n onLoginSubmitted,\n openManagedPopup,\n providerId,\n providerTemplate,\n resolved,\n setBrowserChrome,\n setPopupChrome,\n setWebViewUrl,\n webRef,\n webViewProps,\n webViewUrl,\n}: ProviderNavigationHandlersOptions) {\n const lastMainNavigationRef = useRef<{ loading: boolean; url: string } | null>(null);\n const lastMainDocumentUrlRef = useRef<string | null>(null);\n useEffect(() => {\n lastMainNavigationRef.current = null;\n lastMainDocumentUrlRef.current = null;\n }, [resolved]);\n\n const progressProviderId =\n resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId;\n\n const loadInCurrentWebView = useCallback(\n (url: string, message: string) => {\n setWebViewUrl(url);\n setBrowserChrome((current) => ({\n ...current,\n url,\n loading: true,\n }));\n emitProgress({\n phase: 'waitingForRequest',\n message,\n percent: 0.05,\n providerId: progressProviderId,\n });\n webRef.current?.injectJavaScript?.(\n `try { window.location.assign(${JSON.stringify(url)}); } catch (_) {} true;`\n );\n },\n [emitProgress, progressProviderId, setBrowserChrome, setWebViewUrl, webRef]\n );\n\n const handleOpenWindow = useCallback(\n (event: WebViewNavigationEventLike) => {\n invokeWebViewCallback(webViewProps?.onOpenWindow, event);\n const targetUrl = event.nativeEvent?.targetUrl ?? event.nativeEvent?.url;\n if (!targetUrl) return;\n openManagedPopup({\n url: targetUrl,\n target: null,\n sourceUrl:\n lastMainDocumentUrlRef.current ??\n webViewUrl ??\n (resolved ? providerLoginUrl(resolved.template) : null),\n reason: 'nativeOpenWindow',\n });\n },\n [openManagedPopup, resolved, webViewProps, webViewUrl]\n );\n\n const handleShouldStartLoadWithRequest = useCallback(\n (request: WebViewShouldStartLoadRequestLike) => {\n const hostDecision = invokeShouldStartLoadWithRequest(\n webViewProps?.onShouldStartLoadWithRequest,\n request\n );\n if (hostDecision === false) return false;\n\n const url = request.url;\n if (!url || isWebViewSafeUrl(url)) return true;\n\n const fallbackUrl = parseIntentBrowserFallbackUrl(url);\n satyaDebug.debug('webview', 'blocked non-web navigation (main)', {\n url,\n scheme: schemeLabel(url),\n intentFallback: fallbackUrl,\n });\n if (fallbackUrl) {\n loadInCurrentWebView(fallbackUrl, 'Handling external OAuth fallback inside the WebView');\n } else {\n emitProgress({\n phase: 'waitingForRequest',\n message: `Blocked external navigation to ${schemeLabel(url)}`,\n percent: 0.05,\n providerId: progressProviderId,\n });\n }\n return false;\n },\n [emitProgress, loadInCurrentWebView, progressProviderId, webViewProps]\n );\n\n const handlePopupOpenWindow = useCallback(\n (event: WebViewNavigationEventLike) => {\n invokeWebViewCallback(webViewProps?.onOpenWindow, event);\n const targetUrl = event.nativeEvent?.targetUrl ?? event.nativeEvent?.url;\n if (!targetUrl) return;\n openManagedPopup({\n url: targetUrl,\n target: managedPopup?.target ?? null,\n sourceUrl: managedPopup?.url ?? null,\n reason: 'nestedNativeOpenWindow',\n });\n },\n [managedPopup?.target, managedPopup?.url, openManagedPopup, webViewProps]\n );\n\n const handlePopupShouldStartLoadWithRequest = useCallback(\n (request: WebViewShouldStartLoadRequestLike) => {\n const hostDecision = invokeShouldStartLoadWithRequest(\n webViewProps?.onShouldStartLoadWithRequest,\n request\n );\n if (hostDecision === false) return false;\n\n const url = request.url;\n if (!url || isWebViewSafeUrl(url)) return true;\n\n const fallbackUrl = parseIntentBrowserFallbackUrl(url);\n satyaDebug.debug('webview', 'blocked non-web navigation (popup)', {\n url,\n scheme: schemeLabel(url),\n intentFallback: fallbackUrl,\n });\n if (fallbackUrl) {\n openManagedPopup(\n {\n url: fallbackUrl,\n target: managedPopup?.target ?? null,\n sourceUrl: managedPopup?.url ?? null,\n reason: 'popupIntentFallback',\n },\n 'Handling external OAuth fallback inside the popup WebView'\n );\n } else {\n emitProgress({\n phase: 'waitingForRequest',\n message: `Blocked external popup navigation to ${schemeLabel(url)}`,\n percent: 0.05,\n providerId: progressProviderId,\n });\n }\n return false;\n },\n [\n emitProgress,\n managedPopup?.target,\n managedPopup?.url,\n openManagedPopup,\n progressProviderId,\n webViewProps,\n ]\n );\n\n const handleNavigationStateChange = useCallback(\n (event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onNavigationStateChange, event);\n if (nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n if (nextChrome.url) {\n satyaDebug.debug('webview', 'navigation (main)', {\n url: summarizeResponse({ url: nextChrome.url }).url,\n title: nextChrome.title,\n loading: nextChrome.loading,\n });\n }\n setBrowserChrome((current) => ({ ...current, ...nextChrome }));\n // Navigation events describe a load the native WebView already owns.\n // Writing them back to source can reload an intermediate OAuth URL after\n // the browser has redirected ahead, replaying a one-time handoff token.\n // Keep source for explicit navigation and update only observed state here.\n if (nextChrome.url && isLoadableDocumentUrl(nextChrome.url)) {\n lastMainDocumentUrlRef.current = nextChrome.url;\n }\n const previousNavigation = lastMainNavigationRef.current;\n const isDistinctNavigation =\n !!nextChrome.url &&\n (previousNavigation?.url !== nextChrome.url ||\n (nextChrome.loading === true && previousNavigation?.loading !== true));\n if (nextChrome.url) {\n lastMainNavigationRef.current = {\n loading: nextChrome.loading === true,\n url: nextChrome.url,\n };\n }\n // Form-POST logins never reach the fetch/XHR interceptor, so a navigation\n // to a configured post-login URL is the only pre-emptive cover signal.\n // Presentation-only: it does not gate capture.\n const loginSubmitSignal = matchingLoginSubmitNavigationSignal(\n loginSubmitSignalsFrom(resolved?.template),\n nextChrome.url\n );\n if (loginSubmitSignal && isDistinctNavigation) {\n satyaDebug.info('webview', 'login submit navigation matched — covering provider', {\n signalId: loginSubmitSignal.id,\n url: summarizeResponse({ url: nextChrome.url }).url,\n });\n onLoginSubmitted(loginSubmitSignal);\n }\n // Any main-frame navigation holds an existing provisional cover open; the\n // callback no-ops unless one is up.\n if (isDistinctNavigation) onLoginNavigation();\n },\n [onLoginNavigation, onLoginSubmitted, resolved, setBrowserChrome, webViewProps]\n );\n\n const handlePopupNavigationStateChange = useCallback(\n (event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onNavigationStateChange, event);\n if (nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n if (nextChrome.url) {\n satyaDebug.debug('webview', 'navigation (popup)', {\n url: summarizeResponse({ url: nextChrome.url }).url,\n loading: nextChrome.loading,\n });\n }\n setPopupChrome((current) => ({ ...current, ...nextChrome }));\n // OAuth callbacks must finish in their popup and notify the original\n // opener. Returning to its origin alone must not close or replay them.\n // Explicit opener navigation, postMessage and close use the popup bridge.\n },\n [setPopupChrome, webViewProps]\n );\n\n return {\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// Generated by internal/module_scripts/sync-sdk-metadata.js.
|
|
2
2
|
export const EXPO_SATYA_ATTEST_SDK_NAME = '@burnt-labs/expo-satya-attest';
|
|
3
|
-
export const EXPO_SATYA_ATTEST_SDK_VERSION = '3.10.
|
|
3
|
+
export const EXPO_SATYA_ATTEST_SDK_VERSION = '3.10.2';
|
|
4
4
|
//# sourceMappingURL=sdkMetadata.generated.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdkMetadata.generated.js","sourceRoot":"","sources":["../src/sdkMetadata.generated.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,+BAAwC,CAAC;AACnF,MAAM,CAAC,MAAM,6BAA6B,GAAG,QAAiB,CAAC","sourcesContent":["// Generated by internal/module_scripts/sync-sdk-metadata.js.\nexport const EXPO_SATYA_ATTEST_SDK_NAME = '@burnt-labs/expo-satya-attest' as const;\nexport const EXPO_SATYA_ATTEST_SDK_VERSION = '3.10.
|
|
1
|
+
{"version":3,"file":"sdkMetadata.generated.js","sourceRoot":"","sources":["../src/sdkMetadata.generated.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,+BAAwC,CAAC;AACnF,MAAM,CAAC,MAAM,6BAA6B,GAAG,QAAiB,CAAC","sourcesContent":["// Generated by internal/module_scripts/sync-sdk-metadata.js.\nexport const EXPO_SATYA_ATTEST_SDK_NAME = '@burnt-labs/expo-satya-attest' as const;\nexport const EXPO_SATYA_ATTEST_SDK_VERSION = '3.10.2' as const;\n"]}
|
package/build/tee/client.d.ts
CHANGED
|
@@ -107,6 +107,6 @@ export interface TeeSubmissionEnvelope {
|
|
|
107
107
|
sdkSessionId?: string;
|
|
108
108
|
}
|
|
109
109
|
export declare function teeSubmissionEnvelope(appId: string, artifacts: readonly string[], sdkSessionId?: string, schemaVersion?: '3.0.0' | '3.1.0'): TeeSubmissionEnvelope;
|
|
110
|
-
export declare const SDK_VERSION: "3.10.
|
|
110
|
+
export declare const SDK_VERSION: "3.10.2";
|
|
111
111
|
export type { SatyaTeeSessionContext };
|
|
112
112
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -10,15 +10,18 @@
|
|
|
10
10
|
<key>HeadersPath</key>
|
|
11
11
|
<string>Headers</string>
|
|
12
12
|
<key>LibraryIdentifier</key>
|
|
13
|
-
<string>ios-
|
|
13
|
+
<string>ios-arm64_x86_64-simulator</string>
|
|
14
14
|
<key>LibraryPath</key>
|
|
15
15
|
<string>libsatya_ffi.a</string>
|
|
16
16
|
<key>SupportedArchitectures</key>
|
|
17
17
|
<array>
|
|
18
18
|
<string>arm64</string>
|
|
19
|
+
<string>x86_64</string>
|
|
19
20
|
</array>
|
|
20
21
|
<key>SupportedPlatform</key>
|
|
21
22
|
<string>ios</string>
|
|
23
|
+
<key>SupportedPlatformVariant</key>
|
|
24
|
+
<string>simulator</string>
|
|
22
25
|
</dict>
|
|
23
26
|
<dict>
|
|
24
27
|
<key>BinaryPath</key>
|
|
@@ -26,18 +29,15 @@
|
|
|
26
29
|
<key>HeadersPath</key>
|
|
27
30
|
<string>Headers</string>
|
|
28
31
|
<key>LibraryIdentifier</key>
|
|
29
|
-
<string>ios-
|
|
32
|
+
<string>ios-arm64</string>
|
|
30
33
|
<key>LibraryPath</key>
|
|
31
34
|
<string>libsatya_ffi.a</string>
|
|
32
35
|
<key>SupportedArchitectures</key>
|
|
33
36
|
<array>
|
|
34
37
|
<string>arm64</string>
|
|
35
|
-
<string>x86_64</string>
|
|
36
38
|
</array>
|
|
37
39
|
<key>SupportedPlatform</key>
|
|
38
40
|
<string>ios</string>
|
|
39
|
-
<key>SupportedPlatformVariant</key>
|
|
40
|
-
<string>simulator</string>
|
|
41
41
|
</dict>
|
|
42
42
|
</array>
|
|
43
43
|
<key>CFBundlePackageType</key>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
[diffend] Oversized file quarantined before diffing.
|
|
2
2
|
name: package/ios/Frameworks/libsatya_ffi-rs.xcframework/ios-arm64/libsatya_ffi.a
|
|
3
3
|
size: 35999664 bytes
|
|
4
|
-
sha256:
|
|
4
|
+
sha256: e93ba4440ffdbc5df5c66d3d8e574ded9bd56ef1fbe055a83d2cc601cd1b4f7e
|
package/ios/Frameworks/libsatya_ffi-rs.xcframework/ios-arm64_x86_64-simulator/libsatya_ffi.a
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
[diffend] Oversized file quarantined before diffing.
|
|
2
2
|
name: package/ios/Frameworks/libsatya_ffi-rs.xcframework/ios-arm64_x86_64-simulator/libsatya_ffi.a
|
|
3
3
|
size: 71319040 bytes
|
|
4
|
-
sha256:
|
|
4
|
+
sha256: 0ccfd781eb08494d3c6ca74135576f31acc028a71748fbea0f8cec114f38e2b7
|
package/ios/SatyaAttest.podspec
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Pod::Spec.new do |s|
|
|
2
2
|
s.name = 'SatyaAttest'
|
|
3
|
-
s.version = '3.10.
|
|
3
|
+
s.version = '3.10.2'
|
|
4
4
|
s.summary = 'SATYA-W mobile TLS app-attestation (App Attest + Secure Enclave) backed by the Rust satya-sdk core'
|
|
5
5
|
s.description = 'Expo native module wrapping the Rust satya-ffi XCFramework and layering iOS App Attest + Secure Enclave platform attestation.'
|
|
6
6
|
s.author = 'Justin'
|
package/package.json
CHANGED
|
@@ -893,7 +893,6 @@ export function useProviderAttestFlow(
|
|
|
893
893
|
} = useProviderNavigationHandlers({
|
|
894
894
|
emitProgress,
|
|
895
895
|
managedPopup,
|
|
896
|
-
navigateOpenerFromPopup,
|
|
897
896
|
onLoginNavigation: signalLoginNavigation,
|
|
898
897
|
onLoginSubmitted: signalLoginSubmitted,
|
|
899
898
|
openManagedPopup,
|
|
@@ -21,7 +21,6 @@ import type {
|
|
|
21
21
|
import {
|
|
22
22
|
isLoadableDocumentUrl,
|
|
23
23
|
isWebViewSafeUrl,
|
|
24
|
-
originFromUrl,
|
|
25
24
|
parseIntentBrowserFallbackUrl,
|
|
26
25
|
schemeLabel,
|
|
27
26
|
} from './urlUtils';
|
|
@@ -37,7 +36,6 @@ import type { ProviderPopupMessage } from '../../webview';
|
|
|
37
36
|
interface ProviderNavigationHandlersOptions {
|
|
38
37
|
emitProgress: (progress: SatyaProviderFlowProgress) => void;
|
|
39
38
|
managedPopup: ManagedPopupState | null;
|
|
40
|
-
navigateOpenerFromPopup: (popup: ProviderPopupMessage) => void;
|
|
41
39
|
onLoginNavigation: () => void;
|
|
42
40
|
onLoginSubmitted: (signal: SatyaProviderLoginSubmitSignal) => boolean;
|
|
43
41
|
openManagedPopup: (popup: ProviderPopupMessage, message?: string) => void;
|
|
@@ -55,7 +53,6 @@ interface ProviderNavigationHandlersOptions {
|
|
|
55
53
|
export function useProviderNavigationHandlers({
|
|
56
54
|
emitProgress,
|
|
57
55
|
managedPopup,
|
|
58
|
-
navigateOpenerFromPopup,
|
|
59
56
|
onLoginNavigation,
|
|
60
57
|
onLoginSubmitted,
|
|
61
58
|
openManagedPopup,
|
|
@@ -276,33 +273,11 @@ export function useProviderNavigationHandlers({
|
|
|
276
273
|
});
|
|
277
274
|
}
|
|
278
275
|
setPopupChrome((current) => ({ ...current, ...nextChrome }));
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
const openerOrigin = originFromUrl(
|
|
283
|
-
managedPopup.sourceUrl ??
|
|
284
|
-
lastMainDocumentUrlRef.current ??
|
|
285
|
-
webViewUrl ??
|
|
286
|
-
(resolved ? providerLoginUrl(resolved.template) : null)
|
|
287
|
-
);
|
|
288
|
-
const initialPopupOrigin = originFromUrl(managedPopup.url);
|
|
289
|
-
const currentPopupOrigin = originFromUrl(url);
|
|
290
|
-
if (
|
|
291
|
-
openerOrigin &&
|
|
292
|
-
currentPopupOrigin &&
|
|
293
|
-
currentPopupOrigin === openerOrigin &&
|
|
294
|
-
initialPopupOrigin &&
|
|
295
|
-
initialPopupOrigin !== openerOrigin
|
|
296
|
-
) {
|
|
297
|
-
navigateOpenerFromPopup({
|
|
298
|
-
url,
|
|
299
|
-
target: managedPopup.target ?? null,
|
|
300
|
-
sourceUrl: managedPopup.url ?? null,
|
|
301
|
-
reason: 'popupReturnedToOpenerOrigin',
|
|
302
|
-
});
|
|
303
|
-
}
|
|
276
|
+
// OAuth callbacks must finish in their popup and notify the original
|
|
277
|
+
// opener. Returning to its origin alone must not close or replay them.
|
|
278
|
+
// Explicit opener navigation, postMessage and close use the popup bridge.
|
|
304
279
|
},
|
|
305
|
-
[
|
|
280
|
+
[setPopupChrome, webViewProps]
|
|
306
281
|
);
|
|
307
282
|
|
|
308
283
|
return {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// Generated by internal/module_scripts/sync-sdk-metadata.js.
|
|
2
2
|
export const EXPO_SATYA_ATTEST_SDK_NAME = '@burnt-labs/expo-satya-attest' as const;
|
|
3
|
-
export const EXPO_SATYA_ATTEST_SDK_VERSION = '3.10.
|
|
3
|
+
export const EXPO_SATYA_ATTEST_SDK_VERSION = '3.10.2' as const;
|