react-native-tediwave-biometric-verifier 0.1.3
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/LICENSE +9 -0
- package/README.md +85 -0
- package/TediwaveBiometricVerifier.podspec +20 -0
- package/android/build.gradle +67 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/com/tediwavebiometricverifier/TediwaveBiometricVerifierModule.kt +15 -0
- package/android/src/main/java/com/tediwavebiometricverifier/TediwaveBiometricVerifierPackage.kt +31 -0
- package/ios/TediwaveBiometricVerifier.h +5 -0
- package/ios/TediwaveBiometricVerifier.mm +21 -0
- package/lib/module/BiometricCamera.js +30 -0
- package/lib/module/BiometricCamera.js.map +1 -0
- package/lib/module/index.js +6 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/logger.js +38 -0
- package/lib/module/logger.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/useBiometricEngine.js +458 -0
- package/lib/module/useBiometricEngine.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/BiometricCamera.d.ts +14 -0
- package/lib/typescript/src/BiometricCamera.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +5 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/logger.d.ts +10 -0
- package/lib/typescript/src/logger.d.ts.map +1 -0
- package/lib/typescript/src/useBiometricEngine.d.ts +99 -0
- package/lib/typescript/src/useBiometricEngine.d.ts.map +1 -0
- package/package.json +159 -0
- package/src/BiometricCamera.tsx +39 -0
- package/src/index.tsx +6 -0
- package/src/logger.ts +46 -0
- package/src/useBiometricEngine.ts +626 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Proprietary Code License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Tediwave, all rights reserved
|
|
4
|
+
|
|
5
|
+
This software and all associated documentation files, hereinafter referred to as the "Software", are the exclusive, proprietary intellectual property of Tediwave, meaning that no license, permission, or right of use is granted to any person, company, or third-party entity obtaining a copy of this material
|
|
6
|
+
|
|
7
|
+
You are strictly prohibited from copying, modifying, merging, publishing, distributing, sublicensing, selling, or reverse-engineering any part of this software workspace, as all ownership, exploitation, and distribution privileges remain entirely, unconditionally reserved by the authors
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, MEANING THAT IN NO EVENT SHALL THE AUTHORS, COPYRIGHT HOLDERS, OR NATIVE OWNERS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF THIS REPOSITORY
|
package/README.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
## Tediwave Biometric Verifier (Headless SDK)
|
|
2
|
+
|
|
3
|
+
This SDK provides headless biometric verification capabilities for React Native apps. It focuses on processing, liveness and optional identity verification, and session management — without imposing any UI. Your application is responsible for rendering camera views, overlays, instructions, progress bars, and retry flows.
|
|
4
|
+
|
|
5
|
+
Key responsibilities:
|
|
6
|
+
|
|
7
|
+
- Camera processing (frame processor to wire into your camera)
|
|
8
|
+
- Face detection and face quality metrics
|
|
9
|
+
- Challenge generation and validation
|
|
10
|
+
- Liveness verification
|
|
11
|
+
- Optional identity verification (when a reference image is provided)
|
|
12
|
+
- Anti-spoofing checks
|
|
13
|
+
- Voice guidance (configurable)
|
|
14
|
+
- Session management and result payloads
|
|
15
|
+
|
|
16
|
+
Installation
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
npm install react-native-tediwave-biometric-verifier
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Quick Start (headless)
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import React from 'react';
|
|
26
|
+
import { Camera, useCameraDevice } from 'react-native-vision-camera';
|
|
27
|
+
import {
|
|
28
|
+
BiometricCamera,
|
|
29
|
+
useBiometricEngine,
|
|
30
|
+
} from 'react-native-tediwave-biometric-verifier';
|
|
31
|
+
|
|
32
|
+
export default function MyVerifierScreen() {
|
|
33
|
+
const device = useCameraDevice('front');
|
|
34
|
+
const {
|
|
35
|
+
frameProcessor,
|
|
36
|
+
frameProcessorFps,
|
|
37
|
+
status,
|
|
38
|
+
verificationStatus,
|
|
39
|
+
currentChallenge,
|
|
40
|
+
progress,
|
|
41
|
+
startVerification,
|
|
42
|
+
pauseVerification,
|
|
43
|
+
resumeVerification,
|
|
44
|
+
finishVerification,
|
|
45
|
+
faceQuality,
|
|
46
|
+
completedChallenges,
|
|
47
|
+
totalChallenges,
|
|
48
|
+
setLiveImage,
|
|
49
|
+
onResult,
|
|
50
|
+
} = useBiometricEngine({ apiKey: 'MY_KEY', autoStart: false });
|
|
51
|
+
|
|
52
|
+
React.useEffect(() => {
|
|
53
|
+
startVerification();
|
|
54
|
+
}, [startVerification]);
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<BiometricCamera
|
|
58
|
+
device={device}
|
|
59
|
+
isActive
|
|
60
|
+
frameProcessor={frameProcessor}
|
|
61
|
+
frameProcessorFps={frameProcessorFps ?? 1}
|
|
62
|
+
style={{ flex: 1 }}
|
|
63
|
+
>
|
|
64
|
+
{/* Render your custom UI overlays here using the headless state above */}
|
|
65
|
+
</BiometricCamera>
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Primary exports
|
|
71
|
+
|
|
72
|
+
- `useBiometricEngine(config)`: Headless hook returning state, control methods, frameProcessor and results.
|
|
73
|
+
- `BiometricCamera`: Lightweight camera wrapper that forwards props to `react-native-vision-camera` and accepts a `frameProcessor`.
|
|
74
|
+
|
|
75
|
+
Documentation
|
|
76
|
+
|
|
77
|
+
- See the `example/` folder for full integration examples demonstrating custom UIs, retries and identity mode.
|
|
78
|
+
|
|
79
|
+
Migration notes
|
|
80
|
+
|
|
81
|
+
- The SDK removed built-in UI components. Move any in-app UI into your application and consume the headless hook and camera component to drive UI state.
|
|
82
|
+
|
|
83
|
+
License
|
|
84
|
+
|
|
85
|
+
MIT
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
|
|
3
|
+
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
4
|
+
|
|
5
|
+
Pod::Spec.new do |s|
|
|
6
|
+
s.name = "TediwaveBiometricVerifier"
|
|
7
|
+
s.version = package["version"]
|
|
8
|
+
s.summary = package["description"]
|
|
9
|
+
s.homepage = package["homepage"]
|
|
10
|
+
s.license = package["license"]
|
|
11
|
+
s.authors = package["author"]
|
|
12
|
+
|
|
13
|
+
s.platforms = { :ios => min_ios_version_supported }
|
|
14
|
+
s.source = { :git => "https://github.com/Tediwave/tediwave-biometric-verifier.git", :tag => "#{s.version}" }
|
|
15
|
+
|
|
16
|
+
s.source_files = "ios/**/*.{h,m,mm,swift,cpp}"
|
|
17
|
+
s.private_header_files = "ios/**/*.h"
|
|
18
|
+
|
|
19
|
+
install_modules_dependencies(s)
|
|
20
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
buildscript {
|
|
2
|
+
ext.TediwaveBiometricVerifier = [
|
|
3
|
+
kotlinVersion: "2.0.21",
|
|
4
|
+
minSdkVersion: 24,
|
|
5
|
+
compileSdkVersion: 36,
|
|
6
|
+
targetSdkVersion: 36
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
ext.getExtOrDefault = { prop ->
|
|
10
|
+
if (rootProject.ext.has(prop)) {
|
|
11
|
+
return rootProject.ext.get(prop)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return TediwaveBiometricVerifier[prop]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
repositories {
|
|
18
|
+
google()
|
|
19
|
+
mavenCentral()
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
dependencies {
|
|
23
|
+
classpath "com.android.tools.build:gradle:8.7.2"
|
|
24
|
+
// noinspection DifferentKotlinGradleVersion
|
|
25
|
+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${getExtOrDefault('kotlinVersion')}"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
apply plugin: "com.android.library"
|
|
31
|
+
apply plugin: "kotlin-android"
|
|
32
|
+
|
|
33
|
+
apply plugin: "com.facebook.react"
|
|
34
|
+
|
|
35
|
+
android {
|
|
36
|
+
namespace "com.tediwavebiometricverifier"
|
|
37
|
+
|
|
38
|
+
compileSdkVersion getExtOrDefault("compileSdkVersion")
|
|
39
|
+
|
|
40
|
+
defaultConfig {
|
|
41
|
+
minSdkVersion getExtOrDefault("minSdkVersion")
|
|
42
|
+
targetSdkVersion getExtOrDefault("targetSdkVersion")
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
buildFeatures {
|
|
46
|
+
buildConfig true
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
buildTypes {
|
|
50
|
+
release {
|
|
51
|
+
minifyEnabled false
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
lint {
|
|
56
|
+
disable "GradleCompatible"
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
compileOptions {
|
|
60
|
+
sourceCompatibility JavaVersion.VERSION_1_8
|
|
61
|
+
targetCompatibility JavaVersion.VERSION_1_8
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
dependencies {
|
|
66
|
+
implementation "com.facebook.react:react-android"
|
|
67
|
+
}
|
package/android/src/main/java/com/tediwavebiometricverifier/TediwaveBiometricVerifierModule.kt
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
package com.tediwavebiometricverifier
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
4
|
+
|
|
5
|
+
class TediwaveBiometricVerifierModule(reactContext: ReactApplicationContext) :
|
|
6
|
+
NativeTediwaveBiometricVerifierSpec(reactContext) {
|
|
7
|
+
|
|
8
|
+
override fun multiply(a: Double, b: Double): Double {
|
|
9
|
+
return a * b
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
companion object {
|
|
13
|
+
const val NAME = NativeTediwaveBiometricVerifierSpec.NAME
|
|
14
|
+
}
|
|
15
|
+
}
|
package/android/src/main/java/com/tediwavebiometricverifier/TediwaveBiometricVerifierPackage.kt
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
package com.tediwavebiometricverifier
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.BaseReactPackage
|
|
4
|
+
import com.facebook.react.bridge.NativeModule
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
+
import com.facebook.react.module.model.ReactModuleInfo
|
|
7
|
+
import com.facebook.react.module.model.ReactModuleInfoProvider
|
|
8
|
+
import java.util.HashMap
|
|
9
|
+
|
|
10
|
+
class TediwaveBiometricVerifierPackage : BaseReactPackage() {
|
|
11
|
+
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
|
|
12
|
+
return if (name == TediwaveBiometricVerifierModule.NAME) {
|
|
13
|
+
TediwaveBiometricVerifierModule(reactContext)
|
|
14
|
+
} else {
|
|
15
|
+
null
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
override fun getReactModuleInfoProvider() = ReactModuleInfoProvider {
|
|
20
|
+
mapOf(
|
|
21
|
+
TediwaveBiometricVerifierModule.NAME to ReactModuleInfo(
|
|
22
|
+
name = TediwaveBiometricVerifierModule.NAME,
|
|
23
|
+
className = TediwaveBiometricVerifierModule.NAME,
|
|
24
|
+
canOverrideExistingModule = false,
|
|
25
|
+
needsEagerInit = false,
|
|
26
|
+
isCxxModule = false,
|
|
27
|
+
isTurboModule = true
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#import "TediwaveBiometricVerifier.h"
|
|
2
|
+
|
|
3
|
+
@implementation TediwaveBiometricVerifier
|
|
4
|
+
- (NSNumber *)multiply:(double)a b:(double)b {
|
|
5
|
+
NSNumber *result = @(a * b);
|
|
6
|
+
|
|
7
|
+
return result;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
|
11
|
+
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
12
|
+
{
|
|
13
|
+
return std::make_shared<facebook::react::NativeTediwaveBiometricVerifierSpecJSI>(params);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
+ (NSString *)moduleName
|
|
17
|
+
{
|
|
18
|
+
return @"TediwaveBiometricVerifier";
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { View } from 'react-native';
|
|
5
|
+
import { Camera } from 'react-native-vision-camera';
|
|
6
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
7
|
+
export function BiometricCamera({
|
|
8
|
+
style,
|
|
9
|
+
isActive = true,
|
|
10
|
+
frameProcessor,
|
|
11
|
+
frameProcessorFps = 1,
|
|
12
|
+
children,
|
|
13
|
+
...cameraProps
|
|
14
|
+
}) {
|
|
15
|
+
const CameraAny = Camera;
|
|
16
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
17
|
+
style: style,
|
|
18
|
+
children: [/*#__PURE__*/_jsx(CameraAny, {
|
|
19
|
+
...cameraProps,
|
|
20
|
+
isActive: isActive,
|
|
21
|
+
frameProcessor: frameProcessor,
|
|
22
|
+
frameProcessorFps: frameProcessorFps,
|
|
23
|
+
style: {
|
|
24
|
+
flex: 1
|
|
25
|
+
}
|
|
26
|
+
}), children]
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export default BiometricCamera;
|
|
30
|
+
//# sourceMappingURL=BiometricCamera.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","View","Camera","jsx","_jsx","jsxs","_jsxs","BiometricCamera","style","isActive","frameProcessor","frameProcessorFps","children","cameraProps","CameraAny","flex"],"sourceRoot":"..\\..\\src","sources":["BiometricCamera.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,QAAQ,cAAc;AAEnC,SAASC,MAAM,QAAQ,4BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAYpD,OAAO,SAASC,eAAeA,CAAC;EAC9BC,KAAK;EACLC,QAAQ,GAAG,IAAI;EACfC,cAAc;EACdC,iBAAiB,GAAG,CAAC;EACrBC,QAAQ;EACR,GAAGC;AACiB,CAAC,EAAE;EACvB,MAAMC,SAAc,GAAGZ,MAAM;EAC7B,oBACEI,KAAA,CAACL,IAAI;IAACO,KAAK,EAAEA,KAAM;IAAAI,QAAA,gBACjBR,IAAA,CAACU,SAAS;MAAA,GACJD,WAAW;MACfJ,QAAQ,EAAEA,QAAS;MACnBC,cAAc,EAAEA,cAAe;MAC/BC,iBAAiB,EAAEA,iBAAkB;MACrCH,KAAK,EAAE;QAAEO,IAAI,EAAE;MAAE;IAAE,CACpB,CAAC,EACDH,QAAQ;EAAA,CACL,CAAC;AAEX;AAEA,eAAeL,eAAe","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useBiometricEngine","BiometricCamera"],"sourceRoot":"..\\..\\src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,kBAAkB,QAAQ,yBAAyB;AAC5D,SAASC,eAAe,QAAQ,sBAAuB;AAEvD,SAASD,kBAAkB,EAAEC,eAAe","ignoreList":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const LEVEL_ORDER = {
|
|
4
|
+
debug: 0,
|
|
5
|
+
info: 1,
|
|
6
|
+
warn: 2,
|
|
7
|
+
error: 3
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
// Use globalThis to avoid depending on Node's `process` type in the build
|
|
11
|
+
let CURRENT_LEVEL = globalThis.process?.env?.LOG_LEVEL || 'debug';
|
|
12
|
+
function shouldLog(level) {
|
|
13
|
+
return LEVEL_ORDER[level] >= LEVEL_ORDER[CURRENT_LEVEL] || CURRENT_LEVEL === 'debug';
|
|
14
|
+
}
|
|
15
|
+
function formatMessage(level, tag, message) {
|
|
16
|
+
const ts = new Date().toISOString();
|
|
17
|
+
const payload = typeof message === 'string' ? message : JSON.stringify(message);
|
|
18
|
+
return `[${ts}] [${level.toUpperCase()}] [${tag}] ${payload}`;
|
|
19
|
+
}
|
|
20
|
+
export const logger = {
|
|
21
|
+
setLevel(l) {
|
|
22
|
+
CURRENT_LEVEL = l;
|
|
23
|
+
},
|
|
24
|
+
debug(tag, msg) {
|
|
25
|
+
if (shouldLog('debug')) console.debug(formatMessage('debug', tag, msg));
|
|
26
|
+
},
|
|
27
|
+
info(tag, msg) {
|
|
28
|
+
if (shouldLog('info')) console.info(formatMessage('info', tag, msg));
|
|
29
|
+
},
|
|
30
|
+
warn(tag, msg) {
|
|
31
|
+
if (shouldLog('warn')) console.warn(formatMessage('warn', tag, msg));
|
|
32
|
+
},
|
|
33
|
+
error(tag, msg) {
|
|
34
|
+
if (shouldLog('error')) console.error(formatMessage('error', tag, msg));
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
export default logger;
|
|
38
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["LEVEL_ORDER","debug","info","warn","error","CURRENT_LEVEL","globalThis","process","env","LOG_LEVEL","shouldLog","level","formatMessage","tag","message","ts","Date","toISOString","payload","JSON","stringify","toUpperCase","logger","setLevel","l","msg","console"],"sourceRoot":"..\\..\\src","sources":["logger.ts"],"mappings":";;AAEA,MAAMA,WAAqC,GAAG;EAC5CC,KAAK,EAAE,CAAC;EACRC,IAAI,EAAE,CAAC;EACPC,IAAI,EAAE,CAAC;EACPC,KAAK,EAAE;AACT,CAAC;;AAED;AACA,IAAIC,aAAuB,GACvBC,UAAU,CAASC,OAAO,EAAEC,GAAG,EAAEC,SAAS,IAAiB,OAAO;AAEtE,SAASC,SAASA,CAACC,KAAe,EAAE;EAClC,OACEX,WAAW,CAACW,KAAK,CAAC,IAAIX,WAAW,CAACK,aAAa,CAAC,IAChDA,aAAa,KAAK,OAAO;AAE7B;AAEA,SAASO,aAAaA,CAACD,KAAe,EAAEE,GAAW,EAAEC,OAAgB,EAAE;EACrE,MAAMC,EAAE,GAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;EACnC,MAAMC,OAAO,GACX,OAAOJ,OAAO,KAAK,QAAQ,GAAGA,OAAO,GAAGK,IAAI,CAACC,SAAS,CAACN,OAAO,CAAC;EACjE,OAAO,IAAIC,EAAE,MAAMJ,KAAK,CAACU,WAAW,CAAC,CAAC,MAAMR,GAAG,KAAKK,OAAO,EAAE;AAC/D;AAEA,OAAO,MAAMI,MAAM,GAAG;EACpBC,QAAQA,CAACC,CAAW,EAAE;IACpBnB,aAAa,GAAGmB,CAAC;EACnB,CAAC;EACDvB,KAAKA,CAACY,GAAW,EAAEY,GAAY,EAAE;IAC/B,IAAIf,SAAS,CAAC,OAAO,CAAC,EAAEgB,OAAO,CAACzB,KAAK,CAACW,aAAa,CAAC,OAAO,EAAEC,GAAG,EAAEY,GAAG,CAAC,CAAC;EACzE,CAAC;EACDvB,IAAIA,CAACW,GAAW,EAAEY,GAAY,EAAE;IAC9B,IAAIf,SAAS,CAAC,MAAM,CAAC,EAAEgB,OAAO,CAACxB,IAAI,CAACU,aAAa,CAAC,MAAM,EAAEC,GAAG,EAAEY,GAAG,CAAC,CAAC;EACtE,CAAC;EACDtB,IAAIA,CAACU,GAAW,EAAEY,GAAY,EAAE;IAC9B,IAAIf,SAAS,CAAC,MAAM,CAAC,EAAEgB,OAAO,CAACvB,IAAI,CAACS,aAAa,CAAC,MAAM,EAAEC,GAAG,EAAEY,GAAG,CAAC,CAAC;EACtE,CAAC;EACDrB,KAAKA,CAACS,GAAW,EAAEY,GAAY,EAAE;IAC/B,IAAIf,SAAS,CAAC,OAAO,CAAC,EAAEgB,OAAO,CAACtB,KAAK,CAACQ,aAAa,CAAC,OAAO,EAAEC,GAAG,EAAEY,GAAG,CAAC,CAAC;EACzE;AACF,CAAC;AAED,eAAeH,MAAM","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|