deepadb 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/README.md +53 -19
- package/build/bridge/local-bridge.d.ts +40 -1
- package/build/bridge/local-bridge.d.ts.map +1 -1
- package/build/bridge/local-bridge.js +155 -5
- package/build/bridge/local-bridge.js.map +1 -1
- package/build/index.js +2 -1
- package/build/index.js.map +1 -1
- package/build/middleware/auth.d.ts +10 -0
- package/build/middleware/auth.d.ts.map +1 -1
- package/build/middleware/auth.js +48 -0
- package/build/middleware/auth.js.map +1 -1
- package/build/middleware/ui-dump.d.ts +21 -0
- package/build/middleware/ui-dump.d.ts.map +1 -1
- package/build/middleware/ui-dump.js +38 -0
- package/build/middleware/ui-dump.js.map +1 -1
- package/build/server.d.ts.map +1 -1
- package/build/server.js +6 -2
- package/build/server.js.map +1 -1
- package/build/tools/at-commands.d.ts.map +1 -1
- package/build/tools/at-commands.js +192 -0
- package/build/tools/at-commands.js.map +1 -1
- package/build/tools/diagnostics.d.ts +2 -2
- package/build/tools/diagnostics.d.ts.map +1 -1
- package/build/tools/diagnostics.js +86 -3
- package/build/tools/diagnostics.js.map +1 -1
- package/build/tools/firmware-analysis.d.ts.map +1 -1
- package/build/tools/firmware-analysis.js +24 -0
- package/build/tools/firmware-analysis.js.map +1 -1
- package/build/tools/input-gestures.d.ts +11 -0
- package/build/tools/input-gestures.d.ts.map +1 -0
- package/build/tools/input-gestures.js +766 -0
- package/build/tools/input-gestures.js.map +1 -0
- package/build/tools/multi-device.d.ts.map +1 -1
- package/build/tools/multi-device.js +186 -0
- package/build/tools/multi-device.js.map +1 -1
- package/build/tools/qemu.d.ts.map +1 -1
- package/build/tools/qemu.js +246 -2
- package/build/tools/qemu.js.map +1 -1
- package/build/tools/ui.js +2 -48
- package/build/tools/ui.js.map +1 -1
- package/build/tools/wireless-firmware.d.ts +16 -0
- package/build/tools/wireless-firmware.d.ts.map +1 -0
- package/build/tools/wireless-firmware.js +566 -0
- package/build/tools/wireless-firmware.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wireless Firmware Tools — WiFi, Bluetooth, and NFC firmware identification.
|
|
3
|
+
*
|
|
4
|
+
* Provides detailed firmware versioning and chipset identification for
|
|
5
|
+
* short-range wireless radios. Complements the baseband/modem tools which
|
|
6
|
+
* cover cellular radio firmware.
|
|
7
|
+
*
|
|
8
|
+
* Queries Android system properties and dumpsys services to extract
|
|
9
|
+
* firmware versions, driver info, chipset identification, and capabilities.
|
|
10
|
+
*
|
|
11
|
+
* Privacy: MAC addresses and device names are opt-in (like IMEI in baseband
|
|
12
|
+
* tools) since they are permanent hardware identifiers.
|
|
13
|
+
*/
|
|
14
|
+
import { z } from "zod";
|
|
15
|
+
import { OutputProcessor } from "../middleware/output-processor.js";
|
|
16
|
+
/**
|
|
17
|
+
* Parse WiFi firmware/driver information from dumpsys wifi output.
|
|
18
|
+
* Extracts firmware version, driver version, chipset info, and capabilities.
|
|
19
|
+
*/
|
|
20
|
+
function parseWifiDumpsys(raw) {
|
|
21
|
+
const info = {};
|
|
22
|
+
// Firmware version — various formats across vendors
|
|
23
|
+
const fwMatch = raw.match(/Firmware\s*(?:version|Version|Ver)[:\s]+([^\n,]+)/i)
|
|
24
|
+
|| raw.match(/Wi-?Fi\s+(?:FW|firmware)[:\s]+([^\n,]+)/i);
|
|
25
|
+
if (fwMatch)
|
|
26
|
+
info.firmwareVersion = fwMatch[1].trim();
|
|
27
|
+
// Driver version
|
|
28
|
+
const driverMatch = raw.match(/Driver\s*(?:version|Version|Ver)[:\s]+([^\n,]+)/i);
|
|
29
|
+
if (driverMatch)
|
|
30
|
+
info.driverVersion = driverMatch[1].trim();
|
|
31
|
+
// Chipset / hardware
|
|
32
|
+
const chipMatch = raw.match(/(?:Chip|Chipset|Hardware)[:\s]+([^\n,]+)/i);
|
|
33
|
+
if (chipMatch)
|
|
34
|
+
info.chipset = chipMatch[1].trim();
|
|
35
|
+
// Supported bands/frequencies
|
|
36
|
+
const band2g = raw.includes("2.4GHz") || raw.includes("2412") || raw.includes("2437");
|
|
37
|
+
const band5g = raw.includes("5GHz") || raw.includes("5180") || raw.includes("5745");
|
|
38
|
+
const band6g = raw.includes("6GHz") || raw.includes("5955") || raw.includes("6115");
|
|
39
|
+
const bands = [];
|
|
40
|
+
if (band2g)
|
|
41
|
+
bands.push("2.4 GHz");
|
|
42
|
+
if (band5g)
|
|
43
|
+
bands.push("5 GHz");
|
|
44
|
+
if (band6g)
|
|
45
|
+
bands.push("6 GHz");
|
|
46
|
+
if (bands.length > 0)
|
|
47
|
+
info.supportedBands = bands.join(", ");
|
|
48
|
+
// WiFi standard detection from capabilities
|
|
49
|
+
if (raw.includes("wifi7") || raw.includes("802.11be") || band6g)
|
|
50
|
+
info.wifiStandard = "Wi-Fi 7 (802.11be)";
|
|
51
|
+
else if (raw.includes("wifi6e") || raw.includes("6GHz"))
|
|
52
|
+
info.wifiStandard = "Wi-Fi 6E";
|
|
53
|
+
else if (raw.includes("wifi6") || raw.includes("802.11ax"))
|
|
54
|
+
info.wifiStandard = "Wi-Fi 6 (802.11ax)";
|
|
55
|
+
else if (raw.includes("802.11ac") || raw.includes("VHT"))
|
|
56
|
+
info.wifiStandard = "Wi-Fi 5 (802.11ac)";
|
|
57
|
+
// Country code
|
|
58
|
+
const ccMatch = raw.match(/Country\s*(?:code|Code)[:\s]+(\w{2})/i);
|
|
59
|
+
if (ccMatch)
|
|
60
|
+
info.countryCode = ccMatch[1].toUpperCase();
|
|
61
|
+
return info;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parse Bluetooth information from dumpsys bluetooth_manager output.
|
|
65
|
+
* Extracts firmware version, chipset, BT version, adapter state, and profile support.
|
|
66
|
+
*/
|
|
67
|
+
function parseBluetoothDumpsys(raw) {
|
|
68
|
+
const info = {};
|
|
69
|
+
// Firmware version / revision
|
|
70
|
+
const fwMatch = raw.match(/(?:FW|Firmware)\s*(?:version|Version|Ver|revision)[:\s]+([^\n,]+)/i)
|
|
71
|
+
|| raw.match(/(?:LMP|HCI)\s*(?:sub)?version[:\s]+(?:0x)?([0-9a-fA-F]+)/i);
|
|
72
|
+
if (fwMatch)
|
|
73
|
+
info.firmwareVersion = fwMatch[1].trim();
|
|
74
|
+
// Chipset identification
|
|
75
|
+
const chipMatch = raw.match(/(?:Chip|Chipset|Controller)[:\s]+([^\n,]+)/i);
|
|
76
|
+
if (chipMatch)
|
|
77
|
+
info.chipset = chipMatch[1].trim();
|
|
78
|
+
// BT version from LMP version
|
|
79
|
+
const lmpMatch = raw.match(/(?:LMP\s*version|Bluetooth\s*version)[:\s]+(?:0x)?([0-9a-fA-F]+)/i);
|
|
80
|
+
if (lmpMatch) {
|
|
81
|
+
const lmpVer = parseInt(lmpMatch[1], 16) || parseInt(lmpMatch[1], 10);
|
|
82
|
+
if (lmpVer >= 13)
|
|
83
|
+
info.btVersion = "5.4";
|
|
84
|
+
else if (lmpVer >= 12)
|
|
85
|
+
info.btVersion = "5.3";
|
|
86
|
+
else if (lmpVer >= 11)
|
|
87
|
+
info.btVersion = "5.2";
|
|
88
|
+
else if (lmpVer >= 10)
|
|
89
|
+
info.btVersion = "5.1";
|
|
90
|
+
else if (lmpVer >= 9)
|
|
91
|
+
info.btVersion = "5.0";
|
|
92
|
+
else if (lmpVer >= 8)
|
|
93
|
+
info.btVersion = "4.2";
|
|
94
|
+
else if (lmpVer >= 7)
|
|
95
|
+
info.btVersion = "4.1";
|
|
96
|
+
else if (lmpVer >= 6)
|
|
97
|
+
info.btVersion = "4.0";
|
|
98
|
+
else
|
|
99
|
+
info.btVersion = `LMP ${lmpVer}`;
|
|
100
|
+
}
|
|
101
|
+
// Adapter state
|
|
102
|
+
const stateMatch = raw.match(/(?:state|State|isEnabled)[:\s=]+(ON|OFF|true|false|enabled|disabled)/i);
|
|
103
|
+
if (stateMatch) {
|
|
104
|
+
const val = stateMatch[1].toLowerCase();
|
|
105
|
+
info.adapterState = (val === "on" || val === "true" || val === "enabled") ? "enabled" : "disabled";
|
|
106
|
+
}
|
|
107
|
+
// LE (Low Energy) support
|
|
108
|
+
if (raw.includes("LE Audio") || raw.includes("isLeAudioSupported=true"))
|
|
109
|
+
info.leAudio = "supported";
|
|
110
|
+
if (raw.includes("isLe2MPhySupported=true"))
|
|
111
|
+
info.le2mPhy = "supported";
|
|
112
|
+
if (raw.includes("isLeCodedPhySupported=true"))
|
|
113
|
+
info.leCodedPhy = "supported";
|
|
114
|
+
if (raw.includes("isLeExtendedAdvertisingSupported=true"))
|
|
115
|
+
info.leExtAdv = "supported";
|
|
116
|
+
// Bonded device count (not the names/addresses)
|
|
117
|
+
const bondedMatch = raw.match(/Bonded\s*(?:devices?|count)[:\s]+(\d+)/i);
|
|
118
|
+
if (bondedMatch)
|
|
119
|
+
info.bondedDevices = bondedMatch[1];
|
|
120
|
+
// Profiles
|
|
121
|
+
const profiles = [];
|
|
122
|
+
if (raw.includes("A2dpService") || raw.includes("BluetoothA2dp"))
|
|
123
|
+
profiles.push("A2DP");
|
|
124
|
+
if (raw.includes("HeadsetService") || raw.includes("BluetoothHeadset"))
|
|
125
|
+
profiles.push("HFP");
|
|
126
|
+
if (raw.includes("HidHostService") || raw.includes("BluetoothHidHost"))
|
|
127
|
+
profiles.push("HID");
|
|
128
|
+
if (raw.includes("PanService") || raw.includes("BluetoothPan"))
|
|
129
|
+
profiles.push("PAN");
|
|
130
|
+
if (raw.includes("MapService") || raw.includes("BluetoothMap"))
|
|
131
|
+
profiles.push("MAP");
|
|
132
|
+
if (raw.includes("LeAudioService"))
|
|
133
|
+
profiles.push("LE Audio");
|
|
134
|
+
if (profiles.length > 0)
|
|
135
|
+
info.activeProfiles = profiles.join(", ");
|
|
136
|
+
return info;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Parse NFC information from dumpsys nfc output.
|
|
140
|
+
* Extracts controller type, firmware version, supported technologies, and SE info.
|
|
141
|
+
*/
|
|
142
|
+
function parseNfcDumpsys(raw) {
|
|
143
|
+
const info = {};
|
|
144
|
+
// NFC controller / chip identification
|
|
145
|
+
const controllerMatch = raw.match(/(?:NFC\s*(?:Controller|Chip|Hardware)|mNfcChip)[:\s]+([^\n,]+)/i)
|
|
146
|
+
|| raw.match(/((?:NXP|Broadcom|Samsung|ST|NQ)\s*\w+)/i);
|
|
147
|
+
if (controllerMatch)
|
|
148
|
+
info.controller = controllerMatch[1].trim();
|
|
149
|
+
// Firmware version
|
|
150
|
+
const fwMatch = raw.match(/(?:FW|Firmware)\s*(?:version|Version|Ver)[:\s]+([^\n,]+)/i)
|
|
151
|
+
|| raw.match(/NCI\s*version[:\s]+([^\n,]+)/i);
|
|
152
|
+
if (fwMatch)
|
|
153
|
+
info.firmwareVersion = fwMatch[1].trim();
|
|
154
|
+
// NFC state
|
|
155
|
+
const stateMatch = raw.match(/mState[=:\s]+(STATE_\w+|\d+)/i)
|
|
156
|
+
|| raw.match(/(?:NFC\s*state|isEnabled)[:\s=]+(ON|OFF|true|false|enabled|disabled)/i);
|
|
157
|
+
if (stateMatch) {
|
|
158
|
+
const val = stateMatch[1];
|
|
159
|
+
if (val.includes("ON") || val.includes("true") || val.includes("enabled") || val === "STATE_ON" || val === "3") {
|
|
160
|
+
info.state = "enabled";
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
info.state = "disabled";
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Supported technologies
|
|
167
|
+
const techs = [];
|
|
168
|
+
if (raw.includes("NFC-A") || raw.includes("NfcA") || raw.includes("IsoDep"))
|
|
169
|
+
techs.push("NFC-A (ISO 14443-3A)");
|
|
170
|
+
if (raw.includes("NFC-B") || raw.includes("NfcB"))
|
|
171
|
+
techs.push("NFC-B (ISO 14443-3B)");
|
|
172
|
+
if (raw.includes("NFC-F") || raw.includes("NfcF"))
|
|
173
|
+
techs.push("NFC-F (FeliCa)");
|
|
174
|
+
if (raw.includes("NFC-V") || raw.includes("NfcV"))
|
|
175
|
+
techs.push("NFC-V (ISO 15693)");
|
|
176
|
+
if (raw.includes("MIFARE"))
|
|
177
|
+
techs.push("MIFARE");
|
|
178
|
+
if (techs.length > 0)
|
|
179
|
+
info.supportedTechnologies = techs.join(", ");
|
|
180
|
+
// Secure Element
|
|
181
|
+
if (raw.includes("eSE") || raw.includes("Embedded SE"))
|
|
182
|
+
info.secureElement = "eSE (embedded)";
|
|
183
|
+
else if (raw.includes("UICC") || raw.includes("SIM-based SE"))
|
|
184
|
+
info.secureElement = "UICC (SIM-based)";
|
|
185
|
+
if (raw.includes("HCE") || raw.includes("HostEmulation")) {
|
|
186
|
+
info.hce = "supported";
|
|
187
|
+
}
|
|
188
|
+
// Reader mode / tag dispatch
|
|
189
|
+
if (raw.includes("mReaderModeEnabled=true"))
|
|
190
|
+
info.readerMode = "enabled";
|
|
191
|
+
if (raw.includes("mNdefPushEnabled=true") || raw.includes("Android Beam"))
|
|
192
|
+
info.beam = "available";
|
|
193
|
+
return info;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Android GNSS constellation ID to name mapping.
|
|
197
|
+
* From android.location.GnssStatus constants.
|
|
198
|
+
*/
|
|
199
|
+
const GNSS_CONSTELLATIONS = {
|
|
200
|
+
1: "GPS",
|
|
201
|
+
2: "SBAS",
|
|
202
|
+
3: "GLONASS",
|
|
203
|
+
4: "QZSS",
|
|
204
|
+
5: "BeiDou",
|
|
205
|
+
6: "Galileo",
|
|
206
|
+
7: "IRNSS/NavIC",
|
|
207
|
+
};
|
|
208
|
+
/**
|
|
209
|
+
* Parse GNSS information from dumpsys location output.
|
|
210
|
+
* Extracts hardware model, firmware, capabilities, constellations, and signal types.
|
|
211
|
+
*/
|
|
212
|
+
function parseGnssDumpsys(raw) {
|
|
213
|
+
const info = {};
|
|
214
|
+
// Hardware model name — contains chipset manufacturer, model, and firmware
|
|
215
|
+
const hwModelMatch = raw.match(/GNSS Hardware Model Name:\s*(.+)/i);
|
|
216
|
+
if (hwModelMatch) {
|
|
217
|
+
const parts = hwModelMatch[1].trim();
|
|
218
|
+
info.hardwareModel = parts;
|
|
219
|
+
// Parse manufacturer and model from common format: "Broadcom, BCM4776, GLL ver. X.Y.Z"
|
|
220
|
+
const commaSegs = parts.split(",").map(s => s.trim());
|
|
221
|
+
if (commaSegs.length >= 2) {
|
|
222
|
+
info.manufacturer = commaSegs[0];
|
|
223
|
+
info.chipModel = commaSegs[1];
|
|
224
|
+
if (commaSegs.length >= 3)
|
|
225
|
+
info.firmwareVersion = commaSegs.slice(2).join(", ");
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Hardware version
|
|
229
|
+
const hwVerMatch = raw.match(/Hardware Version:\s*(\S+)/i);
|
|
230
|
+
if (hwVerMatch)
|
|
231
|
+
info.hardwareVersion = hwVerMatch[1].trim();
|
|
232
|
+
// Capabilities — extract from the Capabilities: [...] block
|
|
233
|
+
const capMatch = raw.match(/Capabilities:\s*\[([^\]]+)\]/);
|
|
234
|
+
if (capMatch) {
|
|
235
|
+
const capStr = capMatch[1];
|
|
236
|
+
// Extract named capabilities (before signalTypes)
|
|
237
|
+
const sigIdx = capStr.indexOf("signalTypes");
|
|
238
|
+
const capsRaw = sigIdx > 0 ? capStr.substring(0, sigIdx) : capStr;
|
|
239
|
+
const caps = capsRaw.split(/\s+/).filter(c => c.length > 0 && !c.startsWith("signal"));
|
|
240
|
+
if (caps.length > 0)
|
|
241
|
+
info.capabilities = caps;
|
|
242
|
+
// A-GPS detection from capabilities
|
|
243
|
+
const agpsModes = [];
|
|
244
|
+
if (caps.includes("MSB"))
|
|
245
|
+
agpsModes.push("MSB (Mobile Station Based)");
|
|
246
|
+
if (caps.includes("MSA"))
|
|
247
|
+
agpsModes.push("MSA (Mobile Station Assisted)");
|
|
248
|
+
if (agpsModes.length > 0)
|
|
249
|
+
info.agpsModes = agpsModes.join(", ");
|
|
250
|
+
// Key capabilities for security research
|
|
251
|
+
if (caps.includes("MEASUREMENTS"))
|
|
252
|
+
info.rawMeasurements = "supported (pseudorange-level access)";
|
|
253
|
+
if (caps.includes("NAVIGATION_MESSAGES"))
|
|
254
|
+
info.navMessages = "supported";
|
|
255
|
+
if (caps.includes("SATELLITE_PVT"))
|
|
256
|
+
info.satellitePvt = "supported";
|
|
257
|
+
if (caps.includes("MEASUREMENT_CORRECTIONS"))
|
|
258
|
+
info.measurementCorrections = "supported";
|
|
259
|
+
if (caps.includes("ACCUMULATED_DELTA_RANGE"))
|
|
260
|
+
info.carrierPhase = "supported (accumulated delta range)";
|
|
261
|
+
// Extract constellations and signal types
|
|
262
|
+
const sigTypesMatch = capStr.match(/signalTypes=\[(.+)\]/);
|
|
263
|
+
if (sigTypesMatch) {
|
|
264
|
+
const constellationIds = new Set();
|
|
265
|
+
const freqs = new Set();
|
|
266
|
+
const sigTypeRegex = /Constellation=(\d+),\s*CarrierFrequencyHz=([^,\]]+),\s*CodeType=(\w+)/g;
|
|
267
|
+
let sigMatch;
|
|
268
|
+
while ((sigMatch = sigTypeRegex.exec(sigTypesMatch[1])) !== null) {
|
|
269
|
+
const cId = parseInt(sigMatch[1], 10);
|
|
270
|
+
const freqHz = parseFloat(sigMatch[2]);
|
|
271
|
+
constellationIds.add(cId);
|
|
272
|
+
const freqMhz = (freqHz / 1e6).toFixed(2);
|
|
273
|
+
const cName = GNSS_CONSTELLATIONS[cId] ?? `Unknown(${cId})`;
|
|
274
|
+
freqs.add(`${cName} ${sigMatch[3]} @ ${freqMhz} MHz`);
|
|
275
|
+
}
|
|
276
|
+
const constellations = [...constellationIds]
|
|
277
|
+
.sort()
|
|
278
|
+
.map(id => GNSS_CONSTELLATIONS[id] ?? `Unknown(${id})`);
|
|
279
|
+
if (constellations.length > 0)
|
|
280
|
+
info.constellations = constellations;
|
|
281
|
+
// Detect dual-frequency (L1+L5) support
|
|
282
|
+
const hasL1 = capStr.includes("1.57542E9");
|
|
283
|
+
const hasL5 = capStr.includes("1.17645E9");
|
|
284
|
+
if (hasL1 && hasL5)
|
|
285
|
+
info.dualFrequency = "L1 + L5";
|
|
286
|
+
if (freqs.size > 0)
|
|
287
|
+
info.signalTypes = [...freqs];
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return info;
|
|
291
|
+
}
|
|
292
|
+
export function registerWirelessFirmwareTools(ctx) {
|
|
293
|
+
ctx.server.tool("adb_wifi_firmware", "WiFi chipset and firmware identification. Reports WiFi driver version, firmware version, chipset/hardware info, supported bands and standards, interface details, and connection state. MAC address is opt-in only (permanent hardware identifier).", {
|
|
294
|
+
device: z.string().optional().describe("Device serial"),
|
|
295
|
+
includeMac: z.boolean().optional().default(false)
|
|
296
|
+
.describe("Include WiFi MAC address (permanent hardware identifier — opt-in only)"),
|
|
297
|
+
}, async ({ device, includeMac }) => {
|
|
298
|
+
try {
|
|
299
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
300
|
+
const serial = resolved.serial;
|
|
301
|
+
const props = await ctx.deviceManager.getDeviceProps(serial);
|
|
302
|
+
const sections = [];
|
|
303
|
+
sections.push("=== WiFi Firmware Information ===");
|
|
304
|
+
sections.push(`Device: ${props["ro.product.model"] ?? "unknown"} (${serial})`);
|
|
305
|
+
// ── Properties ──
|
|
306
|
+
const wifiProps = [
|
|
307
|
+
["WiFi hardware", props["ro.hardware.wifi"] ?? ""],
|
|
308
|
+
["WiFi interface", props["wifi.interface"] ?? ""],
|
|
309
|
+
["Concurrent interface", props["wifi.concurrent.interface"] ?? ""],
|
|
310
|
+
["Driver version", props["wlan.driver.version"] ?? ""],
|
|
311
|
+
["Firmware version", props["vendor.wifi.firmware.version"] ?? props["wifi.firmware.version"] ?? ""],
|
|
312
|
+
["WiFi HAL", props["ro.hardware.wifi_hal"] ?? ""],
|
|
313
|
+
["WiFi country code", props["wifi.lbs.lac"] ?? ""],
|
|
314
|
+
];
|
|
315
|
+
sections.push("\n── System Properties ──");
|
|
316
|
+
for (const [label, value] of wifiProps) {
|
|
317
|
+
if (value)
|
|
318
|
+
sections.push(`${label}: ${value}`);
|
|
319
|
+
}
|
|
320
|
+
if (includeMac) {
|
|
321
|
+
const mac = props["wifi.interface.mac"] ?? "";
|
|
322
|
+
if (mac)
|
|
323
|
+
sections.push(`MAC address: ${mac}`);
|
|
324
|
+
}
|
|
325
|
+
// ── dumpsys wifi ──
|
|
326
|
+
try {
|
|
327
|
+
const wifiDump = await ctx.bridge.shell("dumpsys wifi 2>/dev/null | head -200", { device: serial, timeout: 10000, ignoreExitCode: true });
|
|
328
|
+
const parsed = parseWifiDumpsys(wifiDump.stdout);
|
|
329
|
+
if (Object.keys(parsed).length > 0) {
|
|
330
|
+
sections.push("\n── WiFi Detailed Info (from dumpsys) ──");
|
|
331
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
332
|
+
sections.push(`${key}: ${value}`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
// Connection state
|
|
336
|
+
const connMatch = wifiDump.stdout.match(/mWifiInfo\s+([^\n]+)/);
|
|
337
|
+
if (connMatch) {
|
|
338
|
+
sections.push(`\n── Current Connection ──`);
|
|
339
|
+
const ssidMatch = connMatch[1].match(/SSID:\s*([^,]+)/);
|
|
340
|
+
const rssiMatch = connMatch[1].match(/RSSI:\s*(-?\d+)/);
|
|
341
|
+
const linkMatch = connMatch[1].match(/Link speed:\s*(\d+)\s*Mbps/i);
|
|
342
|
+
const freqMatch = connMatch[1].match(/Frequency:\s*(\d+)/);
|
|
343
|
+
if (ssidMatch)
|
|
344
|
+
sections.push(`SSID: ${ssidMatch[1].trim()}`);
|
|
345
|
+
if (rssiMatch)
|
|
346
|
+
sections.push(`RSSI: ${rssiMatch[1]} dBm`);
|
|
347
|
+
if (linkMatch)
|
|
348
|
+
sections.push(`Link speed: ${linkMatch[1]} Mbps`);
|
|
349
|
+
if (freqMatch) {
|
|
350
|
+
const freq = parseInt(freqMatch[1], 10);
|
|
351
|
+
const band = freq >= 5925 ? "6 GHz" : freq >= 5000 ? "5 GHz" : "2.4 GHz";
|
|
352
|
+
sections.push(`Frequency: ${freq} MHz (${band})`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
catch { /* dumpsys may not be available */ }
|
|
357
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
ctx.server.tool("adb_bluetooth_firmware", "Bluetooth firmware and chipset identification. Reports firmware version, BT version (4.x/5.x), chipset model, adapter state, supported profiles, LE capabilities, and bonded device count. MAC address and device name are opt-in only (permanent identifiers).", {
|
|
364
|
+
device: z.string().optional().describe("Device serial"),
|
|
365
|
+
includeIdentifiers: z.boolean().optional().default(false)
|
|
366
|
+
.describe("Include Bluetooth MAC address and device name (permanent identifiers — opt-in only)"),
|
|
367
|
+
}, async ({ device, includeIdentifiers }) => {
|
|
368
|
+
try {
|
|
369
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
370
|
+
const serial = resolved.serial;
|
|
371
|
+
const props = await ctx.deviceManager.getDeviceProps(serial);
|
|
372
|
+
const sections = [];
|
|
373
|
+
sections.push("=== Bluetooth Firmware Information ===");
|
|
374
|
+
sections.push(`Device: ${props["ro.product.model"] ?? "unknown"} (${serial})`);
|
|
375
|
+
// ── Properties ──
|
|
376
|
+
const btProps = [
|
|
377
|
+
["BT hardware", props["ro.hardware.bt"] ?? ""],
|
|
378
|
+
["Firmware version", props["vendor.bluetooth.firmware.version"] ?? props["bluetooth.firmware.version"] ?? ""],
|
|
379
|
+
["HCI firmware revision", props["bluetooth.hci.firmware_revision"] ?? ""],
|
|
380
|
+
["BT enabled", props["bluetooth.enable_timeout_ms"] ? "yes" : ""],
|
|
381
|
+
];
|
|
382
|
+
sections.push("\n── System Properties ──");
|
|
383
|
+
for (const [label, value] of btProps) {
|
|
384
|
+
if (value)
|
|
385
|
+
sections.push(`${label}: ${value}`);
|
|
386
|
+
}
|
|
387
|
+
if (includeIdentifiers) {
|
|
388
|
+
const btName = props["persist.bluetooth.bluetooth_name"] ?? props["net.bt.name"] ?? "";
|
|
389
|
+
const btAddr = props["persist.bluetooth.bluetoothaddr"] ?? "";
|
|
390
|
+
if (btName)
|
|
391
|
+
sections.push(`Device name: ${btName}`);
|
|
392
|
+
if (btAddr)
|
|
393
|
+
sections.push(`MAC address: ${btAddr}`);
|
|
394
|
+
}
|
|
395
|
+
// ── dumpsys bluetooth_manager ──
|
|
396
|
+
try {
|
|
397
|
+
const btDump = await ctx.bridge.shell("dumpsys bluetooth_manager 2>/dev/null | head -300", { device: serial, timeout: 10000, ignoreExitCode: true });
|
|
398
|
+
const parsed = parseBluetoothDumpsys(btDump.stdout);
|
|
399
|
+
if (Object.keys(parsed).length > 0) {
|
|
400
|
+
sections.push("\n── Bluetooth Detailed Info (from dumpsys) ──");
|
|
401
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
402
|
+
sections.push(`${key}: ${value}`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
catch { /* dumpsys may not be available */ }
|
|
407
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
408
|
+
}
|
|
409
|
+
catch (error) {
|
|
410
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
ctx.server.tool("adb_nfc_firmware", "NFC controller firmware identification. Reports controller type (NXP/Broadcom/Samsung/ST), firmware version, NCI version, supported technologies (NFC-A/B/F/V), secure element availability (eSE/UICC), and HCE (Host Card Emulation) support.", {
|
|
414
|
+
device: z.string().optional().describe("Device serial"),
|
|
415
|
+
}, async ({ device }) => {
|
|
416
|
+
try {
|
|
417
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
418
|
+
const serial = resolved.serial;
|
|
419
|
+
const props = await ctx.deviceManager.getDeviceProps(serial);
|
|
420
|
+
const sections = [];
|
|
421
|
+
sections.push("=== NFC Firmware Information ===");
|
|
422
|
+
sections.push(`Device: ${props["ro.product.model"] ?? "unknown"} (${serial})`);
|
|
423
|
+
// ── Properties ──
|
|
424
|
+
const nfcProps = [
|
|
425
|
+
["NFC hardware", props["ro.hardware.nfc"] ?? props["ro.hardware.nfc_nci"] ?? ""],
|
|
426
|
+
["NFC port", props["ro.nfc.port"] ?? ""],
|
|
427
|
+
["NFC SE ID", props["persist.nfc.se_id"] ?? ""],
|
|
428
|
+
["NFC features", props["ro.hardware.nfc_ese"] ? "eSE present" : ""],
|
|
429
|
+
];
|
|
430
|
+
sections.push("\n── System Properties ──");
|
|
431
|
+
let hasNfcProps = false;
|
|
432
|
+
for (const [label, value] of nfcProps) {
|
|
433
|
+
if (value) {
|
|
434
|
+
sections.push(`${label}: ${value}`);
|
|
435
|
+
hasNfcProps = true;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
if (!hasNfcProps) {
|
|
439
|
+
sections.push("No NFC hardware properties found — device may not have NFC");
|
|
440
|
+
}
|
|
441
|
+
// ── dumpsys nfc ──
|
|
442
|
+
try {
|
|
443
|
+
const nfcDump = await ctx.bridge.shell("dumpsys nfc 2>/dev/null | head -200", { device: serial, timeout: 10000, ignoreExitCode: true });
|
|
444
|
+
if (nfcDump.stdout.includes("NfcService") || nfcDump.stdout.includes("mState")
|
|
445
|
+
|| nfcDump.stdout.includes("NFC")) {
|
|
446
|
+
const parsed = parseNfcDumpsys(nfcDump.stdout);
|
|
447
|
+
if (Object.keys(parsed).length > 0) {
|
|
448
|
+
sections.push("\n── NFC Detailed Info (from dumpsys) ──");
|
|
449
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
450
|
+
sections.push(`${key}: ${value}`);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
sections.push("\n── NFC Service ──");
|
|
456
|
+
sections.push("NFC service not responding — NFC may be disabled or unavailable");
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
catch { /* dumpsys may not be available */ }
|
|
460
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
461
|
+
}
|
|
462
|
+
catch (error) {
|
|
463
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
464
|
+
}
|
|
465
|
+
});
|
|
466
|
+
ctx.server.tool("adb_gps_firmware", "GNSS/GPS chipset and firmware identification. Reports GNSS hardware model (manufacturer, chip, firmware version), supported constellations (GPS, GLONASS, Galileo, BeiDou, QZSS, NavIC, SBAS), signal types with frequencies, dual-frequency (L1+L5) support, raw measurement capabilities (pseudorange access for spoofing detection), A-GPS modes (MSB/MSA — cellular-routed assisted GPS relevant to IMSI catcher research), carrier phase measurements, navigation message decoding, and SUPL server configuration.", {
|
|
467
|
+
device: z.string().optional().describe("Device serial"),
|
|
468
|
+
}, async ({ device }) => {
|
|
469
|
+
try {
|
|
470
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
471
|
+
const serial = resolved.serial;
|
|
472
|
+
const props = await ctx.deviceManager.getDeviceProps(serial);
|
|
473
|
+
const sections = [];
|
|
474
|
+
sections.push("=== GNSS/GPS Firmware Information ===");
|
|
475
|
+
sections.push(`Device: ${props["ro.product.model"] ?? "unknown"} (${serial})`);
|
|
476
|
+
// ── Properties ──
|
|
477
|
+
const gpsHw = props["ro.hardware.gps"] ?? "";
|
|
478
|
+
if (gpsHw)
|
|
479
|
+
sections.push(`GPS hardware: ${gpsHw}`);
|
|
480
|
+
// ── dumpsys location (GNSS Manager section) ──
|
|
481
|
+
try {
|
|
482
|
+
const locDump = await ctx.bridge.shell("dumpsys location", { device: serial, timeout: 15000, ignoreExitCode: true });
|
|
483
|
+
const parsed = parseGnssDumpsys(locDump.stdout);
|
|
484
|
+
if (parsed.hardwareModel) {
|
|
485
|
+
sections.push(`\n── GNSS Hardware ──`);
|
|
486
|
+
sections.push(`Model: ${parsed.hardwareModel}`);
|
|
487
|
+
if (parsed.manufacturer)
|
|
488
|
+
sections.push(`Manufacturer: ${parsed.manufacturer}`);
|
|
489
|
+
if (parsed.chipModel)
|
|
490
|
+
sections.push(`Chipset: ${parsed.chipModel}`);
|
|
491
|
+
if (parsed.firmwareVersion)
|
|
492
|
+
sections.push(`Firmware: ${parsed.firmwareVersion}`);
|
|
493
|
+
if (parsed.hardwareVersion)
|
|
494
|
+
sections.push(`Hardware version: ${parsed.hardwareVersion}`);
|
|
495
|
+
}
|
|
496
|
+
if (parsed.constellations && Array.isArray(parsed.constellations)) {
|
|
497
|
+
sections.push(`\n── Supported Constellations (${parsed.constellations.length}) ──`);
|
|
498
|
+
sections.push(parsed.constellations.join(", "));
|
|
499
|
+
if (parsed.dualFrequency)
|
|
500
|
+
sections.push(`Dual-frequency: ${parsed.dualFrequency}`);
|
|
501
|
+
}
|
|
502
|
+
if (parsed.signalTypes && Array.isArray(parsed.signalTypes)) {
|
|
503
|
+
sections.push(`\n── Signal Types (${parsed.signalTypes.length}) ──`);
|
|
504
|
+
for (const sig of parsed.signalTypes) {
|
|
505
|
+
sections.push(` ${sig}`);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
// Capabilities relevant to security research
|
|
509
|
+
const secCaps = [];
|
|
510
|
+
if (parsed.rawMeasurements)
|
|
511
|
+
secCaps.push(`Raw GNSS measurements: ${parsed.rawMeasurements}`);
|
|
512
|
+
if (parsed.navMessages)
|
|
513
|
+
secCaps.push(`Navigation messages: ${parsed.navMessages}`);
|
|
514
|
+
if (parsed.satellitePvt)
|
|
515
|
+
secCaps.push(`Satellite PVT: ${parsed.satellitePvt}`);
|
|
516
|
+
if (parsed.measurementCorrections)
|
|
517
|
+
secCaps.push(`Measurement corrections: ${parsed.measurementCorrections}`);
|
|
518
|
+
if (parsed.carrierPhase)
|
|
519
|
+
secCaps.push(`Carrier phase: ${parsed.carrierPhase}`);
|
|
520
|
+
if (secCaps.length > 0) {
|
|
521
|
+
sections.push(`\n── Research Capabilities ──`);
|
|
522
|
+
for (const cap of secCaps)
|
|
523
|
+
sections.push(cap);
|
|
524
|
+
}
|
|
525
|
+
// A-GPS / SUPL configuration
|
|
526
|
+
sections.push(`\n── A-GPS / Assisted GNSS ──`);
|
|
527
|
+
if (parsed.agpsModes) {
|
|
528
|
+
sections.push(`A-GPS modes: ${parsed.agpsModes}`);
|
|
529
|
+
}
|
|
530
|
+
// Check SUPL settings
|
|
531
|
+
try {
|
|
532
|
+
const agpsEnabled = await ctx.bridge.shell("settings get global assisted_gps_enabled", { device: serial, timeout: 5000, ignoreExitCode: true });
|
|
533
|
+
const enabled = agpsEnabled.stdout.trim();
|
|
534
|
+
sections.push(`A-GPS enabled: ${enabled === "1" ? "yes" : enabled === "0" ? "no" : enabled}`);
|
|
535
|
+
const suplHost = await ctx.bridge.shell("settings get global assisted_gps_supl_host", { device: serial, timeout: 5000, ignoreExitCode: true });
|
|
536
|
+
const host = suplHost.stdout.trim();
|
|
537
|
+
if (host && host !== "null") {
|
|
538
|
+
sections.push(`SUPL server: ${host}`);
|
|
539
|
+
const suplPort = await ctx.bridge.shell("settings get global assisted_gps_supl_port", { device: serial, timeout: 5000, ignoreExitCode: true });
|
|
540
|
+
const port = suplPort.stdout.trim();
|
|
541
|
+
if (port && port !== "null")
|
|
542
|
+
sections.push(`SUPL port: ${port}`);
|
|
543
|
+
sections.push(`⚠ SUPL traffic is routed through the cellular network — susceptible to interception by IMSI catchers`);
|
|
544
|
+
}
|
|
545
|
+
else {
|
|
546
|
+
sections.push(`SUPL server: not configured`);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
catch { /* settings query failed */ }
|
|
550
|
+
// All capabilities dump
|
|
551
|
+
if (parsed.capabilities && Array.isArray(parsed.capabilities) && parsed.capabilities.length > 0) {
|
|
552
|
+
sections.push(`\n── All Capabilities (${parsed.capabilities.length}) ──`);
|
|
553
|
+
sections.push(parsed.capabilities.join(", "));
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
catch {
|
|
557
|
+
sections.push("\nGNSS data not available — location service may not be running");
|
|
558
|
+
}
|
|
559
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
560
|
+
}
|
|
561
|
+
catch (error) {
|
|
562
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
563
|
+
}
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
//# sourceMappingURL=wireless-firmware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireless-firmware.js","sourceRoot":"","sources":["../../src/tools/wireless-firmware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE;;;GAGG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,IAAI,GAA2B,EAAE,CAAC;IAExC,oDAAoD;IACpD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,oDAAoD,CAAC;WAC1E,GAAG,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC3D,IAAI,OAAO;QAAE,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEtD,iBAAiB;IACjB,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAClF,IAAI,WAAW;QAAE,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5D,qBAAqB;IACrB,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;IACzE,IAAI,SAAS;QAAE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAElD,8BAA8B;IAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtF,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7D,4CAA4C;IAC5C,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,MAAM;QAAE,IAAI,CAAC,YAAY,GAAG,oBAAoB,CAAC;SACrG,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC;SACnF,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,IAAI,CAAC,YAAY,GAAG,oBAAoB,CAAC;SAChG,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,YAAY,GAAG,oBAAoB,CAAC;IAEnG,eAAe;IACf,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACnE,IAAI,OAAO;QAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAEzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAAC,GAAW;IACxC,MAAM,IAAI,GAA2B,EAAE,CAAC;IAExC,8BAA8B;IAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,oEAAoE,CAAC;WAC1F,GAAG,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC5E,IAAI,OAAO;QAAE,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEtD,yBAAyB;IACzB,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC3E,IAAI,SAAS;QAAE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAElD,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;IAChG,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,IAAI,MAAM,IAAI,EAAE;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACpC,IAAI,MAAM,IAAI,EAAE;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACzC,IAAI,MAAM,IAAI,EAAE;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACzC,IAAI,MAAM,IAAI,EAAE;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACzC,IAAI,MAAM,IAAI,CAAC;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxC,IAAI,MAAM,IAAI,CAAC;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxC,IAAI,MAAM,IAAI,CAAC;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxC,IAAI,MAAM,IAAI,CAAC;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;;YACxC,IAAI,CAAC,SAAS,GAAG,OAAO,MAAM,EAAE,CAAC;IACxC,CAAC;IAED,gBAAgB;IAChB,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;IACtG,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IACrG,CAAC;IAED,0BAA0B;IAC1B,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAAE,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC;IACpG,IAAI,GAAG,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAAE,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC;IACxE,IAAI,GAAG,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAAE,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;IAC9E,IAAI,GAAG,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAAE,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC;IAEvF,gDAAgD;IAChD,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACzE,IAAI,WAAW;QAAE,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAErD,WAAW;IACX,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxF,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7F,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7F,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrF,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrF,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEnE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,IAAI,GAA2B,EAAE,CAAC;IAExC,uCAAuC;IACvC,MAAM,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC,iEAAiE,CAAC;WAC/F,GAAG,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC1D,IAAI,eAAe;QAAE,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEjE,mBAAmB;IACnB,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,2DAA2D,CAAC;WACjF,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAChD,IAAI,OAAO;QAAE,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEtD,YAAY;IACZ,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC;WACxD,GAAG,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;IACxF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAC/G,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAChH,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACtF,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChF,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACnF,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpE,iBAAiB;IACjB,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,IAAI,CAAC,aAAa,GAAG,gBAAgB,CAAC;SACzF,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,IAAI,CAAC,aAAa,GAAG,kBAAkB,CAAC;IACvG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC;IACzB,CAAC;IAED,6BAA6B;IAC7B,IAAI,GAAG,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAAE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IACzE,IAAI,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAEnG,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,mBAAmB,GAA2B;IAClD,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,aAAa;CACjB,CAAC;AAEF;;;GAGG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,IAAI,GAAsC,EAAE,CAAC;IAEnD,2EAA2E;IAC3E,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACpE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,uFAAuF;QACvF,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC;gBAAE,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC3D,IAAI,UAAU;QAAE,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5D,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC3D,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3B,kDAAkD;QAClD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAClE,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAE9C,oCAAoC;QACpC,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACvE,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC1E,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhE,yCAAyC;QACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,IAAI,CAAC,eAAe,GAAG,sCAAsC,CAAC;QACjG,IAAI,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAAE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QACzE,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;YAAE,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QACpE,IAAI,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAAE,IAAI,CAAC,sBAAsB,GAAG,WAAW,CAAC;QACxF,IAAI,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAAE,IAAI,CAAC,YAAY,GAAG,qCAAqC,CAAC;QAExG,0CAA0C;QAC1C,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC3D,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;YAC3C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;YAChC,MAAM,YAAY,GAAG,wEAAwE,CAAC;YAC9F,IAAI,QAAQ,CAAC;YACb,OAAO,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACjE,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC1B,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1C,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,WAAW,GAAG,GAAG,CAAC;gBAC5D,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,cAAc,GAAG,CAAC,GAAG,gBAAgB,CAAC;iBACzC,IAAI,EAAE;iBACN,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,GAAG,CAAC,CAAC;YAC1D,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;YAEpE,wCAAwC;YACxC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC3C,IAAI,KAAK,IAAI,KAAK;gBAAE,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAEnD,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;gBAAE,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,GAAgB;IAE5D,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,mBAAmB,EACnB,qPAAqP,EACrP;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACvD,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;aAC9C,QAAQ,CAAC,wEAAwE,CAAC;KACtF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAE7D,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,kBAAkB,CAAC,IAAI,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC;YAE/E,mBAAmB;YACnB,MAAM,SAAS,GAAuB;gBACpC,CAAC,eAAe,EAAE,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;gBAClD,CAAC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;gBACjD,CAAC,sBAAsB,EAAE,KAAK,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAC;gBAClE,CAAC,gBAAgB,EAAE,KAAK,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;gBACtD,CAAC,kBAAkB,EAAE,KAAK,CAAC,8BAA8B,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC;gBACnG,CAAC,UAAU,EAAE,KAAK,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;gBACjD,CAAC,mBAAmB,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;aACnD,CAAC;YAEF,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC3C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;gBACvC,IAAI,KAAK;oBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;YACjD,CAAC;YAED,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;gBAC9C,IAAI,GAAG;oBAAE,QAAQ,CAAC,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;YAChD,CAAC;YAED,qBAAqB;YACrB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CACrC,sCAAsC,EACtC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CACzD,CAAC;gBACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAEjD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnC,QAAQ,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;oBAC3D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;wBAClD,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;gBAED,mBAAmB;gBACnB,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAChE,IAAI,SAAS,EAAE,CAAC;oBACd,QAAQ,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;oBAC5C,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;oBACxD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;oBACxD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;oBACpE,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;oBAC3D,IAAI,SAAS;wBAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC7D,IAAI,SAAS;wBAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBAC1D,IAAI,SAAS;wBAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBACjE,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACxC,MAAM,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;wBACzE,QAAQ,CAAC,IAAI,CAAC,cAAc,IAAI,SAAS,IAAI,GAAG,CAAC,CAAC;oBACpD,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,kCAAkC,CAAC,CAAC;YAE9C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClG,CAAC;IACH,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,wBAAwB,EACxB,iQAAiQ,EACjQ;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACvD,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;aACtD,QAAQ,CAAC,qFAAqF,CAAC;KACnG,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAE7D,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACxD,QAAQ,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,kBAAkB,CAAC,IAAI,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC;YAE/E,mBAAmB;YACnB,MAAM,OAAO,GAAuB;gBAClC,CAAC,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;gBAC9C,CAAC,kBAAkB,EAAE,KAAK,CAAC,mCAAmC,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,IAAI,EAAE,CAAC;gBAC7G,CAAC,uBAAuB,EAAE,KAAK,CAAC,iCAAiC,CAAC,IAAI,EAAE,CAAC;gBACzE,CAAC,YAAY,EAAE,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE,CAAC;YAEF,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC3C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;gBACrC,IAAI,KAAK;oBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;YACjD,CAAC;YAED,IAAI,kBAAkB,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,KAAK,CAAC,kCAAkC,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;gBACvF,MAAM,MAAM,GAAG,KAAK,CAAC,iCAAiC,CAAC,IAAI,EAAE,CAAC;gBAC9D,IAAI,MAAM;oBAAE,QAAQ,CAAC,IAAI,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;gBACpD,IAAI,MAAM;oBAAE,QAAQ,CAAC,IAAI,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;YACtD,CAAC;YAED,kCAAkC;YAClC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CACnC,mDAAmD,EACnD,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CACzD,CAAC;gBACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAEpD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnC,QAAQ,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;oBAChE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;wBAClD,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,kCAAkC,CAAC,CAAC;YAE9C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClG,CAAC;IACH,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,kBAAkB,EAClB,gPAAgP,EAChP;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KACxD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAE7D,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAClD,QAAQ,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,kBAAkB,CAAC,IAAI,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC;YAE/E,mBAAmB;YACnB,MAAM,QAAQ,GAAuB;gBACnC,CAAC,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;gBAChF,CAAC,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;gBACxC,CAAC,WAAW,EAAE,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;gBAC/C,CAAC,cAAc,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;aACpE,CAAC;YAEF,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC3C,IAAI,WAAW,GAAG,KAAK,CAAC;YACxB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACtC,IAAI,KAAK,EAAE,CAAC;oBAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;oBAAC,WAAW,GAAG,IAAI,CAAC;gBAAC,CAAC;YACzE,CAAC;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;YAC9E,CAAC;YAED,oBAAoB;YACpB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CACpC,qCAAqC,EACrC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CACzD,CAAC;gBAEF,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;uBACvE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtC,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAE/C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACnC,QAAQ,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;wBAC1D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;4BAClD,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;wBACpC,CAAC;oBACH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBACrC,QAAQ,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,kCAAkC,CAAC,CAAC;YAE9C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClG,CAAC;IACH,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,kBAAkB,EAClB,yfAAyf,EACzf;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KACxD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAE7D,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YACvD,QAAQ,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,kBAAkB,CAAC,IAAI,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC;YAE/E,mBAAmB;YACnB,MAAM,KAAK,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;YAC7C,IAAI,KAAK;gBAAE,QAAQ,CAAC,IAAI,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;YAEnD,gDAAgD;YAChD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CACpC,kBAAkB,EAClB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CACzD,CAAC;gBACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAEhD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;oBACzB,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;oBACvC,QAAQ,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;oBAChD,IAAI,MAAM,CAAC,YAAY;wBAAE,QAAQ,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;oBAC/E,IAAI,MAAM,CAAC,SAAS;wBAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;oBACpE,IAAI,MAAM,CAAC,eAAe;wBAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;oBACjF,IAAI,MAAM,CAAC,eAAe;wBAAE,QAAQ,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;gBAC3F,CAAC;gBAED,IAAI,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;oBAClE,QAAQ,CAAC,IAAI,CAAC,kCAAkC,MAAM,CAAC,cAAc,CAAC,MAAM,MAAM,CAAC,CAAC;oBACpF,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBAChD,IAAI,MAAM,CAAC,aAAa;wBAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;gBACrF,CAAC;gBAED,IAAI,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC5D,QAAQ,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,WAAW,CAAC,MAAM,MAAM,CAAC,CAAC;oBACrE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;wBACrC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;oBAC5B,CAAC;gBACH,CAAC;gBAED,6CAA6C;gBAC7C,MAAM,OAAO,GAAa,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,eAAe;oBAAE,OAAO,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;gBAC7F,IAAI,MAAM,CAAC,WAAW;oBAAE,OAAO,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;gBACnF,IAAI,MAAM,CAAC,YAAY;oBAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC/E,IAAI,MAAM,CAAC,sBAAsB;oBAAE,OAAO,CAAC,IAAI,CAAC,4BAA4B,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC;gBAC7G,IAAI,MAAM,CAAC,YAAY;oBAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC/E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,QAAQ,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;oBAC/C,KAAK,MAAM,GAAG,IAAI,OAAO;wBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChD,CAAC;gBAED,6BAA6B;gBAC7B,QAAQ,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;gBAC/C,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACrB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBACpD,CAAC;gBAED,sBAAsB;gBACtB,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CACxC,0CAA0C,EAC1C,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CACxD,CAAC;oBACF,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC1C,QAAQ,CAAC,IAAI,CAAC,kBAAkB,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBAE9F,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CACrC,4CAA4C,EAC5C,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CACxD,CAAC;oBACF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBACpC,IAAI,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC5B,QAAQ,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;wBACtC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CACrC,4CAA4C,EAC5C,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CACxD,CAAC;wBACF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;wBACpC,IAAI,IAAI,IAAI,IAAI,KAAK,MAAM;4BAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;wBACjE,QAAQ,CAAC,IAAI,CAAC,sGAAsG,CAAC,CAAC;oBACxH,CAAC;yBAAM,CAAC;wBACN,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;oBAC/C,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;gBAEvC,wBAAwB;gBACxB,IAAI,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChG,QAAQ,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,YAAY,CAAC,MAAM,MAAM,CAAC,CAAC;oBAC1E,QAAQ,CAAC,IAAI,CAAE,MAAM,CAAC,YAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC9D,CAAC;YAEH,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;YACnF,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClG,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "deepadb",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "DeepADB — the deepest Android Debug Bridge MCP server.
|
|
3
|
+
"version": "1.0.8",
|
|
4
|
+
"description": "DeepADB — the deepest Android Debug Bridge MCP server. 174 tools across 43 modules for device inspection from UI to baseband.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"deepadb": "build/index.js"
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"zod": "^3.25.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@types/node": "^25.
|
|
35
|
+
"@types/node": "^25.6.0",
|
|
36
36
|
"typescript": "^6.0.2"
|
|
37
37
|
}
|
|
38
38
|
}
|