@garrix82/reactgenie-lib 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +22 -0
- package/.github/workflows/publish.yml +20 -0
- package/LICENSE.txt +201 -0
- package/README.md +621 -0
- package/babel.config.js +29 -0
- package/dist/adapters/__tests__/expo-router-adapter.test.d.ts +1 -0
- package/dist/adapters/expo-router-adapter.d.ts +16 -0
- package/dist/adapters/expo-router-adapter.js +521 -0
- package/dist/adapters/navigation-adapter.d.ts +20 -0
- package/dist/adapters/navigation-adapter.js +137 -0
- package/dist/audio-visualizer.d.ts +14 -0
- package/dist/audio-visualizer.js +123 -0
- package/dist/current-selection.d.ts +27 -0
- package/dist/current-selection.js +94 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.js +37 -0
- package/dist/genie/DateTime.d.ts +66 -0
- package/dist/genie/DateTime.js +399 -0
- package/dist/genie/TimeDelta.d.ts +35 -0
- package/dist/genie/TimeDelta.js +169 -0
- package/dist/genie-view-wrapper.d.ts +1 -0
- package/dist/genie-view-wrapper.js +377 -0
- package/dist/hooks/__tests__/useSpeechRecognition.test.d.ts +1 -0
- package/dist/hooks/useSpeechRecognition.d.ts +28 -0
- package/dist/hooks/useSpeechRecognition.js +118 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +469 -0
- package/dist/logger.d.ts +23 -0
- package/dist/logger.js +597 -0
- package/dist/logger.remote.test.d.ts +0 -0
- package/dist/modality-provider-v2.d.ts +28 -0
- package/dist/modality-provider-v2.js +1321 -0
- package/dist/modality-provider.d.ts +22 -0
- package/dist/modality-provider.js +373 -0
- package/dist/native-visibility.d.ts +28 -0
- package/dist/native-visibility.js +50 -0
- package/dist/platform/VoiceRecognitionBar.d.ts +17 -0
- package/dist/platform/VoiceRecognitionBar.js +332 -0
- package/dist/platform/components.d.ts +32 -0
- package/dist/platform/components.js +351 -0
- package/dist/platform/events.d.ts +31 -0
- package/dist/platform/events.js +274 -0
- package/dist/platform/index.d.ts +3 -0
- package/dist/platform/index.js +39 -0
- package/dist/platform/types.d.ts +79 -0
- package/dist/platform/types.js +97 -0
- package/dist/react-decorators.d.ts +87 -0
- package/dist/react-decorators.js +368 -0
- package/dist/shared-store.d.ts +74 -0
- package/dist/shared-store.js +589 -0
- package/dist/speech-recognition/__tests__/speech-recognition-groq-transport.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-native.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-openai-native.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-openai.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-unified-import.test.d.ts +0 -0
- package/dist/speech-recognition/__tests__/speech-recognition-unified.test.d.ts +1 -0
- package/dist/speech-recognition/speech-recognition-groq.d.ts +21 -0
- package/dist/speech-recognition/speech-recognition-groq.js +409 -0
- package/dist/speech-recognition/speech-recognition-mlx.d.ts +15 -0
- package/dist/speech-recognition/speech-recognition-mlx.js +393 -0
- package/dist/speech-recognition/speech-recognition-native.d.ts +24 -0
- package/dist/speech-recognition/speech-recognition-native.js +632 -0
- package/dist/speech-recognition/speech-recognition-openai-native.d.ts +40 -0
- package/dist/speech-recognition/speech-recognition-openai-native.js +653 -0
- package/dist/speech-recognition/speech-recognition-openai.d.ts +39 -0
- package/dist/speech-recognition/speech-recognition-openai.js +718 -0
- package/dist/speech-recognition/speech-recognition-unified.d.ts +93 -0
- package/dist/speech-recognition/speech-recognition-unified.js +589 -0
- package/dist/speech-recognition/utils/groq-transcription.d.ts +41 -0
- package/dist/speech-recognition/utils/groq-transcription.js +382 -0
- package/dist/speech-recognition.d.ts +7 -0
- package/dist/speech-recognition.js +61 -0
- package/dist/voice-pipeline-telemetry.d.ts +26 -0
- package/dist/voice-pipeline-telemetry.js +15 -0
- package/garrix82-reactgenie-lib-1.3.0.tgz +0 -0
- package/metro/index.js +3 -0
- package/metro/with-genie-registry.js +47 -0
- package/package.json +111 -0
- package/scripts/dry-run.js +23 -0
- package/scripts/generate-genie-registry.js +278 -0
- package/scripts/log-file-test.js +51 -0
- package/scripts/parse.js +26 -0
- package/scripts/prompt.js +19 -0
- package/scripts/set-script.js +200 -0
- package/tsconfig.json +36 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { NlInterpreter, ExampleParse, type NlInterpreterParserConfig } from "@garrix82/reactgenie-dsl";
|
|
3
|
+
export declare let GenieInterpreter: NlInterpreter;
|
|
4
|
+
export declare const enum ListenerStateEnum {
|
|
5
|
+
Idle = 0,
|
|
6
|
+
Listening = 1,
|
|
7
|
+
Processing = 2
|
|
8
|
+
}
|
|
9
|
+
export declare const ModalityProvider: (props: {
|
|
10
|
+
examples?: ExampleParse[];
|
|
11
|
+
codexApiKey: string;
|
|
12
|
+
codexApiBaseUrl?: string;
|
|
13
|
+
parserConfig?: NlInterpreterParserConfig;
|
|
14
|
+
langsmithConfig?: {
|
|
15
|
+
apiKey?: string;
|
|
16
|
+
project?: string;
|
|
17
|
+
endpoint?: string;
|
|
18
|
+
};
|
|
19
|
+
displayTranscript: boolean;
|
|
20
|
+
extraPrompt: string;
|
|
21
|
+
children: React.ReactElement[] | React.ReactElement;
|
|
22
|
+
}) => any;
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ModalityProvider = exports.ListenerStateEnum = exports.GenieInterpreter = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _reactRedux = require("react-redux");
|
|
9
|
+
var _native = require("@react-navigation/native");
|
|
10
|
+
var _stack = require("@react-navigation/stack");
|
|
11
|
+
var _vectorIcons = require("@expo/vector-icons");
|
|
12
|
+
var _speechRecognition = require("./speech-recognition");
|
|
13
|
+
var _core = require("@react-native-material/core");
|
|
14
|
+
var _reactgenieDsl = require("@garrix82/reactgenie-dsl");
|
|
15
|
+
var _reactDecorators = require("./react-decorators");
|
|
16
|
+
var _sharedStore = require("./shared-store");
|
|
17
|
+
var _reactNative = require("react-native");
|
|
18
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
19
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
20
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
21
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
22
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
23
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
24
|
+
const Stack = (0, _stack.createStackNavigator)();
|
|
25
|
+
let GenieInterpreter = exports.GenieInterpreter = void 0;
|
|
26
|
+
const recordInterpreterTurn = (interpreter, record) => {
|
|
27
|
+
const maybeTurnRecorder = interpreter;
|
|
28
|
+
if (typeof maybeTurnRecorder.recordTurn === "function") {
|
|
29
|
+
maybeTurnRecorder.recordTurn(record);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
maybeTurnRecorder.recordInteraction?.(record);
|
|
33
|
+
};
|
|
34
|
+
const DefaultScreen = children => ({
|
|
35
|
+
navigation
|
|
36
|
+
}) => {
|
|
37
|
+
(0, _react.useEffect)(() => {
|
|
38
|
+
navigation.setOptions({
|
|
39
|
+
headerShown: false
|
|
40
|
+
});
|
|
41
|
+
}, []);
|
|
42
|
+
return children;
|
|
43
|
+
};
|
|
44
|
+
const ObjectInterfaceScreen = genieInterfaceStoreElement => ({
|
|
45
|
+
route,
|
|
46
|
+
navigation
|
|
47
|
+
}) => {
|
|
48
|
+
const title = genieInterfaceStoreElement.title(route.params);
|
|
49
|
+
(0, _react.useEffect)(() => {
|
|
50
|
+
navigation.setOptions({
|
|
51
|
+
headerShown: true
|
|
52
|
+
});
|
|
53
|
+
navigation.setOptions({
|
|
54
|
+
title: title
|
|
55
|
+
});
|
|
56
|
+
}, []);
|
|
57
|
+
return /*#__PURE__*/_react.default.createElement(genieInterfaceStoreElement.function, route.params);
|
|
58
|
+
};
|
|
59
|
+
const cardStyle = {
|
|
60
|
+
presentation: "card",
|
|
61
|
+
animation: "default",
|
|
62
|
+
// v7: replaced animationEnabled with animation
|
|
63
|
+
headerStyleInterpolator: _stack.HeaderStyleInterpolators.forUIKit,
|
|
64
|
+
cardStyleInterpolator: _stack.CardStyleInterpolators.forHorizontalIOS
|
|
65
|
+
};
|
|
66
|
+
let ListenerStateEnum = exports.ListenerStateEnum = /*#__PURE__*/function (ListenerStateEnum) {
|
|
67
|
+
ListenerStateEnum[ListenerStateEnum["Idle"] = 0] = "Idle";
|
|
68
|
+
ListenerStateEnum[ListenerStateEnum["Listening"] = 1] = "Listening";
|
|
69
|
+
ListenerStateEnum[ListenerStateEnum["Processing"] = 2] = "Processing"; // Done,
|
|
70
|
+
return ListenerStateEnum;
|
|
71
|
+
}({});
|
|
72
|
+
const ModalityProvider = props => {
|
|
73
|
+
const resolvedProxyBaseUrl = props.codexApiBaseUrl;
|
|
74
|
+
const examples = (0, _sharedStore.useGenieSelector)(() => {
|
|
75
|
+
if (props.examples === undefined) {
|
|
76
|
+
return _reactgenieDsl.sharedState["__EXAMPLES__"];
|
|
77
|
+
} else {
|
|
78
|
+
return props.examples.concat(_reactgenieDsl.sharedState["__EXAMPLES__"]);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
const navState = (0, _reactRedux.useSelector)(state => {
|
|
82
|
+
return state.navState;
|
|
83
|
+
});
|
|
84
|
+
const navStack = (0, _reactRedux.useSelector)(state => {
|
|
85
|
+
return state.navStack;
|
|
86
|
+
});
|
|
87
|
+
const voiceMessage = (0, _reactRedux.useSelector)(state => {
|
|
88
|
+
return state.message;
|
|
89
|
+
});
|
|
90
|
+
const [snackbarVisible, setSnackbarVisible] = (0, _react.useState)(false);
|
|
91
|
+
(0, _react.useEffect)(() => {
|
|
92
|
+
const messageText = voiceMessage?.fullText || voiceMessage?.message || voiceMessage?.minimalText || "";
|
|
93
|
+
if (voiceMessage !== null && voiceMessage !== undefined && messageText != "") {
|
|
94
|
+
setSnackbarVisible(true);
|
|
95
|
+
setTimeout(() => {
|
|
96
|
+
setSnackbarVisible(false);
|
|
97
|
+
}, 3000);
|
|
98
|
+
}
|
|
99
|
+
}, [voiceMessage]);
|
|
100
|
+
exports.GenieInterpreter = GenieInterpreter = (0, _react.useMemo)(() => {
|
|
101
|
+
const descriptors = [];
|
|
102
|
+
for (const key in _reactDecorators.AllGenieObjects) {
|
|
103
|
+
descriptors.push(_reactDecorators.AllGenieObjects[key].ClassDescriptor);
|
|
104
|
+
}
|
|
105
|
+
return new _reactgenieDsl.NlInterpreter(descriptors, props.codexApiKey, undefined, examples, props.extraPrompt, {
|
|
106
|
+
parser: {
|
|
107
|
+
provider: props.parserConfig?.provider,
|
|
108
|
+
groq: _objectSpread(_objectSpread({}, props.parserConfig?.groq || {}), {}, {
|
|
109
|
+
baseUrl: props.parserConfig?.groq?.baseUrl || resolvedProxyBaseUrl
|
|
110
|
+
}),
|
|
111
|
+
openai: _objectSpread(_objectSpread({}, props.parserConfig?.openai || {}), {}, {
|
|
112
|
+
baseUrl: props.parserConfig?.openai?.baseUrl || resolvedProxyBaseUrl
|
|
113
|
+
})
|
|
114
|
+
},
|
|
115
|
+
monitoring: {
|
|
116
|
+
langsmithApiKey: props.langsmithConfig?.apiKey,
|
|
117
|
+
langsmithProject: props.langsmithConfig?.project,
|
|
118
|
+
langsmithEndpoint: props.langsmithConfig?.endpoint
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}, [props.codexApiKey, props.extraPrompt, props.parserConfig, props.langsmithConfig?.apiKey, props.langsmithConfig?.project, props.langsmithConfig?.endpoint, resolvedProxyBaseUrl, examples]);
|
|
122
|
+
|
|
123
|
+
//create ref to NavigationContainer with type
|
|
124
|
+
const navigationRef = (0, _native.useNavigationContainerRef)();
|
|
125
|
+
(0, _react.useEffect)(() => {
|
|
126
|
+
console.log("nav state changed", navState);
|
|
127
|
+
if (navState.objectViewClassName !== null) {
|
|
128
|
+
navigationRef.dispatch(_native.StackActions.push(navState.objectViewClassName, navState.objectConstructorParams));
|
|
129
|
+
}
|
|
130
|
+
}, [navStack]);
|
|
131
|
+
const uiList = (0, _react.useMemo)(() => {
|
|
132
|
+
const uiList = [];
|
|
133
|
+
const allInterfaces = _reactDecorators.AllGenieObjectInterfaces.allInterfaces();
|
|
134
|
+
for (const key in allInterfaces) {
|
|
135
|
+
const interfacesStoreElement = allInterfaces[key];
|
|
136
|
+
uiList.push(/*#__PURE__*/_react.default.createElement(Stack.Screen, {
|
|
137
|
+
// key={key}
|
|
138
|
+
name: key,
|
|
139
|
+
component: ObjectInterfaceScreen(interfacesStoreElement),
|
|
140
|
+
options: cardStyle
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
return uiList;
|
|
144
|
+
}, []);
|
|
145
|
+
const gui = (0, _react.useMemo)(() =>
|
|
146
|
+
/*#__PURE__*/
|
|
147
|
+
// @ts-expect-error - React Navigation v7 types are overly strict with React 19; children are properly provided below
|
|
148
|
+
_react.default.createElement(_native.NavigationContainer, {
|
|
149
|
+
ref: navigationRef
|
|
150
|
+
}, /*#__PURE__*/_react.default.createElement(Stack.Navigator, {
|
|
151
|
+
initialRouteName: "Default GUI"
|
|
152
|
+
}, /*#__PURE__*/_react.default.createElement(Stack.Screen, {
|
|
153
|
+
name: "Default GUI",
|
|
154
|
+
component: DefaultScreen(props.children),
|
|
155
|
+
options: cardStyle
|
|
156
|
+
}), uiList)), [uiList, props.children]);
|
|
157
|
+
const [listenerState, setListenerState] = (0, _react.useState)(ListenerStateEnum.Idle);
|
|
158
|
+
const [shouldListen, setShouldListen] = (0, _react.useState)(false);
|
|
159
|
+
const [transcript, setTranscript] = (0, _react.useState)("");
|
|
160
|
+
const [interimTranscript, setInterimTranscript] = (0, _react.useState)("");
|
|
161
|
+
const [mouseDown, setMouseDown] = (0, _react.useState)(false);
|
|
162
|
+
(0, _react.useEffect)(() => {
|
|
163
|
+
console.log("listener state changed", listenerState);
|
|
164
|
+
setShouldListen(listenerState === ListenerStateEnum.Listening);
|
|
165
|
+
}, [listenerState]);
|
|
166
|
+
const handleClick = event => {
|
|
167
|
+
if (listenerState === ListenerStateEnum.Listening) {
|
|
168
|
+
const x = event.clientX;
|
|
169
|
+
const y = event.clientY;
|
|
170
|
+
console.log(`Click position: (${x}, ${y})`);
|
|
171
|
+
_reactDecorators.ClickPoints.push({
|
|
172
|
+
x: x,
|
|
173
|
+
y: y
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
setMouseDown(false);
|
|
177
|
+
};
|
|
178
|
+
const handleDown = () => {
|
|
179
|
+
setMouseDown(true);
|
|
180
|
+
};
|
|
181
|
+
const speechStatusCallback = (status, interimTranscript) => {
|
|
182
|
+
if (listenerState === ListenerStateEnum.Listening) {
|
|
183
|
+
console.log(`Speech status: ${status}`);
|
|
184
|
+
if (status == true) {
|
|
185
|
+
console.log(`Interim transcript: ${interimTranscript}`);
|
|
186
|
+
setInterimTranscript(interimTranscript);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
const speechResultCallback = finalTranscript => {
|
|
191
|
+
if (listenerState === ListenerStateEnum.Listening) {
|
|
192
|
+
console.log(`Final transcript: ${finalTranscript}`);
|
|
193
|
+
setInterimTranscript(finalTranscript);
|
|
194
|
+
setTranscript(finalTranscript);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
let lastTranscript = "";
|
|
198
|
+
(0, _react.useEffect)(() => {
|
|
199
|
+
if (transcript !== "" && listenerState === ListenerStateEnum.Listening) {
|
|
200
|
+
lastTranscript = transcript;
|
|
201
|
+
(0, _reactDecorators.RetrieveInterfaces)();
|
|
202
|
+
setListenerState(ListenerStateEnum.Processing);
|
|
203
|
+
setTranscript("");
|
|
204
|
+
const processTranscript = async () => {
|
|
205
|
+
let parsedCommand = null;
|
|
206
|
+
try {
|
|
207
|
+
const result = await GenieInterpreter.nlParser.parse(lastTranscript);
|
|
208
|
+
console.log(`parsed result: ${result}`);
|
|
209
|
+
setInterimTranscript("");
|
|
210
|
+
setListenerState(ListenerStateEnum.Idle);
|
|
211
|
+
if (typeof result === "string" && result.trim() !== "") {
|
|
212
|
+
parsedCommand = result.trim();
|
|
213
|
+
} else {
|
|
214
|
+
recordInterpreterTurn(GenieInterpreter, {
|
|
215
|
+
utterance: lastTranscript,
|
|
216
|
+
success: false,
|
|
217
|
+
resultSummary: "parse_empty"
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
const genieInterfaces = (0, _reactDecorators.RetrieveInterfaces)();
|
|
221
|
+
const executionResult = await (0, _sharedStore.executeGenieCode)(result, {
|
|
222
|
+
origin: "voice",
|
|
223
|
+
shouldSpeakErrors: true
|
|
224
|
+
});
|
|
225
|
+
if (executionResult.success && parsedCommand) {
|
|
226
|
+
recordInterpreterTurn(GenieInterpreter, {
|
|
227
|
+
utterance: lastTranscript,
|
|
228
|
+
parsed: parsedCommand,
|
|
229
|
+
success: true,
|
|
230
|
+
resultSummary: "execute_ok"
|
|
231
|
+
});
|
|
232
|
+
console.log("execution result: ", executionResult);
|
|
233
|
+
(0, _sharedStore.displayResult)(executionResult, lastTranscript, parsedCommand, genieInterfaces);
|
|
234
|
+
} else if (parsedCommand) {
|
|
235
|
+
recordInterpreterTurn(GenieInterpreter, {
|
|
236
|
+
utterance: lastTranscript,
|
|
237
|
+
parsed: parsedCommand,
|
|
238
|
+
success: false,
|
|
239
|
+
resultSummary: "execute_error:execution_failed"
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
} catch (error) {
|
|
243
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
244
|
+
recordInterpreterTurn(GenieInterpreter, {
|
|
245
|
+
utterance: lastTranscript,
|
|
246
|
+
parsed: parsedCommand,
|
|
247
|
+
success: false,
|
|
248
|
+
resultSummary: parsedCommand ? `execute_error:${errorMessage}` : `parse_error:${errorMessage}`
|
|
249
|
+
});
|
|
250
|
+
setInterimTranscript("");
|
|
251
|
+
setListenerState(ListenerStateEnum.Idle);
|
|
252
|
+
} finally {
|
|
253
|
+
_reactDecorators.ClickPoints.splice(0, _reactDecorators.ClickPoints.length);
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
void processTranscript();
|
|
257
|
+
}
|
|
258
|
+
}, [transcript]);
|
|
259
|
+
return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
260
|
+
style: {
|
|
261
|
+
flex: 1
|
|
262
|
+
}
|
|
263
|
+
}, (listenerState === ListenerStateEnum.Listening || listenerState === ListenerStateEnum.Processing) && /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
264
|
+
onStartShouldSetResponder: () => true,
|
|
265
|
+
onResponderGrant: handleDown,
|
|
266
|
+
onResponderRelease: handleClick,
|
|
267
|
+
style: {
|
|
268
|
+
position: "absolute",
|
|
269
|
+
top: 0,
|
|
270
|
+
left: 0,
|
|
271
|
+
backgroundColor: mouseDown ? "#7f7f7f" : "#cccccc",
|
|
272
|
+
width: "100%",
|
|
273
|
+
height: "100%",
|
|
274
|
+
zIndex: 3,
|
|
275
|
+
opacity: 0.5
|
|
276
|
+
}
|
|
277
|
+
}, listenerState === ListenerStateEnum.Processing && /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
278
|
+
style: {
|
|
279
|
+
position: "absolute",
|
|
280
|
+
top: "50%",
|
|
281
|
+
left: "50%",
|
|
282
|
+
transform: [{
|
|
283
|
+
translateX: -25
|
|
284
|
+
}, {
|
|
285
|
+
translateY: -25
|
|
286
|
+
}],
|
|
287
|
+
backgroundColor: "#ffffff",
|
|
288
|
+
padding: 10,
|
|
289
|
+
borderRadius: 10,
|
|
290
|
+
shadowColor: "#000000",
|
|
291
|
+
shadowOffset: {
|
|
292
|
+
width: 0,
|
|
293
|
+
height: 0
|
|
294
|
+
},
|
|
295
|
+
shadowOpacity: 0.5,
|
|
296
|
+
shadowRadius: 10,
|
|
297
|
+
elevation: 10
|
|
298
|
+
}
|
|
299
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.ActivityIndicator, {
|
|
300
|
+
size: "large",
|
|
301
|
+
color: "#888888"
|
|
302
|
+
})), props.displayTranscript && /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
303
|
+
style: {
|
|
304
|
+
position: "absolute",
|
|
305
|
+
bottom: "10%",
|
|
306
|
+
left: "50%",
|
|
307
|
+
transform: [{
|
|
308
|
+
translateX: "-50%"
|
|
309
|
+
}, {
|
|
310
|
+
translateY: "-50%"
|
|
311
|
+
}],
|
|
312
|
+
backgroundColor: "#ffffff",
|
|
313
|
+
padding: 10,
|
|
314
|
+
borderRadius: 10,
|
|
315
|
+
shadowColor: "#000000",
|
|
316
|
+
shadowOffset: {
|
|
317
|
+
width: 0,
|
|
318
|
+
height: 0
|
|
319
|
+
},
|
|
320
|
+
shadowOpacity: 0.5,
|
|
321
|
+
shadowRadius: 10,
|
|
322
|
+
elevation: 10
|
|
323
|
+
}
|
|
324
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
|
|
325
|
+
style: {
|
|
326
|
+
fontSize: 20
|
|
327
|
+
}
|
|
328
|
+
}, interimTranscript))), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
329
|
+
style: {
|
|
330
|
+
position: "absolute",
|
|
331
|
+
bottom: 50,
|
|
332
|
+
right: 10,
|
|
333
|
+
zIndex: 4
|
|
334
|
+
}
|
|
335
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
|
|
336
|
+
onPress: () => {
|
|
337
|
+
if (listenerState === ListenerStateEnum.Idle) {
|
|
338
|
+
setListenerState(ListenerStateEnum.Listening);
|
|
339
|
+
} else if (listenerState === ListenerStateEnum.Listening) {
|
|
340
|
+
setShouldListen(false);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
344
|
+
style: {
|
|
345
|
+
width: 50,
|
|
346
|
+
height: 50,
|
|
347
|
+
borderRadius: 25,
|
|
348
|
+
backgroundColor: listenerState === ListenerStateEnum.Listening ? "#0000ff" : "#cccccc",
|
|
349
|
+
justifyContent: "center",
|
|
350
|
+
alignItems: "center"
|
|
351
|
+
}
|
|
352
|
+
}, /*#__PURE__*/_react.default.createElement(_vectorIcons.Ionicons, {
|
|
353
|
+
name: listenerState === ListenerStateEnum.Listening ? "mic" : "mic-outline",
|
|
354
|
+
size: 28,
|
|
355
|
+
color: "#ffffff"
|
|
356
|
+
})))), /*#__PURE__*/_react.default.createElement(_speechRecognition.SpeechRecognizer, {
|
|
357
|
+
speechStatusCallback: speechStatusCallback,
|
|
358
|
+
speechResultCallback: speechResultCallback,
|
|
359
|
+
shouldListen: shouldListen
|
|
360
|
+
// groqApiKey={props.codexApiKey}
|
|
361
|
+
}), gui, snackbarVisible && /*#__PURE__*/_react.default.createElement(_core.Snackbar, {
|
|
362
|
+
message: voiceMessage?.fullText || voiceMessage?.message || voiceMessage?.minimalText || "",
|
|
363
|
+
style: {
|
|
364
|
+
position: "absolute",
|
|
365
|
+
start: 16,
|
|
366
|
+
end: 16,
|
|
367
|
+
bottom: 100,
|
|
368
|
+
backgroundColor: voiceMessage.type === "error" ? "#ff0000" : "#000000"
|
|
369
|
+
}
|
|
370
|
+
}));
|
|
371
|
+
};
|
|
372
|
+
exports.ModalityProvider = ModalityProvider;
|
|
373
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RSZWR1eCIsIl9uYXRpdmUiLCJfc3RhY2siLCJfdmVjdG9ySWNvbnMiLCJfc3BlZWNoUmVjb2duaXRpb24iLCJfY29yZSIsIl9yZWFjdGdlbmllRHNsIiwiX3JlYWN0RGVjb3JhdG9ycyIsIl9zaGFyZWRTdG9yZSIsIl9yZWFjdE5hdGl2ZSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJfdG9QcmltaXRpdmUiLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsIlN0YWNrIiwiY3JlYXRlU3RhY2tOYXZpZ2F0b3IiLCJHZW5pZUludGVycHJldGVyIiwiZXhwb3J0cyIsInJlY29yZEludGVycHJldGVyVHVybiIsImludGVycHJldGVyIiwicmVjb3JkIiwibWF5YmVUdXJuUmVjb3JkZXIiLCJyZWNvcmRUdXJuIiwicmVjb3JkSW50ZXJhY3Rpb24iLCJEZWZhdWx0U2NyZWVuIiwiY2hpbGRyZW4iLCJuYXZpZ2F0aW9uIiwidXNlRWZmZWN0Iiwic2V0T3B0aW9ucyIsImhlYWRlclNob3duIiwiT2JqZWN0SW50ZXJmYWNlU2NyZWVuIiwiZ2VuaWVJbnRlcmZhY2VTdG9yZUVsZW1lbnQiLCJyb3V0ZSIsInRpdGxlIiwicGFyYW1zIiwiY3JlYXRlRWxlbWVudCIsImZ1bmN0aW9uIiwiY2FyZFN0eWxlIiwicHJlc2VudGF0aW9uIiwiYW5pbWF0aW9uIiwiaGVhZGVyU3R5bGVJbnRlcnBvbGF0b3IiLCJIZWFkZXJTdHlsZUludGVycG9sYXRvcnMiLCJmb3JVSUtpdCIsImNhcmRTdHlsZUludGVycG9sYXRvciIsIkNhcmRTdHlsZUludGVycG9sYXRvcnMiLCJmb3JIb3Jpem9udGFsSU9TIiwiTGlzdGVuZXJTdGF0ZUVudW0iLCJNb2RhbGl0eVByb3ZpZGVyIiwicHJvcHMiLCJyZXNvbHZlZFByb3h5QmFzZVVybCIsImNvZGV4QXBpQmFzZVVybCIsImV4YW1wbGVzIiwidXNlR2VuaWVTZWxlY3RvciIsInVuZGVmaW5lZCIsInNoYXJlZFN0YXRlIiwiY29uY2F0IiwibmF2U3RhdGUiLCJ1c2VTZWxlY3RvciIsInN0YXRlIiwibmF2U3RhY2siLCJ2b2ljZU1lc3NhZ2UiLCJtZXNzYWdlIiwic25hY2tiYXJWaXNpYmxlIiwic2V0U25hY2tiYXJWaXNpYmxlIiwidXNlU3RhdGUiLCJtZXNzYWdlVGV4dCIsImZ1bGxUZXh0IiwibWluaW1hbFRleHQiLCJzZXRUaW1lb3V0IiwidXNlTWVtbyIsImRlc2NyaXB0b3JzIiwia2V5IiwiQWxsR2VuaWVPYmplY3RzIiwiQ2xhc3NEZXNjcmlwdG9yIiwiTmxJbnRlcnByZXRlciIsImNvZGV4QXBpS2V5IiwiZXh0cmFQcm9tcHQiLCJwYXJzZXIiLCJwcm92aWRlciIsInBhcnNlckNvbmZpZyIsImdyb3EiLCJiYXNlVXJsIiwib3BlbmFpIiwibW9uaXRvcmluZyIsImxhbmdzbWl0aEFwaUtleSIsImxhbmdzbWl0aENvbmZpZyIsImFwaUtleSIsImxhbmdzbWl0aFByb2plY3QiLCJwcm9qZWN0IiwibGFuZ3NtaXRoRW5kcG9pbnQiLCJlbmRwb2ludCIsIm5hdmlnYXRpb25SZWYiLCJ1c2VOYXZpZ2F0aW9uQ29udGFpbmVyUmVmIiwiY29uc29sZSIsImxvZyIsIm9iamVjdFZpZXdDbGFzc05hbWUiLCJkaXNwYXRjaCIsIlN0YWNrQWN0aW9ucyIsIm9iamVjdENvbnN0cnVjdG9yUGFyYW1zIiwidWlMaXN0IiwiYWxsSW50ZXJmYWNlcyIsIkFsbEdlbmllT2JqZWN0SW50ZXJmYWNlcyIsImludGVyZmFjZXNTdG9yZUVsZW1lbnQiLCJTY3JlZW4iLCJuYW1lIiwiY29tcG9uZW50Iiwib3B0aW9ucyIsImd1aSIsIk5hdmlnYXRpb25Db250YWluZXIiLCJyZWYiLCJOYXZpZ2F0b3IiLCJpbml0aWFsUm91dGVOYW1lIiwibGlzdGVuZXJTdGF0ZSIsInNldExpc3RlbmVyU3RhdGUiLCJJZGxlIiwic2hvdWxkTGlzdGVuIiwic2V0U2hvdWxkTGlzdGVuIiwidHJhbnNjcmlwdCIsInNldFRyYW5zY3JpcHQiLCJpbnRlcmltVHJhbnNjcmlwdCIsInNldEludGVyaW1UcmFuc2NyaXB0IiwibW91c2VEb3duIiwic2V0TW91c2VEb3duIiwiTGlzdGVuaW5nIiwiaGFuZGxlQ2xpY2siLCJldmVudCIsIngiLCJjbGllbnRYIiwieSIsImNsaWVudFkiLCJDbGlja1BvaW50cyIsImhhbmRsZURvd24iLCJzcGVlY2hTdGF0dXNDYWxsYmFjayIsInN0YXR1cyIsInNwZWVjaFJlc3VsdENhbGxiYWNrIiwiZmluYWxUcmFuc2NyaXB0IiwibGFzdFRyYW5zY3JpcHQiLCJSZXRyaWV2ZUludGVyZmFjZXMiLCJQcm9jZXNzaW5nIiwicHJvY2Vzc1RyYW5zY3JpcHQiLCJwYXJzZWRDb21tYW5kIiwicmVzdWx0IiwibmxQYXJzZXIiLCJwYXJzZSIsInRyaW0iLCJ1dHRlcmFuY2UiLCJzdWNjZXNzIiwicmVzdWx0U3VtbWFyeSIsImdlbmllSW50ZXJmYWNlcyIsImV4ZWN1dGlvblJlc3VsdCIsImV4ZWN1dGVHZW5pZUNvZGUiLCJvcmlnaW4iLCJzaG91bGRTcGVha0Vycm9ycyIsInBhcnNlZCIsImRpc3BsYXlSZXN1bHQiLCJlcnJvciIsImVycm9yTWVzc2FnZSIsIkVycm9yIiwic3BsaWNlIiwiVmlldyIsInN0eWxlIiwiZmxleCIsIm9uU3RhcnRTaG91bGRTZXRSZXNwb25kZXIiLCJvblJlc3BvbmRlckdyYW50Iiwib25SZXNwb25kZXJSZWxlYXNlIiwicG9zaXRpb24iLCJ0b3AiLCJsZWZ0IiwiYmFja2dyb3VuZENvbG9yIiwid2lkdGgiLCJoZWlnaHQiLCJ6SW5kZXgiLCJvcGFjaXR5IiwidHJhbnNmb3JtIiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJwYWRkaW5nIiwiYm9yZGVyUmFkaXVzIiwic2hhZG93Q29sb3IiLCJzaGFkb3dPZmZzZXQiLCJzaGFkb3dPcGFjaXR5Iiwic2hhZG93UmFkaXVzIiwiZWxldmF0aW9uIiwiQWN0aXZpdHlJbmRpY2F0b3IiLCJzaXplIiwiY29sb3IiLCJkaXNwbGF5VHJhbnNjcmlwdCIsImJvdHRvbSIsIlRleHQiLCJmb250U2l6ZSIsInJpZ2h0IiwiVG91Y2hhYmxlT3BhY2l0eSIsIm9uUHJlc3MiLCJqdXN0aWZ5Q29udGVudCIsImFsaWduSXRlbXMiLCJJb25pY29ucyIsIlNwZWVjaFJlY29nbml6ZXIiLCJTbmFja2JhciIsInN0YXJ0IiwiZW5kIiwidHlwZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2RhbGl0eS1wcm92aWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVNlbGVjdG9yIH0gZnJvbSBcInJlYWN0LXJlZHV4XCI7XG5pbXBvcnQge1xuICBOYXZpZ2F0aW9uQ29udGFpbmVyLFxuICBTdGFja0FjdGlvbnMsXG4gIHVzZU5hdmlnYXRpb25Db250YWluZXJSZWYsXG59IGZyb20gXCJAcmVhY3QtbmF2aWdhdGlvbi9uYXRpdmVcIjtcbmltcG9ydCB7XG4gIENhcmRTdHlsZUludGVycG9sYXRvcnMsXG4gIGNyZWF0ZVN0YWNrTmF2aWdhdG9yLFxuICBIZWFkZXJTdHlsZUludGVycG9sYXRvcnMsXG4gIFN0YWNrTmF2aWdhdGlvbk9wdGlvbnMsXG59IGZyb20gXCJAcmVhY3QtbmF2aWdhdGlvbi9zdGFja1wiO1xuaW1wb3J0IHsgSW9uaWNvbnMgfSBmcm9tIFwiQGV4cG8vdmVjdG9yLWljb25zXCI7XG5pbXBvcnQgeyBTcGVlY2hSZWNvZ25pemVyIH0gZnJvbSBcIi4vc3BlZWNoLXJlY29nbml0aW9uXCI7XG5pbXBvcnQgeyBTbmFja2JhciB9IGZyb20gXCJAcmVhY3QtbmF0aXZlLW1hdGVyaWFsL2NvcmVcIjtcblxuaW1wb3J0IHtcbiAgTmxJbnRlcnByZXRlcixcbiAgQ2xhc3NEZXNjcmlwdG9yLFxuICBFeGFtcGxlUGFyc2UsXG4gIEdlbmllT2JqZWN0LFxuICB0eXBlIE5sSW50ZXJwcmV0ZXJQYXJzZXJDb25maWcsXG4gIHNoYXJlZFN0YXRlLFxufSBmcm9tIFwiQGdhcnJpeDgyL3JlYWN0Z2VuaWUtZHNsXCI7XG5pbXBvcnQge1xuICBBbGxHZW5pZU9iamVjdEludGVyZmFjZXMsXG4gIEFsbEdlbmllT2JqZWN0cyxcbiAgQ2xpY2tQb2ludHMsXG4gIEdlbmllSW50ZXJmYWNlU3RvcmVFbGVtZW50LFxuICBSZXRyaWV2ZUludGVyZmFjZXMsXG59IGZyb20gXCIuL3JlYWN0LWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIGRpc3BsYXlSZXN1bHQsXG4gIGV4ZWN1dGVHZW5pZUNvZGUsXG4gIE5hdmlnYXRvclN0YXRlLFxuICB1c2VHZW5pZVNlbGVjdG9yLFxufSBmcm9tIFwiLi9zaGFyZWQtc3RvcmVcIjtcbmltcG9ydCB7IEFjdGl2aXR5SW5kaWNhdG9yLCBJbWFnZSwgVG91Y2hhYmxlT3BhY2l0eSwgVmlldywgVGV4dCB9IGZyb20gXCJyZWFjdC1uYXRpdmVcIjtcblxuY29uc3QgU3RhY2sgPSBjcmVhdGVTdGFja05hdmlnYXRvcigpO1xuZXhwb3J0IGxldCBHZW5pZUludGVycHJldGVyOiBObEludGVycHJldGVyO1xuXG50eXBlIEludGVycHJldGVyVHVyblJlY29yZCA9IHtcbiAgdXR0ZXJhbmNlOiBzdHJpbmc7XG4gIHBhcnNlZD86IHN0cmluZyB8IG51bGw7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIHJlc3VsdFN1bW1hcnk/OiBzdHJpbmc7XG59O1xuXG50eXBlIEludGVycHJldGVyVHVyblJlY29yZGVyID0ge1xuICByZWNvcmRUdXJuPzogKHJlY29yZDogSW50ZXJwcmV0ZXJUdXJuUmVjb3JkKSA9PiB2b2lkO1xuICByZWNvcmRJbnRlcmFjdGlvbj86IChyZWNvcmQ6IEludGVycHJldGVyVHVyblJlY29yZCkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IHJlY29yZEludGVycHJldGVyVHVybiA9IChcbiAgaW50ZXJwcmV0ZXI6IE5sSW50ZXJwcmV0ZXIsXG4gIHJlY29yZDogSW50ZXJwcmV0ZXJUdXJuUmVjb3JkXG4pID0+IHtcbiAgY29uc3QgbWF5YmVUdXJuUmVjb3JkZXIgPSBpbnRlcnByZXRlciBhcyB1bmtub3duIGFzIEludGVycHJldGVyVHVyblJlY29yZGVyO1xuICBpZiAodHlwZW9mIG1heWJlVHVyblJlY29yZGVyLnJlY29yZFR1cm4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1heWJlVHVyblJlY29yZGVyLnJlY29yZFR1cm4ocmVjb3JkKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbWF5YmVUdXJuUmVjb3JkZXIucmVjb3JkSW50ZXJhY3Rpb24/LihyZWNvcmQpO1xufTtcblxuY29uc3QgRGVmYXVsdFNjcmVlbiA9XG4gIChjaGlsZHJlbjogUmVhY3QuUmVhY3RFbGVtZW50IHwgUmVhY3QuUmVhY3RFbGVtZW50W10pID0+XG4gICh7IG5hdmlnYXRpb24gfTogYW55KSA9PiB7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIG5hdmlnYXRpb24uc2V0T3B0aW9ucyh7IGhlYWRlclNob3duOiBmYWxzZSB9KTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9O1xuXG5jb25zdCBPYmplY3RJbnRlcmZhY2VTY3JlZW4gPVxuICAoZ2VuaWVJbnRlcmZhY2VTdG9yZUVsZW1lbnQ6IEdlbmllSW50ZXJmYWNlU3RvcmVFbGVtZW50KSA9PlxuICAoeyByb3V0ZSwgbmF2aWdhdGlvbiB9OiBhbnkpID0+IHtcbiAgICBjb25zdCB0aXRsZSA9IGdlbmllSW50ZXJmYWNlU3RvcmVFbGVtZW50LnRpdGxlKHJvdXRlLnBhcmFtcyk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIG5hdmlnYXRpb24uc2V0T3B0aW9ucyh7IGhlYWRlclNob3duOiB0cnVlIH0pO1xuICAgICAgbmF2aWdhdGlvbi5zZXRPcHRpb25zKHsgdGl0bGU6IHRpdGxlIH0pO1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gPGdlbmllSW50ZXJmYWNlU3RvcmVFbGVtZW50LmZ1bmN0aW9uIHsuLi5yb3V0ZS5wYXJhbXN9IC8+O1xuICB9O1xuXG5jb25zdCBjYXJkU3R5bGU6IFN0YWNrTmF2aWdhdGlvbk9wdGlvbnMgPSB7XG4gIHByZXNlbnRhdGlvbjogXCJjYXJkXCIsXG4gIGFuaW1hdGlvbjogXCJkZWZhdWx0XCIsIC8vIHY3OiByZXBsYWNlZCBhbmltYXRpb25FbmFibGVkIHdpdGggYW5pbWF0aW9uXG4gIGhlYWRlclN0eWxlSW50ZXJwb2xhdG9yOiBIZWFkZXJTdHlsZUludGVycG9sYXRvcnMuZm9yVUlLaXQsXG4gIGNhcmRTdHlsZUludGVycG9sYXRvcjogQ2FyZFN0eWxlSW50ZXJwb2xhdG9ycy5mb3JIb3Jpem9udGFsSU9TLFxufTtcblxuZXhwb3J0IGNvbnN0IGVudW0gTGlzdGVuZXJTdGF0ZUVudW0ge1xuICBJZGxlLFxuICBMaXN0ZW5pbmcsXG4gIFByb2Nlc3NpbmcsXG4gIC8vIERvbmUsXG59XG5cbmV4cG9ydCBjb25zdCBNb2RhbGl0eVByb3ZpZGVyID0gKHByb3BzOiB7XG4gIGV4YW1wbGVzPzogRXhhbXBsZVBhcnNlW107XG4gIGNvZGV4QXBpS2V5OiBzdHJpbmc7XG4gIGNvZGV4QXBpQmFzZVVybD86IHN0cmluZztcbiAgcGFyc2VyQ29uZmlnPzogTmxJbnRlcnByZXRlclBhcnNlckNvbmZpZztcbiAgbGFuZ3NtaXRoQ29uZmlnPzoge1xuICAgIGFwaUtleT86IHN0cmluZztcbiAgICBwcm9qZWN0Pzogc3RyaW5nO1xuICAgIGVuZHBvaW50Pzogc3RyaW5nO1xuICB9O1xuICAvLyBhenVyZVNwZWVjaFJlZ2lvbjogc3RyaW5nO1xuICAvLyBhenVyZVNwZWVjaEtleTogc3RyaW5nO1xuICBkaXNwbGF5VHJhbnNjcmlwdDogYm9vbGVhbjtcbiAgZXh0cmFQcm9tcHQ6IHN0cmluZztcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0RWxlbWVudFtdIHwgUmVhY3QuUmVhY3RFbGVtZW50O1xufSkgPT4ge1xuICBjb25zdCByZXNvbHZlZFByb3h5QmFzZVVybCA9IHByb3BzLmNvZGV4QXBpQmFzZVVybDtcbiAgY29uc3QgZXhhbXBsZXMgPSB1c2VHZW5pZVNlbGVjdG9yKCgpID0+IHtcbiAgICBpZiAocHJvcHMuZXhhbXBsZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHNoYXJlZFN0YXRlW1wiX19FWEFNUExFU19fXCJdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJvcHMuZXhhbXBsZXMuY29uY2F0KHNoYXJlZFN0YXRlW1wiX19FWEFNUExFU19fXCJdKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IG5hdlN0YXRlOiBOYXZpZ2F0b3JTdGF0ZSA9IHVzZVNlbGVjdG9yKChzdGF0ZTogYW55KSA9PiB7XG4gICAgcmV0dXJuIHN0YXRlLm5hdlN0YXRlO1xuICB9KTtcblxuICBjb25zdCBuYXZTdGFjayA9IHVzZVNlbGVjdG9yKChzdGF0ZTogYW55KSA9PiB7XG4gICAgcmV0dXJuIHN0YXRlLm5hdlN0YWNrO1xuICB9KTtcblxuICBjb25zdCB2b2ljZU1lc3NhZ2UgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IGFueSkgPT4ge1xuICAgIHJldHVybiBzdGF0ZS5tZXNzYWdlO1xuICB9KTtcblxuICBjb25zdCBbc25hY2tiYXJWaXNpYmxlLCBzZXRTbmFja2JhclZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZVRleHQgPVxuICAgICAgdm9pY2VNZXNzYWdlPy5mdWxsVGV4dCB8fCB2b2ljZU1lc3NhZ2U/Lm1lc3NhZ2UgfHwgdm9pY2VNZXNzYWdlPy5taW5pbWFsVGV4dCB8fCBcIlwiO1xuICAgIGlmIChcbiAgICAgIHZvaWNlTWVzc2FnZSAhPT0gbnVsbCAmJlxuICAgICAgdm9pY2VNZXNzYWdlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG1lc3NhZ2VUZXh0ICE9IFwiXCJcbiAgICApIHtcbiAgICAgIHNldFNuYWNrYmFyVmlzaWJsZSh0cnVlKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZXRTbmFja2JhclZpc2libGUoZmFsc2UpO1xuICAgICAgfSwgMzAwMCk7XG4gICAgfVxuICB9LCBbdm9pY2VNZXNzYWdlXSk7XG5cbiAgR2VuaWVJbnRlcnByZXRlciA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzOiBDbGFzc0Rlc2NyaXB0b3I8R2VuaWVPYmplY3Q+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBBbGxHZW5pZU9iamVjdHMpIHtcbiAgICAgIGRlc2NyaXB0b3JzLnB1c2goQWxsR2VuaWVPYmplY3RzW2tleV0uQ2xhc3NEZXNjcmlwdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBObEludGVycHJldGVyKFxuICAgICAgZGVzY3JpcHRvcnMsXG4gICAgICBwcm9wcy5jb2RleEFwaUtleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGV4YW1wbGVzLFxuICAgICAgcHJvcHMuZXh0cmFQcm9tcHQsXG4gICAgICB7XG4gICAgICAgIHBhcnNlcjoge1xuICAgICAgICAgIHByb3ZpZGVyOiBwcm9wcy5wYXJzZXJDb25maWc/LnByb3ZpZGVyLFxuICAgICAgICAgIGdyb3E6IHtcbiAgICAgICAgICAgIC4uLihwcm9wcy5wYXJzZXJDb25maWc/Lmdyb3EgfHwge30pLFxuICAgICAgICAgICAgYmFzZVVybDogcHJvcHMucGFyc2VyQ29uZmlnPy5ncm9xPy5iYXNlVXJsIHx8IHJlc29sdmVkUHJveHlCYXNlVXJsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3BlbmFpOiB7XG4gICAgICAgICAgICAuLi4ocHJvcHMucGFyc2VyQ29uZmlnPy5vcGVuYWkgfHwge30pLFxuICAgICAgICAgICAgYmFzZVVybDpcbiAgICAgICAgICAgICAgcHJvcHMucGFyc2VyQ29uZmlnPy5vcGVuYWk/LmJhc2VVcmwgfHwgcmVzb2x2ZWRQcm94eUJhc2VVcmwsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9uaXRvcmluZzoge1xuICAgICAgICAgIGxhbmdzbWl0aEFwaUtleTogcHJvcHMubGFuZ3NtaXRoQ29uZmlnPy5hcGlLZXksXG4gICAgICAgICAgbGFuZ3NtaXRoUHJvamVjdDogcHJvcHMubGFuZ3NtaXRoQ29uZmlnPy5wcm9qZWN0LFxuICAgICAgICAgIGxhbmdzbWl0aEVuZHBvaW50OiBwcm9wcy5sYW5nc21pdGhDb25maWc/LmVuZHBvaW50LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH1cbiAgICApO1xuICB9LCBbXG4gICAgcHJvcHMuY29kZXhBcGlLZXksXG4gICAgcHJvcHMuZXh0cmFQcm9tcHQsXG4gICAgcHJvcHMucGFyc2VyQ29uZmlnLFxuICAgIHByb3BzLmxhbmdzbWl0aENvbmZpZz8uYXBpS2V5LFxuICAgIHByb3BzLmxhbmdzbWl0aENvbmZpZz8ucHJvamVjdCxcbiAgICBwcm9wcy5sYW5nc21pdGhDb25maWc/LmVuZHBvaW50LFxuICAgIHJlc29sdmVkUHJveHlCYXNlVXJsLFxuICAgIGV4YW1wbGVzLFxuICBdKTtcblxuICAvL2NyZWF0ZSByZWYgdG8gTmF2aWdhdGlvbkNvbnRhaW5lciB3aXRoIHR5cGVcbiAgY29uc3QgbmF2aWdhdGlvblJlZiA9IHVzZU5hdmlnYXRpb25Db250YWluZXJSZWYoKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwibmF2IHN0YXRlIGNoYW5nZWRcIiwgbmF2U3RhdGUpO1xuICAgIGlmIChuYXZTdGF0ZS5vYmplY3RWaWV3Q2xhc3NOYW1lICE9PSBudWxsKSB7XG4gICAgICBuYXZpZ2F0aW9uUmVmLmRpc3BhdGNoKFxuICAgICAgICBTdGFja0FjdGlvbnMucHVzaChcbiAgICAgICAgICBuYXZTdGF0ZS5vYmplY3RWaWV3Q2xhc3NOYW1lLFxuICAgICAgICAgIG5hdlN0YXRlLm9iamVjdENvbnN0cnVjdG9yUGFyYW1zXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9LCBbbmF2U3RhY2tdKTtcblxuICBjb25zdCB1aUxpc3QgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB1aUxpc3QgPSBbXTtcbiAgICBjb25zdCBhbGxJbnRlcmZhY2VzID0gQWxsR2VuaWVPYmplY3RJbnRlcmZhY2VzLmFsbEludGVyZmFjZXMoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhbGxJbnRlcmZhY2VzKSB7XG4gICAgICBjb25zdCBpbnRlcmZhY2VzU3RvcmVFbGVtZW50ID0gYWxsSW50ZXJmYWNlc1trZXldO1xuICAgICAgdWlMaXN0LnB1c2goXG4gICAgICAgIDxTdGFjay5TY3JlZW5cbiAgICAgICAgICAvLyBrZXk9e2tleX1cbiAgICAgICAgICBuYW1lPXtrZXl9XG4gICAgICAgICAgY29tcG9uZW50PXtPYmplY3RJbnRlcmZhY2VTY3JlZW4oaW50ZXJmYWNlc1N0b3JlRWxlbWVudCl9XG4gICAgICAgICAgb3B0aW9ucz17Y2FyZFN0eWxlfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHVpTGlzdDtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGd1aSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIFJlYWN0IE5hdmlnYXRpb24gdjcgdHlwZXMgYXJlIG92ZXJseSBzdHJpY3Qgd2l0aCBSZWFjdCAxOTsgY2hpbGRyZW4gYXJlIHByb3Blcmx5IHByb3ZpZGVkIGJlbG93XG4gICAgICA8TmF2aWdhdGlvbkNvbnRhaW5lciByZWY9e25hdmlnYXRpb25SZWZ9PlxuICAgICAgICB7LyogQHRzLWV4cGVjdC1lcnJvciAtIFR5cGVTY3JpcHQgY2FuJ3QgaW5mZXIgY2hpbGRyZW4gZnJvbSBKU1gsIGJ1dCB0aGV5J3JlIHByb3ZpZGVkIGNvcnJlY3RseSAqL31cbiAgICAgICAgPFN0YWNrLk5hdmlnYXRvciBpbml0aWFsUm91dGVOYW1lPVwiRGVmYXVsdCBHVUlcIj5cbiAgICAgICAgICA8U3RhY2suU2NyZWVuXG4gICAgICAgICAgICBuYW1lPVwiRGVmYXVsdCBHVUlcIlxuICAgICAgICAgICAgY29tcG9uZW50PXtEZWZhdWx0U2NyZWVuKHByb3BzLmNoaWxkcmVuKX1cbiAgICAgICAgICAgIG9wdGlvbnM9e2NhcmRTdHlsZX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHt1aUxpc3R9XG4gICAgICAgIDwvU3RhY2suTmF2aWdhdG9yPlxuICAgICAgPC9OYXZpZ2F0aW9uQ29udGFpbmVyPlxuICAgICksXG4gICAgW3VpTGlzdCwgcHJvcHMuY2hpbGRyZW5dXG4gICk7XG5cbiAgY29uc3QgW2xpc3RlbmVyU3RhdGUsIHNldExpc3RlbmVyU3RhdGVdID0gdXNlU3RhdGUoTGlzdGVuZXJTdGF0ZUVudW0uSWRsZSk7XG4gIGNvbnN0IFtzaG91bGRMaXN0ZW4sIHNldFNob3VsZExpc3Rlbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFt0cmFuc2NyaXB0LCBzZXRUcmFuc2NyaXB0XSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbaW50ZXJpbVRyYW5zY3JpcHQsIHNldEludGVyaW1UcmFuc2NyaXB0XSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbbW91c2VEb3duLCBzZXRNb3VzZURvd25dID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJsaXN0ZW5lciBzdGF0ZSBjaGFuZ2VkXCIsIGxpc3RlbmVyU3RhdGUpO1xuICAgIHNldFNob3VsZExpc3RlbihsaXN0ZW5lclN0YXRlID09PSBMaXN0ZW5lclN0YXRlRW51bS5MaXN0ZW5pbmcpO1xuICB9LCBbbGlzdGVuZXJTdGF0ZV0pO1xuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKGxpc3RlbmVyU3RhdGUgPT09IExpc3RlbmVyU3RhdGVFbnVtLkxpc3RlbmluZykge1xuICAgICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIGNvbnNvbGUubG9nKGBDbGljayBwb3NpdGlvbjogKCR7eH0sICR7eX0pYCk7XG4gICAgICBDbGlja1BvaW50cy5wdXNoKHsgeDogeCwgeTogeSB9KTtcbiAgICB9XG4gICAgc2V0TW91c2VEb3duKGZhbHNlKTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlRG93biA9ICgpID0+IHtcbiAgICBzZXRNb3VzZURvd24odHJ1ZSk7XG4gIH07XG5cbiAgY29uc3Qgc3BlZWNoU3RhdHVzQ2FsbGJhY2sgPSAoc3RhdHVzLCBpbnRlcmltVHJhbnNjcmlwdCkgPT4ge1xuICAgIGlmIChsaXN0ZW5lclN0YXRlID09PSBMaXN0ZW5lclN0YXRlRW51bS5MaXN0ZW5pbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBTcGVlY2ggc3RhdHVzOiAke3N0YXR1c31gKTtcbiAgICAgIGlmIChzdGF0dXMgPT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgSW50ZXJpbSB0cmFuc2NyaXB0OiAke2ludGVyaW1UcmFuc2NyaXB0fWApO1xuICAgICAgICBzZXRJbnRlcmltVHJhbnNjcmlwdChpbnRlcmltVHJhbnNjcmlwdCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBzcGVlY2hSZXN1bHRDYWxsYmFjayA9IChmaW5hbFRyYW5zY3JpcHQpID0+IHtcbiAgICBpZiAobGlzdGVuZXJTdGF0ZSA9PT0gTGlzdGVuZXJTdGF0ZUVudW0uTGlzdGVuaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhgRmluYWwgdHJhbnNjcmlwdDogJHtmaW5hbFRyYW5zY3JpcHR9YCk7XG4gICAgICBzZXRJbnRlcmltVHJhbnNjcmlwdChmaW5hbFRyYW5zY3JpcHQpO1xuICAgICAgc2V0VHJhbnNjcmlwdChmaW5hbFRyYW5zY3JpcHQpO1xuICAgIH1cbiAgfTtcblxuICBsZXQgbGFzdFRyYW5zY3JpcHQgPSBcIlwiO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHRyYW5zY3JpcHQgIT09IFwiXCIgJiYgbGlzdGVuZXJTdGF0ZSA9PT0gTGlzdGVuZXJTdGF0ZUVudW0uTGlzdGVuaW5nKSB7XG4gICAgICBsYXN0VHJhbnNjcmlwdCA9IHRyYW5zY3JpcHQ7XG4gICAgICBSZXRyaWV2ZUludGVyZmFjZXMoKTtcbiAgICAgIHNldExpc3RlbmVyU3RhdGUoTGlzdGVuZXJTdGF0ZUVudW0uUHJvY2Vzc2luZyk7XG4gICAgICBzZXRUcmFuc2NyaXB0KFwiXCIpO1xuICAgICAgY29uc3QgcHJvY2Vzc1RyYW5zY3JpcHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBwYXJzZWRDb21tYW5kOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBHZW5pZUludGVycHJldGVyLm5sUGFyc2VyLnBhcnNlKGxhc3RUcmFuc2NyaXB0KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgcGFyc2VkIHJlc3VsdDogJHtyZXN1bHR9YCk7XG4gICAgICAgICAgc2V0SW50ZXJpbVRyYW5zY3JpcHQoXCJcIik7XG4gICAgICAgICAgc2V0TGlzdGVuZXJTdGF0ZShMaXN0ZW5lclN0YXRlRW51bS5JZGxlKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIiAmJiByZXN1bHQudHJpbSgpICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBwYXJzZWRDb21tYW5kID0gcmVzdWx0LnRyaW0oKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVjb3JkSW50ZXJwcmV0ZXJUdXJuKEdlbmllSW50ZXJwcmV0ZXIsIHtcbiAgICAgICAgICAgICAgdXR0ZXJhbmNlOiBsYXN0VHJhbnNjcmlwdCxcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIHJlc3VsdFN1bW1hcnk6IFwicGFyc2VfZW1wdHlcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBnZW5pZUludGVyZmFjZXMgPSBSZXRyaWV2ZUludGVyZmFjZXMoKTtcbiAgICAgICAgICBjb25zdCBleGVjdXRpb25SZXN1bHQgPSBhd2FpdCBleGVjdXRlR2VuaWVDb2RlKHJlc3VsdCwge1xuICAgICAgICAgICAgb3JpZ2luOiBcInZvaWNlXCIsXG4gICAgICAgICAgICBzaG91bGRTcGVha0Vycm9yczogdHJ1ZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQuc3VjY2VzcyAmJiBwYXJzZWRDb21tYW5kKSB7XG4gICAgICAgICAgICByZWNvcmRJbnRlcnByZXRlclR1cm4oR2VuaWVJbnRlcnByZXRlciwge1xuICAgICAgICAgICAgICB1dHRlcmFuY2U6IGxhc3RUcmFuc2NyaXB0LFxuICAgICAgICAgICAgICBwYXJzZWQ6IHBhcnNlZENvbW1hbmQsXG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgIHJlc3VsdFN1bW1hcnk6IFwiZXhlY3V0ZV9va1wiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImV4ZWN1dGlvbiByZXN1bHQ6IFwiLCBleGVjdXRpb25SZXN1bHQpO1xuICAgICAgICAgICAgZGlzcGxheVJlc3VsdChcbiAgICAgICAgICAgICAgZXhlY3V0aW9uUmVzdWx0LFxuICAgICAgICAgICAgICBsYXN0VHJhbnNjcmlwdCxcbiAgICAgICAgICAgICAgcGFyc2VkQ29tbWFuZCxcbiAgICAgICAgICAgICAgZ2VuaWVJbnRlcmZhY2VzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VkQ29tbWFuZCkge1xuICAgICAgICAgICAgcmVjb3JkSW50ZXJwcmV0ZXJUdXJuKEdlbmllSW50ZXJwcmV0ZXIsIHtcbiAgICAgICAgICAgICAgdXR0ZXJhbmNlOiBsYXN0VHJhbnNjcmlwdCxcbiAgICAgICAgICAgICAgcGFyc2VkOiBwYXJzZWRDb21tYW5kLFxuICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgcmVzdWx0U3VtbWFyeTogXCJleGVjdXRlX2Vycm9yOmV4ZWN1dGlvbl9mYWlsZWRcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICAgIHJlY29yZEludGVycHJldGVyVHVybihHZW5pZUludGVycHJldGVyLCB7XG4gICAgICAgICAgICB1dHRlcmFuY2U6IGxhc3RUcmFuc2NyaXB0LFxuICAgICAgICAgICAgcGFyc2VkOiBwYXJzZWRDb21tYW5kLFxuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICByZXN1bHRTdW1tYXJ5OiBwYXJzZWRDb21tYW5kXG4gICAgICAgICAgICAgID8gYGV4ZWN1dGVfZXJyb3I6JHtlcnJvck1lc3NhZ2V9YFxuICAgICAgICAgICAgICA6IGBwYXJzZV9lcnJvcjoke2Vycm9yTWVzc2FnZX1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNldEludGVyaW1UcmFuc2NyaXB0KFwiXCIpO1xuICAgICAgICAgIHNldExpc3RlbmVyU3RhdGUoTGlzdGVuZXJTdGF0ZUVudW0uSWRsZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgQ2xpY2tQb2ludHMuc3BsaWNlKDAsIENsaWNrUG9pbnRzLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZvaWQgcHJvY2Vzc1RyYW5zY3JpcHQoKTtcbiAgICB9XG4gIH0sIFt0cmFuc2NyaXB0XSk7XG5cbiAgcmV0dXJuIChcbiAgICA8VmlldyBzdHlsZT17eyBmbGV4OiAxIH19PlxuICAgICAgeyhsaXN0ZW5lclN0YXRlID09PSBMaXN0ZW5lclN0YXRlRW51bS5MaXN0ZW5pbmcgfHxcbiAgICAgICAgbGlzdGVuZXJTdGF0ZSA9PT0gTGlzdGVuZXJTdGF0ZUVudW0uUHJvY2Vzc2luZykgJiYgKFxuICAgICAgICA8Vmlld1xuICAgICAgICAgIG9uU3RhcnRTaG91bGRTZXRSZXNwb25kZXI9eygpID0+IHRydWV9XG4gICAgICAgICAgb25SZXNwb25kZXJHcmFudD17aGFuZGxlRG93bn1cbiAgICAgICAgICBvblJlc3BvbmRlclJlbGVhc2U9e2hhbmRsZUNsaWNrfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogbW91c2VEb3duID8gXCIjN2Y3ZjdmXCIgOiBcIiNjY2NjY2NcIixcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgICAgICB6SW5kZXg6IDMsXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjUsXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHtsaXN0ZW5lclN0YXRlID09PSBMaXN0ZW5lclN0YXRlRW51bS5Qcm9jZXNzaW5nICYmIChcbiAgICAgICAgICAgIDxWaWV3XG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgICAgICB0b3A6IFwiNTAlXCIsXG4gICAgICAgICAgICAgICAgbGVmdDogXCI1MCVcIixcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFt7IHRyYW5zbGF0ZVg6IC0yNSB9LCB7IHRyYW5zbGF0ZVk6IC0yNSB9XSxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2ZmZmZmZlwiLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEwLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogMTAsXG4gICAgICAgICAgICAgICAgc2hhZG93Q29sb3I6IFwiIzAwMDAwMFwiLFxuICAgICAgICAgICAgICAgIHNoYWRvd09mZnNldDogeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sXG4gICAgICAgICAgICAgICAgc2hhZG93T3BhY2l0eTogMC41LFxuICAgICAgICAgICAgICAgIHNoYWRvd1JhZGl1czogMTAsXG4gICAgICAgICAgICAgICAgZWxldmF0aW9uOiAxMCxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFjdGl2aXR5SW5kaWNhdG9yIHNpemU9XCJsYXJnZVwiIGNvbG9yPVwiIzg4ODg4OFwiIC8+XG4gICAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7LypkcmF3IHRyYW5zY3JpcHQgYXQgdGhlIGJvdHRvbSBjZW50ZXIgb2YgdGhlIHBhZ2UsIGxpa2UgYSBzdWJ0aXRsZSovfVxuICAgICAgICAgIHtwcm9wcy5kaXNwbGF5VHJhbnNjcmlwdCAmJiAoXG4gICAgICAgICAgICA8Vmlld1xuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBcIjEwJVwiLFxuICAgICAgICAgICAgICAgIGxlZnQ6IFwiNTAlXCIsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBbeyB0cmFuc2xhdGVYOiBcIi01MCVcIiB9LCB7IHRyYW5zbGF0ZVk6IFwiLTUwJVwiIH1dLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZmZmZmZmXCIsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogMTAsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAxMCxcbiAgICAgICAgICAgICAgICBzaGFkb3dDb2xvcjogXCIjMDAwMDAwXCIsXG4gICAgICAgICAgICAgICAgc2hhZG93T2Zmc2V0OiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSxcbiAgICAgICAgICAgICAgICBzaGFkb3dPcGFjaXR5OiAwLjUsXG4gICAgICAgICAgICAgICAgc2hhZG93UmFkaXVzOiAxMCxcbiAgICAgICAgICAgICAgICBlbGV2YXRpb246IDEwLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8VGV4dCBzdHlsZT17eyBmb250U2l6ZTogMjAgfX0+e2ludGVyaW1UcmFuc2NyaXB0fTwvVGV4dD5cbiAgICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgICApfVxuICAgICAgICA8L1ZpZXc+XG4gICAgICApfVxuICAgICAgPFZpZXdcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgIGJvdHRvbTogNTAsXG4gICAgICAgICAgcmlnaHQ6IDEwLFxuICAgICAgICAgIHpJbmRleDogNCxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPFRvdWNoYWJsZU9wYWNpdHlcbiAgICAgICAgICBvblByZXNzPXsoKSA9PiB7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJTdGF0ZSA9PT0gTGlzdGVuZXJTdGF0ZUVudW0uSWRsZSkge1xuICAgICAgICAgICAgICBzZXRMaXN0ZW5lclN0YXRlKExpc3RlbmVyU3RhdGVFbnVtLkxpc3RlbmluZyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpc3RlbmVyU3RhdGUgPT09IExpc3RlbmVyU3RhdGVFbnVtLkxpc3RlbmluZykge1xuICAgICAgICAgICAgICBzZXRTaG91bGRMaXN0ZW4oZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8Vmlld1xuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgd2lkdGg6IDUwLFxuICAgICAgICAgICAgICBoZWlnaHQ6IDUwLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDI1LFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJTdGF0ZSA9PT0gTGlzdGVuZXJTdGF0ZUVudW0uTGlzdGVuaW5nXG4gICAgICAgICAgICAgICAgICA/IFwiIzAwMDBmZlwiXG4gICAgICAgICAgICAgICAgICA6IFwiI2NjY2NjY1wiLFxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPElvbmljb25zIFxuICAgICAgICAgICAgICBuYW1lPXtsaXN0ZW5lclN0YXRlID09PSBMaXN0ZW5lclN0YXRlRW51bS5MaXN0ZW5pbmcgPyBcIm1pY1wiIDogXCJtaWMtb3V0bGluZVwifSBcbiAgICAgICAgICAgICAgc2l6ZT17Mjh9IFxuICAgICAgICAgICAgICBjb2xvcj1cIiNmZmZmZmZcIiBcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9WaWV3PlxuICAgICAgICA8L1RvdWNoYWJsZU9wYWNpdHk+XG4gICAgICA8L1ZpZXc+XG4gICAgICA8U3BlZWNoUmVjb2duaXplclxuICAgICAgICBzcGVlY2hTdGF0dXNDYWxsYmFjaz17c3BlZWNoU3RhdHVzQ2FsbGJhY2t9XG4gICAgICAgIHNwZWVjaFJlc3VsdENhbGxiYWNrPXtzcGVlY2hSZXN1bHRDYWxsYmFja31cbiAgICAgICAgc2hvdWxkTGlzdGVuPXtzaG91bGRMaXN0ZW59XG4gICAgICAgIC8vIGdyb3FBcGlLZXk9e3Byb3BzLmNvZGV4QXBpS2V5fVxuXG4gICAgICAvPlxuICAgICAge2d1aX1cbiAgICAgIHtzbmFja2JhclZpc2libGUgJiYgKFxuICAgICAgICA8U25hY2tiYXJcbiAgICAgICAgICBtZXNzYWdlPXt2b2ljZU1lc3NhZ2U/LmZ1bGxUZXh0IHx8IHZvaWNlTWVzc2FnZT8ubWVzc2FnZSB8fCB2b2ljZU1lc3NhZ2U/Lm1pbmltYWxUZXh0IHx8IFwiXCJ9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICBzdGFydDogMTYsXG4gICAgICAgICAgICBlbmQ6IDE2LFxuICAgICAgICAgICAgYm90dG9tOiAxMDAsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgIHZvaWNlTWVzc2FnZS50eXBlID09PSBcImVycm9yXCIgPyBcIiNmZjAwMDBcIiA6IFwiIzAwMDAwMFwiLFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIDwvVmlldz5cbiAgKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUtBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQU1BLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGtCQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxLQUFBLEdBQUFOLE9BQUE7QUFFQSxJQUFBTyxjQUFBLEdBQUFQLE9BQUE7QUFRQSxJQUFBUSxnQkFBQSxHQUFBUixPQUFBO0FBT0EsSUFBQVMsWUFBQSxHQUFBVCxPQUFBO0FBTUEsSUFBQVUsWUFBQSxHQUFBVixPQUFBO0FBQXNGLFNBQUFELHdCQUFBWSxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBZCx1QkFBQSxZQUFBQSxDQUFBWSxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsUUFBQUMsT0FBQSxFQUFBVixDQUFBLGlCQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFNBQUFRLENBQUEsTUFBQUYsQ0FBQSxHQUFBTCxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxRQUFBRyxDQUFBLENBQUFLLEdBQUEsQ0FBQVgsQ0FBQSxVQUFBTSxDQUFBLENBQUFNLEdBQUEsQ0FBQVosQ0FBQSxHQUFBTSxDQUFBLENBQUFPLEdBQUEsQ0FBQWIsQ0FBQSxFQUFBUSxDQUFBLGdCQUFBUCxDQUFBLElBQUFELENBQUEsZ0JBQUFDLENBQUEsT0FBQWEsY0FBQSxDQUFBQyxJQUFBLENBQUFmLENBQUEsRUFBQUMsQ0FBQSxPQUFBTSxDQUFBLElBQUFELENBQUEsR0FBQVUsTUFBQSxDQUFBQyxjQUFBLEtBQUFELE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQWxCLENBQUEsRUFBQUMsQ0FBQSxPQUFBTSxDQUFBLENBQUFLLEdBQUEsSUFBQUwsQ0FBQSxDQUFBTSxHQUFBLElBQUFQLENBQUEsQ0FBQUUsQ0FBQSxFQUFBUCxDQUFBLEVBQUFNLENBQUEsSUFBQUMsQ0FBQSxDQUFBUCxDQUFBLElBQUFELENBQUEsQ0FBQUMsQ0FBQSxXQUFBTyxDQUFBLEtBQUFSLENBQUEsRUFBQUMsQ0FBQTtBQUFBLFNBQUFrQixRQUFBbkIsQ0FBQSxFQUFBRyxDQUFBLFFBQUFGLENBQUEsR0FBQWUsTUFBQSxDQUFBSSxJQUFBLENBQUFwQixDQUFBLE9BQUFnQixNQUFBLENBQUFLLHFCQUFBLFFBQUFmLENBQUEsR0FBQVUsTUFBQSxDQUFBSyxxQkFBQSxDQUFBckIsQ0FBQSxHQUFBRyxDQUFBLEtBQUFHLENBQUEsR0FBQUEsQ0FBQSxDQUFBZ0IsTUFBQSxXQUFBbkIsQ0FBQSxXQUFBYSxNQUFBLENBQUFFLHdCQUFBLENBQUFsQixDQUFBLEVBQUFHLENBQUEsRUFBQW9CLFVBQUEsT0FBQXRCLENBQUEsQ0FBQXVCLElBQUEsQ0FBQUMsS0FBQSxDQUFBeEIsQ0FBQSxFQUFBSyxDQUFBLFlBQUFMLENBQUE7QUFBQSxTQUFBeUIsY0FBQTFCLENBQUEsYUFBQUcsQ0FBQSxNQUFBQSxDQUFBLEdBQUF3QixTQUFBLENBQUFDLE1BQUEsRUFBQXpCLENBQUEsVUFBQUYsQ0FBQSxXQUFBMEIsU0FBQSxDQUFBeEIsQ0FBQSxJQUFBd0IsU0FBQSxDQUFBeEIsQ0FBQSxRQUFBQSxDQUFBLE9BQUFnQixPQUFBLENBQUFILE1BQUEsQ0FBQWYsQ0FBQSxPQUFBNEIsT0FBQSxXQUFBMUIsQ0FBQSxJQUFBMkIsZUFBQSxDQUFBOUIsQ0FBQSxFQUFBRyxDQUFBLEVBQUFGLENBQUEsQ0FBQUUsQ0FBQSxTQUFBYSxNQUFBLENBQUFlLHlCQUFBLEdBQUFmLE1BQUEsQ0FBQWdCLGdCQUFBLENBQUFoQyxDQUFBLEVBQUFnQixNQUFBLENBQUFlLHlCQUFBLENBQUE5QixDQUFBLEtBQUFrQixPQUFBLENBQUFILE1BQUEsQ0FBQWYsQ0FBQSxHQUFBNEIsT0FBQSxXQUFBMUIsQ0FBQSxJQUFBYSxNQUFBLENBQUFDLGNBQUEsQ0FBQWpCLENBQUEsRUFBQUcsQ0FBQSxFQUFBYSxNQUFBLENBQUFFLHdCQUFBLENBQUFqQixDQUFBLEVBQUFFLENBQUEsaUJBQUFILENBQUE7QUFBQSxTQUFBOEIsZ0JBQUE5QixDQUFBLEVBQUFHLENBQUEsRUFBQUYsQ0FBQSxZQUFBRSxDQUFBLEdBQUE4QixjQUFBLENBQUE5QixDQUFBLE1BQUFILENBQUEsR0FBQWdCLE1BQUEsQ0FBQUMsY0FBQSxDQUFBakIsQ0FBQSxFQUFBRyxDQUFBLElBQUErQixLQUFBLEVBQUFqQyxDQUFBLEVBQUFzQixVQUFBLE1BQUFZLFlBQUEsTUFBQUMsUUFBQSxVQUFBcEMsQ0FBQSxDQUFBRyxDQUFBLElBQUFGLENBQUEsRUFBQUQsQ0FBQTtBQUFBLFNBQUFpQyxlQUFBaEMsQ0FBQSxRQUFBTSxDQUFBLEdBQUE4QixZQUFBLENBQUFwQyxDQUFBLHVDQUFBTSxDQUFBLEdBQUFBLENBQUEsR0FBQUEsQ0FBQTtBQUFBLFNBQUE4QixhQUFBcEMsQ0FBQSxFQUFBRSxDQUFBLDJCQUFBRixDQUFBLEtBQUFBLENBQUEsU0FBQUEsQ0FBQSxNQUFBRCxDQUFBLEdBQUFDLENBQUEsQ0FBQXFDLE1BQUEsQ0FBQUMsV0FBQSxrQkFBQXZDLENBQUEsUUFBQU8sQ0FBQSxHQUFBUCxDQUFBLENBQUFlLElBQUEsQ0FBQWQsQ0FBQSxFQUFBRSxDQUFBLHVDQUFBSSxDQUFBLFNBQUFBLENBQUEsWUFBQWlDLFNBQUEseUVBQUFyQyxDQUFBLEdBQUFzQyxNQUFBLEdBQUFDLE1BQUEsRUFBQXpDLENBQUE7QUFFdEYsTUFBTTBDLEtBQUssR0FBRyxJQUFBQywyQkFBb0IsRUFBQyxDQUFDO0FBQzdCLElBQUlDLGdCQUErQixHQUFBQyxPQUFBLENBQUFELGdCQUFBO0FBYzFDLE1BQU1FLHFCQUFxQixHQUFHQSxDQUM1QkMsV0FBMEIsRUFDMUJDLE1BQTZCLEtBQzFCO0VBQ0gsTUFBTUMsaUJBQWlCLEdBQUdGLFdBQWlEO0VBQzNFLElBQUksT0FBT0UsaUJBQWlCLENBQUNDLFVBQVUsS0FBSyxVQUFVLEVBQUU7SUFDdERELGlCQUFpQixDQUFDQyxVQUFVLENBQUNGLE1BQU0sQ0FBQztJQUNwQztFQUNGO0VBQ0FDLGlCQUFpQixDQUFDRSxpQkFBaUIsR0FBR0gsTUFBTSxDQUFDO0FBQy9DLENBQUM7QUFFRCxNQUFNSSxhQUFhLEdBQ2hCQyxRQUFtRCxJQUNwRCxDQUFDO0VBQUVDO0FBQWdCLENBQUMsS0FBSztFQUN2QixJQUFBQyxnQkFBUyxFQUFDLE1BQU07SUFDZEQsVUFBVSxDQUFDRSxVQUFVLENBQUM7TUFBRUMsV0FBVyxFQUFFO0lBQU0sQ0FBQyxDQUFDO0VBQy9DLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDTixPQUFPSixRQUFRO0FBQ2pCLENBQUM7QUFFSCxNQUFNSyxxQkFBcUIsR0FDeEJDLDBCQUFzRCxJQUN2RCxDQUFDO0VBQUVDLEtBQUs7RUFBRU47QUFBZ0IsQ0FBQyxLQUFLO0VBQzlCLE1BQU1PLEtBQUssR0FBR0YsMEJBQTBCLENBQUNFLEtBQUssQ0FBQ0QsS0FBSyxDQUFDRSxNQUFNLENBQUM7RUFDNUQsSUFBQVAsZ0JBQVMsRUFBQyxNQUFNO0lBQ2RELFVBQVUsQ0FBQ0UsVUFBVSxDQUFDO01BQUVDLFdBQVcsRUFBRTtJQUFLLENBQUMsQ0FBQztJQUM1Q0gsVUFBVSxDQUFDRSxVQUFVLENBQUM7TUFBRUssS0FBSyxFQUFFQTtJQUFNLENBQUMsQ0FBQztFQUN6QyxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBQ04sb0JBQU8zRSxNQUFBLENBQUF1QixPQUFBLENBQUFzRCxhQUFBLENBQUNKLDBCQUEwQixDQUFDSyxRQUFRLEVBQUtKLEtBQUssQ0FBQ0UsTUFBUyxDQUFDO0FBQ2xFLENBQUM7QUFFSCxNQUFNRyxTQUFpQyxHQUFHO0VBQ3hDQyxZQUFZLEVBQUUsTUFBTTtFQUNwQkMsU0FBUyxFQUFFLFNBQVM7RUFBRTtFQUN0QkMsdUJBQXVCLEVBQUVDLCtCQUF3QixDQUFDQyxRQUFRO0VBQzFEQyxxQkFBcUIsRUFBRUMsNkJBQXNCLENBQUNDO0FBQ2hELENBQUM7QUFBQyxJQUVnQkMsaUJBQWlCLEdBQUE3QixPQUFBLENBQUE2QixpQkFBQSwwQkFBakJBLGlCQUFpQjtFQUFqQkEsaUJBQWlCLENBQWpCQSxpQkFBaUI7RUFBakJBLGlCQUFpQixDQUFqQkEsaUJBQWlCO0VBQWpCQSxpQkFBaUIsQ0FBakJBLGlCQUFpQixvQ0FJakM7RUFBQSxPQUpnQkEsaUJBQWlCO0FBQUE7QUFPNUIsTUFBTUMsZ0JBQWdCLEdBQUlDLEtBZWhDLElBQUs7RUFDSixNQUFNQyxvQkFBb0IsR0FBR0QsS0FBSyxDQUFDRSxlQUFlO0VBQ2xELE1BQU1DLFFBQVEsR0FBRyxJQUFBQyw2QkFBZ0IsRUFBQyxNQUFNO0lBQ3RDLElBQUlKLEtBQUssQ0FBQ0csUUFBUSxLQUFLRSxTQUFTLEVBQUU7TUFDaEMsT0FBT0MsMEJBQVcsQ0FBQyxjQUFjLENBQUM7SUFDcEMsQ0FBQyxNQUFNO01BQ0wsT0FBT04sS0FBSyxDQUFDRyxRQUFRLENBQUNJLE1BQU0sQ0FBQ0QsMEJBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMzRDtFQUNGLENBQUMsQ0FBQztFQUVGLE1BQU1FLFFBQXdCLEdBQUcsSUFBQUMsdUJBQVcsRUFBRUMsS0FBVSxJQUFLO0lBQzNELE9BQU9BLEtBQUssQ0FBQ0YsUUFBUTtFQUN2QixDQUFDLENBQUM7RUFFRixNQUFNRyxRQUFRLEdBQUcsSUFBQUYsdUJBQVcsRUFBRUMsS0FBVSxJQUFLO0lBQzNDLE9BQU9BLEtBQUssQ0FBQ0MsUUFBUTtFQUN2QixDQUFDLENBQUM7RUFFRixNQUFNQyxZQUFZLEdBQUcsSUFBQUgsdUJBQVcsRUFBRUMsS0FBVSxJQUFLO0lBQy9DLE9BQU9BLEtBQUssQ0FBQ0csT0FBTztFQUN0QixDQUFDLENBQUM7RUFFRixNQUFNLENBQUNDLGVBQWUsRUFBRUMsa0JBQWtCLENBQUMsR0FBRyxJQUFBQyxlQUFRLEVBQUMsS0FBSyxDQUFDO0VBRTdELElBQUFyQyxnQkFBUyxFQUFDLE1BQU07SUFDZCxNQUFNc0MsV0FBVyxHQUNmTCxZQUFZLEVBQUVNLFFBQVEsSUFBSU4sWUFBWSxFQUFFQyxPQUFPLElBQUlELFlBQVksRUFBRU8sV0FBVyxJQUFJLEVBQUU7SUFDcEYsSUFDRVAsWUFBWSxLQUFLLElBQUksSUFDckJBLFlBQVksS0FBS1AsU0FBUyxJQUMxQlksV0FBVyxJQUFJLEVBQUUsRUFDakI7TUFDQUYsa0JBQWtCLENBQUMsSUFBSSxDQUFDO01BQ3hCSyxVQUFVLENBQUMsTUFBTTtRQUNmTCxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7TUFDM0IsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUNWO0VBQ0YsQ0FBQyxFQUFFLENBQUNILFlBQVksQ0FBQyxDQUFDO0VBRWxCM0MsT0FBQSxDQUFBRCxnQkFBQSxHQUFBQSxnQkFBZ0IsR0FBRyxJQUFBcUQsY0FBTyxFQUFDLE1BQU07SUFDL0IsTUFBTUMsV0FBMkMsR0FBRyxFQUFFO0lBQ3RELEtBQUssTUFBTUMsR0FBRyxJQUFJQyxnQ0FBZSxFQUFFO01BQ2pDRixXQUFXLENBQUMzRSxJQUFJLENBQUM2RSxnQ0FBZSxDQUFDRCxHQUFHLENBQUMsQ0FBQ0UsZUFBZSxDQUFDO0lBQ3hEO0lBQ0EsT0FBTyxJQUFJQyw0QkFBYSxDQUN0QkosV0FBVyxFQUNYdEIsS0FBSyxDQUFDMkIsV0FBVyxFQUNqQnRCLFNBQVMsRUFDVEYsUUFBUSxFQUNSSCxLQUFLLENBQUM0QixXQUFXLEVBQ2pCO01BQ0VDLE1BQU0sRUFBRTtRQUNOQyxRQUFRLEVBQUU5QixLQUFLLENBQUMrQixZQUFZLEVBQUVELFFBQVE7UUFDdENFLElBQUksRUFBQW5GLGFBQUEsQ0FBQUEsYUFBQSxLQUNFbUQsS0FBSyxDQUFDK0IsWUFBWSxFQUFFQyxJQUFJLElBQUksQ0FBQyxDQUFDO1VBQ2xDQyxPQUFPLEVBQUVqQyxLQUFLLENBQUMrQixZQUFZLEVBQUVDLElBQUksRUFBRUMsT0FBTyxJQUFJaEM7UUFBb0IsRUFDbkU7UUFDRGlDLE1BQU0sRUFBQXJGLGFBQUEsQ0FBQUEsYUFBQSxLQUNBbUQsS0FBSyxDQUFDK0IsWUFBWSxFQUFFRyxNQUFNLElBQUksQ0FBQyxDQUFDO1VBQ3BDRCxPQUFPLEVBQ0xqQyxLQUFLLENBQUMrQixZQUFZLEVBQUVHLE1BQU0sRUFBRUQsT0FBTyxJQUFJaEM7UUFBb0I7TUFFakUsQ0FBQztNQUNEa0MsVUFBVSxFQUFFO1FBQ1ZDLGVBQWUsRUFBRXBDLEtBQUssQ0FBQ3FDLGVBQWUsRUFBRUMsTUFBTTtRQUM5Q0MsZ0JBQWdCLEVBQUV2QyxLQUFLLENBQUNxQyxlQUFlLEVBQUVHLE9BQU87UUFDaERDLGlCQUFpQixFQUFFekMsS0FBSyxDQUFDcUMsZUFBZSxFQUFFSztNQUM1QztJQUNGLENBQ0YsQ0FBQztFQUNILENBQUMsRUFBRSxDQUNEMUMsS0FBSyxDQUFDMkIsV0FBVyxFQUNqQjNCLEtBQUssQ0FBQzRCLFdBQVcsRUFDakI1QixLQUFLLENBQUMrQixZQUFZLEVBQ2xCL0IsS0FBSyxDQUFDcUMsZUFBZSxFQUFFQyxNQUFNLEVBQzdCdEMsS0FBSyxDQUFDcUMsZUFBZSxFQUFFRyxPQUFPLEVBQzlCeEMsS0FBSyxDQUFDcUMsZUFBZSxFQUFFSyxRQUFRLEVBQy9CekMsb0JBQW9CLEVBQ3BCRSxRQUFRLENBQ1QsQ0FBQzs7RUFFRjtFQUNBLE1BQU13QyxhQUFhLEdBQUcsSUFBQUMsaUNBQXlCLEVBQUMsQ0FBQztFQUVqRCxJQUFBakUsZ0JBQVMsRUFBQyxNQUFNO0lBQ2RrRSxPQUFPLENBQUNDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRXRDLFFBQVEsQ0FBQztJQUMxQyxJQUFJQSxRQUFRLENBQUN1QyxtQkFBbUIsS0FBSyxJQUFJLEVBQUU7TUFDekNKLGFBQWEsQ0FBQ0ssUUFBUSxDQUNwQkMsb0JBQVksQ0FBQ3RHLElBQUksQ0FDZjZELFFBQVEsQ0FBQ3VDLG1CQUFtQixFQUM1QnZDLFFBQVEsQ0FBQzBDLHVCQUNYLENBQ0YsQ0FBQztJQUNIO0VBQ0YsQ0FBQyxFQUFFLENBQUN2QyxRQUFRLENBQUMsQ0FBQztFQUVkLE1BQU13QyxNQUFNLEdBQUcsSUFBQTlCLGNBQU8sRUFBQyxNQUFNO0lBQzNCLE1BQU04QixNQUFNLEdBQUcsRUFBRTtJQUNqQixNQUFNQyxhQUFhLEdBQUdDLHlDQUF3QixDQUFDRCxhQUFhLENBQUMsQ0FBQztJQUM5RCxLQUFLLE1BQU03QixHQUFHLElBQUk2QixhQUFhLEVBQUU7TUFDL0IsTUFBTUUsc0JBQXNCLEdBQUdGLGFBQWEsQ0FBQzdCLEdBQUcsQ0FBQztNQUNqRDRCLE1BQU0sQ0FBQ3hHLElBQUksY0FDVHJDLE1BQUEsQ0FBQXVCLE9BQUEsQ0FBQXNELGFBQUEsQ0FBQ3JCLEtBQUssQ0FBQ3lGLE1BQU07UUFDWDtRQUNBQyxJQUFJLEVBQUVqQyxHQUFJO1FBQ1ZrQyxTQUFTLEVBQUUzRSxxQkFBcUIsQ0FBQ3dFLHNCQUFzQixDQUFFO1FBQ3pESSxPQUFPLEVBQUVyRTtNQUFVLENBQ3BCLENBQ0gsQ0FBQztJQUNIO0lBQ0EsT0FBTzhELE1BQU07RUFDZixDQUFDLEVBQUUsRUFBRSxDQUFDO0VBRU4sTUFBTVEsR0FBRyxHQUFHLElBQUF0QyxjQUFPLEVBQ2pCO0VBQUE7RUFDRTtFQUNBL0csTUFBQSxDQUFBdUIsT0FBQSxDQUFBc0QsYUFBQSxDQUFDekUsT0FBQSxDQUFBa0osbUJBQW1CO0lBQUNDLEdBQUcsRUFBRWxCO0VBQWMsZ0JBRXRDckksTUFBQSxDQUFBdUIsT0FBQSxDQUFBc0QsYUFBQSxDQUFDckIsS0FBSyxDQUFDZ0csU0FBUztJQUFDQyxnQkFBZ0IsRUFBQztFQUFhLGdCQUM3Q3pKLE1BQUEsQ0FBQXVCLE9BQUEsQ0FBQXNELGFBQUEsQ0FBQ3JCLEtBQUssQ0FBQ3lGLE1BQU07SUFDWEMsSUFBSSxFQUFDLGFBQWE7SUFDbEJDLFNBQVMsRUFBRWpGLGFBQWEsQ0FBQ3dCLEtBQUssQ0FBQ3ZCLFFBQVEsQ0FBRTtJQUN6Q2lGLE9BQU8sRUFBRXJFO0VBQVUsQ0FDcEIsQ0FBQyxFQUNEOEQsTUFDYyxDQUNFLENBQ3RCLEVBQ0QsQ0FBQ0EsTUFBTSxFQUFFbkQsS0FBSyxDQUFDdkIsUUFBUSxDQUN6QixDQUFDO0VBRUQsTUFBTSxDQUFDdUYsYUFBYSxFQUFFQyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUFqRCxlQUFRLEVBQUNsQixpQkFBaUIsQ0FBQ29FLElBQUksQ0FBQztFQUMxRSxNQUFNLENBQUNDLFlBQVksRUFBRUMsZUFBZSxDQUFDLEdBQUcsSUFBQXBELGVBQVEsRUFBQyxLQUFLLENBQUM7RUFDdkQsTUFBTSxDQUFDcUQsVUFBVSxFQUFFQyxhQUFhLENBQUMsR0FBRyxJQUFBdEQsZUFBUSxFQUFDLEVBQUUsQ0FBQztFQUNoRCxNQUFNLENBQUN1RCxpQkFBaUIsRUFBRUMsb0JBQW9CLENBQUMsR0FBRyxJQUFBeEQsZUFBUSxFQUFDLEVBQUUsQ0FBQztFQUM5RCxNQUFNLENBQUN5RCxTQUFTLEVBQUVDLFlBQVksQ0FBQyxHQUFHLElBQUExRCxlQUFRLEVBQUMsS0FBSyxDQUFDO0VBRWpELElBQUFyQyxnQkFBUyxFQUFDLE1BQU07SUFDZGtFLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLHdCQUF3QixFQUFFa0IsYUFBYSxDQUFDO0lBQ3BESSxlQUFlLENBQUNKLGFBQWEsS0FBS2xFLGlCQUFpQixDQUFDNkUsU0FBUyxDQUFDO0VBQ2hFLENBQUMsRUFBRSxDQUFDWCxhQUFhLENBQUMsQ0FBQztFQUVuQixNQUFNWSxXQUFXLEdBQUlDLEtBQUssSUFBSztJQUM3QixJQUFJYixhQUFhLEtBQUtsRSxpQkFBaUIsQ0FBQzZFLFNBQVMsRUFBRTtNQUNqRCxNQUFNRyxDQUFDLEdBQUdELEtBQUssQ0FBQ0UsT0FBTztNQUN2QixNQUFNQyxDQUFDLEdBQUdILEtBQUssQ0FBQ0ksT0FBTztNQUN2QnBDLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLG9CQUFvQmdDLENBQUMsS0FBS0UsQ0FBQyxHQUFHLENBQUM7TUFDM0NFLDRCQUFXLENBQUN2SSxJQUFJLENBQUM7UUFBRW1JLENBQUMsRUFBRUEsQ0FBQztRQUFFRSxDQUFDLEVBQUVBO01BQUUsQ0FBQyxDQUFDO0lBQ2xDO0lBQ0FOLFlBQVksQ0FBQyxLQUFLLENBQUM7RUFDckIsQ0FBQztFQUNELE1BQU1TLFVBQVUsR0FBR0EsQ0FBQSxLQUFNO0lBQ3ZCVCxZQUFZLENBQUMsSUFBSSxDQUFDO0VBQ3BCLENBQUM7RUFFRCxNQUFNVSxvQkFBb0IsR0FBR0EsQ0FBQ0MsTUFBTSxFQUFFZCxpQkFBaUIsS0FBSztJQUMxRCxJQUFJUCxhQUFhLEtBQUtsRSxpQkFBaUIsQ0FBQzZFLFNBQVMsRUFBRTtNQUNqRDlCLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLGtCQUFrQnVDLE1BQU0sRUFBRSxDQUFDO01BQ3ZDLElBQUlBLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDbEJ4QyxPQUFPLENBQUNDLEdBQUcsQ0FBQyx1QkFBdUJ5QixpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZEQyxvQkFBb0IsQ0FBQ0QsaUJBQWlCLENBQUM7TUFDekM7SUFDRjtFQUNGLENBQUM7RUFDRCxNQUFNZSxvQkFBb0IsR0FBSUMsZUFBZSxJQUFLO0lBQ2hELElBQUl2QixhQUFhLEtBQUtsRSxpQkFBaUIsQ0FBQzZFLFNBQVMsRUFBRTtNQUNqRDlCLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLHFCQUFxQnlDLGVBQWUsRUFBRSxDQUFDO01BQ25EZixvQkFBb0IsQ0FBQ2UsZUFBZSxDQUFDO01BQ3JDakIsYUFBYSxDQUFDaUIsZUFBZSxDQUFDO0lBQ2hDO0VBQ0YsQ0FBQztFQUVELElBQUlDLGNBQWMsR0FBRyxFQUFFO0VBRXZCLElBQUE3RyxnQkFBUyxFQUFDLE1BQU07SUFDZCxJQUFJMEYsVUFBVSxLQUFLLEVBQUUsSUFBSUwsYUFBYSxLQUFLbEUsaUJBQWlCLENBQUM2RSxTQUFTLEVBQUU7TUFDdEVhLGNBQWMsR0FBR25CLFVBQVU7TUFDM0IsSUFBQW9CLG1DQUFrQixFQUFDLENBQUM7TUFDcEJ4QixnQkFBZ0IsQ0FBQ25FLGlCQUFpQixDQUFDNEYsVUFBVSxDQUFDO01BQzlDcEIsYUFBYSxDQUFDLEVBQUUsQ0FBQztNQUNqQixNQUFNcUIsaUJBQWlCLEdBQUcsTUFBQUEsQ0FBQSxLQUFZO1FBQ3BDLElBQUlDLGFBQTRCLEdBQUcsSUFBSTtRQUN2QyxJQUFJO1VBQ0YsTUFBTUMsTUFBTSxHQUFHLE1BQU03SCxnQkFBZ0IsQ0FBQzhILFFBQVEsQ0FBQ0MsS0FBSyxDQUFDUCxjQUFjLENBQUM7VUFDcEUzQyxPQUFPLENBQUNDLEdBQUcsQ0FBQyxrQkFBa0IrQyxNQUFNLEVBQUUsQ0FBQztVQUN2Q3JCLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztVQUN4QlAsZ0JBQWdCLENBQUNuRSxpQkFBaUIsQ0FBQ29FLElBQUksQ0FBQztVQUN4QyxJQUFJLE9BQU8yQixNQUFNLEtBQUssUUFBUSxJQUFJQSxNQUFNLENBQUNHLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RESixhQUFhLEdBQUdDLE1BQU0sQ0FBQ0csSUFBSSxDQUFDLENBQUM7VUFDL0IsQ0FBQyxNQUFNO1lBQ0w5SCxxQkFBcUIsQ0FBQ0YsZ0JBQWdCLEVBQUU7Y0FDdENpSSxTQUFTLEVBQUVULGNBQWM7Y0FDekJVLE9BQU8sRUFBRSxLQUFLO2NBQ2RDLGFBQWEsRUFBRTtZQUNqQixDQUFDLENBQUM7VUFDSjtVQUNBLE1BQU1DLGVBQWUsR0FBRyxJQUFBWCxtQ0FBa0IsRUFBQyxDQUFDO1VBQzVDLE1BQU1ZLGVBQWUsR0FBRyxNQUFNLElBQUFDLDZCQUFnQixFQUFDVCxNQUFNLEVBQUU7WUFDckRVLE1BQU0sRUFBRSxPQUFPO1lBQ2ZDLGlCQUFpQixFQUFFO1VBQ3JCLENBQUMsQ0FBQztVQUVGLElBQUlILGVBQWUsQ0FBQ0gsT0FBTyxJQUFJTixhQUFhLEVBQUU7WUFDNUMxSCxxQkFBcUIsQ0FBQ0YsZ0JBQWdCLEVBQUU7Y0FDdENpSSxTQUFTLEVBQUVULGNBQWM7Y0FDekJpQixNQUFNLEVBQUViLGFBQWE7Y0FDckJNLE9BQU8sRUFBRSxJQUFJO2NBQ2JDLGFBQWEsRUFBRTtZQUNqQixDQUFDLENBQUM7WUFDRnRELE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLG9CQUFvQixFQUFFdUQsZUFBZSxDQUFDO1lBQ2xELElBQUFLLDBCQUFhLEVBQ1hMLGVBQWUsRUFDZmIsY0FBYyxFQUNkSSxhQUFhLEVBQ2JRLGVBQ0YsQ0FBQztVQUNILENBQUMsTUFBTSxJQUFJUixhQUFhLEVBQUU7WUFDeEIxSCxxQkFBcUIsQ0FBQ0YsZ0JBQWdCLEVBQUU7Y0FDdENpSSxTQUFTLEVBQUVULGNBQWM7Y0FDekJpQixNQUFNLEVBQUViLGFBQWE7Y0FDckJNLE9BQU8sRUFBRSxLQUFLO2NBQ2RDLGFBQWEsRUFBRTtZQUNqQixDQUFDLENBQUM7VUFDSjtRQUNGLENBQUMsQ0FBQyxPQUFPUSxLQUFLLEVBQUU7VUFDZCxNQUFNQyxZQUFZLEdBQ2hCRCxLQUFLLFlBQVlFLEtBQUssR0FBR0YsS0FBSyxDQUFDOUYsT0FBTyxHQUFHakQsTUFBTSxDQUFDK0ksS0FBSyxDQUFDO1VBQ3hEekkscUJBQXFCLENBQUNGLGdCQUFnQixFQUFFO1lBQ3RDaUksU0FBUyxFQUFFVCxjQUFjO1lBQ3pCaUIsTUFBTSxFQUFFYixhQUFhO1lBQ3JCTSxPQUFPLEVBQUUsS0FBSztZQUNkQyxhQUFhLEVBQUVQLGFBQWEsR0FDeEIsaUJBQWlCZ0IsWUFBWSxFQUFFLEdBQy9CLGVBQWVBLFlBQVk7VUFDakMsQ0FBQyxDQUFDO1VBQ0ZwQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7VUFDeEJQLGdCQUFnQixDQUFDbkUsaUJBQWlCLENBQUNvRSxJQUFJLENBQUM7UUFDMUMsQ0FBQyxTQUFTO1VBQ1JnQiw0QkFBVyxDQUFDNEIsTUFBTSxDQUFDLENBQUMsRUFBRTVCLDRCQUFXLENBQUNuSSxNQUFNLENBQUM7UUFDM0M7TUFDRixDQUFDO01BRUQsS0FBSzRJLGlCQUFpQixDQUFDLENBQUM7SUFDMUI7RUFDRixDQUFDLEVBQUUsQ0FBQ3RCLFVBQVUsQ0FBQyxDQUFDO0VBRWhCLG9CQUNFL0osTUFBQSxDQUFBdUIsT0FBQSxDQUFBc0QsYUFBQSxDQUFDakUsWUFBQSxDQUFBNkwsSUFBSTtJQUFDQyxLQUFLLEVBQUU7TUFBRUMsSUFBSSxFQUFFO0lBQUU7RUFBRSxHQUN0QixDQUFDakQsYUFBYSxLQUFLbEUsaUJBQWlCLENBQUM2RSxTQUFTLElBQzdDWCxhQUFhLEtBQUtsRSxpQkFBaUIsQ0FBQzRGLFVBQVUsa0JBQzlDcEwsTUFBQSxDQUFBdUIsT0FBQSxDQUFBc0QsYUFBQSxDQUFDakUsWUFBQSxDQUFBNkwsSUFBSTtJQUNIRyx5QkFBeUIsRUFBRUEsQ0FBQSxLQUFNLElBQUs7SUFDdENDLGdCQUFnQixFQUFFaEMsVUFBVztJQUM3QmlDLGtCQUFrQixFQUFFeEMsV0FBWTtJQUNoQ29DLEtBQUssRUFBRTtNQUNMSyxRQUFRLEVBQUUsVUFBVTtNQUNwQkMsR0FBRyxFQUFFLENBQUM7TUFDTkMsSUFBSSxFQUFFLENBQUM7TUFDUEMsZUFBZSxFQUFFL0MsU0FBUyxHQUFHLFNBQVMsR0FBRyxTQUFTO01BQ2xEZ0QsS0FBSyxFQUFFLE1BQU07TUFDYkMsTUFBTSxFQUFFLE1BQU07TUFDZEMsTUFBTSxFQUFFLENBQUM7TUFDVEMsT0FBTyxFQUFFO0lBQ1g7RUFBRSxHQUVENUQsYUFBYSxLQUFLbEUsaUJBQWlCLENBQUM0RixVQUFVLGlCQUM3Q3BMLE1BQUEsQ0FBQXVCLE9BQUEsQ0FBQXNELGFBQUEsQ0FBQ2pFLFlBQUEsQ0FBQTZMLElBQUk7SUFDSEMsS0FBSyxFQUFFO01BQ0xLLFFBQVEsRUFBRSxVQUFVO01BQ3BCQyxHQUFHLEVBQUUsS0FBSztNQUNWQyxJQUFJLEVBQUUsS0FBSztNQUNYTSxTQUFTLEVBQUUsQ0FBQztRQUFFQyxVQUFVLEVBQUUsQ0FBQztNQUFHLENBQUMsRUFBRTtRQUFFQyxVQUFVLEVBQUUsQ0FBQztNQUFHLENBQUMsQ0FBQztNQUNyRFAsZUFBZSxFQUFFLFNBQVM7TUFDMUJRLE9BQU8sRUFBRSxFQUFFO01BQ1hDLFlBQVksRUFBRSxFQUFFO01BQ2hCQyxXQUFXLEVBQUUsU0FBUztNQUN0QkMsWUFBWSxFQUFFO1FBQUVWLEtBQUssRUFBRSxDQUFDO1FBQUVDLE1BQU0sRUFBRTtNQUFFLENBQUM7TUFDckNVLGFBQWEsRUFBRSxHQUFHO01BQ2xCQyxZQUFZLEVBQUUsRUFBRTtNQUNoQkMsU0FBUyxFQUFFO0lBQ2I7RUFBRSxnQkFFRmhPLE1BQUEsQ0FBQXVCLE9BQUEsQ0FBQXNELGFBQUEsQ0FBQ2pFLFlBQUEsQ0FBQXFOLGlCQUFpQjtJQUFDQyxJQUFJLEVBQUMsT0FBTztJQUFDQyxLQUFLLEVBQUM7RUFBUyxDQUFFLENBQzdDLENBQ1AsRUFFQXpJLEtBQUssQ0FBQzBJLGlCQUFpQixpQkFDdEJwTyxNQUFBLENBQUF1QixPQUFBLENBQUFzRCxhQUFBLENBQUNqRSxZQUFBLENBQUE2TCxJQUFJO0lBQ0hDLEtBQUssRUFBRTtNQUNMSyxRQUFRLEVBQUUsVUFBVTtNQUNwQnNCLE1BQU0sRUFBRSxLQUFLO01BQ2JwQixJQUFJLEVBQUUsS0FBSztNQUNYTSxTQUFTLEVBQUUsQ0FBQztRQUFFQyxVQUFVLEVBQUU7TUFBTyxDQUFDLEVBQUU7UUFBRUMsVUFBVSxFQUFFO01BQU8sQ0FBQyxDQUFDO01BQzNEUCxlQUFlLEVBQUUsU0FBUztNQUMxQlEsT0FBTyxFQUFFLEVBQUU7TUFDWEMsWUFBWSxFQUFFLEVBQUU7TUFDaEJDLFdBQVcsRUFBRSxTQUFTO01BQ3RCQyxZQUFZLEVBQUU7UUFBRVYsS0FBSyxFQUFFLENBQUM7UUFBRUMsTUFBTSxFQUFFO01BQUUsQ0FBQztNQUNyQ1UsYUFBYSxFQUFFLEdBQUc7TUFDbEJDLFlBQVksRUFBRSxFQUFFO01BQ2hCQyxTQUFTLEVBQUU7SUFDYjtFQUFFLGdCQUVGaE8sTUFBQSxDQUFBdUIsT0FBQSxDQUFBc0QsYUFBQSxDQUFDakUsWUFBQSxDQUFBME4sSUFBSTtJQUFDNUIsS0FBSyxFQUFFO01BQUU2QixRQUFRLEVBQUU7SUFBRztFQUFFLEdBQUV0RSxpQkFBd0IsQ0FDcEQsQ0FFSixDQUNQLGVBQ0RqSyxNQUFBLENBQUF1QixPQUFBLENBQUFzRCxhQUFBLENBQUNqRSxZQUFBLENBQUE2TCxJQUFJO0lBQ0hDLEtBQUssRUFBRTtNQUNMSyxRQUFRLEVBQUUsVUFBVTtNQUNwQnNCLE1BQU0sRUFBRSxFQUFFO01BQ1ZHLEtBQUssRUFBRSxFQUFFO01BQ1RuQixNQUFNLEVBQUU7SUFDVjtFQUFFLGdCQUVGck4sTUFBQSxDQUFBdUIsT0FBQSxDQUFBc0QsYUFBQSxDQUFDakUsWUFBQSxDQUFBNk4sZ0JBQWdCO0lBQ2ZDLE9BQU8sRUFBRUEsQ0FBQSxLQUFNO01BQ2IsSUFBSWhGLGFBQWEsS0FBS2xFLGlCQUFpQixDQUFDb0UsSUFBSSxFQUFFO1FBQzVDRCxnQkFBZ0IsQ0FBQ25FLGlCQUFpQixDQUFDNkUsU0FBUyxDQUFDO01BQy9DLENBQUMsTUFBTSxJQUFJWCxhQUFhLEtBQUtsRSxpQkFBaUIsQ0FBQzZFLFNBQVMsRUFBRTtRQUN4RFAsZUFBZSxDQUFDLEtBQUssQ0FBQztNQUN4QjtJQUNGO0VBQUUsZ0JBRUY5SixNQUFBLENBQUF1QixPQUFBLENBQUFzRCxhQUFBLENBQUNqRSxZQUFBLENBQUE2TCxJQUFJO0lBQ0hDLEtBQUssRUFBRTtNQUNMUyxLQUFLLEVBQUUsRUFBRTtNQUNUQyxNQUFNLEVBQUUsRUFBRTtNQUNWTyxZQUFZLEVBQUUsRUFBRTtNQUNoQlQsZUFBZSxFQUNieEQsYUFBYSxLQUFLbEUsaUJBQWlCLENBQUM2RSxTQUFTLEdBQ3pDLFNBQVMsR0FDVCxTQUFTO01BQ2ZzRSxjQUFjLEVBQUUsUUFBUTtNQUN4QkMsVUFBVSxFQUFFO0lBQ2Q7RUFBRSxnQkFFRjVPLE1BQUEsQ0FBQXVCLE9BQUEsQ0FBQXNELGFBQUEsQ0FBQ3ZFLFlBQUEsQ0FBQXVPLFFBQVE7SUFDUDNGLElBQUksRUFBRVEsYUFBYSxLQUFLbEUsaUJBQWlCLENBQUM2RSxTQUFTLEdBQUcsS0FBSyxHQUFHLGFBQWM7SUFDNUU2RCxJQUFJLEVBQUUsRUFBRztJQUNUQyxLQUFLLEVBQUM7RUFBUyxDQUNoQixDQUNHLENBQ1UsQ0FDZCxDQUFDLGVBQ1BuTyxNQUFBLENBQUF1QixPQUFBLENBQUFzRCxhQUFBLENBQUN0RSxrQkFBQSxDQUFBdU8sZ0JBQWdCO0lBQ2ZoRSxvQkFBb0IsRUFBRUEsb0JBQXFCO0lBQzNDRSxvQkFBb0IsRUFBRUEsb0JBQXFCO0lBQzNDbkIsWUFBWSxFQUFFQTtJQUNkO0VBQUEsQ0FFRCxDQUFDLEVBQ0RSLEdBQUcsRUFDSDdDLGVBQWUsaUJBQ2R4RyxNQUFBLENBQUF1QixPQUFBLENBQUFzRCxhQUFBLENBQUNyRSxLQUFBLENBQUF1TyxRQUFRO0lBQ1B4SSxPQUFPLEVBQUVELFlBQVksRUFBRU0sUUFBUSxJQUFJTixZQUFZLEVBQUVDLE9BQU8sSUFBSUQsWUFBWSxFQUFFTyxXQUFXLElBQUksRUFBRztJQUM1RjZGLEtBQUssRUFBRTtNQUNMSyxRQUFRLEVBQUUsVUFBVTtNQUNwQmlDLEtBQUssRUFBRSxFQUFFO01BQ1RDLEdBQUcsRUFBRSxFQUFFO01BQ1BaLE1BQU0sRUFBRSxHQUFHO01BQ1huQixlQUFlLEVBQ2I1RyxZQUFZLENBQUM0SSxJQUFJLEtBQUssT0FBTyxHQUFHLFNBQVMsR0FBRztJQUNoRDtFQUFFLENBQ0gsQ0FFQyxDQUFDO0FBRVgsQ0FBQztBQUFDdkwsT0FBQSxDQUFBOEIsZ0JBQUEsR0FBQUEsZ0JBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type NativeVisibilityPlatform = "web" | "ios" | "android";
|
|
2
|
+
export type NativeVisibilityState = "stable" | "transition_unstable";
|
|
3
|
+
export type NativeVisibilityResolution = {
|
|
4
|
+
interfaces: FocusAwareGenieInterfaceSpec[];
|
|
5
|
+
state: NativeVisibilityState;
|
|
6
|
+
};
|
|
7
|
+
type NativeVisibilityResolutionOptions = {
|
|
8
|
+
now?: number;
|
|
9
|
+
};
|
|
10
|
+
export type FocusAwareGenieInterfaceSpec = {
|
|
11
|
+
className: string;
|
|
12
|
+
key: any;
|
|
13
|
+
rect: {
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
width: number;
|
|
17
|
+
height: number;
|
|
18
|
+
top: number;
|
|
19
|
+
left: number;
|
|
20
|
+
bottom: number;
|
|
21
|
+
right: number;
|
|
22
|
+
};
|
|
23
|
+
isFocusedScreen?: boolean;
|
|
24
|
+
};
|
|
25
|
+
export declare function resetNativeVisibilityStateForTests(): void;
|
|
26
|
+
export declare function resolveVisibleInterfacesForPlatform(platform: NativeVisibilityPlatform | string, interfaces: FocusAwareGenieInterfaceSpec[], options?: NativeVisibilityResolutionOptions): NativeVisibilityResolution;
|
|
27
|
+
export declare function filterVisibleInterfacesForPlatform(platform: NativeVisibilityPlatform | string, interfaces: FocusAwareGenieInterfaceSpec[]): FocusAwareGenieInterfaceSpec[];
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.filterVisibleInterfacesForPlatform = filterVisibleInterfacesForPlatform;
|
|
7
|
+
exports.resetNativeVisibilityStateForTests = resetNativeVisibilityStateForTests;
|
|
8
|
+
exports.resolveVisibleInterfacesForPlatform = resolveVisibleInterfacesForPlatform;
|
|
9
|
+
const NATIVE_VISIBILITY_TRANSITION_GRACE_MS = 400;
|
|
10
|
+
let lastNativeFocusedAtMs = 0;
|
|
11
|
+
function resetNativeVisibilityStateForTests() {
|
|
12
|
+
lastNativeFocusedAtMs = 0;
|
|
13
|
+
}
|
|
14
|
+
function resolveVisibleInterfacesForPlatform(platform, interfaces, options = {}) {
|
|
15
|
+
const now = options.now ?? Date.now();
|
|
16
|
+
if (platform === "web") {
|
|
17
|
+
return {
|
|
18
|
+
interfaces,
|
|
19
|
+
state: "stable"
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const hasFocusMetadata = interfaces.some(genieInterface => typeof genieInterface.isFocusedScreen === "boolean");
|
|
23
|
+
if (!hasFocusMetadata) {
|
|
24
|
+
return {
|
|
25
|
+
interfaces,
|
|
26
|
+
state: "stable"
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const focusedInterfaces = interfaces.filter(genieInterface => genieInterface.isFocusedScreen === true);
|
|
30
|
+
if (focusedInterfaces.length > 0) {
|
|
31
|
+
lastNativeFocusedAtMs = now;
|
|
32
|
+
return {
|
|
33
|
+
interfaces: focusedInterfaces,
|
|
34
|
+
state: "stable"
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const isTransitionUnstable = lastNativeFocusedAtMs > 0 && now - lastNativeFocusedAtMs < NATIVE_VISIBILITY_TRANSITION_GRACE_MS;
|
|
38
|
+
return {
|
|
39
|
+
interfaces: [],
|
|
40
|
+
state: isTransitionUnstable ? "transition_unstable" : "stable"
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Native stacks can keep blurred screens mounted, so "mounted" is not the same
|
|
45
|
+
// as "currently visible for Genie resolution". Web already has a stronger
|
|
46
|
+
// visibility signal from IntersectionObserver and should be left unchanged.
|
|
47
|
+
function filterVisibleInterfacesForPlatform(platform, interfaces) {
|
|
48
|
+
return resolveVisibleInterfacesForPlatform(platform, interfaces).interfaces;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOQVRJVkVfVklTSUJJTElUWV9UUkFOU0lUSU9OX0dSQUNFX01TIiwibGFzdE5hdGl2ZUZvY3VzZWRBdE1zIiwicmVzZXROYXRpdmVWaXNpYmlsaXR5U3RhdGVGb3JUZXN0cyIsInJlc29sdmVWaXNpYmxlSW50ZXJmYWNlc0ZvclBsYXRmb3JtIiwicGxhdGZvcm0iLCJpbnRlcmZhY2VzIiwib3B0aW9ucyIsIm5vdyIsIkRhdGUiLCJzdGF0ZSIsImhhc0ZvY3VzTWV0YWRhdGEiLCJzb21lIiwiZ2VuaWVJbnRlcmZhY2UiLCJpc0ZvY3VzZWRTY3JlZW4iLCJmb2N1c2VkSW50ZXJmYWNlcyIsImZpbHRlciIsImxlbmd0aCIsImlzVHJhbnNpdGlvblVuc3RhYmxlIiwiZmlsdGVyVmlzaWJsZUludGVyZmFjZXNGb3JQbGF0Zm9ybSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9uYXRpdmUtdmlzaWJpbGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBOYXRpdmVWaXNpYmlsaXR5UGxhdGZvcm0gPSBcIndlYlwiIHwgXCJpb3NcIiB8IFwiYW5kcm9pZFwiO1xuZXhwb3J0IHR5cGUgTmF0aXZlVmlzaWJpbGl0eVN0YXRlID0gXCJzdGFibGVcIiB8IFwidHJhbnNpdGlvbl91bnN0YWJsZVwiO1xuXG5leHBvcnQgdHlwZSBOYXRpdmVWaXNpYmlsaXR5UmVzb2x1dGlvbiA9IHtcbiAgaW50ZXJmYWNlczogRm9jdXNBd2FyZUdlbmllSW50ZXJmYWNlU3BlY1tdO1xuICBzdGF0ZTogTmF0aXZlVmlzaWJpbGl0eVN0YXRlO1xufTtcblxudHlwZSBOYXRpdmVWaXNpYmlsaXR5UmVzb2x1dGlvbk9wdGlvbnMgPSB7XG4gIG5vdz86IG51bWJlcjtcbn07XG5cbmNvbnN0IE5BVElWRV9WSVNJQklMSVRZX1RSQU5TSVRJT05fR1JBQ0VfTVMgPSA0MDA7XG5sZXQgbGFzdE5hdGl2ZUZvY3VzZWRBdE1zID0gMDtcblxuZXhwb3J0IHR5cGUgRm9jdXNBd2FyZUdlbmllSW50ZXJmYWNlU3BlYyA9IHtcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIGtleTogYW55O1xuICByZWN0OiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIHRvcDogbnVtYmVyO1xuICAgIGxlZnQ6IG51bWJlcjtcbiAgICBib3R0b206IG51bWJlcjtcbiAgICByaWdodDogbnVtYmVyO1xuICB9O1xuICBpc0ZvY3VzZWRTY3JlZW4/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TmF0aXZlVmlzaWJpbGl0eVN0YXRlRm9yVGVzdHMoKTogdm9pZCB7XG4gIGxhc3ROYXRpdmVGb2N1c2VkQXRNcyA9IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVmlzaWJsZUludGVyZmFjZXNGb3JQbGF0Zm9ybShcbiAgcGxhdGZvcm06IE5hdGl2ZVZpc2liaWxpdHlQbGF0Zm9ybSB8IHN0cmluZyxcbiAgaW50ZXJmYWNlczogRm9jdXNBd2FyZUdlbmllSW50ZXJmYWNlU3BlY1tdLFxuICBvcHRpb25zOiBOYXRpdmVWaXNpYmlsaXR5UmVzb2x1dGlvbk9wdGlvbnMgPSB7fSxcbik6IE5hdGl2ZVZpc2liaWxpdHlSZXNvbHV0aW9uIHtcbiAgY29uc3Qgbm93ID0gb3B0aW9ucy5ub3cgPz8gRGF0ZS5ub3coKTtcblxuICBpZiAocGxhdGZvcm0gPT09IFwid2ViXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW50ZXJmYWNlcyxcbiAgICAgIHN0YXRlOiBcInN0YWJsZVwiLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBoYXNGb2N1c01ldGFkYXRhID0gaW50ZXJmYWNlcy5zb21lKFxuICAgIChnZW5pZUludGVyZmFjZSkgPT4gdHlwZW9mIGdlbmllSW50ZXJmYWNlLmlzRm9jdXNlZFNjcmVlbiA9PT0gXCJib29sZWFuXCIsXG4gICk7XG4gIGlmICghaGFzRm9jdXNNZXRhZGF0YSkge1xuICAgIHJldHVybiB7XG4gICAgICBpbnRlcmZhY2VzLFxuICAgICAgc3RhdGU6IFwic3RhYmxlXCIsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGZvY3VzZWRJbnRlcmZhY2VzID0gaW50ZXJmYWNlcy5maWx0ZXIoXG4gICAgKGdlbmllSW50ZXJmYWNlKSA9PiBnZW5pZUludGVyZmFjZS5pc0ZvY3VzZWRTY3JlZW4gPT09IHRydWUsXG4gICk7XG5cbiAgaWYgKGZvY3VzZWRJbnRlcmZhY2VzLmxlbmd0aCA+IDApIHtcbiAgICBsYXN0TmF0aXZlRm9jdXNlZEF0TXMgPSBub3c7XG4gICAgcmV0dXJuIHtcbiAgICAgIGludGVyZmFjZXM6IGZvY3VzZWRJbnRlcmZhY2VzLFxuICAgICAgc3RhdGU6IFwic3RhYmxlXCIsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGlzVHJhbnNpdGlvblVuc3RhYmxlID1cbiAgICBsYXN0TmF0aXZlRm9jdXNlZEF0TXMgPiAwICYmXG4gICAgbm93IC0gbGFzdE5hdGl2ZUZvY3VzZWRBdE1zIDwgTkFUSVZFX1ZJU0lCSUxJVFlfVFJBTlNJVElPTl9HUkFDRV9NUztcblxuICByZXR1cm4ge1xuICAgIGludGVyZmFjZXM6IFtdLFxuICAgIHN0YXRlOiBpc1RyYW5zaXRpb25VbnN0YWJsZSA/IFwidHJhbnNpdGlvbl91bnN0YWJsZVwiIDogXCJzdGFibGVcIixcbiAgfTtcbn1cblxuLy8gTmF0aXZlIHN0YWNrcyBjYW4ga2VlcCBibHVycmVkIHNjcmVlbnMgbW91bnRlZCwgc28gXCJtb3VudGVkXCIgaXMgbm90IHRoZSBzYW1lXG4vLyBhcyBcImN1cnJlbnRseSB2aXNpYmxlIGZvciBHZW5pZSByZXNvbHV0aW9uXCIuIFdlYiBhbHJlYWR5IGhhcyBhIHN0cm9uZ2VyXG4vLyB2aXNpYmlsaXR5IHNpZ25hbCBmcm9tIEludGVyc2VjdGlvbk9ic2VydmVyIGFuZCBzaG91bGQgYmUgbGVmdCB1bmNoYW5nZWQuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyVmlzaWJsZUludGVyZmFjZXNGb3JQbGF0Zm9ybShcbiAgcGxhdGZvcm06IE5hdGl2ZVZpc2liaWxpdHlQbGF0Zm9ybSB8IHN0cmluZyxcbiAgaW50ZXJmYWNlczogRm9jdXNBd2FyZUdlbmllSW50ZXJmYWNlU3BlY1tdLFxuKTogRm9jdXNBd2FyZUdlbmllSW50ZXJmYWNlU3BlY1tdIHtcbiAgcmV0dXJuIHJlc29sdmVWaXNpYmxlSW50ZXJmYWNlc0ZvclBsYXRmb3JtKHBsYXRmb3JtLCBpbnRlcmZhY2VzKS5pbnRlcmZhY2VzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVlBLE1BQU1BLHFDQUFxQyxHQUFHLEdBQUc7QUFDakQsSUFBSUMscUJBQXFCLEdBQUcsQ0FBQztBQWtCdEIsU0FBU0Msa0NBQWtDQSxDQUFBLEVBQVM7RUFDekRELHFCQUFxQixHQUFHLENBQUM7QUFDM0I7QUFFTyxTQUFTRSxtQ0FBbUNBLENBQ2pEQyxRQUEyQyxFQUMzQ0MsVUFBMEMsRUFDMUNDLE9BQTBDLEdBQUcsQ0FBQyxDQUFDLEVBQ25CO0VBQzVCLE1BQU1DLEdBQUcsR0FBR0QsT0FBTyxDQUFDQyxHQUFHLElBQUlDLElBQUksQ0FBQ0QsR0FBRyxDQUFDLENBQUM7RUFFckMsSUFBSUgsUUFBUSxLQUFLLEtBQUssRUFBRTtJQUN0QixPQUFPO01BQ0xDLFVBQVU7TUFDVkksS0FBSyxFQUFFO0lBQ1QsQ0FBQztFQUNIO0VBRUEsTUFBTUMsZ0JBQWdCLEdBQUdMLFVBQVUsQ0FBQ00sSUFBSSxDQUNyQ0MsY0FBYyxJQUFLLE9BQU9BLGNBQWMsQ0FBQ0MsZUFBZSxLQUFLLFNBQ2hFLENBQUM7RUFDRCxJQUFJLENBQUNILGdCQUFnQixFQUFFO0lBQ3JCLE9BQU87TUFDTEwsVUFBVTtNQUNWSSxLQUFLLEVBQUU7SUFDVCxDQUFDO0VBQ0g7RUFFQSxNQUFNSyxpQkFBaUIsR0FBR1QsVUFBVSxDQUFDVSxNQUFNLENBQ3hDSCxjQUFjLElBQUtBLGNBQWMsQ0FBQ0MsZUFBZSxLQUFLLElBQ3pELENBQUM7RUFFRCxJQUFJQyxpQkFBaUIsQ0FBQ0UsTUFBTSxHQUFHLENBQUMsRUFBRTtJQUNoQ2YscUJBQXFCLEdBQUdNLEdBQUc7SUFDM0IsT0FBTztNQUNMRixVQUFVLEVBQUVTLGlCQUFpQjtNQUM3QkwsS0FBSyxFQUFFO0lBQ1QsQ0FBQztFQUNIO0VBRUEsTUFBTVEsb0JBQW9CLEdBQ3hCaEIscUJBQXFCLEdBQUcsQ0FBQyxJQUN6Qk0sR0FBRyxHQUFHTixxQkFBcUIsR0FBR0QscUNBQXFDO0VBRXJFLE9BQU87SUFDTEssVUFBVSxFQUFFLEVBQUU7SUFDZEksS0FBSyxFQUFFUSxvQkFBb0IsR0FBRyxxQkFBcUIsR0FBRztFQUN4RCxDQUFDO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ08sU0FBU0Msa0NBQWtDQSxDQUNoRGQsUUFBMkMsRUFDM0NDLFVBQTBDLEVBQ1Y7RUFDaEMsT0FBT0YsbUNBQW1DLENBQUNDLFFBQVEsRUFBRUMsVUFBVSxDQUFDLENBQUNBLFVBQVU7QUFDN0UiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { SpeechState } from '../hooks/useSpeechRecognition';
|
|
3
|
+
export interface VoiceRecognitionBarProps {
|
|
4
|
+
state: SpeechState;
|
|
5
|
+
isListening: boolean;
|
|
6
|
+
isProcessing: boolean;
|
|
7
|
+
isConnecting?: boolean;
|
|
8
|
+
interimTranscript: string;
|
|
9
|
+
transcript: string;
|
|
10
|
+
audioLevel: number;
|
|
11
|
+
waveformPreview?: number[];
|
|
12
|
+
onToggle: () => void;
|
|
13
|
+
style?: any;
|
|
14
|
+
showTranscript?: boolean;
|
|
15
|
+
placeholderText?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare const VoiceRecognitionBar: React.FC<VoiceRecognitionBarProps>;
|