@hexar/biometric-identity-sdk-react-native 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/BiometricIdentityFlow.d.ts.map +1 -1
- package/dist/components/BiometricIdentityFlow.js +12 -3
- package/dist/components/CameraCapture.d.ts +2 -1
- package/dist/components/CameraCapture.d.ts.map +1 -1
- package/dist/components/CameraCapture.js +22 -16
- package/dist/components/InstructionsScreen.d.ts +1 -0
- package/dist/components/InstructionsScreen.d.ts.map +1 -1
- package/dist/components/InstructionsScreen.js +18 -1
- package/dist/components/VideoRecorder.d.ts +2 -1
- package/dist/components/VideoRecorder.d.ts.map +1 -1
- package/dist/components/VideoRecorder.js +184 -95
- package/package.json +1 -1
- package/src/components/BiometricIdentityFlow.tsx +13 -0
- package/src/components/CameraCapture.tsx +26 -13
- package/src/components/InstructionsScreen.tsx +28 -1
- package/src/components/VideoRecorder.tsx +215 -95
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BiometricIdentityFlow.d.ts","sourceRoot":"","sources":["../../src/components/BiometricIdentityFlow.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAChE,OAAO,EAOL,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,cAAc,
|
|
1
|
+
{"version":3,"file":"BiometricIdentityFlow.d.ts","sourceRoot":"","sources":["../../src/components/BiometricIdentityFlow.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAChE,OAAO,EAOL,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,cAAc,EAKd,iBAAiB,EAClB,MAAM,oCAAoC,CAAC;AAU5C,MAAM,WAAW,0BAA0B;IACzC,oBAAoB,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,OAAO,CAAC,EAAE,SAAS,CAAC;KACrB,CAAC;CACH;AAED,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAoTtE,CAAC;AAiOF,eAAe,qBAAqB,CAAC"}
|
|
@@ -56,11 +56,16 @@ const BiometricIdentityFlow = ({ onValidationComplete, onError, theme, language,
|
|
|
56
56
|
const [currentChallenges, setCurrentChallenges] = (0, react_1.useState)([]);
|
|
57
57
|
const [isLoadingChallenges, setIsLoadingChallenges] = (0, react_1.useState)(false);
|
|
58
58
|
// Set language early, before any components render
|
|
59
|
+
// Priority: language prop > SDK config language > default 'en'
|
|
59
60
|
// Run on mount and whenever language prop changes
|
|
60
61
|
(0, react_1.useEffect)(() => {
|
|
61
62
|
if (language) {
|
|
63
|
+
// If language prop is provided, override the config
|
|
62
64
|
(0, biometric_identity_sdk_core_1.setLanguage)(language);
|
|
63
65
|
}
|
|
66
|
+
// If no language prop, the language should already be set by BiometricIdentitySDK.configure()
|
|
67
|
+
// The global language state is set when configure() is called, so getStrings() will
|
|
68
|
+
// automatically return strings for the configured language (or 'en' as default)
|
|
64
69
|
}, [language]);
|
|
65
70
|
const strings = (0, biometric_identity_sdk_core_1.getStrings)();
|
|
66
71
|
const styles = createStyles(theme);
|
|
@@ -153,17 +158,21 @@ const BiometricIdentityFlow = ({ onValidationComplete, onError, theme, language,
|
|
|
153
158
|
}
|
|
154
159
|
// Show instructions on first load
|
|
155
160
|
if (showInstructions) {
|
|
156
|
-
return (react_1.default.createElement(InstructionsScreen_1.InstructionsScreen, { theme: theme, language: language, onStart: () => setShowInstructions(false),
|
|
161
|
+
return (react_1.default.createElement(InstructionsScreen_1.InstructionsScreen, { theme: theme, language: language, onStart: () => setShowInstructions(false), onCancel: onError ? () => onError({
|
|
162
|
+
name: 'BiometricError',
|
|
163
|
+
message: 'User cancelled',
|
|
164
|
+
code: biometric_identity_sdk_core_1.BiometricErrorCode.USER_CANCELLED,
|
|
165
|
+
}) : undefined, styles: customStyles }));
|
|
157
166
|
}
|
|
158
167
|
// Show camera/video recorder
|
|
159
168
|
if (showCamera) {
|
|
160
169
|
if (cameraMode === 'video') {
|
|
161
|
-
return (react_1.default.createElement(VideoRecorder_1.VideoRecorder, { theme: theme, challenges: currentChallenges, smartMode: smartLivenessMode, sessionId: sdk.getSessionId() || undefined, onComplete: handleCaptureComplete, onCancel: () => setShowCamera(false), onFetchChallenges: async () => {
|
|
170
|
+
return (react_1.default.createElement(VideoRecorder_1.VideoRecorder, { theme: theme, language: language, challenges: currentChallenges, smartMode: smartLivenessMode, sessionId: sdk.getSessionId() || undefined, onComplete: handleCaptureComplete, onCancel: () => setShowCamera(false), onFetchChallenges: async () => {
|
|
162
171
|
const challenges = await fetchChallenges('active');
|
|
163
172
|
return challenges;
|
|
164
173
|
} }));
|
|
165
174
|
}
|
|
166
|
-
return (react_1.default.createElement(CameraCapture_1.CameraCapture, { mode: cameraMode, theme: theme, onCapture: handleCaptureComplete, onCancel: () => setShowCamera(false) }));
|
|
175
|
+
return (react_1.default.createElement(CameraCapture_1.CameraCapture, { mode: cameraMode, theme: theme, language: language, onCapture: handleCaptureComplete, onCancel: () => setShowCamera(false) }));
|
|
167
176
|
}
|
|
168
177
|
// Show validation progress
|
|
169
178
|
if (state.currentStep === biometric_identity_sdk_core_1.SDKStep.VALIDATING) {
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
* Handles ID document photo capture
|
|
4
4
|
*/
|
|
5
5
|
import React from 'react';
|
|
6
|
-
import { ThemeConfig } from '@hexar/biometric-identity-sdk-core';
|
|
6
|
+
import { ThemeConfig, SupportedLanguage } from '@hexar/biometric-identity-sdk-core';
|
|
7
7
|
export interface CameraCaptureProps {
|
|
8
8
|
mode: 'front' | 'back';
|
|
9
9
|
theme?: ThemeConfig;
|
|
10
|
+
language?: SupportedLanguage;
|
|
10
11
|
onCapture: (imageData: string) => void;
|
|
11
12
|
onCancel: () => void;
|
|
12
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CameraCapture.d.ts","sourceRoot":"","sources":["../../src/components/CameraCapture.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAsC,MAAM,OAAO,CAAC;AAY3D,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"CameraCapture.d.ts","sourceRoot":"","sources":["../../src/components/CameraCapture.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAsC,MAAM,OAAO,CAAC;AAY3D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAA2B,MAAM,oCAAoC,CAAC;AAI7G,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA6NtD,CAAC;AA0JF,eAAe,aAAa,CAAC"}
|
|
@@ -42,12 +42,17 @@ const react_1 = __importStar(require("react"));
|
|
|
42
42
|
const react_native_1 = require("react-native");
|
|
43
43
|
const react_native_vision_camera_1 = require("react-native-vision-camera");
|
|
44
44
|
const react_native_permissions_1 = require("react-native-permissions");
|
|
45
|
+
const biometric_identity_sdk_core_1 = require("@hexar/biometric-identity-sdk-core");
|
|
45
46
|
const { width, height } = react_native_1.Dimensions.get('window');
|
|
46
|
-
const CameraCapture = ({ mode, theme, onCapture, onCancel, }) => {
|
|
47
|
+
const CameraCapture = ({ mode, theme, language, onCapture, onCancel, }) => {
|
|
47
48
|
const [isCapturing, setIsCapturing] = (0, react_1.useState)(false);
|
|
48
49
|
const [hasPermission, setHasPermission] = (0, react_1.useState)(false);
|
|
49
50
|
const cameraRef = (0, react_1.useRef)(null);
|
|
50
51
|
const { hasPermission: cameraPermission, requestPermission } = (0, react_native_vision_camera_1.useCameraPermission)();
|
|
52
|
+
if (language) {
|
|
53
|
+
(0, biometric_identity_sdk_core_1.setLanguage)(language);
|
|
54
|
+
}
|
|
55
|
+
const strings = (0, biometric_identity_sdk_core_1.getStrings)();
|
|
51
56
|
// Get camera device (back camera for document capture)
|
|
52
57
|
const device = (0, react_native_vision_camera_1.useCameraDevice)('back');
|
|
53
58
|
(0, react_1.useEffect)(() => {
|
|
@@ -78,7 +83,10 @@ const CameraCapture = ({ mode, theme, onCapture, onCancel, }) => {
|
|
|
78
83
|
catch (error) {
|
|
79
84
|
console.error('Permission check error:', error);
|
|
80
85
|
setHasPermission(false);
|
|
81
|
-
|
|
86
|
+
const errorMsg = typeof strings.errors.cameraPermissionDenied === 'string'
|
|
87
|
+
? strings.errors.cameraPermissionDenied
|
|
88
|
+
: strings.errors.cameraPermissionDenied?.message || 'Please enable camera access in your device settings to capture your ID document.';
|
|
89
|
+
react_native_1.Alert.alert('Camera Permission Required', errorMsg);
|
|
82
90
|
}
|
|
83
91
|
};
|
|
84
92
|
const handleCapture = async () => {
|
|
@@ -136,23 +144,25 @@ const CameraCapture = ({ mode, theme, onCapture, onCancel, }) => {
|
|
|
136
144
|
}
|
|
137
145
|
};
|
|
138
146
|
const instructions = mode === 'front'
|
|
139
|
-
?
|
|
140
|
-
:
|
|
147
|
+
? strings.capture.frontId.instruction
|
|
148
|
+
: strings.capture.backId.instruction;
|
|
141
149
|
if (!hasPermission) {
|
|
142
150
|
return (react_1.default.createElement(react_native_1.View, { style: styles.container },
|
|
143
151
|
react_1.default.createElement(react_native_1.View, { style: styles.permissionContainer },
|
|
144
|
-
react_1.default.createElement(react_native_1.Text, { style: styles.permissionText },
|
|
152
|
+
react_1.default.createElement(react_native_1.Text, { style: styles.permissionText }, typeof strings.errors.cameraPermissionDenied === 'string'
|
|
153
|
+
? strings.errors.cameraPermissionDenied
|
|
154
|
+
: strings.errors.cameraPermissionDenied?.message || 'Camera permission is required'),
|
|
145
155
|
react_1.default.createElement(react_native_1.TouchableOpacity, { style: [styles.button, { backgroundColor: theme?.primaryColor || '#6366F1' }], onPress: checkPermissions },
|
|
146
|
-
react_1.default.createElement(react_native_1.Text, { style: styles.buttonText },
|
|
156
|
+
react_1.default.createElement(react_native_1.Text, { style: styles.buttonText }, strings.common.grantPermission || 'Grant Permission')),
|
|
147
157
|
react_1.default.createElement(react_native_1.TouchableOpacity, { style: [styles.button, styles.cancelButton], onPress: onCancel },
|
|
148
|
-
react_1.default.createElement(react_native_1.Text, { style: styles.buttonText },
|
|
158
|
+
react_1.default.createElement(react_native_1.Text, { style: styles.buttonText }, strings.common.cancel || 'Cancel')))));
|
|
149
159
|
}
|
|
150
160
|
if (!device) {
|
|
151
161
|
return (react_1.default.createElement(react_native_1.View, { style: styles.container },
|
|
152
162
|
react_1.default.createElement(react_native_1.View, { style: styles.permissionContainer },
|
|
153
|
-
react_1.default.createElement(react_native_1.Text, { style: styles.permissionText },
|
|
163
|
+
react_1.default.createElement(react_native_1.Text, { style: styles.permissionText }, strings.errors.cameraNotAvailable || 'Camera not available'),
|
|
154
164
|
react_1.default.createElement(react_native_1.TouchableOpacity, { style: [styles.button, styles.cancelButton], onPress: onCancel },
|
|
155
|
-
react_1.default.createElement(react_native_1.Text, { style: styles.buttonText },
|
|
165
|
+
react_1.default.createElement(react_native_1.Text, { style: styles.buttonText }, strings.common.cancel || 'Cancel')))));
|
|
156
166
|
}
|
|
157
167
|
return (react_1.default.createElement(react_native_1.View, { style: styles.container },
|
|
158
168
|
react_1.default.createElement(react_native_1.View, { style: styles.cameraContainer },
|
|
@@ -166,15 +176,11 @@ const CameraCapture = ({ mode, theme, onCapture, onCancel, }) => {
|
|
|
166
176
|
react_1.default.createElement(react_native_1.View, { style: [styles.corner, styles.cornerBottomRight] }))))),
|
|
167
177
|
react_1.default.createElement(react_native_1.View, { style: styles.instructionsContainer },
|
|
168
178
|
react_1.default.createElement(react_native_1.Text, { style: styles.instructionsText }, instructions),
|
|
169
|
-
react_1.default.createElement(react_native_1.Text, { style: styles.tipsText },
|
|
170
|
-
|
|
171
|
-
'\n',
|
|
172
|
-
"\u2022 Avoid glare and shadows",
|
|
173
|
-
'\n',
|
|
174
|
-
"\u2022 Keep document flat and complete")),
|
|
179
|
+
react_1.default.createElement(react_native_1.Text, { style: styles.tipsText }, mode === 'front' ? strings.capture.frontId.tips : strings.capture.backId.tips ||
|
|
180
|
+
'• Ensure good lighting\n• Avoid glare and shadows\n• Keep document flat and complete')),
|
|
175
181
|
react_1.default.createElement(react_native_1.View, { style: styles.controls },
|
|
176
182
|
react_1.default.createElement(react_native_1.TouchableOpacity, { style: [styles.button, styles.cancelButton], onPress: onCancel },
|
|
177
|
-
react_1.default.createElement(react_native_1.Text, { style: styles.buttonText },
|
|
183
|
+
react_1.default.createElement(react_native_1.Text, { style: styles.buttonText }, strings.common.cancel || 'Cancel')),
|
|
178
184
|
react_1.default.createElement(react_native_1.TouchableOpacity, { style: [
|
|
179
185
|
styles.button,
|
|
180
186
|
styles.captureButton,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstructionsScreen.d.ts","sourceRoot":"","sources":["../../src/components/InstructionsScreen.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAML,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAA2B,MAAM,oCAAoC,CAAC;AAE7G,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,OAAO,CAAC,EAAE,SAAS,CAAC;KACrB,CAAC;CACH;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,
|
|
1
|
+
{"version":3,"file":"InstructionsScreen.d.ts","sourceRoot":"","sources":["../../src/components/InstructionsScreen.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAML,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAA2B,MAAM,oCAAoC,CAAC;AAE7G,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,OAAO,CAAC,EAAE,SAAS,CAAC;KACrB,CAAC;CACH;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA4GhE,CAAC;AAiMF,eAAe,kBAAkB,CAAC"}
|
|
@@ -41,7 +41,7 @@ exports.InstructionsScreen = void 0;
|
|
|
41
41
|
const react_1 = __importStar(require("react"));
|
|
42
42
|
const react_native_1 = require("react-native");
|
|
43
43
|
const biometric_identity_sdk_core_1 = require("@hexar/biometric-identity-sdk-core");
|
|
44
|
-
const InstructionsScreen = ({ theme, language = 'en', onStart, styles: customStyles, }) => {
|
|
44
|
+
const InstructionsScreen = ({ theme, language = 'en', onStart, onCancel, styles: customStyles, }) => {
|
|
45
45
|
const [strings, setStrings] = (0, react_1.useState)(() => {
|
|
46
46
|
// Set initial language
|
|
47
47
|
if (language) {
|
|
@@ -76,9 +76,16 @@ const InstructionsScreen = ({ theme, language = 'en', onStart, styles: customSty
|
|
|
76
76
|
react_1.default.createElement(react_native_1.View, { style: styles.privacyContainer },
|
|
77
77
|
react_1.default.createElement(react_native_1.Text, { style: styles.privacyText }, privacyContent))),
|
|
78
78
|
react_1.default.createElement(react_native_1.View, { style: styles.footer },
|
|
79
|
+
onCancel && (react_1.default.createElement(react_native_1.TouchableOpacity, { style: [
|
|
80
|
+
styles.button,
|
|
81
|
+
styles.cancelButton,
|
|
82
|
+
{ borderColor: theme?.errorColor || '#EF4444' },
|
|
83
|
+
], onPress: onCancel },
|
|
84
|
+
react_1.default.createElement(react_native_1.Text, { style: [styles.buttonText, { color: theme?.errorColor || '#EF4444' }] }, strings.common.cancel || 'Cancel'))),
|
|
79
85
|
react_1.default.createElement(react_native_1.TouchableOpacity, { style: [
|
|
80
86
|
styles.button,
|
|
81
87
|
{ backgroundColor: theme?.primaryColor || '#6366F1' },
|
|
88
|
+
onCancel && styles.startButton,
|
|
82
89
|
], onPress: onStart },
|
|
83
90
|
react_1.default.createElement(react_native_1.Text, { style: styles.buttonText }, strings.instructions.startButton)))));
|
|
84
91
|
};
|
|
@@ -175,12 +182,22 @@ const styles = react_native_1.StyleSheet.create({
|
|
|
175
182
|
padding: 24,
|
|
176
183
|
borderTopWidth: 1,
|
|
177
184
|
borderTopColor: '#E5E7EB',
|
|
185
|
+
flexDirection: 'row',
|
|
186
|
+
gap: 12,
|
|
178
187
|
},
|
|
179
188
|
button: {
|
|
180
189
|
paddingVertical: 16,
|
|
181
190
|
paddingHorizontal: 32,
|
|
182
191
|
borderRadius: 8,
|
|
183
192
|
alignItems: 'center',
|
|
193
|
+
flex: 1,
|
|
194
|
+
},
|
|
195
|
+
cancelButton: {
|
|
196
|
+
borderWidth: 2,
|
|
197
|
+
backgroundColor: 'transparent',
|
|
198
|
+
},
|
|
199
|
+
startButton: {
|
|
200
|
+
flex: 1,
|
|
184
201
|
},
|
|
185
202
|
buttonText: {
|
|
186
203
|
color: '#FFFFFF',
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Features challenge-response flow with guided head movements
|
|
4
4
|
*/
|
|
5
5
|
import React from 'react';
|
|
6
|
-
import { ThemeConfig, LivenessInstruction } from '@hexar/biometric-identity-sdk-core';
|
|
6
|
+
import { ThemeConfig, LivenessInstruction, SupportedLanguage } from '@hexar/biometric-identity-sdk-core';
|
|
7
7
|
export interface ChallengeAction {
|
|
8
8
|
action: string;
|
|
9
9
|
instruction: string;
|
|
@@ -13,6 +13,7 @@ export interface ChallengeAction {
|
|
|
13
13
|
}
|
|
14
14
|
export interface VideoRecorderProps {
|
|
15
15
|
theme?: ThemeConfig;
|
|
16
|
+
language?: SupportedLanguage;
|
|
16
17
|
/** Total recording duration in ms (default: 8000ms for smart mode) */
|
|
17
18
|
duration?: number;
|
|
18
19
|
/** Instructions for user to follow */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoRecorder.d.ts","sourceRoot":"","sources":["../../src/components/VideoRecorder.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAaxE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"VideoRecorder.d.ts","sourceRoot":"","sources":["../../src/components/VideoRecorder.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAaxE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAA2B,MAAM,oCAAoC,CAAC;AAGlI,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACrC,0CAA0C;IAC1C,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wCAAwC;IACxC,UAAU,EAAE,CAAC,SAAS,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACtD,iCAAiC;IACjC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,gDAAgD;IAChD,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+CD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAmsBtD,CAAC;AA4OF,eAAe,aAAa,CAAC"}
|