android+linux: add head tracking and gestures
@@ -348,27 +348,34 @@ The packets sent (based on the previous states) are as follows:
|
||||
|
||||
> *i do hate apple for not hardcoding these, like there are literally only 4^2 - ${\binom{4}{1}}$ - $\binom{4}{2}$*
|
||||
|
||||
# Miscellaneous/Unknown
|
||||
# Head Tracking
|
||||
|
||||
## Request something (Probably Head Positions)
|
||||
## Start Tracking
|
||||
|
||||
This packet initiates head tracking. When sent, the AirPods begin streaming head tracking data (e.g. orientation and acceleration) for live plotting and analysis.
|
||||
|
||||
```plaintext
|
||||
<!-- 04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00 -->
|
||||
OR
|
||||
04 00 04 00 17 00 00 00 10 00 10 00 08 A1 02 42 0B 08 0E 10 02 1A 05 01 40 9C 00 00
|
||||
```
|
||||
|
||||
Example packet
|
||||
## Stop Tracking
|
||||
|
||||
```plaintext
|
||||
04 00 04 00 17 00 00 00 10 00 43 00 08 ec 07 10 01 1a 3c 0e 00 01 90 95 5d af 86 19 00 00 03 04 43 94 04 9e 6b 01 00 00 00 d5 a2 06 13 eb 13 03 00 f0 ff 01 00 67 83 67 83 67 83 fe ff fd ff 07 00 b3 01 9c 03 65 00 48 74 2c 37 fd 1e 00 00
|
||||
```
|
||||
|
||||
## Stop whatever was requested
|
||||
This packet stops the head tracking data stream.
|
||||
|
||||
```plaintext
|
||||
04 00 04 00 17 00 00 00 10 00 11 00 08 7E 10 02 42 0B 08 4E 10 02 1A 05 01 00 00 00 00
|
||||
```
|
||||
## Received Head Tracking Sensor Data
|
||||
|
||||
Once tracking is active, the AirPods stream sensor packets with the following common structure:
|
||||
|
||||
| Field | Offset | Length (bytes) |
|
||||
|--------------------------|--------|----------------|
|
||||
| orientation 1 | 43 | 2 |
|
||||
| orientation 2 | 45 | 2 |
|
||||
| orientation 3 | 47 | 2 |
|
||||
| Horizontal Acceleration | 51 | 2 |
|
||||
| Vertical Acceleration | 53 | 2 |
|
||||
|
||||
# LICENSE
|
||||
|
||||
|
||||
@@ -64,4 +64,4 @@ dependencies {
|
||||
androidTestImplementation(libs.androidx.ui.test.junit4)
|
||||
debugImplementation(libs.androidx.ui.tooling)
|
||||
debugImplementation(libs.androidx.ui.test.manifest)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
tools:ignore="UnusedAttribute" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
|
||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
|
||||
@@ -64,9 +64,11 @@ import com.google.accompanist.permissions.rememberMultiplePermissionsState
|
||||
import me.kavishdevar.aln.screens.AirPodsSettingsScreen
|
||||
import me.kavishdevar.aln.screens.AppSettingsScreen
|
||||
import me.kavishdevar.aln.screens.DebugScreen
|
||||
import me.kavishdevar.aln.screens.HeadTrackingScreen
|
||||
import me.kavishdevar.aln.screens.LongPress
|
||||
import me.kavishdevar.aln.screens.RenameScreen
|
||||
import me.kavishdevar.aln.services.AirPodsService
|
||||
import me.kavishdevar.aln.services.ServiceManager
|
||||
import me.kavishdevar.aln.ui.theme.ALNTheme
|
||||
import me.kavishdevar.aln.utils.AirPodsNotifications
|
||||
import me.kavishdevar.aln.utils.CrossDevice
|
||||
@@ -135,7 +137,9 @@ fun Main() {
|
||||
"android.permission.BLUETOOTH_SCAN",
|
||||
"android.permission.BLUETOOTH_ADVERTISE",
|
||||
"android.permission.POST_NOTIFICATIONS",
|
||||
"android.permission.READ_PHONE_STATE"
|
||||
"android.permission.READ_PHONE_STATE",
|
||||
"android.permission.ANSWER_PHONE_CALLS",
|
||||
"android.permission.MODIFY_AUDIO_SETTINGS"
|
||||
)
|
||||
)
|
||||
val airPodsService = remember { mutableStateOf<AirPodsService?>(null) }
|
||||
@@ -250,6 +254,9 @@ fun Main() {
|
||||
composable("app_settings") {
|
||||
AppSettingsScreen(navController)
|
||||
}
|
||||
composable("head_tracking") {
|
||||
HeadTrackingScreen(navController)
|
||||
}
|
||||
}
|
||||
}
|
||||
serviceConnection = remember {
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
* AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
|
||||
*
|
||||
*
|
||||
* Copyright (C) 2024 Kavish Devar
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -48,7 +48,7 @@ import androidx.compose.ui.unit.sp
|
||||
import me.kavishdevar.aln.services.AirPodsService
|
||||
|
||||
@Composable
|
||||
fun IndependentToggle(name: String, service: AirPodsService, functionName: String, sharedPreferences: SharedPreferences, default: Boolean = false) {
|
||||
fun IndependentToggle(name: String, service: AirPodsService? = null, functionName: String? = null, sharedPreferences: SharedPreferences, default: Boolean = false) {
|
||||
val isDarkTheme = isSystemInDarkTheme()
|
||||
val textColor = if (isDarkTheme) Color.White else Color.Black
|
||||
|
||||
@@ -77,9 +77,10 @@ fun IndependentToggle(name: String, service: AirPodsService, functionName: Strin
|
||||
.edit()
|
||||
.putBoolean(snakeCasedName, checked)
|
||||
.apply()
|
||||
|
||||
val method = service::class.java.getMethod(functionName, Boolean::class.java)
|
||||
method.invoke(service, checked)
|
||||
if (functionName != null && service != null) {
|
||||
val method = service::class.java.getMethod(functionName, Boolean::class.java)
|
||||
method.invoke(service, checked)
|
||||
}
|
||||
}
|
||||
)
|
||||
},
|
||||
@@ -98,8 +99,11 @@ fun IndependentToggle(name: String, service: AirPodsService, functionName: Strin
|
||||
onCheckedChange = {
|
||||
checked = it
|
||||
sharedPreferences.edit().putBoolean(snakeCasedName, it).apply()
|
||||
val method = service::class.java.getMethod(functionName, Boolean::class.java)
|
||||
method.invoke(service, it)
|
||||
if (functionName != null && service != null) {
|
||||
val method =
|
||||
service::class.java.getMethod(functionName, Boolean::class.java)
|
||||
method.invoke(service, it)
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
@@ -110,4 +114,4 @@ fun IndependentToggle(name: String, service: AirPodsService, functionName: Strin
|
||||
@Composable
|
||||
fun IndependentTogglePreview() {
|
||||
IndependentToggle("Test", AirPodsService(), "test", LocalContext.current.getSharedPreferences("preview", 0), true)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
* AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
|
||||
*
|
||||
*
|
||||
* Copyright (C) 2024 Kavish Devar
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -81,6 +81,8 @@ fun PressAndHoldSettings(navController: NavController) {
|
||||
modifier = Modifier.padding(8.dp, bottom = 2.dp)
|
||||
)
|
||||
|
||||
Spacer(modifier = Modifier.height(1.dp))
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
|
||||
@@ -305,6 +305,21 @@ fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService,
|
||||
Spacer(modifier = Modifier.height(32.dp))
|
||||
NoiseControlSettings(service = service)
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
Text(
|
||||
text = stringResource(R.string.head_gestures).uppercase(),
|
||||
style = TextStyle(
|
||||
fontSize = 14.sp,
|
||||
fontWeight = FontWeight.Light,
|
||||
color = (if (isSystemInDarkTheme()) Color.White else Color.Black).copy(alpha = 0.6f),
|
||||
fontFamily = FontFamily(Font(R.font.sf_pro))
|
||||
),
|
||||
modifier = Modifier.padding(8.dp, bottom = 2.dp)
|
||||
)
|
||||
|
||||
Spacer(modifier = Modifier.height(2.dp))
|
||||
NavigationButton(to = "head_tracking", "Head Tracking", navController)
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
PressAndHoldSettings(navController = navController)
|
||||
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
* AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
|
||||
*
|
||||
*
|
||||
* Copyright (C) 2024 Kavish Devar
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -22,6 +22,8 @@ package me.kavishdevar.aln.screens
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.isSystemInDarkTheme
|
||||
@@ -32,7 +34,6 @@ import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.imePadding
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.layout.width
|
||||
@@ -86,6 +87,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import me.kavishdevar.aln.R
|
||||
import me.kavishdevar.aln.services.ServiceManager
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.Q)
|
||||
@OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)
|
||||
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter", "UnspecifiedRegisterReceiverFlag")
|
||||
@Composable
|
||||
@@ -154,7 +156,7 @@ fun DebugScreen(navController: NavController) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.imePadding()
|
||||
// .imePadding()
|
||||
.haze(hazeState)
|
||||
.padding(top = paddingValues.calculateTopPadding())
|
||||
) {
|
||||
@@ -198,7 +200,7 @@ fun DebugScreen(navController: NavController) {
|
||||
Column {
|
||||
Text(
|
||||
text =
|
||||
if (isSent) message.substring(5).take(60) + (if (message.substring(5).length > 60) "..." else "")
|
||||
if (isSent) message.substring(5).take(60) + (if (message.substring(5).length > 60) "..." else "")
|
||||
else message.substring(9).take(60) + (if (message.substring(9).length > 60) "..." else ""),
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
)
|
||||
@@ -261,4 +263,4 @@ fun DebugScreen(navController: NavController) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,808 @@
|
||||
/*
|
||||
* AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
|
||||
*
|
||||
* Copyright (C) 2024 Kavish Devar
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package me.kavishdevar.aln.screens
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.compose.animation.AnimatedContent
|
||||
import androidx.compose.animation.ExperimentalAnimationApi
|
||||
import androidx.compose.animation.core.tween
|
||||
import androidx.compose.animation.fadeIn
|
||||
import androidx.compose.animation.fadeOut
|
||||
import androidx.compose.animation.slideInVertically
|
||||
import androidx.compose.animation.togetherWith
|
||||
import androidx.compose.foundation.Canvas
|
||||
import androidx.compose.foundation.isSystemInDarkTheme
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.aspectRatio
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowLeft
|
||||
import androidx.compose.material.icons.filled.PlayArrow
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.ButtonDefaults
|
||||
import androidx.compose.material3.Card
|
||||
import androidx.compose.material3.CardDefaults
|
||||
import androidx.compose.material3.CenterAlignedTopAppBar
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TextButton
|
||||
import androidx.compose.material3.TopAppBarDefaults
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.DisposableEffect
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableFloatStateOf
|
||||
import androidx.compose.runtime.mutableLongStateOf
|
||||
import androidx.compose.runtime.mutableStateListOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.scale
|
||||
import androidx.compose.ui.geometry.CornerRadius
|
||||
import androidx.compose.ui.geometry.Offset
|
||||
import androidx.compose.ui.geometry.Size
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.Path
|
||||
import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.StrokeCap
|
||||
import androidx.compose.ui.graphics.asAndroidPath
|
||||
import androidx.compose.ui.graphics.drawscope.Stroke
|
||||
import androidx.compose.ui.graphics.nativeCanvas
|
||||
import androidx.compose.ui.graphics.toArgb
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.drawText
|
||||
import androidx.compose.ui.text.font.Font
|
||||
import androidx.compose.ui.text.font.FontFamily
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.rememberTextMeasurer
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.navigation.NavController
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import me.kavishdevar.aln.R
|
||||
import me.kavishdevar.aln.composables.IndependentToggle
|
||||
import me.kavishdevar.aln.services.ServiceManager
|
||||
import me.kavishdevar.aln.utils.HeadTracking
|
||||
import kotlin.math.abs
|
||||
import kotlin.math.cos
|
||||
import kotlin.math.sin
|
||||
import kotlin.random.Random
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.Q)
|
||||
@OptIn(ExperimentalMaterial3Api::class, ExperimentalAnimationApi::class)
|
||||
@Composable
|
||||
fun HeadTrackingScreen(navController: NavController) {
|
||||
DisposableEffect(Unit) {
|
||||
ServiceManager.getService()?.startHeadTracking()
|
||||
onDispose {
|
||||
ServiceManager.getService()?.stopHeadTracking()
|
||||
}
|
||||
}
|
||||
val sharedPreferences = LocalContext.current.getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||
val isDarkTheme = isSystemInDarkTheme()
|
||||
val backgroundColor = if (isDarkTheme) Color(0xFF1C1C1E) else Color(0xFFFFFFFF)
|
||||
val textColor = if (isDarkTheme) Color.White else Color.Black
|
||||
Scaffold(
|
||||
topBar = {
|
||||
CenterAlignedTopAppBar(
|
||||
title = {
|
||||
Text(
|
||||
stringResource(R.string.head_tracking),
|
||||
fontFamily = FontFamily(Font(R.font.sf_pro)),
|
||||
)
|
||||
},
|
||||
navigationIcon = {
|
||||
TextButton(
|
||||
onClick = {
|
||||
navController.popBackStack()
|
||||
if (ServiceManager.getService()?.isHeadTrackingActive == true) ServiceManager.getService()?.stopHeadTracking()
|
||||
},
|
||||
shape = RoundedCornerShape(8.dp),
|
||||
) {
|
||||
Icon(
|
||||
Icons.AutoMirrored.Filled.KeyboardArrowLeft,
|
||||
contentDescription = "Back",
|
||||
tint = if (isDarkTheme) Color(0xFF007AFF) else Color(0xFF3C6DF5),
|
||||
modifier = Modifier.scale(1.5f)
|
||||
)
|
||||
Text(
|
||||
sharedPreferences.getString("name", "AirPods")!!,
|
||||
style = TextStyle(
|
||||
fontSize = 18.sp,
|
||||
fontWeight = FontWeight.Medium,
|
||||
color = if (isDarkTheme) Color(0xFF007AFF) else Color(0xFF3C6DF5),
|
||||
fontFamily = FontFamily(Font(R.font.sf_pro))
|
||||
),
|
||||
)
|
||||
}
|
||||
},
|
||||
colors = TopAppBarDefaults.topAppBarColors(
|
||||
containerColor = Color.Transparent
|
||||
),
|
||||
actions = {
|
||||
var isActive by remember { mutableStateOf(ServiceManager.getService()?.isHeadTrackingActive == true) }
|
||||
IconButton(
|
||||
onClick = {
|
||||
if (ServiceManager.getService()?.isHeadTrackingActive == false) {
|
||||
ServiceManager.getService()?.startHeadTracking()
|
||||
Log.d("HeadTrackingScreen", "Head tracking started")
|
||||
isActive = true
|
||||
} else {
|
||||
ServiceManager.getService()?.stopHeadTracking()
|
||||
Log.d("HeadTrackingScreen", "Head tracking stopped")
|
||||
isActive = false
|
||||
}
|
||||
},
|
||||
) {
|
||||
Icon(
|
||||
if (isActive) {
|
||||
ImageVector.Builder(
|
||||
name = "Pause",
|
||||
defaultWidth = 24.dp,
|
||||
defaultHeight = 24.dp,
|
||||
viewportWidth = 24f,
|
||||
viewportHeight = 24f
|
||||
).apply {
|
||||
path(
|
||||
fill = SolidColor(Color.Black),
|
||||
pathBuilder = {
|
||||
moveTo(6f, 5f)
|
||||
lineTo(10f, 5f)
|
||||
lineTo(10f, 19f)
|
||||
lineTo(6f, 19f)
|
||||
lineTo(6f, 5f)
|
||||
moveTo(14f, 5f)
|
||||
lineTo(18f, 5f)
|
||||
lineTo(18f, 19f)
|
||||
lineTo(14f, 19f)
|
||||
lineTo(14f, 5f)
|
||||
}
|
||||
)
|
||||
}.build()
|
||||
} else Icons.Filled.PlayArrow,
|
||||
contentDescription = "Start",
|
||||
tint = if (isDarkTheme) Color(0xFF007AFF) else Color(0xFF3C6DF5),
|
||||
modifier = Modifier.scale(1.5f)
|
||||
)
|
||||
}
|
||||
}
|
||||
)
|
||||
},
|
||||
containerColor = if (isSystemInDarkTheme()) Color(0xFF000000)
|
||||
else Color(0xFFF2F2F7),
|
||||
) { paddingValues ->
|
||||
Column (
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(paddingValues = paddingValues)
|
||||
.padding(horizontal = 16.dp)
|
||||
.padding(top = 8.dp)
|
||||
) {
|
||||
val sharedPreferences =
|
||||
LocalContext.current.getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||
|
||||
var gestureText by remember { mutableStateOf("") }
|
||||
val coroutineScope = rememberCoroutineScope()
|
||||
|
||||
IndependentToggle(name = "Head Gestures", sharedPreferences = sharedPreferences)
|
||||
Spacer(modifier = Modifier.height(2.dp))
|
||||
Text(
|
||||
stringResource(R.string.head_gestures_details),
|
||||
style = TextStyle(
|
||||
fontSize = 14.sp,
|
||||
fontWeight = FontWeight.Normal,
|
||||
fontFamily = FontFamily(Font(R.font.sf_pro)),
|
||||
color = textColor.copy(0.6f)
|
||||
),
|
||||
modifier = Modifier.padding(start = 4.dp)
|
||||
)
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
Text(
|
||||
"Head Orientation",
|
||||
style = TextStyle(
|
||||
fontSize = 18.sp,
|
||||
fontWeight = FontWeight.Medium,
|
||||
fontFamily = FontFamily(Font(R.font.sf_pro)),
|
||||
color = textColor
|
||||
),
|
||||
modifier = Modifier.padding(start = 4.dp, bottom = 8.dp, top = 8.dp)
|
||||
)
|
||||
HeadVisualization()
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
Text(
|
||||
"Acceleration",
|
||||
style = TextStyle(
|
||||
fontSize = 18.sp,
|
||||
fontWeight = FontWeight.Medium,
|
||||
fontFamily = FontFamily(Font(R.font.sf_pro)),
|
||||
color = textColor
|
||||
),
|
||||
modifier = Modifier.padding(start = 4.dp, bottom = 8.dp, top = 8.dp)
|
||||
)
|
||||
AccelerationPlot()
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
Button (
|
||||
onClick = {
|
||||
gestureText = "Shake your head or nod!"
|
||||
coroutineScope.launch {
|
||||
val accepted = ServiceManager.getService()?.testHeadGestures() ?: false
|
||||
gestureText = if (accepted) "\"Yes\" gesture detected." else "\"No\" gesture detected."
|
||||
}
|
||||
},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(55.dp),
|
||||
colors = ButtonDefaults.buttonColors(
|
||||
containerColor = backgroundColor
|
||||
),
|
||||
shape = RoundedCornerShape(8.dp)
|
||||
) {
|
||||
Text(
|
||||
"Test Head Gestures",
|
||||
style = TextStyle(
|
||||
fontSize = 16.sp,
|
||||
fontWeight = FontWeight.Medium,
|
||||
fontFamily = FontFamily(Font(R.font.sf_pro)),
|
||||
color = textColor
|
||||
),
|
||||
)
|
||||
}
|
||||
var lastClickTime by remember { mutableLongStateOf(0L) }
|
||||
var shouldExplode by remember { mutableStateOf(false) }
|
||||
|
||||
LaunchedEffect(gestureText) {
|
||||
if (gestureText.isNotEmpty()) {
|
||||
lastClickTime = System.currentTimeMillis()
|
||||
delay(3000)
|
||||
if (System.currentTimeMillis() - lastClickTime >= 3000) {
|
||||
shouldExplode = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Box(
|
||||
contentAlignment = Alignment.Center,
|
||||
modifier = Modifier.padding(top = 12.dp)
|
||||
) {
|
||||
AnimatedContent(
|
||||
targetState = gestureText,
|
||||
transitionSpec = {
|
||||
(fadeIn(
|
||||
animationSpec = tween(300)
|
||||
) + slideInVertically(
|
||||
initialOffsetY = { 40 },
|
||||
animationSpec = tween(300)
|
||||
)).togetherWith(fadeOut(animationSpec = tween(150)))
|
||||
}
|
||||
) { text ->
|
||||
if (shouldExplode) {
|
||||
LaunchedEffect(Unit) {
|
||||
CoroutineScope(coroutineScope.coroutineContext).launch {
|
||||
delay(750)
|
||||
gestureText = ""
|
||||
}
|
||||
}
|
||||
ParticleText(
|
||||
text = text,
|
||||
style = TextStyle(
|
||||
fontSize = 20.sp,
|
||||
fontWeight = FontWeight.Medium,
|
||||
fontFamily = FontFamily(Font(R.font.sf_pro)),
|
||||
color = textColor,
|
||||
textAlign = TextAlign.Center
|
||||
),
|
||||
onAnimationComplete = {
|
||||
shouldExplode = false
|
||||
},
|
||||
)
|
||||
} else {
|
||||
Text(
|
||||
text = text,
|
||||
style = TextStyle(
|
||||
fontSize = 20.sp,
|
||||
fontWeight = FontWeight.Medium,
|
||||
fontFamily = FontFamily(Font(R.font.sf_pro)),
|
||||
color = textColor,
|
||||
textAlign = TextAlign.Center
|
||||
),
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
private data class Particle(
|
||||
val initialPosition: Offset,
|
||||
val velocity: Offset,
|
||||
var alpha: Float = 1f
|
||||
)
|
||||
|
||||
@Composable
|
||||
private fun ParticleText(
|
||||
text: String,
|
||||
style: TextStyle,
|
||||
onAnimationComplete: () -> Unit,
|
||||
) {
|
||||
val particles = remember { mutableStateListOf<Particle>() }
|
||||
val textMeasurer = rememberTextMeasurer()
|
||||
var isAnimating by remember { mutableStateOf(true) }
|
||||
var textVisible by remember { mutableStateOf(true) }
|
||||
|
||||
Canvas(modifier = Modifier.fillMaxWidth()) {
|
||||
val textLayoutResult = textMeasurer.measure(text, style)
|
||||
val textBounds = textLayoutResult.size
|
||||
val centerX = (size.width - textBounds.width) / 2
|
||||
val centerY = size.height / 2
|
||||
|
||||
if (textVisible && particles.isEmpty()) {
|
||||
drawText(
|
||||
textMeasurer = textMeasurer,
|
||||
text = text,
|
||||
style = style,
|
||||
topLeft = Offset(centerX, centerY - textBounds.height / 2)
|
||||
)
|
||||
}
|
||||
|
||||
if (particles.isEmpty()) {
|
||||
val random = Random(System.currentTimeMillis())
|
||||
for (i in 0..100) {
|
||||
val x = centerX + random.nextFloat() * textBounds.width
|
||||
val y = centerY - textBounds.height / 2 + random.nextFloat() * textBounds.height
|
||||
val vx = (random.nextFloat() - 0.5f) * 20
|
||||
val vy = (random.nextFloat() - 0.5f) * 20
|
||||
particles.add(Particle(Offset(x, y), Offset(vx, vy)))
|
||||
}
|
||||
textVisible = false
|
||||
}
|
||||
|
||||
particles.forEach { particle ->
|
||||
drawCircle(
|
||||
color = style.color.copy(alpha = particle.alpha),
|
||||
radius = 0.5.dp.toPx(),
|
||||
center = particle.initialPosition
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
LaunchedEffect(text) {
|
||||
while (isAnimating) {
|
||||
delay(16)
|
||||
particles.forEachIndexed { index, particle ->
|
||||
particles[index] = particle.copy(
|
||||
initialPosition = particle.initialPosition + particle.velocity,
|
||||
alpha = (particle.alpha - 0.02f).coerceAtLeast(0f)
|
||||
)
|
||||
}
|
||||
|
||||
if (particles.all { it.alpha <= 0f }) {
|
||||
isAnimating = false
|
||||
onAnimationComplete()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun HeadVisualization() {
|
||||
val orientation by HeadTracking.orientation.collectAsState()
|
||||
val darkTheme = isSystemInDarkTheme()
|
||||
val backgroundColor = if (darkTheme) Color(0xFF1C1C1E) else Color.White
|
||||
val strokeColor = if (darkTheme) Color.White else Color.Black
|
||||
|
||||
Card(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.aspectRatio(2f),
|
||||
colors = CardDefaults.cardColors(
|
||||
containerColor = backgroundColor
|
||||
)
|
||||
) {
|
||||
Box(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Canvas(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(16.dp)
|
||||
) {
|
||||
val width = size.width
|
||||
val height = size.height
|
||||
val center = Offset(width / 2, height / 2)
|
||||
val faceRadius = height * 0.35f
|
||||
|
||||
val pitch = Math.toRadians(orientation.pitch.toDouble())
|
||||
val yaw = Math.toRadians(orientation.yaw.toDouble())
|
||||
|
||||
val cosY = cos(yaw).toFloat()
|
||||
val sinY = sin(yaw).toFloat()
|
||||
val cosP = cos(pitch).toFloat()
|
||||
val sinP = sin(pitch).toFloat()
|
||||
|
||||
fun rotate3D(point: Triple<Float, Float, Float>): Triple<Float, Float, Float> {
|
||||
val (x, y, z) = point
|
||||
val x1 = x * cosY - z * sinY
|
||||
val y1 = y
|
||||
val z1 = x * sinY + z * cosY
|
||||
|
||||
val x2 = x1
|
||||
val y2 = y1 * cosP - z1 * sinP
|
||||
val z2 = y1 * sinP + z1 * cosP
|
||||
|
||||
return Triple(x2, y2, z2)
|
||||
}
|
||||
|
||||
fun project(point: Triple<Float, Float, Float>): Pair<Float, Float> {
|
||||
val (x, y, z) = point
|
||||
val scale = 1f + (z / width)
|
||||
return Pair(center.x + x * scale, center.y + y * scale)
|
||||
}
|
||||
|
||||
val earWidth = height * 0.08f
|
||||
val earHeight = height * 0.2f
|
||||
val earOffsetX = height * 0.4f
|
||||
val earOffsetY = 0f
|
||||
val earZ = 0f
|
||||
|
||||
for (xSign in listOf(-1f, 1f)) {
|
||||
val rotated = rotate3D(Triple(earOffsetX * xSign, earOffsetY, earZ))
|
||||
val (earX, earY) = project(rotated)
|
||||
drawRoundRect(
|
||||
color = strokeColor,
|
||||
topLeft = Offset(earX - earWidth/2, earY - earHeight/2),
|
||||
size = Size(earWidth, earHeight),
|
||||
cornerRadius = CornerRadius(earWidth/2),
|
||||
style = Stroke(width = 4.dp.toPx())
|
||||
)
|
||||
}
|
||||
|
||||
val spherePath = Path()
|
||||
val firstPoint = project(rotate3D(Triple(faceRadius, 0f, 0f)))
|
||||
spherePath.moveTo(firstPoint.first, firstPoint.second)
|
||||
|
||||
for (i in 1..32) {
|
||||
val angle = (i * 2 * Math.PI / 32).toFloat()
|
||||
val point = project(rotate3D(Triple(
|
||||
cos(angle) * faceRadius,
|
||||
sin(angle) * faceRadius,
|
||||
0f
|
||||
)))
|
||||
spherePath.lineTo(point.first, point.second)
|
||||
}
|
||||
spherePath.close()
|
||||
|
||||
drawContext.canvas.nativeCanvas.apply {
|
||||
val paint = android.graphics.Paint().apply {
|
||||
style = android.graphics.Paint.Style.FILL
|
||||
shader = android.graphics.RadialGradient(
|
||||
center.x + sinY * faceRadius * 0.3f,
|
||||
center.y - sinP * faceRadius * 0.3f,
|
||||
faceRadius * 1.4f,
|
||||
intArrayOf(
|
||||
backgroundColor.copy(alpha = 1f).toArgb(),
|
||||
backgroundColor.copy(alpha = 0.95f).toArgb(),
|
||||
backgroundColor.copy(alpha = 0.9f).toArgb(),
|
||||
backgroundColor.copy(alpha = 0.8f).toArgb(),
|
||||
backgroundColor.copy(alpha = 0.7f).toArgb()
|
||||
),
|
||||
floatArrayOf(0.3f, 0.5f, 0.7f, 0.8f, 1f),
|
||||
android.graphics.Shader.TileMode.CLAMP
|
||||
)
|
||||
}
|
||||
drawPath(spherePath.asAndroidPath(), paint)
|
||||
|
||||
val highlightPaint = android.graphics.Paint().apply {
|
||||
style = android.graphics.Paint.Style.FILL
|
||||
shader = android.graphics.RadialGradient(
|
||||
center.x - faceRadius * 0.4f - sinY * faceRadius * 0.5f,
|
||||
center.y - faceRadius * 0.4f - sinP * faceRadius * 0.5f,
|
||||
faceRadius * 0.9f,
|
||||
intArrayOf(
|
||||
android.graphics.Color.WHITE,
|
||||
android.graphics.Color.argb(100, 255, 255, 255),
|
||||
android.graphics.Color.TRANSPARENT
|
||||
),
|
||||
floatArrayOf(0f, 0.3f, 1f),
|
||||
android.graphics.Shader.TileMode.CLAMP
|
||||
)
|
||||
alpha = if (darkTheme) 30 else 60
|
||||
}
|
||||
drawPath(spherePath.asAndroidPath(), highlightPaint)
|
||||
|
||||
val secondaryHighlightPaint = android.graphics.Paint().apply {
|
||||
style = android.graphics.Paint.Style.FILL
|
||||
shader = android.graphics.RadialGradient(
|
||||
center.x + faceRadius * 0.3f + sinY * faceRadius * 0.3f,
|
||||
center.y + faceRadius * 0.3f - sinP * faceRadius * 0.3f,
|
||||
faceRadius * 0.7f,
|
||||
intArrayOf(
|
||||
android.graphics.Color.WHITE,
|
||||
android.graphics.Color.TRANSPARENT
|
||||
),
|
||||
floatArrayOf(0f, 1f),
|
||||
android.graphics.Shader.TileMode.CLAMP
|
||||
)
|
||||
alpha = if (darkTheme) 15 else 30
|
||||
}
|
||||
drawPath(spherePath.asAndroidPath(), secondaryHighlightPaint)
|
||||
|
||||
val shadowPaint = android.graphics.Paint().apply {
|
||||
style = android.graphics.Paint.Style.FILL
|
||||
shader = android.graphics.RadialGradient(
|
||||
center.x + sinY * faceRadius * 0.5f,
|
||||
center.y - sinP * faceRadius * 0.5f,
|
||||
faceRadius * 1.1f,
|
||||
intArrayOf(
|
||||
android.graphics.Color.TRANSPARENT,
|
||||
android.graphics.Color.BLACK
|
||||
),
|
||||
floatArrayOf(0.7f, 1f),
|
||||
android.graphics.Shader.TileMode.CLAMP
|
||||
)
|
||||
alpha = if (darkTheme) 40 else 20
|
||||
}
|
||||
drawPath(spherePath.asAndroidPath(), shadowPaint)
|
||||
}
|
||||
|
||||
drawPath(
|
||||
path = spherePath,
|
||||
color = strokeColor,
|
||||
style = Stroke(width = 4.dp.toPx())
|
||||
)
|
||||
|
||||
val smileRadius = faceRadius * 0.5f
|
||||
val smileStartAngle = -340f
|
||||
val smileSweepAngle = 140f
|
||||
val smileOffsetY = faceRadius * 0.1f
|
||||
|
||||
val smilePath = Path()
|
||||
for (i in 0..32) {
|
||||
val angle = Math.toRadians(smileStartAngle + (smileSweepAngle * i / 32.0))
|
||||
val x = cos(angle.toFloat()) * smileRadius
|
||||
val y = sin(angle.toFloat()) * smileRadius + smileOffsetY
|
||||
|
||||
val rotated = rotate3D(Triple(x, y, 0f))
|
||||
val projected = project(rotated)
|
||||
|
||||
if (i == 0) {
|
||||
smilePath.moveTo(projected.first, projected.second)
|
||||
} else {
|
||||
smilePath.lineTo(projected.first, projected.second)
|
||||
}
|
||||
}
|
||||
|
||||
drawPath(
|
||||
path = smilePath,
|
||||
color = strokeColor,
|
||||
style = Stroke(
|
||||
width = 4.dp.toPx(),
|
||||
cap = StrokeCap.Round
|
||||
)
|
||||
)
|
||||
|
||||
val eyeOffsetX = height * 0.15f
|
||||
val eyeOffsetY = height * 0.1f
|
||||
val eyeLength = height * 0.08f
|
||||
|
||||
for (xSign in listOf(-1f, 1f)) {
|
||||
val rotated = rotate3D(Triple(eyeOffsetX * xSign, -eyeOffsetY, 0f))
|
||||
val (eyeX, eyeY) = project(rotated)
|
||||
drawLine(
|
||||
color = strokeColor,
|
||||
start = Offset(eyeX, eyeY - eyeLength/2),
|
||||
end = Offset(eyeX, eyeY + eyeLength/2),
|
||||
strokeWidth = 4.dp.toPx(),
|
||||
cap = StrokeCap.Round
|
||||
)
|
||||
}
|
||||
|
||||
drawContext.canvas.nativeCanvas.apply {
|
||||
val paint = android.graphics.Paint().apply {
|
||||
color = if (darkTheme) android.graphics.Color.WHITE else android.graphics.Color.BLACK
|
||||
textSize = 12.sp.toPx()
|
||||
textAlign = android.graphics.Paint.Align.RIGHT
|
||||
typeface = android.graphics.Typeface.create(
|
||||
"SF Pro",
|
||||
android.graphics.Typeface.NORMAL
|
||||
)
|
||||
}
|
||||
|
||||
val pitch = orientation.pitch.toInt()
|
||||
val yaw = orientation.yaw.toInt()
|
||||
val text = "Pitch: ${pitch}° Yaw: ${yaw}°"
|
||||
|
||||
drawText(
|
||||
text,
|
||||
width - 8.dp.toPx(),
|
||||
height - 8.dp.toPx(),
|
||||
paint
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun AccelerationPlot() {
|
||||
val acceleration by HeadTracking.acceleration.collectAsState()
|
||||
val maxPoints = 100
|
||||
val points = remember { mutableStateListOf<Pair<Float, Float>>() }
|
||||
val darkTheme = isSystemInDarkTheme()
|
||||
|
||||
var maxAbs by remember { mutableFloatStateOf(1000f) }
|
||||
|
||||
LaunchedEffect(acceleration) {
|
||||
points.add(Pair(acceleration.horizontal, acceleration.vertical))
|
||||
if (points.size > maxPoints) {
|
||||
points.removeAt(0)
|
||||
}
|
||||
|
||||
val currentMax = points.maxOf { maxOf(abs(it.first), abs(it.second)) }
|
||||
maxAbs = maxOf(currentMax * 1.2f, 1000f)
|
||||
}
|
||||
|
||||
Card(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(300.dp),
|
||||
colors = CardDefaults.cardColors(
|
||||
containerColor = if (darkTheme) Color(0xFF1C1C1E) else Color.White
|
||||
)
|
||||
) {
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(16.dp)
|
||||
) {
|
||||
Canvas(
|
||||
modifier = Modifier.fillMaxSize()
|
||||
) {
|
||||
val width = size.width
|
||||
val height = size.height
|
||||
val xScale = width / maxPoints
|
||||
val yScale = (height - 40.dp.toPx()) / (maxAbs * 2)
|
||||
val zeroY = height / 2
|
||||
|
||||
val gridColor = if (darkTheme) Color.White.copy(alpha = 0.1f) else Color.Black.copy(alpha = 0.1f)
|
||||
|
||||
for (i in 0..maxPoints step 10) {
|
||||
val x = i * xScale
|
||||
drawLine(
|
||||
color = gridColor,
|
||||
start = Offset(x, 0f),
|
||||
end = Offset(x, height),
|
||||
strokeWidth = 1.dp.toPx()
|
||||
)
|
||||
}
|
||||
|
||||
val gridStep = maxAbs / 4
|
||||
for (value in (-maxAbs.toInt()..maxAbs.toInt()) step gridStep.toInt()) {
|
||||
val y = zeroY - value * yScale
|
||||
drawLine(
|
||||
color = gridColor,
|
||||
start = Offset(0f, y),
|
||||
end = Offset(width, y),
|
||||
strokeWidth = 1.dp.toPx()
|
||||
)
|
||||
}
|
||||
|
||||
drawLine(
|
||||
color = if (darkTheme) Color.White.copy(alpha = 0.3f) else Color.Black.copy(alpha = 0.3f),
|
||||
start = Offset(0f, zeroY),
|
||||
end = Offset(width, zeroY),
|
||||
strokeWidth = 1.5f.dp.toPx()
|
||||
)
|
||||
|
||||
if (points.size > 1) {
|
||||
for (i in 0 until points.size - 1) {
|
||||
val x1 = i * xScale
|
||||
val x2 = (i + 1) * xScale
|
||||
|
||||
drawLine(
|
||||
color = Color(0xFF007AFF),
|
||||
start = Offset(x1, zeroY - points[i].first * yScale),
|
||||
end = Offset(x2, zeroY - points[i + 1].first * yScale),
|
||||
strokeWidth = 2.dp.toPx()
|
||||
)
|
||||
|
||||
drawLine(
|
||||
color = Color(0xFFFF3B30),
|
||||
start = Offset(x1, zeroY - points[i].second * yScale),
|
||||
end = Offset(x2, zeroY - points[i + 1].second * yScale),
|
||||
strokeWidth = 2.dp.toPx()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
drawContext.canvas.nativeCanvas.apply {
|
||||
val paint = android.graphics.Paint().apply {
|
||||
color = if (darkTheme) android.graphics.Color.WHITE else android.graphics.Color.BLACK
|
||||
textSize = 12.sp.toPx()
|
||||
textAlign = android.graphics.Paint.Align.RIGHT
|
||||
}
|
||||
|
||||
drawText("${maxAbs.toInt()}", 30.dp.toPx(), 20.dp.toPx(), paint)
|
||||
drawText("0", 30.dp.toPx(), height/2, paint)
|
||||
drawText("-${maxAbs.toInt()}", 30.dp.toPx(), height - 10.dp.toPx(), paint)
|
||||
}
|
||||
|
||||
val legendY = 15.dp.toPx()
|
||||
val textOffsetY = legendY + 5.dp.toPx() / 2
|
||||
|
||||
drawCircle(Color(0xFF007AFF), 5.dp.toPx(), Offset(width - 150.dp.toPx(), legendY))
|
||||
drawContext.canvas.nativeCanvas.apply {
|
||||
val paint = android.graphics.Paint().apply {
|
||||
color = if (darkTheme) android.graphics.Color.WHITE else android.graphics.Color.BLACK
|
||||
textSize = 12.sp.toPx()
|
||||
textAlign = android.graphics.Paint.Align.LEFT
|
||||
}
|
||||
drawText("Horizontal", width - 140.dp.toPx(), textOffsetY, paint)
|
||||
}
|
||||
|
||||
drawCircle(Color(0xFFFF3B30), 5.dp.toPx(), Offset(width - 70.dp.toPx(), legendY))
|
||||
drawContext.canvas.nativeCanvas.apply {
|
||||
val paint = android.graphics.Paint().apply {
|
||||
color = if (darkTheme) android.graphics.Color.WHITE else android.graphics.Color.BLACK
|
||||
textSize = 12.sp.toPx()
|
||||
textAlign = android.graphics.Paint.Align.LEFT
|
||||
}
|
||||
drawText("Vertical", width - 60.dp.toPx(), textOffsetY, paint)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.Q)
|
||||
@Preview
|
||||
@Composable
|
||||
fun HeadTrackingScreenPreview() {
|
||||
HeadTrackingScreen(navController = NavController(LocalContext.current))
|
||||
}
|
||||
@@ -216,7 +216,7 @@ fun LongPressElement(name: String, checked: MutableState<Boolean>, id: String, e
|
||||
sharedPreferences.getBoolean("long_press_adaptive", false)
|
||||
)
|
||||
ServiceManager.getService()
|
||||
?.updateLongPress(originalLongPressArray, newLongPressArray)
|
||||
?.updateLongPress(originalLongPressArray, newLongPressArray, offListeningMode)
|
||||
}
|
||||
val shape = when {
|
||||
isFirst -> RoundedCornerShape(topStart = 14.dp, topEnd = 14.dp)
|
||||
|
||||
@@ -36,6 +36,7 @@ import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.content.SharedPreferences
|
||||
import android.content.pm.PackageManager
|
||||
import android.content.res.Resources
|
||||
import android.media.AudioManager
|
||||
import android.os.BatteryManager
|
||||
@@ -45,22 +46,27 @@ import android.os.Handler
|
||||
import android.os.IBinder
|
||||
import android.os.Looper
|
||||
import android.os.ParcelUuid
|
||||
import android.telecom.TelecomManager
|
||||
import android.telephony.PhoneStateListener
|
||||
import android.telephony.TelephonyManager
|
||||
import android.util.Log
|
||||
import android.util.TypedValue
|
||||
import android.view.View
|
||||
import android.widget.RemoteViews
|
||||
import android.widget.Toast
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.annotation.RequiresPermission
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.core.app.NotificationCompat
|
||||
import androidx.core.content.edit
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||
import me.kavishdevar.aln.MainActivity
|
||||
import me.kavishdevar.aln.R
|
||||
import me.kavishdevar.aln.utils.AirPodsNotifications
|
||||
@@ -70,15 +76,19 @@ import me.kavishdevar.aln.utils.BatteryStatus
|
||||
import me.kavishdevar.aln.utils.CrossDevice
|
||||
import me.kavishdevar.aln.utils.CrossDevicePackets
|
||||
import me.kavishdevar.aln.utils.Enums
|
||||
import me.kavishdevar.aln.utils.GestureDetector
|
||||
import me.kavishdevar.aln.utils.HeadTracking
|
||||
import me.kavishdevar.aln.utils.IslandType
|
||||
import me.kavishdevar.aln.utils.IslandWindow
|
||||
import me.kavishdevar.aln.utils.LongPressMode
|
||||
import me.kavishdevar.aln.utils.LongPressPackets
|
||||
import me.kavishdevar.aln.utils.MediaController
|
||||
import me.kavishdevar.aln.utils.PopupWindow
|
||||
import me.kavishdevar.aln.utils.determinePacket
|
||||
import me.kavishdevar.aln.utils.isHeadTrackingData
|
||||
import me.kavishdevar.aln.widgets.BatteryWidget
|
||||
import me.kavishdevar.aln.widgets.NoiseControlWidget
|
||||
import org.lsposed.hiddenapibypass.HiddenApiBypass
|
||||
import java.nio.ByteBuffer
|
||||
import java.nio.ByteOrder
|
||||
|
||||
object ServiceManager {
|
||||
private var service: AirPodsService? = null
|
||||
@@ -152,7 +162,7 @@ class AirPodsService : Service() {
|
||||
}
|
||||
|
||||
fun clearLogs() {
|
||||
clearPacketLogs() // Expose a method to clear logs
|
||||
clearPacketLogs()
|
||||
_packetLogsFlow.value = emptySet()
|
||||
}
|
||||
|
||||
@@ -160,6 +170,18 @@ class AirPodsService : Service() {
|
||||
return LocalBinder()
|
||||
}
|
||||
|
||||
private var gestureDetector: GestureDetector? = null
|
||||
private var isInCall = false
|
||||
private var callNumber: String? = null
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.Q)
|
||||
private fun initGestureDetector() {
|
||||
if (gestureDetector == null) {
|
||||
gestureDetector = GestureDetector(this)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var popupShown = false
|
||||
|
||||
fun showPopup(service: Service, name: String) {
|
||||
@@ -525,6 +547,98 @@ class AirPodsService : Service() {
|
||||
notificationManager.notify(1, updatedNotification)
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.Q)
|
||||
fun handleIncomingCall() {
|
||||
if (isInCall) return
|
||||
|
||||
initGestureDetector()
|
||||
|
||||
gestureDetector?.startDetection { accepted ->
|
||||
if (accepted) {
|
||||
answerCall()
|
||||
} else {
|
||||
rejectCall()
|
||||
}
|
||||
}
|
||||
}
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
@RequiresApi(Build.VERSION_CODES.Q)
|
||||
|
||||
suspend fun testHeadGestures(): Boolean {
|
||||
return suspendCancellableCoroutine { continuation ->
|
||||
gestureDetector?.startDetection(doNotStop = true) { accepted ->
|
||||
if (continuation.isActive) {
|
||||
continuation.resume(accepted) {
|
||||
gestureDetector?.stopDetection()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
private fun answerCall() {
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||
val telecomManager = getSystemService(TELECOM_SERVICE) as TelecomManager
|
||||
if (checkSelfPermission(Manifest.permission.ANSWER_PHONE_CALLS) == PackageManager.PERMISSION_GRANTED) {
|
||||
telecomManager.acceptRingingCall()
|
||||
}
|
||||
} else {
|
||||
val telephonyService = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
|
||||
val telephonyClass = Class.forName(telephonyService.javaClass.name)
|
||||
val method = telephonyClass.getDeclaredMethod("getITelephony")
|
||||
method.isAccessible = true
|
||||
val telephonyInterface = method.invoke(telephonyService)
|
||||
val answerCallMethod = telephonyInterface.javaClass.getDeclaredMethod("answerRingingCall")
|
||||
answerCallMethod.invoke(telephonyInterface)
|
||||
}
|
||||
|
||||
sendToast("Call answered via head gesture")
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
sendToast("Failed to answer call: ${e.message}")
|
||||
} finally {
|
||||
islandWindow?.close()
|
||||
}
|
||||
}
|
||||
private fun rejectCall() {
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||
val telecomManager = getSystemService(Context.TELECOM_SERVICE) as TelecomManager
|
||||
if (checkSelfPermission(Manifest.permission.ANSWER_PHONE_CALLS) == PackageManager.PERMISSION_GRANTED) {
|
||||
telecomManager.endCall()
|
||||
}
|
||||
} else {
|
||||
val telephonyService = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
|
||||
val telephonyClass = Class.forName(telephonyService.javaClass.name)
|
||||
val method = telephonyClass.getDeclaredMethod("getITelephony")
|
||||
method.isAccessible = true
|
||||
val telephonyInterface = method.invoke(telephonyService)
|
||||
val endCallMethod = telephonyInterface.javaClass.getDeclaredMethod("endCall")
|
||||
endCallMethod.invoke(telephonyInterface)
|
||||
}
|
||||
|
||||
sendToast("Call rejected via head gesture")
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
sendToast("Failed to reject call: ${e.message}")
|
||||
} finally {
|
||||
islandWindow?.close()
|
||||
}
|
||||
}
|
||||
|
||||
fun sendToast(message: String) {
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
Toast.makeText(applicationContext, message, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.R)
|
||||
fun processHeadTrackingData(data: ByteArray) {
|
||||
val horizontal = ByteBuffer.wrap(data, 51, 2).order(ByteOrder.LITTLE_ENDIAN).short.toInt()
|
||||
val vertical = ByteBuffer.wrap(data, 53, 2).order(ByteOrder.LITTLE_ENDIAN).short.toInt()
|
||||
gestureDetector?.processHeadOrientation(horizontal, vertical)
|
||||
}
|
||||
|
||||
private lateinit var connectionReceiver: BroadcastReceiver
|
||||
private lateinit var disconnectionReceiver: BroadcastReceiver
|
||||
|
||||
@@ -533,6 +647,7 @@ class AirPodsService : Service() {
|
||||
Log.d("AirPodsService", "Service started")
|
||||
ServiceManager.setService(this)
|
||||
startForegroundNotification()
|
||||
initGestureDetector()
|
||||
val audioManager =
|
||||
this@AirPodsService.getSystemService(AUDIO_SERVICE) as AudioManager
|
||||
MediaController.initialize(
|
||||
@@ -559,9 +674,19 @@ class AirPodsService : Service() {
|
||||
when (state) {
|
||||
TelephonyManager.CALL_STATE_RINGING -> {
|
||||
if (CrossDevice.isAvailable && !isConnectedLocally && earDetectionNotification.status.contains(0x00)) takeOver()
|
||||
if (sharedPreferences.getBoolean("head_gestures", false)) {
|
||||
callNumber = phoneNumber
|
||||
handleIncomingCall()
|
||||
}
|
||||
}
|
||||
TelephonyManager.CALL_STATE_OFFHOOK -> {
|
||||
if (CrossDevice.isAvailable && !isConnectedLocally && earDetectionNotification.status.contains(0x00)) takeOver()
|
||||
isInCall = true
|
||||
}
|
||||
TelephonyManager.CALL_STATE_IDLE -> {
|
||||
isInCall = false
|
||||
callNumber = null
|
||||
gestureDetector?.stopDetection()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -711,7 +836,7 @@ class AirPodsService : Service() {
|
||||
}
|
||||
|
||||
if (!isConnectedLocally && !CrossDevice.isAvailable) {
|
||||
clearPacketLogs() // Clear logs when device is not available
|
||||
clearPacketLogs()
|
||||
}
|
||||
|
||||
return START_STICKY
|
||||
@@ -729,6 +854,7 @@ class AirPodsService : Service() {
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.R)
|
||||
@SuppressLint("MissingPermission")
|
||||
fun takeOver() {
|
||||
Log.d("AirPodsService", "Taking over audio")
|
||||
@@ -750,6 +876,7 @@ class AirPodsService : Service() {
|
||||
CrossDevice.isAvailable = false
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.R)
|
||||
@SuppressLint("MissingPermission", "UnspecifiedRegisterReceiverFlag")
|
||||
fun connectToSocket(device: BluetoothDevice) {
|
||||
HiddenApiBypass.addHiddenApiExemptions("Landroid/bluetooth/BluetoothSocket;")
|
||||
@@ -824,7 +951,6 @@ class AirPodsService : Service() {
|
||||
var data: ByteArray = byteArrayOf()
|
||||
if (bytesRead > 0) {
|
||||
data = buffer.copyOfRange(0, bytesRead)
|
||||
logPacket(data, "AirPods")
|
||||
sendBroadcast(Intent(AirPodsNotifications.Companion.AIRPODS_DATA).apply {
|
||||
putExtra("data", buffer.copyOfRange(0, bytesRead))
|
||||
})
|
||||
@@ -836,7 +962,10 @@ class AirPodsService : Service() {
|
||||
sharedPreferences.getString("name", device.name),
|
||||
batteryNotification.getBattery()
|
||||
)
|
||||
Log.d("AirPods Data", "Data received: $formattedHex")
|
||||
if (!isHeadTrackingData(data)) {
|
||||
Log.d("AirPods Data", "Data received: $formattedHex")
|
||||
logPacket(data, "AirPods")
|
||||
}
|
||||
} else if (bytesRead == -1) {
|
||||
Log.d("AirPods Service", "Socket closed (bytesRead = -1)")
|
||||
sendBroadcast(Intent(AirPodsNotifications.Companion.AIRPODS_DISCONNECTED))
|
||||
@@ -844,6 +973,7 @@ class AirPodsService : Service() {
|
||||
}
|
||||
var inEar = false
|
||||
var inEarData = listOf<Boolean>()
|
||||
processData(data)
|
||||
if (earDetectionNotification.isEarDetectionData(data)) {
|
||||
earDetectionNotification.setStatus(data)
|
||||
sendBroadcast(Intent(AirPodsNotifications.Companion.EAR_DETECTION_DATA).apply {
|
||||
@@ -1042,7 +1172,9 @@ class AirPodsService : Service() {
|
||||
"AirPods Parser",
|
||||
"Conversation Awareness: ${conversationAwarenessNotification.status}"
|
||||
)
|
||||
} else {
|
||||
}
|
||||
else if (isHeadTrackingData(data)) {
|
||||
processHeadTrackingData(data)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1391,27 +1523,136 @@ class AirPodsService : Service() {
|
||||
fun updateLongPress(
|
||||
oldLongPressArray: BooleanArray,
|
||||
newLongPressArray: BooleanArray,
|
||||
offListeningMode: Boolean
|
||||
) {
|
||||
if (oldLongPressArray.contentEquals(newLongPressArray)) {
|
||||
return
|
||||
}
|
||||
val oldModes = mutableSetOf<LongPressMode>()
|
||||
val newModes = mutableSetOf<LongPressMode>()
|
||||
val oldOffEnabled = oldLongPressArray[0]
|
||||
val oldAncEnabled = oldLongPressArray[1]
|
||||
val oldTransparencyEnabled = oldLongPressArray[2]
|
||||
val oldAdaptiveEnabled = oldLongPressArray[3]
|
||||
|
||||
if (oldLongPressArray[0]) oldModes.add(LongPressMode.OFF)
|
||||
if (oldLongPressArray[1]) oldModes.add(LongPressMode.ANC)
|
||||
if (oldLongPressArray[2]) oldModes.add(LongPressMode.TRANSPARENCY)
|
||||
if (oldLongPressArray[3]) oldModes.add(LongPressMode.ADAPTIVE)
|
||||
|
||||
if (newLongPressArray[0]) newModes.add(LongPressMode.OFF)
|
||||
if (newLongPressArray[1]) newModes.add(LongPressMode.ANC)
|
||||
if (newLongPressArray[2]) newModes.add(LongPressMode.TRANSPARENCY)
|
||||
if (newLongPressArray[3]) newModes.add(LongPressMode.ADAPTIVE)
|
||||
val newOffEnabled = newLongPressArray[0]
|
||||
val newAncEnabled = newLongPressArray[1]
|
||||
val newTransparencyEnabled = newLongPressArray[2]
|
||||
val newAdaptiveEnabled = newLongPressArray[3]
|
||||
|
||||
val changedIndex = findChangedIndex(oldLongPressArray, newLongPressArray)
|
||||
val newEnabled = newLongPressArray[changedIndex]
|
||||
Log.d("AirPodsService", "changedIndex: $changedIndex")
|
||||
var packet: ByteArray? = null
|
||||
if (offListeningMode) {
|
||||
packet = when (changedIndex) {
|
||||
0 -> {
|
||||
if (newOffEnabled) {
|
||||
when {
|
||||
oldAncEnabled && oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_EVERYTHING.value
|
||||
oldAncEnabled && oldTransparencyEnabled -> LongPressPackets.ENABLE_OFF_FROM_TRANSPARENCY_AND_ANC.value
|
||||
oldAncEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_OFF_FROM_ADAPTIVE_AND_ANC.value
|
||||
oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_OFF_FROM_TRANSPARENCY_AND_ADAPTIVE.value
|
||||
else -> null
|
||||
}
|
||||
} else {
|
||||
when {
|
||||
oldAncEnabled && oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_OFF_FROM_EVERYTHING.value
|
||||
oldAncEnabled && oldTransparencyEnabled -> LongPressPackets.DISABLE_OFF_FROM_TRANSPARENCY_AND_ANC.value
|
||||
oldAncEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_OFF_FROM_ADAPTIVE_AND_ANC.value
|
||||
oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_OFF_FROM_TRANSPARENCY_AND_ADAPTIVE.value
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val packet = determinePacket(changedIndex, newEnabled, oldModes, newModes)
|
||||
1 -> {
|
||||
if (newAncEnabled) {
|
||||
when {
|
||||
oldOffEnabled && oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_EVERYTHING.value
|
||||
oldOffEnabled && oldTransparencyEnabled -> LongPressPackets.ENABLE_ANC_FROM_OFF_AND_TRANSPARENCY.value
|
||||
oldOffEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_ANC_FROM_OFF_AND_ADAPTIVE.value
|
||||
oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_OFF_FROM_TRANSPARENCY_AND_ADAPTIVE.value
|
||||
else -> null
|
||||
}
|
||||
} else {
|
||||
when {
|
||||
oldOffEnabled && oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_ANC_FROM_EVERYTHING.value
|
||||
oldOffEnabled && oldTransparencyEnabled -> LongPressPackets.DISABLE_ANC_FROM_OFF_AND_TRANSPARENCY.value
|
||||
oldOffEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_ANC_FROM_OFF_AND_ADAPTIVE.value
|
||||
oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_OFF_FROM_TRANSPARENCY_AND_ADAPTIVE.value
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
2 -> {
|
||||
if (newTransparencyEnabled) {
|
||||
when {
|
||||
oldOffEnabled && oldAncEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_EVERYTHING.value
|
||||
oldOffEnabled && oldAncEnabled -> LongPressPackets.ENABLE_TRANSPARENCY_FROM_OFF_AND_ANC.value
|
||||
oldOffEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_TRANSPARENCY_FROM_OFF_AND_ADAPTIVE.value
|
||||
oldAncEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_TRANSPARENCY_FROM_ADAPTIVE_AND_ANC.value
|
||||
else -> null
|
||||
}
|
||||
} else {
|
||||
when {
|
||||
oldOffEnabled && oldAncEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_TRANSPARENCY_FROM_EVERYTHING.value
|
||||
oldOffEnabled && oldAncEnabled -> LongPressPackets.DISABLE_TRANSPARENCY_FROM_OFF_AND_ANC.value
|
||||
oldOffEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_TRANSPARENCY_FROM_OFF_AND_ADAPTIVE.value
|
||||
oldAncEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_TRANSPARENCY_FROM_ADAPTIVE_AND_ANC.value
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
3 -> {
|
||||
if (newAdaptiveEnabled) {
|
||||
when {
|
||||
oldOffEnabled && oldAncEnabled && oldTransparencyEnabled -> LongPressPackets.ENABLE_EVERYTHING.value
|
||||
oldOffEnabled && oldAncEnabled -> LongPressPackets.ENABLE_ADAPTIVE_FROM_OFF_AND_ANC.value
|
||||
oldOffEnabled && oldTransparencyEnabled -> LongPressPackets.ENABLE_ADAPTIVE_FROM_OFF_AND_TRANSPARENCY.value
|
||||
oldAncEnabled && oldTransparencyEnabled -> LongPressPackets.ENABLE_ADAPTIVE_FROM_TRANSPARENCY_AND_ANC.value
|
||||
else -> null
|
||||
}
|
||||
} else {
|
||||
when {
|
||||
oldOffEnabled && oldAncEnabled && oldTransparencyEnabled -> LongPressPackets.DISABLE_ADAPTIVE_FROM_EVERYTHING.value
|
||||
oldOffEnabled && oldAncEnabled -> LongPressPackets.DISABLE_ADAPTIVE_FROM_OFF_AND_ANC.value
|
||||
oldOffEnabled && oldTransparencyEnabled -> LongPressPackets.DISABLE_ADAPTIVE_FROM_OFF_AND_TRANSPARENCY.value
|
||||
oldAncEnabled && oldTransparencyEnabled -> LongPressPackets.DISABLE_ADAPTIVE_FROM_TRANSPARENCY_AND_ANC.value
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else -> null
|
||||
}
|
||||
} else {
|
||||
when (changedIndex) {
|
||||
1 -> {
|
||||
packet = if (newLongPressArray[1]) {
|
||||
LongPressPackets.ENABLE_EVERYTHING_OFF_DISABLED.value
|
||||
} else {
|
||||
LongPressPackets.DISABLE_ANC_OFF_DISABLED.value
|
||||
}
|
||||
}
|
||||
|
||||
2 -> {
|
||||
packet = if (newLongPressArray[2]) {
|
||||
LongPressPackets.ENABLE_EVERYTHING_OFF_DISABLED.value
|
||||
} else {
|
||||
LongPressPackets.DISABLE_TRANSPARENCY_OFF_DISABLED.value
|
||||
}
|
||||
}
|
||||
|
||||
3 -> {
|
||||
packet = if (newLongPressArray[3]) {
|
||||
LongPressPackets.ENABLE_EVERYTHING_OFF_DISABLED.value
|
||||
} else {
|
||||
LongPressPackets.DISABLE_ADAPTIVE_OFF_DISABLED.value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
packet?.let {
|
||||
Log.d("AirPodsService", "Sending packet: ${it.joinToString(" ") { "%02X".format(it) }}")
|
||||
sendPacket(it)
|
||||
@@ -1442,11 +1683,29 @@ class AirPodsService : Service() {
|
||||
e.printStackTrace()
|
||||
}
|
||||
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE)
|
||||
// Reset state variables
|
||||
isConnectedLocally = false
|
||||
CrossDevice.isAvailable = true
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
var isHeadTrackingActive = false
|
||||
|
||||
fun startHeadTracking() {
|
||||
isHeadTrackingActive = true
|
||||
socket.outputStream.write(Enums.START_HEAD_TRACKING.value)
|
||||
HeadTracking.reset()
|
||||
}
|
||||
|
||||
fun stopHeadTracking() {
|
||||
socket.outputStream.write(Enums.STOP_HEAD_TRACKING.value)
|
||||
isHeadTrackingActive = false
|
||||
}
|
||||
|
||||
fun processData(data: ByteArray) {
|
||||
if (isHeadTrackingActive && isHeadTrackingData(data)) {
|
||||
HeadTracking.processPacket(data)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun Int.dpToPx(): Int {
|
||||
|
||||
@@ -143,9 +143,7 @@ object CrossDevice {
|
||||
}
|
||||
|
||||
fun sendReceivedPacket(packet: ByteArray) {
|
||||
Log.d("CrossDevice", "Sending packet to remote device")
|
||||
if (clientSocket == null || clientSocket!!.outputStream != null) {
|
||||
Log.d("CrossDevice", "Client socket is null")
|
||||
return
|
||||
}
|
||||
clientSocket?.outputStream?.write(CrossDevicePackets.AIRPODS_DATA_HEADER.packet + packet)
|
||||
@@ -257,7 +255,6 @@ object CrossDevice {
|
||||
|
||||
fun sendRemotePacket(byteArray: ByteArray) {
|
||||
if (clientSocket == null || clientSocket!!.outputStream == null) {
|
||||
Log.d("CrossDevice", "Client socket is null")
|
||||
return
|
||||
}
|
||||
clientSocket?.outputStream?.write(byteArray)
|
||||
|
||||
@@ -0,0 +1,441 @@
|
||||
package me.kavishdevar.aln.utils
|
||||
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.annotation.RequiresApi
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import me.kavishdevar.aln.services.AirPodsService
|
||||
import me.kavishdevar.aln.services.ServiceManager
|
||||
import java.util.Collections
|
||||
import java.util.concurrent.CopyOnWriteArrayList
|
||||
import kotlin.math.abs
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import kotlin.math.pow
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.Q)
|
||||
class GestureDetector(
|
||||
private val airPodsService: AirPodsService,
|
||||
) {
|
||||
companion object {
|
||||
private const val TAG = "GestureDetector"
|
||||
|
||||
private const val START_CMD = "04 00 04 00 17 00 00 00 10 00 10 00 08 A1 02 42 0B 08 0E 10 02 1A 05 01 40 9C 00 00"
|
||||
private const val STOP_CMD = "04 00 04 00 17 00 00 00 10 00 11 00 08 7E 10 02 42 0B 08 4E 10 02 1A 05 01 00 00 00 00"
|
||||
|
||||
private const val IMMEDIATE_FEEDBACK_THRESHOLD = 600
|
||||
private const val DIRECTION_CHANGE_SENSITIVITY = 150
|
||||
|
||||
private const val FAST_MOVEMENT_THRESHOLD = 300.0
|
||||
private const val MIN_REQUIRED_EXTREMES = 3
|
||||
private const val MAX_REQUIRED_EXTREMES = 4
|
||||
}
|
||||
|
||||
val audio = GestureFeedback(ServiceManager.getService()?.baseContext!!)
|
||||
|
||||
private val horizontalBuffer = Collections.synchronizedList(ArrayList<Double>())
|
||||
private val verticalBuffer = Collections.synchronizedList(ArrayList<Double>())
|
||||
|
||||
private val horizontalAvgBuffer = Collections.synchronizedList(ArrayList<Double>())
|
||||
private val verticalAvgBuffer = Collections.synchronizedList(ArrayList<Double>())
|
||||
|
||||
private var prevHorizontal: Double = 0.0
|
||||
private var prevVertical: Double = 0.0
|
||||
|
||||
private val horizontalPeaks = CopyOnWriteArrayList<Triple<Int, Double, Long>>()
|
||||
private val horizontalTroughs = CopyOnWriteArrayList<Triple<Int, Double, Long>>()
|
||||
private val verticalPeaks = CopyOnWriteArrayList<Triple<Int, Double, Long>>()
|
||||
private val verticalTroughs = CopyOnWriteArrayList<Triple<Int, Double, Long>>()
|
||||
|
||||
private var lastPeakTime: Long = 0
|
||||
private val peakIntervals = Collections.synchronizedList(ArrayList<Double>())
|
||||
|
||||
private val movementSpeedIntervals = Collections.synchronizedList(ArrayList<Long>())
|
||||
|
||||
private val peakThreshold = 400
|
||||
private val directionChangeThreshold = DIRECTION_CHANGE_SENSITIVITY
|
||||
private val rhythmConsistencyThreshold = 0.5
|
||||
|
||||
private var horizontalIncreasing: Boolean? = null
|
||||
private var verticalIncreasing: Boolean? = null
|
||||
|
||||
private var detectionTimeout = 15000L
|
||||
private val minConfidenceThreshold = 0.7
|
||||
|
||||
private var isRunning = false
|
||||
private var detectionJob: Job? = null
|
||||
private var gestureDetectedCallback: ((Boolean) -> Unit)? = null
|
||||
|
||||
private var significantMotion = false
|
||||
private var lastSignificantMotionTime = 0L
|
||||
|
||||
init {
|
||||
while (horizontalAvgBuffer.size < 3) horizontalAvgBuffer.add(0.0)
|
||||
while (verticalAvgBuffer.size < 3) verticalAvgBuffer.add(0.0)
|
||||
}
|
||||
|
||||
/**
|
||||
* Start head gesture detection
|
||||
*/
|
||||
fun startDetection(doNotStop: Boolean = false, onGestureDetected: (Boolean) -> Unit) {
|
||||
if (isRunning) return
|
||||
|
||||
Log.d(TAG, "Starting gesture detection...")
|
||||
isRunning = true
|
||||
gestureDetectedCallback = onGestureDetected
|
||||
|
||||
clearData()
|
||||
|
||||
prevHorizontal = 0.0
|
||||
prevVertical = 0.0
|
||||
|
||||
airPodsService.sendPacket(START_CMD)
|
||||
|
||||
detectionJob = CoroutineScope(Dispatchers.Default).launch {
|
||||
val startTime = System.currentTimeMillis()
|
||||
|
||||
while (isRunning && (System.currentTimeMillis() - startTime < detectionTimeout)) {
|
||||
delay(50)
|
||||
|
||||
val gesture = detectGestures()
|
||||
if (gesture != null) {
|
||||
withContext(Dispatchers.Main) {
|
||||
audio.playConfirmation(gesture)
|
||||
|
||||
gestureDetectedCallback?.invoke(gesture)
|
||||
stopDetection(doNotStop)
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (isRunning) {
|
||||
Log.d(TAG, "Gesture detection timed out")
|
||||
withContext(Dispatchers.Main) {
|
||||
stopDetection(doNotStop)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop head gesture detection
|
||||
*/
|
||||
fun stopDetection(doNotStop: Boolean = false) {
|
||||
if (!isRunning) return
|
||||
|
||||
Log.d(TAG, "Stopping gesture detection")
|
||||
isRunning = false
|
||||
|
||||
if (!doNotStop) airPodsService.sendPacket(STOP_CMD)
|
||||
|
||||
detectionJob?.cancel()
|
||||
detectionJob = null
|
||||
gestureDetectedCallback = null
|
||||
}
|
||||
|
||||
/**
|
||||
* Process head orientation data received from AirPods
|
||||
*/
|
||||
@RequiresApi(Build.VERSION_CODES.R)
|
||||
fun processHeadOrientation(horizontal: Int, vertical: Int) {
|
||||
if (!isRunning) return
|
||||
|
||||
val horizontalDelta = horizontal - prevHorizontal
|
||||
val verticalDelta = vertical - prevVertical
|
||||
|
||||
val significantHorizontal = abs(horizontalDelta) > IMMEDIATE_FEEDBACK_THRESHOLD
|
||||
val significantVertical = abs(verticalDelta) > IMMEDIATE_FEEDBACK_THRESHOLD
|
||||
|
||||
if (significantHorizontal && (!significantVertical || abs(horizontalDelta) > abs(verticalDelta))) {
|
||||
CoroutineScope(Dispatchers.Main).launch {
|
||||
audio.playDirectional(isVertical = false, value = horizontalDelta)
|
||||
}
|
||||
significantMotion = true
|
||||
lastSignificantMotionTime = System.currentTimeMillis()
|
||||
Log.d(TAG, "Significant HORIZONTAL movement: $horizontalDelta")
|
||||
}
|
||||
else if (significantVertical) {
|
||||
CoroutineScope(Dispatchers.Main).launch {
|
||||
audio.playDirectional(isVertical = true, value = verticalDelta)
|
||||
}
|
||||
significantMotion = true
|
||||
lastSignificantMotionTime = System.currentTimeMillis()
|
||||
Log.d(TAG, "Significant VERTICAL movement: $verticalDelta")
|
||||
}
|
||||
else if (significantMotion &&
|
||||
(System.currentTimeMillis() - lastSignificantMotionTime) > 300) {
|
||||
significantMotion = false
|
||||
}
|
||||
|
||||
prevHorizontal = horizontal.toDouble()
|
||||
prevVertical = vertical.toDouble()
|
||||
|
||||
val smoothHorizontal = applySmoothing(horizontal.toDouble(), horizontalAvgBuffer)
|
||||
val smoothVertical = applySmoothing(vertical.toDouble(), verticalAvgBuffer)
|
||||
|
||||
synchronized(horizontalBuffer) {
|
||||
horizontalBuffer.add(smoothHorizontal)
|
||||
if (horizontalBuffer.size > 100) horizontalBuffer.removeAt(0)
|
||||
}
|
||||
|
||||
synchronized(verticalBuffer) {
|
||||
verticalBuffer.add(smoothVertical)
|
||||
if (verticalBuffer.size > 100) verticalBuffer.removeAt(0)
|
||||
}
|
||||
|
||||
detectPeaksAndTroughs()
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply moving average smoothing
|
||||
*/
|
||||
private fun applySmoothing(newValue: Double, buffer: MutableList<Double>): Double {
|
||||
synchronized(buffer) {
|
||||
buffer.add(newValue)
|
||||
if (buffer.size > 3) buffer.removeAt(0)
|
||||
return buffer.average()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect motion direction changes
|
||||
*/
|
||||
private fun detectPeaksAndTroughs() {
|
||||
if (horizontalBuffer.size < 4 || verticalBuffer.size < 4) return
|
||||
|
||||
val hValues = horizontalBuffer.takeLast(4)
|
||||
val vValues = verticalBuffer.takeLast(4)
|
||||
val hVariance = calculateVariance(hValues)
|
||||
val vVariance = calculateVariance(vValues)
|
||||
|
||||
processDirectionChanges(
|
||||
horizontalBuffer,
|
||||
horizontalIncreasing,
|
||||
hVariance,
|
||||
horizontalPeaks,
|
||||
horizontalTroughs
|
||||
)?.let { horizontalIncreasing = it }
|
||||
|
||||
processDirectionChanges(
|
||||
verticalBuffer,
|
||||
verticalIncreasing,
|
||||
vVariance,
|
||||
verticalPeaks,
|
||||
verticalTroughs
|
||||
)?.let { verticalIncreasing = it }
|
||||
}
|
||||
|
||||
/**
|
||||
* Process direction changes and detect peaks/troughs
|
||||
*/
|
||||
private fun processDirectionChanges(
|
||||
buffer: List<Double>,
|
||||
isIncreasing: Boolean?,
|
||||
variance: Double,
|
||||
peaks: MutableList<Triple<Int, Double, Long>>,
|
||||
troughs: MutableList<Triple<Int, Double, Long>>
|
||||
): Boolean? {
|
||||
if (buffer.size < 2) return isIncreasing
|
||||
|
||||
val current = buffer.last()
|
||||
val prev = buffer[buffer.size - 2]
|
||||
var increasing = isIncreasing ?: (current > prev)
|
||||
|
||||
val dynamicThreshold = max(50.0, min(directionChangeThreshold.toDouble(), variance / 3))
|
||||
|
||||
val now = System.currentTimeMillis()
|
||||
|
||||
if (increasing && current < prev - dynamicThreshold) {
|
||||
if (abs(prev) > peakThreshold) {
|
||||
peaks.add(Triple(buffer.size - 1, prev, now))
|
||||
if (lastPeakTime > 0) {
|
||||
val interval = (now - lastPeakTime) / 1000.0
|
||||
val timeDiff = now - lastPeakTime
|
||||
|
||||
synchronized(peakIntervals) {
|
||||
peakIntervals.add(interval)
|
||||
if (peakIntervals.size > 5) peakIntervals.removeAt(0)
|
||||
}
|
||||
|
||||
synchronized(movementSpeedIntervals) {
|
||||
movementSpeedIntervals.add(timeDiff)
|
||||
if (movementSpeedIntervals.size > 5) movementSpeedIntervals.removeAt(0)
|
||||
}
|
||||
}
|
||||
lastPeakTime = now
|
||||
}
|
||||
increasing = false
|
||||
} else if (!increasing && current > prev + dynamicThreshold) {
|
||||
if (abs(prev) > peakThreshold) {
|
||||
troughs.add(Triple(buffer.size - 1, prev, now))
|
||||
|
||||
if (lastPeakTime > 0) {
|
||||
val interval = (now - lastPeakTime) / 1000.0
|
||||
val timeDiff = now - lastPeakTime
|
||||
|
||||
synchronized(peakIntervals) {
|
||||
peakIntervals.add(interval)
|
||||
if (peakIntervals.size > 5) peakIntervals.removeAt(0)
|
||||
}
|
||||
|
||||
synchronized(movementSpeedIntervals) {
|
||||
movementSpeedIntervals.add(timeDiff)
|
||||
if (movementSpeedIntervals.size > 5) movementSpeedIntervals.removeAt(0)
|
||||
}
|
||||
}
|
||||
lastPeakTime = now
|
||||
}
|
||||
increasing = true
|
||||
}
|
||||
|
||||
return increasing
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate variance of a list of values
|
||||
*/
|
||||
private fun calculateVariance(values: List<Double>): Double {
|
||||
if (values.size <= 1) return 0.0
|
||||
|
||||
val mean = values.average()
|
||||
val squaredDiffs = values.map { (it - mean) * (it - mean) }
|
||||
return squaredDiffs.average()
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate how consistent the timing between peaks is
|
||||
*/
|
||||
private fun calculateRhythmConsistency(): Double {
|
||||
if (peakIntervals.size < 2) return 0.0
|
||||
|
||||
val meanInterval = peakIntervals.average()
|
||||
if (meanInterval == 0.0) return 0.0
|
||||
|
||||
val variances = peakIntervals.map { (it / meanInterval - 1.0).pow(2) }
|
||||
val consistency = 1.0 - min(1.0, variances.average() / rhythmConsistencyThreshold)
|
||||
return max(0.0, consistency)
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate confidence score for gesture detection
|
||||
*/
|
||||
private fun calculateConfidenceScore(extremes: List<Triple<Int, Double, Long>>, isVertical: Boolean): Double {
|
||||
if (extremes.size < getRequiredExtremes()) return 0.0
|
||||
|
||||
val sortedExtremes = extremes.sortedBy { it.first }
|
||||
|
||||
val recent = sortedExtremes.takeLast(getRequiredExtremes())
|
||||
|
||||
val avgAmplitude = recent.map { abs(it.second) }.average()
|
||||
val amplitudeFactor = min(1.0, avgAmplitude / 600)
|
||||
|
||||
val rhythmFactor = calculateRhythmConsistency()
|
||||
|
||||
val signs = recent.map { if (it.second > 0) 1 else -1 }
|
||||
val alternating = (1 until signs.size).all { signs[it] != signs[it - 1] }
|
||||
val alternationFactor = if (alternating) 1.0 else 0.5
|
||||
|
||||
val isolationFactor = if (isVertical) {
|
||||
val vertAmplitude = recent.map { abs(it.second) }.average()
|
||||
val horizVals = horizontalBuffer.takeLast(recent.size * 2)
|
||||
val horizAmplitude = horizVals.map { abs(it) }.average()
|
||||
min(1.0, vertAmplitude / (horizAmplitude + 0.1) * 1.2)
|
||||
} else {
|
||||
val horizAmplitude = recent.map { abs(it.second) }.average()
|
||||
val vertVals = verticalBuffer.takeLast(recent.size * 2)
|
||||
val vertAmplitude = vertVals.map { abs(it) }.average()
|
||||
min(1.0, horizAmplitude / (vertAmplitude + 0.1) * 1.2)
|
||||
}
|
||||
|
||||
return (
|
||||
amplitudeFactor * 0.4 +
|
||||
rhythmFactor * 0.2 +
|
||||
alternationFactor * 0.2 +
|
||||
isolationFactor * 0.2
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the required number of extremes based on movement speed
|
||||
* - Fast movements (short intervals) require more evidence (5 extremes)
|
||||
* - Slow, deliberate movements need fewer evidence points (3 extremes)
|
||||
*/
|
||||
private fun getRequiredExtremes(): Int {
|
||||
if (movementSpeedIntervals.isEmpty()) return MIN_REQUIRED_EXTREMES
|
||||
|
||||
val avgInterval = movementSpeedIntervals.average()
|
||||
Log.d(TAG, "Average movement interval: $avgInterval ms")
|
||||
|
||||
return if (avgInterval < FAST_MOVEMENT_THRESHOLD) {
|
||||
MAX_REQUIRED_EXTREMES
|
||||
} else {
|
||||
MIN_REQUIRED_EXTREMES
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect gestures based on collected motion data
|
||||
*/
|
||||
private fun detectGestures(): Boolean? {
|
||||
val requiredExtremes = getRequiredExtremes()
|
||||
Log.d(TAG, "Current required extremes: $requiredExtremes")
|
||||
|
||||
if (verticalPeaks.size + verticalTroughs.size >= requiredExtremes) {
|
||||
val allExtremes = (verticalPeaks + verticalTroughs).sortedBy { it.first }
|
||||
|
||||
val confidence = calculateConfidenceScore(allExtremes, isVertical = true)
|
||||
|
||||
Log.d(TAG, "Vertical motion confidence: $confidence (need $minConfidenceThreshold)")
|
||||
|
||||
if (confidence >= minConfidenceThreshold) {
|
||||
Log.d(TAG, "\"Yes\" Gesture Detected (confidence: $confidence, extremes: ${allExtremes.size}/$requiredExtremes)")
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
if (horizontalPeaks.size + horizontalTroughs.size >= requiredExtremes) {
|
||||
val allExtremes = (horizontalPeaks + horizontalTroughs).sortedBy { it.first }
|
||||
|
||||
val confidence = calculateConfidenceScore(allExtremes, isVertical = false)
|
||||
|
||||
Log.d(TAG, "Horizontal motion confidence: $confidence (need $minConfidenceThreshold)")
|
||||
|
||||
if (confidence >= minConfidenceThreshold) {
|
||||
Log.d(TAG, "\"No\" Gesture Detected (confidence: $confidence, extremes: ${allExtremes.size}/$requiredExtremes)")
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all buffers and tracking data
|
||||
*/
|
||||
private fun clearData() {
|
||||
horizontalBuffer.clear()
|
||||
verticalBuffer.clear()
|
||||
horizontalPeaks.clear()
|
||||
horizontalTroughs.clear()
|
||||
verticalPeaks.clear()
|
||||
verticalTroughs.clear()
|
||||
peakIntervals.clear()
|
||||
movementSpeedIntervals.clear()
|
||||
horizontalIncreasing = null
|
||||
verticalIncreasing = null
|
||||
lastPeakTime = 0
|
||||
significantMotion = false
|
||||
lastSignificantMotionTime = 0L
|
||||
}
|
||||
|
||||
/**
|
||||
* Extension function for power calculation
|
||||
*/
|
||||
private fun Double.pow(exponent: Int): Double = this.pow(exponent.toDouble())
|
||||
}
|
||||
@@ -0,0 +1,228 @@
|
||||
@file:Suppress("PrivatePropertyName")
|
||||
|
||||
package me.kavishdevar.aln.utils
|
||||
|
||||
import android.content.Context
|
||||
import android.media.AudioAttributes
|
||||
import android.media.AudioDeviceInfo
|
||||
import android.media.AudioFocusRequest
|
||||
import android.media.AudioManager
|
||||
import android.media.SoundPool
|
||||
import android.os.Build
|
||||
import android.os.SystemClock
|
||||
import android.util.Log
|
||||
import androidx.annotation.RequiresApi
|
||||
import me.kavishdevar.aln.R
|
||||
import java.util.concurrent.atomic.AtomicBoolean
|
||||
|
||||
/**
|
||||
* Audio feedback for head gestures using efficient SoundPool API
|
||||
* - Simple audio cues for direction
|
||||
* - Strict channel separation for clarity
|
||||
* - Optimized for low latency
|
||||
*/
|
||||
@RequiresApi(Build.VERSION_CODES.Q)
|
||||
class GestureFeedback(private val context: Context) {
|
||||
|
||||
private val TAG = "GestureFeedback"
|
||||
|
||||
private val soundsLoaded = AtomicBoolean(false)
|
||||
|
||||
private fun forceBluetoothRouting(audioManager: AudioManager) {
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||
val devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)
|
||||
val bluetoothDevice = devices.find {
|
||||
it.type == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP ||
|
||||
it.type == AudioDeviceInfo.TYPE_BLUETOOTH_SCO
|
||||
}
|
||||
|
||||
bluetoothDevice?.let { device ->
|
||||
val focusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)
|
||||
.setAudioAttributes(AudioAttributes.Builder()
|
||||
.setUsage(AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY)
|
||||
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
|
||||
.build())
|
||||
.build()
|
||||
|
||||
audioManager.requestAudioFocus(focusRequest)
|
||||
|
||||
if (!audioManager.isBluetoothScoOn) {
|
||||
audioManager.isBluetoothScoOn = true
|
||||
audioManager.startBluetoothSco()
|
||||
}
|
||||
|
||||
Log.d(TAG, "Forced audio routing to Bluetooth device")
|
||||
}
|
||||
} else {
|
||||
if (!audioManager.isBluetoothScoOn) {
|
||||
audioManager.isBluetoothScoOn = true
|
||||
audioManager.startBluetoothSco()
|
||||
Log.d(TAG, "Started Bluetooth SCO")
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Failed to force Bluetooth routing", e)
|
||||
}
|
||||
}
|
||||
|
||||
private val soundPool = SoundPool.Builder()
|
||||
.setMaxStreams(3)
|
||||
.setAudioAttributes(
|
||||
AudioAttributes.Builder()
|
||||
.setUsage(AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY)
|
||||
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
|
||||
.setFlags(AudioAttributes.FLAG_LOW_LATENCY or
|
||||
AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
|
||||
.build()
|
||||
)
|
||||
.build()
|
||||
|
||||
|
||||
private var soundId = 0
|
||||
private var confirmYesId = 0
|
||||
private var confirmNoId = 0
|
||||
|
||||
private var lastHorizontalTime = 0L
|
||||
private var lastLeftTime = 0L
|
||||
private var lastRightTime = 0L
|
||||
|
||||
private var lastVerticalTime = 0L
|
||||
private var lastUpTime = 0L
|
||||
private var lastDownTime = 0L
|
||||
|
||||
private val MIN_TIME_BETWEEN_SOUNDS = 150L
|
||||
private val MIN_TIME_BETWEEN_DIRECTION = 200L
|
||||
|
||||
private var currentHorizontalStreamId = 0
|
||||
private var currentVerticalStreamId = 0
|
||||
|
||||
|
||||
private val LEFT_VOLUME = Pair(1.0f, 0.0f)
|
||||
private val RIGHT_VOLUME = Pair(0.0f, 1.0f)
|
||||
private val VERTICAL_VOLUME = Pair(1.0f, 1.0f)
|
||||
|
||||
init {
|
||||
soundId = soundPool.load(context, R.raw.blip_no, 1)
|
||||
confirmYesId = soundPool.load(context, R.raw.confirm_yes, 1)
|
||||
confirmNoId = soundPool.load(context, R.raw.confirm_no, 1)
|
||||
|
||||
soundPool.setOnLoadCompleteListener { _, _, _ ->
|
||||
Log.d(TAG, "Sounds loaded")
|
||||
soundsLoaded.set(true)
|
||||
|
||||
soundPool.play(soundId, 0.0f, 0.0f, 1, 0, 1.0f)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Play directional feedback sound with appropriate channel separation
|
||||
* Optimized for minimal latency
|
||||
*/
|
||||
@RequiresApi(Build.VERSION_CODES.R)
|
||||
fun playDirectional(isVertical: Boolean, value: Double) {
|
||||
if (!soundsLoaded.get()) {
|
||||
Log.d(TAG, "Sounds not yet loaded, skipping playback")
|
||||
return
|
||||
}
|
||||
|
||||
val now = SystemClock.uptimeMillis()
|
||||
|
||||
if (isVertical) {
|
||||
val isUp = value > 0
|
||||
|
||||
if (now - lastVerticalTime < MIN_TIME_BETWEEN_SOUNDS) {
|
||||
Log.d(TAG, "Skipping vertical sound due to general vertical debounce")
|
||||
return
|
||||
}
|
||||
|
||||
if (isUp && now - lastUpTime < MIN_TIME_BETWEEN_DIRECTION) {
|
||||
Log.d(TAG, "Skipping UP sound due to direction debounce")
|
||||
return
|
||||
}
|
||||
|
||||
if (!isUp && now - lastDownTime < MIN_TIME_BETWEEN_DIRECTION) {
|
||||
Log.d(TAG, "Skipping DOWN sound due to direction debounce")
|
||||
return
|
||||
}
|
||||
|
||||
if (currentVerticalStreamId > 0) {
|
||||
soundPool.stop(currentVerticalStreamId)
|
||||
}
|
||||
|
||||
val (leftVol, rightVol) = VERTICAL_VOLUME
|
||||
|
||||
currentVerticalStreamId = soundPool.play(soundId, leftVol, rightVol, 1, 0, 1.0f)
|
||||
Log.d(TAG, "Playing VERTICAL sound: ${if (isUp) "UP" else "DOWN"} - streamID=$currentVerticalStreamId")
|
||||
|
||||
lastVerticalTime = now
|
||||
if (isUp) {
|
||||
lastUpTime = now
|
||||
} else {
|
||||
lastDownTime = now
|
||||
}
|
||||
} else {
|
||||
if (now - lastHorizontalTime < MIN_TIME_BETWEEN_SOUNDS) {
|
||||
Log.d(TAG, "Skipping horizontal sound due to general horizontal debounce")
|
||||
return
|
||||
}
|
||||
|
||||
val isRight = value > 0
|
||||
|
||||
if (isRight && now - lastRightTime < MIN_TIME_BETWEEN_DIRECTION) {
|
||||
Log.d(TAG, "Skipping RIGHT sound due to direction debounce")
|
||||
return
|
||||
}
|
||||
|
||||
if (!isRight && now - lastLeftTime < MIN_TIME_BETWEEN_DIRECTION) {
|
||||
Log.d(TAG, "Skipping LEFT sound due to direction debounce")
|
||||
return
|
||||
}
|
||||
|
||||
if (currentHorizontalStreamId > 0) {
|
||||
soundPool.stop(currentHorizontalStreamId)
|
||||
}
|
||||
|
||||
val (leftVol, rightVol) = if (isRight) RIGHT_VOLUME else LEFT_VOLUME
|
||||
|
||||
currentHorizontalStreamId = soundPool.play(soundId, leftVol, rightVol, 1, 0, 1.0f)
|
||||
Log.d(TAG, "Playing HORIZONTAL sound: ${if (isRight) "RIGHT" else "LEFT"} - streamID=$currentHorizontalStreamId")
|
||||
|
||||
lastHorizontalTime = now
|
||||
if (isRight) {
|
||||
lastRightTime = now
|
||||
} else {
|
||||
lastLeftTime = now
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Play confirmation sound for completed gesture
|
||||
*/
|
||||
fun playConfirmation(isYes: Boolean) {
|
||||
if (currentHorizontalStreamId > 0) {
|
||||
soundPool.stop(currentHorizontalStreamId)
|
||||
}
|
||||
if (currentVerticalStreamId > 0) {
|
||||
soundPool.stop(currentVerticalStreamId)
|
||||
}
|
||||
|
||||
val soundId = if (isYes) confirmYesId else confirmNoId
|
||||
if (soundId != 0 && soundsLoaded.get()) {
|
||||
val streamId = soundPool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f)
|
||||
Log.d(TAG, "Playing ${if (isYes) "YES" else "NO"} confirmation - streamID=$streamId")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean up resources
|
||||
*/
|
||||
fun release() {
|
||||
try {
|
||||
soundPool.release()
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Error releasing resources", e)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
package me.kavishdevar.aln.utils
|
||||
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
data class Orientation(val pitch: Float = 0f, val yaw: Float = 0f)
|
||||
data class Acceleration(val vertical: Float = 0f, val horizontal: Float = 0f)
|
||||
|
||||
object HeadTracking {
|
||||
private val _orientation = MutableStateFlow(Orientation())
|
||||
val orientation = _orientation.asStateFlow()
|
||||
|
||||
private val _acceleration = MutableStateFlow(Acceleration())
|
||||
val acceleration = _acceleration.asStateFlow()
|
||||
|
||||
private val calibrationSamples = mutableListOf<Triple<Int, Int, Int>>()
|
||||
private var isCalibrated = false
|
||||
private var o1Neutral = 19000
|
||||
private var o2Neutral = 0
|
||||
private var o3Neutral = 0
|
||||
|
||||
private const val CALIBRATION_SAMPLE_COUNT = 10
|
||||
private const val ORIENTATION_OFFSET = 5500
|
||||
|
||||
fun processPacket(packet: ByteArray) {
|
||||
val o1 = bytesToInt(packet[43], packet[44])
|
||||
val o2 = bytesToInt(packet[45], packet[46])
|
||||
val o3 = bytesToInt(packet[47], packet[48])
|
||||
|
||||
val horizontalAccel = bytesToInt(packet[51], packet[52]).toFloat()
|
||||
val verticalAccel = bytesToInt(packet[53], packet[54]).toFloat()
|
||||
|
||||
if (!isCalibrated) {
|
||||
calibrationSamples.add(Triple(o1, o2, o3))
|
||||
if (calibrationSamples.size >= CALIBRATION_SAMPLE_COUNT) {
|
||||
calibrate()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
val orientation = calculateOrientation(o1, o2, o3)
|
||||
_orientation.value = orientation
|
||||
|
||||
_acceleration.value = Acceleration(verticalAccel, horizontalAccel)
|
||||
}
|
||||
|
||||
private fun calibrate() {
|
||||
if (calibrationSamples.size < 3) return
|
||||
|
||||
// Add offset during calibration
|
||||
o1Neutral = calibrationSamples.map { it.first + ORIENTATION_OFFSET }.average().roundToInt()
|
||||
o2Neutral = calibrationSamples.map { it.second + ORIENTATION_OFFSET }.average().roundToInt()
|
||||
o3Neutral = calibrationSamples.map { it.third + ORIENTATION_OFFSET }.average().roundToInt()
|
||||
|
||||
isCalibrated = true
|
||||
}
|
||||
|
||||
@Suppress("UnusedVariable")
|
||||
private fun calculateOrientation(o1: Int, o2: Int, o3: Int): Orientation {
|
||||
if (!isCalibrated) return Orientation()
|
||||
|
||||
// Add offset before normalizationval
|
||||
val o1Norm = (o1 + ORIENTATION_OFFSET) - o1Neutral
|
||||
val o2Norm = (o2 + ORIENTATION_OFFSET) - o2Neutral
|
||||
val o3Norm = (o3 + ORIENTATION_OFFSET) - o3Neutral
|
||||
|
||||
val pitch = (o2Norm + o3Norm) / 2f / 32000f * 180f
|
||||
val yaw = (o2Norm - o3Norm) / 2f / 32000f * 180f
|
||||
|
||||
return Orientation(pitch, yaw)
|
||||
}
|
||||
|
||||
private fun bytesToInt(b1: Byte, b2: Byte): Int {
|
||||
return (b2.toInt() shl 8) or (b1.toInt() and 0xFF)
|
||||
}
|
||||
|
||||
fun reset() {
|
||||
calibrationSamples.clear()
|
||||
isCalibrated = false
|
||||
_orientation.value = Orientation()
|
||||
_acceleration.value = Acceleration()
|
||||
}
|
||||
}
|
||||
@@ -45,7 +45,8 @@ import me.kavishdevar.aln.services.ServiceManager
|
||||
enum class IslandType {
|
||||
CONNECTED,
|
||||
TAKING_OVER,
|
||||
MOVED_TO_REMOTE
|
||||
MOVED_TO_REMOTE,
|
||||
// CALL_GESTURE
|
||||
}
|
||||
|
||||
class IslandWindow(context: Context) {
|
||||
@@ -84,14 +85,20 @@ class IslandWindow(context: Context) {
|
||||
close()
|
||||
}
|
||||
|
||||
if (type == IslandType.TAKING_OVER) {
|
||||
islandView.findViewById<TextView>(R.id.island_connected_text).text = getString(context, R.string.island_taking_over_text)
|
||||
} else if (type == IslandType.MOVED_TO_REMOTE) {
|
||||
islandView.findViewById<TextView>(R.id.island_connected_text).text = getString(context, R.string.island_moved_to_remote_text)
|
||||
} else if (CrossDevice.isAvailable) {
|
||||
islandView.findViewById<TextView>(R.id.island_connected_text).text = getString(context, R.string.island_connected_remote_text)
|
||||
} else if (type == IslandType.CONNECTED) {
|
||||
islandView.findViewById<TextView>(R.id.island_connected_text).text = getString(context, R.string.island_connected_text)
|
||||
when (type) {
|
||||
IslandType.CONNECTED -> {
|
||||
islandView.findViewById<TextView>(R.id.island_connected_text).text = getString(context, R.string.island_connected_text)
|
||||
}
|
||||
IslandType.TAKING_OVER -> {
|
||||
islandView.findViewById<TextView>(R.id.island_connected_text).text = getString(context, R.string.island_taking_over_text)
|
||||
}
|
||||
IslandType.MOVED_TO_REMOTE -> {
|
||||
islandView.findViewById<TextView>(R.id.island_connected_text).text = getString(context, R.string.island_moved_to_remote_text)
|
||||
}
|
||||
// IslandType.CALL_GESTURE -> {
|
||||
// islandView.findViewById<TextView>(R.id.island_connected_text).text = "Incoming Call from $name"
|
||||
// islandView.findViewById<TextView>(R.id.island_device_name).text = "Use Head Gestures to answer."
|
||||
// }
|
||||
}
|
||||
|
||||
val batteryProgressBar = islandView.findViewById<ProgressBar>(R.id.island_battery_progress)
|
||||
|
||||
@@ -45,7 +45,9 @@ enum class Enums(val value: ByteArray) {
|
||||
NOISE_CANCELLATION_ADAPTIVE(NOISE_CANCELLATION_PREFIX.value + Capabilities.NoiseCancellation.ADAPTIVE.value + SUFFIX.value),
|
||||
SET_CONVERSATION_AWARENESS_OFF(PREFIX.value + SETTINGS.value + CONVERSATION_AWARENESS.value + Capabilities.ConversationAwareness.OFF.value + SUFFIX.value),
|
||||
SET_CONVERSATION_AWARENESS_ON(PREFIX.value + SETTINGS.value + CONVERSATION_AWARENESS.value + Capabilities.ConversationAwareness.ON.value + SUFFIX.value),
|
||||
CONVERSATION_AWARENESS_RECEIVE_PREFIX(PREFIX.value + byteArrayOf(0x4b, 0x00, 0x02, 0x00));
|
||||
CONVERSATION_AWARENESS_RECEIVE_PREFIX(PREFIX.value + byteArrayOf(0x4b, 0x00, 0x02, 0x00)),
|
||||
START_HEAD_TRACKING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0xA1.toByte(), 0x02, 0x42, 0x0B, 0x08, 0x0E, 0x10, 0x02, 0x1A, 0x05, 0x01, 0x40, 0x9C.toByte(), 0x00, 0x00)),
|
||||
STOP_HEAD_TRACKING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x08, 0x7E.toByte(), 0x10, 0x02, 0x42, 0x0B, 0x08, 0x4E.toByte(), 0x10, 0x02, 0x1A, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00));
|
||||
}
|
||||
|
||||
object BatteryComponent {
|
||||
@@ -241,36 +243,105 @@ class Capabilities {
|
||||
}
|
||||
}
|
||||
|
||||
enum class LongPressMode {
|
||||
OFF, TRANSPARENCY, ADAPTIVE, ANC
|
||||
enum class LongPressPackets(val value: ByteArray) {
|
||||
ENABLE_EVERYTHING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0F, 0x00, 0x00, 0x00)),
|
||||
|
||||
DISABLE_OFF_FROM_EVERYTHING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0e, 0x00, 0x00, 0x00)),
|
||||
DISABLE_OFF_FROM_TRANSPARENCY_AND_ADAPTIVE(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0c, 0x00, 0x00, 0x00)),
|
||||
DISABLE_OFF_FROM_TRANSPARENCY_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x06, 0x00, 0x00, 0x00)),
|
||||
DISABLE_OFF_FROM_ADAPTIVE_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0a, 0x00, 0x00, 0x00)),
|
||||
|
||||
ENABLE_OFF_FROM_TRANSPARENCY_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x07, 0x00, 0x00, 0x00)),
|
||||
ENABLE_OFF_FROM_ADAPTIVE_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0b, 0x00, 0x00, 0x00)),
|
||||
ENABLE_OFF_FROM_TRANSPARENCY_AND_ADAPTIVE(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0d, 0x00, 0x00, 0x00)),
|
||||
|
||||
DISABLE_TRANSPARENCY_FROM_EVERYTHING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0b, 0x00, 0x00, 0x00)),
|
||||
DISABLE_TRANSPARENCY_FROM_OFF_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x03, 0x00, 0x00, 0x00)),
|
||||
DISABLE_TRANSPARENCY_FROM_ADAPTIVE_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0a, 0x00, 0x00, 0x00)),
|
||||
DISABLE_TRANSPARENCY_FROM_OFF_AND_ADAPTIVE(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x09, 0x00, 0x00, 0x00)),
|
||||
|
||||
ENABLE_TRANSPARENCY_FROM_OFF_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x07, 0x00, 0x00, 0x00)),
|
||||
ENABLE_TRANSPARENCY_FROM_ADAPTIVE_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0e, 0x00, 0x00, 0x00)),
|
||||
ENABLE_TRANSPARENCY_FROM_OFF_AND_ADAPTIVE(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0d, 0x00, 0x00, 0x00)),
|
||||
|
||||
DISABLE_ANC_FROM_EVERYTHING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0D, 0x00, 0x00, 0x00)),
|
||||
DISABLE_ANC_FROM_OFF_AND_TRANSPARENCY(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x05, 0x00, 0x00, 0x00)),
|
||||
DISABLE_ANC_FROM_ADAPTIVE_AND_TRANSPARENCY(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0c, 0x00, 0x00, 0x00)),
|
||||
DISABLE_ANC_FROM_OFF_AND_ADAPTIVE(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x09, 0x00, 0x00, 0x00)),
|
||||
|
||||
ENABLE_ANC_FROM_OFF_AND_TRANSPARENCY(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x07, 0x00, 0x00, 0x00)),
|
||||
ENABLE_ANC_FROM_ADAPTIVE_AND_TRANSPARENCY(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0e, 0x00, 0x00, 0x00)),
|
||||
ENABLE_ANC_FROM_OFF_AND_ADAPTIVE(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0b, 0x00, 0x00, 0x00)),
|
||||
|
||||
DISABLE_ADAPTIVE_FROM_EVERYTHING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x07, 0x00, 0x00, 0x00)),
|
||||
DISABLE_ADAPTIVE_FROM_OFF_AND_TRANSPARENCY(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x05, 0x00, 0x00, 0x00)),
|
||||
DISABLE_ADAPTIVE_FROM_TRANSPARENCY_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x06, 0x00, 0x00, 0x00)),
|
||||
DISABLE_ADAPTIVE_FROM_OFF_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x03, 0x00, 0x00, 0x00)),
|
||||
|
||||
ENABLE_ADAPTIVE_FROM_OFF_AND_TRANSPARENCY(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0d, 0x00, 0x00, 0x00)),
|
||||
ENABLE_ADAPTIVE_FROM_TRANSPARENCY_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0e, 0x00, 0x00, 0x00)),
|
||||
ENABLE_ADAPTIVE_FROM_OFF_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0b, 0x00, 0x00, 0x00)),
|
||||
|
||||
ENABLE_EVERYTHING_OFF_DISABLED(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0E, 0x00, 0x00, 0x00)),
|
||||
DISABLE_TRANSPARENCY_OFF_DISABLED(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0A, 0x00, 0x00, 0x00)),
|
||||
DISABLE_ADAPTIVE_OFF_DISABLED(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x06, 0x00, 0x00, 0x00)),
|
||||
DISABLE_ANC_OFF_DISABLED(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0C, 0x00, 0x00, 0x00)),
|
||||
}
|
||||
|
||||
data class LongPressPacket(val modes: Set<LongPressMode>) {
|
||||
val value: ByteArray
|
||||
get() {
|
||||
val baseArray = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A)
|
||||
val modeByte = calculateModeByte()
|
||||
return baseArray + byteArrayOf(modeByte, 0x00, 0x00, 0x00)
|
||||
}
|
||||
//enum class LongPressMode {
|
||||
// OFF, TRANSPARENCY, ADAPTIVE, ANC
|
||||
//}
|
||||
//
|
||||
//data class LongPressPacket(val modes: Set<LongPressMode>) {
|
||||
// val value: ByteArray
|
||||
// get() {
|
||||
// val baseArray = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A)
|
||||
// val modeByte = calculateModeByte()
|
||||
// return baseArray + byteArrayOf(modeByte, 0x00, 0x00, 0x00)
|
||||
// }
|
||||
//
|
||||
// private fun calculateModeByte(): Byte {
|
||||
// var modeByte: Byte = 0x00
|
||||
// modes.forEach { mode ->
|
||||
// modeByte = when (mode) {
|
||||
// LongPressMode.OFF -> (modeByte + 0x01).toByte()
|
||||
// LongPressMode.TRANSPARENCY -> (modeByte + 0x02).toByte()
|
||||
// LongPressMode.ADAPTIVE -> (modeByte + 0x04).toByte()
|
||||
// LongPressMode.ANC -> (modeByte + 0x08).toByte()
|
||||
// }
|
||||
// }
|
||||
// return modeByte
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//fun determinePacket(changedIndex: Int, newEnabled: Boolean, oldModes: Set<LongPressMode>, newModes: Set<LongPressMode>): ByteArray? {
|
||||
// return if (newEnabled) {
|
||||
// LongPressPacket(oldModes + newModes.elementAt(changedIndex)).value
|
||||
// } else {
|
||||
// LongPressPacket(oldModes - newModes.elementAt(changedIndex)).value
|
||||
// }
|
||||
//}
|
||||
|
||||
private fun calculateModeByte(): Byte {
|
||||
var modeByte: Byte = 0x00
|
||||
modes.forEach { mode ->
|
||||
modeByte = when (mode) {
|
||||
LongPressMode.OFF -> (modeByte + 0x01).toByte()
|
||||
LongPressMode.TRANSPARENCY -> (modeByte + 0x02).toByte()
|
||||
LongPressMode.ADAPTIVE -> (modeByte + 0x04).toByte()
|
||||
LongPressMode.ANC -> (modeByte + 0x08).toByte()
|
||||
}
|
||||
}
|
||||
return modeByte
|
||||
fun isHeadTrackingData(data: ByteArray): Boolean {
|
||||
// Check minimum size requirement first for efficiency
|
||||
if (data.size <= 60) return false
|
||||
|
||||
// Check if the first 10 bytes match
|
||||
val prefixPattern = byteArrayOf(
|
||||
0x04, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00,
|
||||
0x10, 0x00
|
||||
)
|
||||
|
||||
// Check prefix (first 10 bytes)
|
||||
for (i in prefixPattern.indices) {
|
||||
if (data[i] != prefixPattern[i].toByte()) return false
|
||||
}
|
||||
}
|
||||
|
||||
fun determinePacket(changedIndex: Int, newEnabled: Boolean, oldModes: Set<LongPressMode>, newModes: Set<LongPressMode>): ByteArray? {
|
||||
return if (newEnabled) {
|
||||
LongPressPacket(oldModes + newModes.elementAt(changedIndex)).value
|
||||
} else {
|
||||
LongPressPacket(oldModes - newModes.elementAt(changedIndex)).value
|
||||
}
|
||||
// Check if byte 11 is either 0x44 or 0x45
|
||||
if (data[10] != 0x44.toByte() && data[10] != 0x45.toByte()) return false
|
||||
|
||||
// Check byte 12
|
||||
if (data[11] != 0x00.toByte()) return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
BIN
android/app/src/main/res/raw/blip_no.wav
Normal file
BIN
android/app/src/main/res/raw/blip_yes.wav
Normal file
BIN
android/app/src/main/res/raw/confirm_no.wav
Normal file
BIN
android/app/src/main/res/raw/confirm_yes.wav
Normal file
@@ -17,6 +17,7 @@
|
||||
<string name="adaptive">Adaptive</string>
|
||||
<string name="noise_cancellation">Noise Cancellation</string>
|
||||
<string name="press_and_hold_airpods">Press and Hold AirPods</string>
|
||||
<string name="head_gestures">Head Gestures</string>
|
||||
<string name="left">Left</string>
|
||||
<string name="right">Right</string>
|
||||
<string name="adjusts_volume">Adjusts the volume of media in response to your environment</string>
|
||||
@@ -46,4 +47,6 @@
|
||||
<string name="island_connected_remote_text">Connected to Linux</string>
|
||||
<string name="island_taking_over_text">Moved to phone</string>
|
||||
<string name="island_moved_to_remote_text">Moved to Linux</string>
|
||||
<string name="head_tracking">Head Tracking</string>
|
||||
<string name="head_gestures_details">Nod to answer calls, and shake your head to decline.</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[versions]
|
||||
accompanistPermissions = "0.36.0"
|
||||
agp = "8.8.0"
|
||||
agp = "8.8.2"
|
||||
hiddenapibypass = "4.3"
|
||||
kotlin = "2.0.0"
|
||||
coreKtx = "1.15.0"
|
||||
|
||||
1
head-tracking/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
imgs
|
||||
|
Before Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 97 KiB |
@@ -1,237 +0,0 @@
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D5 01 10 07 1A 3A 0E 00 01 C0 92 F4 B0 7A 14 00 00 06 04 83 A7 F2 99 76 00 00 00 00 DD 9B 6A E8 A7 DD FC FF F2 FF 05 00 23 83 00 0E 27 08 02 00 FD FF 00 00 84 FD E7 02 22 01 91 E3 1A 38 27 06 00 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D6 01 10 07 1A 3A 0E 00 01 F0 5B 58 B3 7A 14 00 00 06 04 83 45 8F 9A 76 00 00 00 00 D9 9B 67 E8 B0 DD F5 FF F3 FF 00 00 23 83 00 0E 27 08 00 00 F9 FF 01 00 84 FD E7 02 22 01 31 B4 1B 38 2F 06 3C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D7 01 10 07 1A 3A 0E 00 01 20 25 BC B5 7A 14 00 00 06 04 83 E3 2B 9B 76 00 00 00 00 D4 9B 5F E8 AD DD F8 FF F9 FF FA FF 23 83 00 0E 27 08 FE FF 01 00 03 00 85 FD E8 02 23 01 A0 6E E5 37 37 06 5A 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D8 01 10 07 1A 3A 0E 00 01 50 EE 1F B8 7A 14 00 00 06 04 43 81 C8 9B 76 00 00 00 00 D1 9B 56 E8 A7 DD 02 00 FB FF 01 00 23 83 00 0E 27 08 00 00 00 00 06 00 85 FD E8 02 24 01 C3 A0 3C 37 3F 06 78 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D9 01 10 07 1A 3A 0E 00 01 80 B7 83 BA 7A 14 00 00 06 04 43 1F 65 9C 76 00 00 00 00 CA 9B 4E E8 B4 DD FF FF EF FF 06 00 23 83 00 0E 27 08 FB FF 00 00 00 00 85 FD E8 02 25 01 55 CB 2C 37 47 06 95 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DA 01 10 07 1A 3A 0E 00 01 B0 80 E7 BC 7A 14 00 00 06 04 43 BD 01 9D 76 00 00 00 00 C1 9B 53 E8 BE DD FC FF 05 00 0B 00 23 83 00 0E 27 08 FA FF FE FF FD FF 85 FD E8 02 25 01 C7 BB 3E 37 4F 06 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DB 01 10 07 1A 3A 0E 00 01 E0 49 4B BF 7A 14 00 00 06 04 43 5B 9E 9D 76 00 00 00 00 BB 9B 63 E8 BB DD F8 FF 04 00 0F 00 23 83 00 0E 27 08 01 00 00 00 00 00 85 FD E8 02 26 01 37 5F 21 37 57 06 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DC 01 10 07 1A 3A 0E 00 01 F8 16 AF C1 7A 14 00 00 06 04 43 FA 3A 9E 76 00 00 00 00 BA 9B 6C E8 B9 DD FF FF FA FF 12 00 23 83 00 0E 27 08 00 00 01 00 00 00 85 FD E9 02 26 01 DA 2E 06 37 5F 06 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DD 01 10 07 1A 3A 0E 00 01 28 E0 12 C4 7A 14 00 00 06 04 43 98 D7 9E 76 00 00 00 00 B4 9B 77 E8 C6 DD 00 00 FD FF 0F 00 24 83 00 0E 27 08 00 00 00 00 00 00 86 FD E9 02 27 01 38 93 E2 36 67 06 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DE 01 10 07 1A 3A 0E 00 01 58 A9 76 C6 7A 14 00 00 06 04 43 36 74 9F 76 00 00 00 00 AC 9B 80 E8 D2 DD F9 FF 00 00 06 00 24 83 00 0E 27 08 FE FF FF FF 00 00 86 FD E9 02 27 01 3D 55 AF 36 6F 06 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DF 01 10 07 1A 3A 0E 00 01 88 72 DA C8 7A 14 00 00 06 04 43 D4 10 A0 76 00 00 00 00 AB 9B 86 E8 D5 DD FA FF F6 FF FF FF 24 83 00 0E 27 08 0B 00 F5 FF 05 00 87 FD E9 02 28 01 B9 28 81 37 77 06 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E0 01 10 07 1A 3A 0E 00 01 B8 3B 3E CB 7A 14 00 00 06 04 83 72 AD A0 76 00 00 00 00 A8 9B 7B E8 E0 DD 0E 00 FE FF 09 00 24 83 00 0E 27 08 FA FF 05 00 01 00 87 FD EA 02 28 01 CD 10 F0 37 7F 06 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E1 01 10 07 1A 3A 0E 00 01 E8 04 A2 CD 7A 14 00 00 06 04 83 10 4A A1 76 00 00 00 00 A8 9B 7E E8 EC DD 08 00 FD FF 0B 00 24 83 00 0E 27 08 FE FF 00 00 FD FF 87 FD EA 02 29 01 A1 90 F5 37 87 06 A2 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E2 01 10 07 1A 3A 0E 00 01 18 CE 05 D0 7A 14 00 00 06 04 83 AE E6 A1 76 00 00 00 00 A8 9B 98 E8 EC DD F9 FF 16 00 16 00 24 83 00 0E 27 08 FF FF FA FF FE FF 88 FD EA 02 29 01 17 76 01 38 8F 06 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E3 01 10 07 1A 3A 0E 00 01 30 9B 69 D2 7A 14 00 00 06 04 83 4D 83 A2 76 00 00 00 00 9D 9B BE E8 E5 DD EB FF 09 00 18 00 24 83 00 0E 27 08 02 00 02 00 04 00 88 FD EA 02 29 01 E8 4E 0E 38 97 06 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E4 01 10 07 1A 3A 0E 00 01 60 64 CD D4 7A 14 00 00 06 04 83 EB 1F A3 76 00 00 00 00 93 9B D6 E8 E6 DD FB FF FC FF 10 00 24 83 00 0E 27 08 02 00 07 00 05 00 89 FD EB 02 2A 01 85 7F 11 38 9F 06 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E5 01 10 07 1A 3A 0E 00 01 90 2D 31 D7 7A 14 00 00 06 04 83 89 BC A3 76 00 00 00 00 8F 9B DD E8 F7 DD 08 00 F4 FF 09 00 24 83 00 0E 27 08 05 00 00 00 02 00 8A FD EB 02 2B 01 F2 37 09 38 A7 06 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E6 01 10 07 1A 3A 0E 00 01 C0 F6 94 D9 7A 14 00 00 06 04 43 27 59 A4 76 00 00 00 00 8B 9B DB E8 12 DE 05 00 FA FF 0B 00 24 83 00 0E 27 08 FC FF 01 00 FD FF 8A FD EC 02 2B 01 55 45 5F 37 AF 06 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E7 01 10 07 1A 3A 0E 00 01 F0 BF F8 DB 7A 14 00 00 06 04 43 C5 F5 A4 76 00 00 00 00 84 9B E4 E8 23 DE F8 FF FA FF 0D 00 24 83 00 0E 27 08 00 00 FF FF FD FF 8B FD EC 02 2B 01 B5 DE 2F 37 B7 06 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E8 01 10 07 1A 3A 0E 00 01 20 89 5C DE 7A 14 00 00 06 04 43 63 92 A5 76 00 00 00 00 78 9B F2 E8 2D DE F0 FF FE FF 0C 00 24 83 00 0E 27 08 00 00 00 00 FD FF 8B FD EC 02 2B 01 18 EF 55 37 BF 06 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E9 01 10 07 1A 3A 0E 00 01 50 52 C0 E0 7A 14 00 00 06 04 43 01 2F A6 76 00 00 00 00 6D 9B FF E8 35 DE F8 FF F9 FF 0E 00 25 83 00 0E 27 08 00 00 06 00 00 00 8C FD ED 02 2C 01 C3 5C 2B 37 C7 06 A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EA 01 10 07 1A 3A 0E 00 01 80 1B 24 E3 7A 14 00 00 06 04 43 9F CB A6 76 00 00 00 00 65 9B 0F E9 41 DE F9 FF 00 00 10 00 25 83 00 0E 27 08 00 00 00 00 FD FF 8C FD ED 02 2C 01 34 5C 0F 37 CF 06 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EB 01 10 07 1A 3A 0E 00 01 98 E8 87 E5 7A 14 00 00 06 04 43 3E 68 A7 76 00 00 00 00 5F 9B 1B E9 3E DE F3 FF 0D 00 FC FF 25 83 00 0E 27 08 00 00 F8 FF FD FF 8D FD ED 02 2C 01 B8 BE 4C 37 D7 06 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EC 01 10 07 1A 3A 0E 00 01 C8 B1 EB E7 7A 14 00 00 06 04 43 DC 04 A8 76 00 00 00 00 5C 9B 20 E9 29 DE F8 FF 06 00 FC FF 25 83 00 0E 27 08 03 00 03 00 05 00 8E FD EE 02 2C 01 DC B4 66 37 DF 06 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 ED 01 10 07 1A 3A 0E 00 01 F8 7A 4F EA 7A 14 00 00 06 04 43 7A A1 A8 76 00 00 00 00 57 9B 18 E9 29 DE 00 00 EE FF 04 00 25 83 00 0E 27 08 00 00 05 00 06 00 8E FD EE 02 2D 01 43 74 87 37 E7 06 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EE 01 10 07 1A 3A 0E 00 01 28 44 B3 EC 7A 14 00 00 06 04 43 18 3E A9 76 00 00 00 00 4F 9B 0D E9 41 DE FC FF E7 FF 00 00 25 83 00 0E 27 08 F5 FF 04 00 FF FF 8E FD EE 02 2E 01 CE B2 9B 37 EF 06 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EF 01 10 07 1A 3A 0E 00 01 58 0D 17 EF 7A 14 00 00 06 04 83 B6 DA A9 76 00 00 00 00 49 9B 12 E9 5B DE 00 00 FE FF 16 00 25 83 00 0E 27 08 F5 FF 03 00 01 00 8E FD EF 02 2E 01 8C 9C 3C 38 F7 06 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F0 01 10 07 1A 3A 0E 00 01 88 D6 7A F1 7A 14 00 00 06 04 83 54 77 AA 76 00 00 00 00 3F 9B 25 E9 78 DE 02 00 F1 FF 21 00 25 83 00 0E 27 08 FC FF 00 00 01 00 8F FD F0 02 2F 01 58 2C 51 38 FF 06 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F1 01 10 07 1A 3A 0E 00 01 B8 9F DE F3 7A 14 00 00 06 04 83 F2 13 AB 76 00 00 00 00 3C 9B 36 E9 8A DE FF FF 08 00 0E 00 25 83 00 0E 27 08 03 00 F7 FF FB FF 8F FD EF 02 2F 01 EB 6C 60 38 07 07 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F2 01 10 07 1A 3A 0E 00 01 D0 6C 42 F6 7A 14 00 00 06 04 83 91 B0 AB 76 00 00 00 00 38 9B 46 E9 86 DE F7 FF 03 00 09 00 25 83 00 0E 27 08 0C 00 FD FF 02 00 90 FD F0 02 2F 01 D6 9B 86 38 0F 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F3 01 10 07 1A 3A 0E 00 01 00 36 A6 F8 7A 14 00 00 06 04 83 2F 4D AC 76 00 00 00 00 2C 9B 52 E9 90 DE F7 FF F2 FF 10 00 25 83 00 0E 27 08 07 00 00 00 04 00 92 FD F0 02 30 01 78 07 8A 38 17 07 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F4 01 10 07 1A 3A 0E 00 01 30 FF 09 FB 7A 14 00 00 06 04 83 CD E9 AC 76 00 00 00 00 1C 9B 58 E9 A6 DE FF FF F5 FF 0A 00 25 83 00 0E 27 08 00 00 05 00 03 00 92 FD F1 02 31 01 10 43 89 38 1F 07 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F5 01 10 07 1A 3A 0E 00 01 60 C8 6D FD 7A 14 00 00 06 04 83 6B 86 AD 76 00 00 00 00 14 9B 60 E9 B7 DE 01 00 F7 FF 0E 00 26 83 00 0E 27 08 01 00 06 00 06 00 93 FD F1 02 31 01 3E 37 34 38 27 07 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F6 01 10 07 1A 3A 0E 00 01 90 91 D1 FF 7A 14 00 00 06 04 83 09 23 AE 76 00 00 00 00 0C 9B 67 E9 CD DE FF FF FA FF 0E 00 26 83 00 0E 27 08 00 00 01 00 00 00 94 FD F2 02 32 01 4A 35 0D 38 2F 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F7 01 10 07 1A 3A 0E 00 01 C0 5A 35 02 7B 14 00 00 06 04 83 A7 BF AE 76 00 00 00 00 07 9B 76 E9 D6 DE FD FF 05 00 0B 00 26 83 00 0E 27 08 00 00 00 00 00 00 94 FD F2 02 32 01 97 17 F9 37 37 07 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F8 01 10 07 1A 3A 0E 00 01 F0 23 99 04 7B 14 00 00 06 04 43 45 5C AF 76 00 00 00 00 05 9B 86 E9 D6 DE FD FF 05 00 08 00 26 83 00 0E 27 08 04 00 01 00 01 00 95 FD F3 02 33 01 78 A3 77 37 3F 07 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F9 01 10 07 1A 3A 0E 00 01 08 F1 FC 06 7B 14 00 00 06 04 43 E4 F8 AF 76 00 00 00 00 02 9B 92 E9 DC DE 01 00 FC FF 0F 00 26 83 00 0E 27 08 02 00 04 00 03 00 96 FD F3 02 34 01 05 E7 1C 37 47 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FA 01 10 07 1A 3A 0E 00 01 38 BA 60 09 7B 14 00 00 06 04 43 82 95 B0 76 00 00 00 00 F9 9A 9D E9 F3 DE FE FF F2 FF 13 00 26 83 00 0E 27 08 00 00 02 00 FE FF 97 FD F4 02 34 01 BE C7 EE 36 4F 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FB 01 10 07 1A 3A 0E 00 01 68 83 C4 0B 7B 14 00 00 06 04 43 20 32 B1 76 00 00 00 00 F0 9A AD E9 07 DF F7 FF FE FF 10 00 26 83 00 0E 27 08 00 00 FC FF FC FF 98 FD F4 02 34 01 E0 8B 83 36 57 07 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FC 01 10 07 1A 3A 0E 00 01 98 4C 28 0E 7B 14 00 00 06 04 43 BE CE B1 76 00 00 00 00 E7 9A BD E9 13 DF 04 00 00 00 0D 00 26 83 00 0E 27 08 07 00 F9 FF FE FF 98 FD F5 02 34 01 24 D0 FD 36 5F 07 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FD 01 10 07 1A 3A 0E 00 01 C8 15 8C 10 7B 14 00 00 06 04 83 5C 6B B2 76 00 00 00 00 E0 9A B8 E9 12 DF 00 00 FE FF FF FF 26 83 00 0E 27 08 FA FF 0E 00 01 00 99 FD F5 02 35 01 45 A0 1C 38 67 07 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FE 01 10 07 1A 3A 0E 00 01 F8 DE EF 12 7B 14 00 00 06 04 83 FA 07 B3 76 00 00 00 00 E6 9A BE E9 0C DF 00 00 02 00 00 00 26 83 00 0E 27 08 08 00 00 00 05 00 9A FD F5 02 35 01 E7 22 35 38 6F 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FF 01 10 07 1A 3A 0E 00 01 28 A8 53 15 7B 14 00 00 06 04 83 98 A4 B3 76 00 00 00 00 E1 9A B5 E9 1C DF FD FF EC FF 00 00 26 83 00 0E 27 08 03 00 FF FF 01 00 9B FD F6 02 36 01 6F F8 37 38 77 07 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 80 02 10 07 1A 3A 0E 00 01 40 75 B7 17 7B 14 00 00 06 04 83 37 41 B4 76 00 00 00 00 DC 9A AE E9 28 DF FE FF F9 FF 00 00 27 83 00 0E 27 08 01 00 FF FF 02 00 9C FD F6 02 37 01 12 6B 35 38 7F 07 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 81 02 10 07 1A 3A 0E 00 01 70 3E 1B 1A 7B 14 00 00 06 04 83 D5 DD B4 76 00 00 00 00 D4 9A AD E9 31 DF FB FF F7 FF 01 00 27 83 00 0E 27 08 01 00 00 00 05 00 9C FD F7 02 37 01 18 63 38 38 87 07 A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 82 02 10 07 1A 3A 0E 00 01 A0 07 7F 1C 7B 14 00 00 06 04 83 73 7A B5 76 00 00 00 00 D0 9A AE E9 38 DF FC FF FE FF FE FF 27 83 00 0E 27 08 00 00 FB FF 01 00 9D FD F7 02 38 01 6E 7B 38 38 8F 07 A2 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 83 02 10 07 1A 3A 0E 00 01 D0 D0 E2 1E 7B 14 00 00 06 04 43 11 17 B6 76 00 00 00 00 D0 9A AE E9 30 DF 02 00 07 00 FC FF 27 83 00 0E 27 08 FF FF 00 00 01 00 9D FD F7 02 38 01 6D 09 A1 37 97 07 91 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 84 02 10 07 1A 3A 0E 00 01 00 9A 46 21 7B 14 00 00 06 04 43 AF B3 B6 76 00 00 00 00 D3 9A B1 E9 24 DF FD FF 01 00 FD FF 27 83 00 0E 27 08 01 00 FD FF 02 00 9D FD F7 02 39 01 11 78 B8 36 9F 07 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 85 02 10 07 1A 3A 0E 00 01 30 63 AA 23 7B 14 00 00 06 04 43 4D 50 B7 76 00 00 00 00 D1 9A B0 E9 1F DF FD FF 05 00 FF FF 27 83 03 0E 27 08 FE FF FF FF FF FF 9E FD F7 02 39 01 BD EA 90 36 A7 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 86 02 10 07 1A 3A 0E 00 01 48 30 0E 26 7B 14 00 00 06 04 43 EC EC B7 76 00 00 00 00 CF 9A B3 E9 1A DF FD FF 01 00 03 00 27 83 03 0E 27 08 00 00 00 00 03 00 9E FD F7 02 39 01 0D 28 8B 36 AF 07 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 87 02 10 07 1A 3A 0E 00 01 78 F9 71 28 7B 14 00 00 06 04 43 8A 89 B8 76 00 00 00 00 CA 9A B4 E9 21 DF 01 00 F9 FF 06 00 27 83 03 0E 27 08 FE FF 02 00 02 00 9F FD F8 02 3A 01 58 E0 A5 36 B7 07 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 88 02 10 07 1A 3A 0E 00 01 A8 C2 D5 2A 7B 14 00 00 06 04 43 28 26 B9 76 00 00 00 00 C8 9A B5 E9 29 DF 04 00 00 00 01 00 27 83 03 0E 27 08 FD FF FF FF FF FF 9F FD F8 02 3A 01 A8 63 8F 36 BF 07 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 89 02 10 07 1A 3A 0E 00 01 D8 8B 39 2D 7B 14 00 00 06 04 43 C6 C2 B9 76 00 00 00 00 CA 9A B7 E9 2A DF 02 00 08 00 04 00 27 83 03 0E 27 08 FA FF 00 00 FB FF 9F FD F8 02 3A 01 5C CE 41 36 C7 07 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8A 02 10 07 1A 3A 0E 00 01 08 55 9D 2F 7B 14 00 00 06 04 43 64 5F BA 76 00 00 00 00 CA 9A CA E9 21 DF FC FF 10 00 11 00 27 83 03 0E 27 08 FD FF 07 00 00 00 9F FD F8 02 3A 01 E5 FF C3 36 CF 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8B 02 10 07 1A 3A 0E 00 01 38 1E 01 32 7B 14 00 00 06 04 43 02 FC BA 76 00 00 00 00 CA 9A E0 E9 1F DF F4 FF 01 00 01 00 27 83 03 0E 27 08 05 00 F8 FF 00 00 A0 FD F8 02 3A 01 24 22 97 37 D7 07 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8C 02 10 07 1A 3A 0E 00 01 68 E7 64 34 7B 14 00 00 06 04 43 A0 98 BB 76 00 00 00 00 CB 9A E6 E9 1F DF 06 00 07 00 09 00 28 83 03 0E 27 08 00 00 06 00 00 00 A0 FD F9 02 3B 01 68 90 D8 37 DF 07 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8D 02 10 07 1A 3A 0E 00 01 80 B4 C8 36 7B 14 00 00 06 04 43 3F 35 BC 76 00 00 00 00 CB 9A ED E9 2E DF 06 00 F0 FF 10 00 28 83 03 0E 27 08 07 00 01 00 01 00 A1 FD F9 02 3B 01 56 4A D7 37 E7 07 A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8E 02 10 07 1A 3A 0E 00 01 B0 7D 2C 39 7B 14 00 00 06 04 83 DD D1 BC 76 00 00 00 00 C4 9A EA E9 4B DF FF FF E6 FF 02 00 28 83 03 0E 27 08 04 00 FC FF FB FF A1 FD F9 02 3B 01 DC 7E 08 38 EF 07 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8F 02 10 07 1A 3A 0E 00 01 E0 46 90 3B 7B 14 00 00 06 04 83 7B 6E BD 76 00 00 00 00 BB 9A DD E9 5A DF F4 FF F6 FF F4 FF 28 83 03 0E 27 08 05 00 FD FF FC FF A2 FD F9 02 3B 01 E8 4C 2C 38 F7 07 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 90 02 10 07 1A 3A 0E 00 01 10 10 F4 3D 7B 14 00 00 06 04 83 19 0B BE 76 00 00 00 00 B0 9A CC E9 5E DF F9 FF EE FF F8 FF 28 83 03 0E 27 08 02 00 03 00 01 00 A3 FD FA 02 3B 01 A5 31 29 38 FF 07 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 91 02 10 07 1A 3A 0E 00 01 40 D9 57 40 7B 14 00 00 06 04 83 B7 A7 BE 76 00 00 00 00 AA 9A B6 E9 67 DF FA FF F2 FF F1 FF 28 83 03 0E 27 08 FA FF 00 00 02 00 A3 FD FA 02 3C 01 68 B1 FC 37 07 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 92 02 10 07 1A 3A 0E 00 01 70 A2 BB 42 7B 14 00 00 06 04 83 55 44 BF 76 00 00 00 00 AA 9A A4 E9 68 DF 04 00 00 00 F9 FF 28 83 03 0E 27 08 F8 FF 05 00 00 00 A3 FD FA 02 3C 01 12 83 00 38 0F 08 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 93 02 10 07 1A 3A 0E 00 01 88 6F 1F 45 7B 14 00 00 06 04 83 F4 E0 BF 76 00 00 00 00 AD 9A A3 E9 64 DF 01 00 07 00 01 00 28 83 03 0E 27 08 FB FF 00 00 00 00 A3 FD FA 02 3C 01 92 9E 0A 38 17 08 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 94 02 10 07 1A 3A 0E 00 01 B8 38 83 47 7B 14 00 00 06 04 83 92 7D C0 76 00 00 00 00 AF 9A AD E9 5C DF FC FF 0F 00 04 00 28 83 03 0E 27 08 FD FF FF FF FD FF A3 FD FA 02 3D 01 19 28 E5 37 1F 08 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 95 02 10 07 1A 3A 0E 00 01 E8 01 E7 49 7B 14 00 00 06 04 43 30 1A C1 76 00 00 00 00 B1 9A BF E9 4D DF FA FF 0C 00 07 00 28 83 03 0E 27 08 02 00 FF FF 00 00 A3 FD FA 02 3D 01 30 94 9D 37 27 08 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 96 02 10 07 1A 3A 0E 00 01 18 CB 4A 4C 7B 14 00 00 06 04 43 CE B6 C1 76 00 00 00 00 AD 9A CD E9 48 DF FE FF 03 00 08 00 28 83 03 0E 27 08 00 00 00 00 00 00 A3 FD FA 02 3D 01 C3 FF 90 37 2F 08 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 97 02 10 07 1A 3A 0E 00 01 48 94 AE 4E 7B 14 00 00 06 04 43 6C 53 C2 76 00 00 00 00 AB 9A D3 E9 43 DF F9 FF 05 00 FC FF 28 83 03 0E 27 08 FF FF FE FF FE FF A3 FD FA 02 3D 01 3C 6C 9D 37 37 08 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 98 02 10 07 1A 3A 0E 00 01 78 5D 12 51 7B 14 00 00 06 04 43 0A F0 C2 76 00 00 00 00 A8 9A D8 E9 3B DF FA FF 06 00 01 00 29 83 03 0E 27 08 00 00 00 00 00 00 A4 FD FA 02 3D 01 0E 05 31 37 3F 08 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 99 02 10 07 1A 3A 0E 00 01 90 2A 76 53 7B 14 00 00 06 04 43 A9 8C C3 76 00 00 00 00 A0 9A DF E9 36 DF F8 FF 00 00 04 00 29 83 03 0E 27 08 01 00 FE FF 00 00 A4 FD FA 02 3E 01 F1 81 AB 36 47 08 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9A 02 10 07 1A 3A 0E 00 01 C0 F3 D9 55 7B 14 00 00 06 04 43 47 29 C4 76 00 00 00 00 98 9A DC E9 33 DF F4 FF FC FF F6 FF 29 83 03 0E 27 08 FA FF 06 00 00 00 A4 FD FA 02 3E 01 5B 10 5D 37 4F 08 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9B 02 10 07 1A 3A 0E 00 01 F0 BC 3D 58 7B 14 00 00 06 04 83 E5 C5 C4 76 00 00 00 00 9B 9A DE E9 2F DF 07 00 06 00 05 00 29 83 03 0E 27 08 FE FF 04 00 04 00 A4 FD FA 02 3E 01 85 2E 02 38 57 08 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9C 02 10 07 1A 3A 0E 00 01 20 86 A1 5A 7B 14 00 00 06 04 83 83 62 C5 76 00 00 00 00 9C 9A DF E9 3A DF 01 00 F9 FF 04 00 29 83 03 0E 27 08 00 00 FE FF 01 00 A4 FD FA 02 3F 01 DA 50 03 38 5F 08 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9D 02 10 07 1A 3A 0E 00 01 50 4F 05 5D 7B 14 00 00 06 04 83 21 FF C5 76 00 00 00 00 9B 9A E1 E9 42 DF 01 00 04 00 05 00 29 83 03 0E 27 08 FF FF 00 00 FE FF A4 FD FA 02 3F 01 8E 5B F6 37 67 08 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9E 02 10 07 1A 3A 0E 00 01 80 18 69 5F 7B 14 00 00 06 04 83 BF 9B C6 76 00 00 00 00 99 9A E5 E9 42 DF FA FF FF FF 00 00 29 83 03 0E 27 08 05 00 FC FF 01 00 A4 FD FA 02 3F 01 14 D2 05 38 6F 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9F 02 10 07 1A 3A 0E 00 01 98 E5 CC 61 7B 14 00 00 06 04 83 5E 38 C7 76 00 00 00 00 95 9A E2 E9 45 DF 00 00 FA FF 00 00 29 83 03 0E 27 08 00 00 00 00 01 00 A5 FD FA 02 3F 01 6D 6A 03 38 77 08 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A0 02 10 07 1A 3A 0E 00 01 C8 AE 30 64 7B 14 00 00 06 04 83 FC D4 C7 76 00 00 00 00 90 9A D7 E9 46 DF FD FF 00 00 F3 FF 29 83 03 0E 27 08 FE FF FF FF FF FF A5 FD FA 02 3F 01 A2 B0 DB 37 7F 08 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A1 02 10 07 1A 3A 0E 00 01 F8 77 94 66 7B 14 00 00 06 04 43 9A 71 C8 76 00 00 00 00 92 9A CF E9 3A DF FC FF 04 00 F7 FF 29 83 03 0E 27 08 00 00 00 00 03 00 A5 FD FA 02 40 01 EE 73 F3 36 87 08 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A2 02 10 07 1A 3A 0E 00 01 28 41 F8 68 7B 14 00 00 06 04 43 38 0E C9 76 00 00 00 00 8F 9A CD E9 34 DF F8 FF FE FF FF FF 29 83 03 0E 27 08 FE FF 01 00 02 00 A5 FD FA 02 40 01 A4 32 C0 36 8F 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A3 02 10 07 1A 3A 0E 00 01 58 0A 5C 6B 7B 14 00 00 06 04 43 D6 AA C9 76 00 00 00 00 8C 9A D0 E9 32 DF FF FF 05 00 01 00 2A 83 03 0E 27 08 FF FF FD FF 02 00 A5 FD FA 02 40 01 47 7D F3 36 97 08 9D 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A4 02 10 07 1A 3A 0E 00 01 88 D3 BF 6D 7B 14 00 00 06 04 43 74 47 CA 76 00 00 00 00 8B 9A D4 E9 30 DF FF FF 00 00 01 00 2A 83 03 0E 27 08 00 00 01 00 04 00 A5 FD FA 02 41 01 68 53 DB 36 9F 08 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A5 02 10 07 1A 3A 0E 00 01 A0 A0 23 70 7B 14 00 00 06 04 43 13 E4 CA 76 00 00 00 00 8C 9A D6 E9 35 DF 05 00 00 00 07 00 2A 83 03 0E 27 08 FD FF FE FF FF FF A4 FD FA 02 41 01 6C CE 06 37 A7 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A6 02 10 07 1A 3A 0E 00 01 D0 69 87 72 7B 14 00 00 06 04 43 B1 80 CB 76 00 00 00 00 8E 9A DD E9 32 DF FC FF 06 00 00 00 2A 83 03 0E 27 08 01 00 FA FF FE FF A5 FD FA 02 41 01 17 D8 2C 37 AF 08 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A7 02 10 07 1A 3A 0E 00 01 00 33 EB 74 7B 14 00 00 06 04 43 4F 1D CC 76 00 00 00 00 8D 9A E5 E9 2B DF F8 FF 01 00 02 00 2A 83 03 0E 27 08 00 00 00 00 00 00 A5 FD FA 02 41 01 37 8E 30 37 B7 08 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A8 02 10 07 1A 3A 0E 00 01 30 FC 4E 77 7B 14 00 00 06 04 43 ED B9 CC 76 00 00 00 00 8C 9A EF E9 2B DF 00 00 FE FF 02 00 2A 83 03 0E 27 08 06 00 F6 FF 00 00 A5 FD FA 02 41 01 6D 5D 9A 37 BF 08 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A9 02 10 07 1A 3A 0E 00 01 60 C5 B2 79 7B 14 00 00 06 04 83 8B 56 CD 76 00 00 00 00 86 9A E7 E9 2F DF 03 00 00 00 02 00 2A 83 03 0E 27 08 F6 FF 08 00 FF FF A5 FD FA 02 41 01 48 62 EB 37 C7 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AA 02 10 07 1A 3A 0E 00 01 90 8E 16 7C 7B 14 00 00 06 04 83 29 F3 CD 76 00 00 00 00 88 9A EE E9 31 DF 00 00 FA FF 0A 00 2A 83 03 0E 27 08 01 00 01 00 03 00 A5 FD FA 02 42 01 8A 3E 00 38 CF 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AB 02 10 07 1A 3A 0E 00 01 A8 5B 7A 7E 7B 14 00 00 06 04 83 C8 8F CE 76 00 00 00 00 80 9A F3 E9 41 DF F7 FF F9 FF 0A 00 2A 83 03 0E 27 08 FC FF FF FF FD FF A5 FD FA 02 42 01 24 FD E6 37 D7 08 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AC 02 10 07 1A 3A 0E 00 01 D8 24 DE 80 7B 14 00 00 06 04 83 66 2C CF 76 00 00 00 00 7B 9A 00 EA 41 DF FA FF 08 00 06 00 2A 83 03 0E 27 08 FF FF 00 00 01 00 A5 FD FA 02 42 01 48 E2 DA 37 DF 08 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AD 02 10 07 1A 3A 0E 00 01 08 EE 41 83 7B 14 00 00 06 04 43 04 C9 CF 76 00 00 00 00 78 9A 0B EA 3D DF FC FF 02 00 04 00 2A 83 03 0E 27 08 00 00 01 00 03 00 A5 FD FA 02 42 01 14 FF C8 37 E7 08 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AE 02 10 07 1A 3A 0E 00 01 38 B7 A5 85 7B 14 00 00 06 04 43 A2 65 D0 76 00 00 00 00 76 9A 13 EA 3C DF F9 FF FF FF 00 00 2A 83 03 0E 27 08 07 00 FC FF 01 00 A6 FD FA 02 42 01 CA 6A CA 37 EF 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AF 02 10 07 1A 3A 0E 00 01 68 80 09 88 7B 14 00 00 06 04 43 40 02 D1 76 00 00 00 00 74 9A 13 EA 39 DF 02 00 09 00 FE FF 2B 83 03 0E 27 08 FE FF 00 00 00 00 A6 FD FA 02 43 01 C4 34 54 37 F7 08 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B0 02 10 07 1A 3A 0E 00 01 98 49 6D 8A 7B 14 00 00 06 04 43 DE 9E D1 76 00 00 00 00 78 9A 14 EA 2F DF FE FF 03 00 FA FF 2B 83 03 0E 27 08 01 00 FD FF FF FF A6 FD FA 02 43 01 48 3F C9 36 FF 08 9B 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B1 02 10 07 1A 3A 0E 00 01 B0 16 D1 8C 7B 14 00 00 06 04 43 7D 3B D2 76 00 00 00 00 76 9A 14 EA 27 DF FC FF 00 00 01 00 2B 83 03 0E 27 08 FF FF 01 00 FF FF A6 FD FA 02 43 01 87 EA D7 36 07 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B2 02 10 07 1A 3A 0E 00 01 E0 DF 34 8F 7B 14 00 00 06 04 43 1B D8 D2 76 00 00 00 00 74 9A 1A EA 22 DF FF FF 04 00 00 00 2B 83 03 0E 27 08 00 00 00 00 02 00 A6 FD FA 02 43 01 F6 A7 DC 36 0F 09 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B3 02 10 07 1A 3A 0E 00 01 10 A9 98 91 7B 14 00 00 06 04 43 B9 74 D3 76 00 00 00 00 73 9A 18 EA 20 DF FE FF 00 00 FD FF 2B 83 03 0E 27 08 00 00 02 00 01 00 A6 FD FA 02 43 01 9A 79 E4 36 17 09 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B4 02 10 07 1A 3A 0E 00 01 40 72 FC 93 7B 14 00 00 06 04 43 57 11 D4 76 00 00 00 00 73 9A 14 EA 20 DF 03 00 FF FF FF FF 2B 83 03 0E 27 08 FE FF 00 00 FF FF A6 FD FA 02 43 01 CB 4F D2 36 1F 09 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B5 02 10 07 1A 3A 0E 00 01 70 3B 60 96 7B 14 00 00 06 04 43 F5 AD D4 76 00 00 00 00 75 9A 10 EA 1C DF FD FF 04 00 F8 FF 2B 83 03 0E 27 08 FF FF FC FF 00 00 A6 FD FA 02 43 01 98 22 B1 36 27 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B6 02 10 07 1A 3A 0E 00 01 A0 04 C4 98 7B 14 00 00 06 04 43 93 4A D5 76 00 00 00 00 74 9A 0C EA 15 DF FF FF 00 00 00 00 2B 83 03 0E 27 08 FD FF 01 00 01 00 A6 FD FA 02 43 01 44 83 CF 36 2F 09 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B7 02 10 07 1A 3A 0E 00 01 B8 D1 27 9B 7B 14 00 00 06 04 43 32 E7 D5 76 00 00 00 00 73 9A 0C EA 11 DF 02 00 05 00 03 00 2B 83 03 0E 27 08 FF FF 00 00 00 00 A6 FD FA 02 43 01 12 0A D5 36 37 09 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B8 02 10 07 1A 3A 0E 00 01 E8 9A 8B 9D 7B 14 00 00 06 04 43 D0 83 D6 76 00 00 00 00 74 9A 0A EA 0B DF F9 FF 01 00 F6 FF 2B 83 03 0E 27 08 F8 FF 04 00 00 00 A6 FD F9 02 43 01 C2 B9 5E 37 3F 09 9D 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B9 02 10 07 1A 3A 0E 00 01 18 64 EF 9F 7B 14 00 00 06 04 83 6E 20 D7 76 00 00 00 00 78 9A 11 EA 04 DF 00 00 0E 00 08 00 2B 83 03 0E 27 08 FA FF 00 00 01 00 A5 FD FA 02 44 01 D3 75 E1 37 47 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BA 02 10 07 1A 3A 0E 00 01 48 2D 53 A2 7B 14 00 00 06 04 83 0C BD D7 76 00 00 00 00 79 9A 1E EA 08 DF 00 00 00 00 0C 00 2C 83 03 0E 27 08 01 00 FC FF FF FF A5 FD FA 02 44 01 46 F5 E8 37 4F 09 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BB 02 10 07 1A 3A 0E 00 01 78 F6 B6 A4 7B 14 00 00 06 04 43 AA 59 D8 76 00 00 00 00 77 9A 2E EA 08 DF 01 00 0C 00 0B 00 2C 83 03 0E 27 08 00 00 00 00 00 00 A5 FD FA 02 44 01 1F C0 DF 37 57 09 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BC 02 10 07 1A 3A 0E 00 01 A8 BF 1A A7 7B 14 00 00 06 04 43 48 F6 D8 76 00 00 00 00 77 9A 3C EA 07 DF 00 00 01 00 09 00 2C 83 03 0E 27 08 04 00 03 00 03 00 A6 FD FA 02 44 01 9E 29 D6 37 5F 09 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BD 02 10 07 1A 3A 0E 00 01 C0 8C 7E A9 7B 14 00 00 06 04 43 E7 92 D9 76 00 00 00 00 77 9A 3E EA 0D DF 04 00 FA FF 02 00 2C 83 03 0E 27 08 04 00 FF FF 01 00 A6 FD FA 02 44 01 D6 89 CA 37 67 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BE 02 10 07 1A 3A 0E 00 01 F0 55 E2 AB 7B 14 00 00 06 04 83 85 2F DA 76 00 00 00 00 75 9A 34 EA 0F DF FC FF FE FF F1 FF 2C 83 03 0E 27 08 04 00 FE FF FC FF A6 FD FA 02 44 01 90 A7 DC 37 6F 09 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BF 02 10 07 1A 3A 0E 00 01 20 1F 46 AE 7B 14 00 00 06 04 43 23 CC DA 76 00 00 00 00 78 9A 27 EA 04 DF 03 00 03 00 F2 FF 2C 83 03 0E 27 08 01 00 00 00 03 00 A6 FD FA 02 44 01 24 73 3B 37 77 09 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C0 02 10 07 1A 3A 0E 00 01 50 E8 A9 B0 7B 14 00 00 06 04 43 C1 68 DB 76 00 00 00 00 7B 9A 18 EA FF DE 00 00 FA FF F6 FF 2C 83 03 0E 27 08 FE FF 00 00 02 00 A6 FD FA 02 44 01 1D 19 26 37 7F 09 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C1 02 10 07 1A 3A 0E 00 01 80 B1 0D B3 7B 14 00 00 06 04 43 5F 05 DC 76 00 00 00 00 7C 9A 12 EA FE DE 04 00 04 00 00 00 2C 83 03 0E 27 08 FC FF FF FF 00 00 A6 FD FA 02 44 01 39 75 3C 37 87 09 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C2 02 10 07 1A 3A 0E 00 01 98 7E 71 B5 7B 14 00 00 06 04 43 FE A1 DC 76 00 00 00 00 7D 9A 13 EA FE DE 00 00 02 00 01 00 2C 83 03 0E 27 08 FD FF FD FF 00 00 A6 FD F9 02 44 01 E5 EA 45 37 8F 09 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C3 02 10 07 1A 3A 0E 00 01 C8 47 D5 B7 7B 14 00 00 06 04 43 9C 3E DD 76 00 00 00 00 7D 9A 1A EA FC DE 01 00 06 00 08 00 2C 83 03 0E 27 08 F9 FF 00 00 FF FF A5 FD F9 02 44 01 DA 97 68 37 97 09 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C4 02 10 07 1A 3A 0E 00 01 F8 10 39 BA 7B 14 00 00 06 04 43 3A DB DD 76 00 00 00 00 81 9A 2A EA F5 DE 00 00 0B 00 09 00 2C 83 03 0E 27 08 01 00 FE FF 01 00 A5 FD F9 02 44 01 12 7A 10 37 9F 09 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C5 02 10 07 1A 3A 0E 00 01 28 DA 9C BC 7B 14 00 00 06 04 43 D8 77 DE 76 00 00 00 00 81 9A 35 EA F5 DE 04 00 00 00 09 00 2C 83 03 0E 27 08 00 00 01 00 00 00 A5 FD F9 02 44 01 92 33 EC 36 A7 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C6 02 10 07 1A 3A 0E 00 01 58 A3 00 BF 7B 14 00 00 06 04 43 76 14 DF 76 00 00 00 00 85 9A 3A EA FD DE 0A 00 02 00 04 00 2D 83 03 0E 27 08 FC FF 00 00 FB FF A5 FD F9 02 44 01 D8 CE 06 37 AF 09 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C7 02 10 07 1A 3A 0E 00 01 88 6C 64 C1 7B 14 00 00 06 04 43 14 B1 DF 76 00 00 00 00 8B 9A 3D EA F4 DE 03 00 0E 00 FE FF 2D 83 03 0E 27 08 00 00 FF FF FD FF A5 FD F9 02 43 01 25 A8 D6 36 B7 09 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C8 02 10 07 1A 3A 0E 00 01 A0 39 C8 C3 7B 14 00 00 06 04 43 B3 4D E0 76 00 00 00 00 91 9A 3B EA EC DE F8 FF FB FF F4 FF 2D 83 03 0E 27 08 03 00 F8 FF FE FF A5 FD F9 02 43 01 E4 B1 A0 37 BF 09 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C9 02 10 07 1A 3A 0E 00 01 D0 02 2C C6 7B 14 00 00 06 04 83 51 EA E0 76 00 00 00 00 92 9A 30 EA E9 DE 05 00 03 00 00 00 2D 83 03 0E 27 08 FB FF 03 00 00 00 A5 FD F9 02 43 01 E3 99 D9 37 C7 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CA 02 10 07 1A 3A 0E 00 01 00 CC 8F C8 7B 14 00 00 06 04 43 EF 86 E1 76 00 00 00 00 92 9A 2C EA F1 DE 01 00 F3 FF 05 00 2D 83 03 0E 27 08 01 00 00 00 02 00 A5 FD F9 02 43 01 C4 9A D1 37 CF 09 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CB 02 10 07 1A 3A 0E 00 01 30 95 F3 CA 7B 14 00 00 06 04 83 8D 23 E2 76 00 00 00 00 8E 9A 2C EA 03 DF 05 00 FB FF 0C 00 2D 83 03 0E 27 08 FC FF FE FF FE FF A5 FD F9 02 43 01 F3 64 D5 37 D7 09 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CC 02 10 07 1A 3A 0E 00 01 60 5E 57 CD 7B 14 00 00 06 04 83 2B C0 E2 76 00 00 00 00 8B 9A 33 EA 08 DF F7 FF 02 00 04 00 2D 83 03 0E 27 08 00 00 FD FF FF FF A5 FD F9 02 43 01 3A 44 E0 37 DF 09 A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CD 02 10 07 1A 3A 0E 00 01 78 2B BB CF 7B 14 00 00 06 04 83 CA 5C E3 76 00 00 00 00 86 9A 3E EA 07 DF FD FF 04 00 08 00 2D 83 03 0E 27 08 FD FF 03 00 FF FF A5 FD F9 02 43 01 0E C9 E4 37 E7 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CE 02 10 07 1A 3A 0E 00 01 A8 F4 1E D2 7B 14 00 00 06 04 43 68 F9 E3 76 00 00 00 00 87 9A 4B EA FC DE FA FF 13 00 FC FF 2D 83 03 0E 27 08 00 00 FC FF FD FF A5 FD F9 02 42 01 85 9A B3 37 EF 09 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CF 02 10 07 1A 3A 0E 00 01 D8 BD 82 D4 7B 14 00 00 06 04 43 06 96 E4 76 00 00 00 00 8B 9A 51 EA E2 DE F8 FF 13 00 F9 FF 2D 83 03 0E 27 08 FF FF 02 00 FE FF A5 FD F9 02 42 01 A0 A9 42 37 F7 09 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D0 02 10 07 1A 3A 0E 00 01 08 87 E6 D6 7B 14 00 00 06 04 43 A4 32 E5 76 00 00 00 00 8E 9A 58 EA CE DE F7 FF 0A 00 00 00 2D 83 03 0E 27 08 01 00 02 00 00 00 A5 FD FA 02 42 01 09 DC 57 37 FF 09 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D1 02 10 07 1A 3A 0E 00 01 38 50 4A D9 7B 14 00 00 06 04 43 42 CF E5 76 00 00 00 00 85 9A 68 EA CD DE F2 FF FF FF 0F 00 2D 83 03 0E 27 08 01 00 05 00 00 00 A5 FD FA 02 42 01 74 E1 79 37 07 0A A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D2 02 10 07 1A 3A 0E 00 01 68 19 AE DB 7B 14 00 00 06 04 43 E0 6B E6 76 00 00 00 00 78 9A 80 EA DB DE F8 FF FB FF 14 00 2E 83 03 0E 27 08 01 00 03 00 01 00 A5 FD FA 02 42 01 73 73 75 37 0F 0A A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D3 02 10 07 1A 3A 0E 00 01 80 E6 11 DE 7B 14 00 00 06 04 43 7F 08 E7 76 00 00 00 00 71 9A 90 EA EA DE FF FF FE FF 0D 00 2E 83 03 0E 27 08 02 00 FF FF FE FF A5 FD FA 02 42 01 FD 64 76 37 17 0A A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D4 02 10 07 1A 3A 0E 00 01 B0 AF 75 E0 7B 14 00 00 06 04 43 1D A5 E7 76 00 00 00 00 6E 9A 96 EA F1 DE 03 00 00 00 03 00 2E 83 03 0E 27 08 00 00 00 00 00 00 A6 FD FA 02 42 01 85 02 43 37 1F 0A 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D5 02 10 07 1A 3A 0E 00 01 E0 78 D9 E2 7B 14 00 00 06 04 43 BB 41 E8 76 00 00 00 00 6F 9A 8E EA F0 DE 00 00 FE FF F4 FF 2E 83 03 0E 27 08 00 00 FE FF FF FF A6 FD FA 02 42 01 50 1D 52 37 27 0A A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D6 02 10 07 1A 3A 0E 00 01 10 42 3D E5 7B 14 00 00 06 04 43 59 DE E8 76 00 00 00 00 71 9A 7F EA F1 DE 05 00 F5 FF F9 FF 2E 83 03 0E 27 08 00 00 FF FF FF FF A6 FD FA 02 42 01 45 B6 2A 37 2F 0A A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D7 02 10 07 1A 3A 0E 00 01 40 0B A1 E7 7B 14 00 00 06 04 43 F7 7A E9 76 00 00 00 00 70 9A 74 EA F9 DE 0A 00 F9 FF 01 00 2E 83 03 0E 27 08 FC FF FC FF FE FF A6 FD FA 02 42 01 E4 9F 39 37 37 0A A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D8 02 10 07 1A 3A 0E 00 01 58 D8 04 EA 7B 14 00 00 06 04 43 96 17 EA 76 00 00 00 00 6C 9A 66 EA F8 DE F4 FF F9 FF EF FF 2E 83 03 0E 27 08 F7 FF 01 00 FB FF A6 FD FA 02 42 01 D8 CC E5 37 3F 0A A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D9 02 10 07 1A 3A 0E 00 01 88 A1 68 EC 7B 14 00 00 06 04 83 34 B4 EA 76 00 00 00 00 6E 9A 67 EA EF DE FC FF 01 00 01 00 2E 83 03 0E 27 08 00 00 03 00 05 00 A6 FD FA 02 42 01 75 41 28 38 47 0A A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DA 02 10 07 1A 3A 0E 00 01 B8 6A CC EE 7B 14 00 00 06 04 83 D2 50 EB 76 00 00 00 00 6A 9A 60 EA FF DE 00 00 F0 FF 01 00 2E 83 03 0E 27 08 00 00 F9 FF 00 00 A6 FD FA 02 42 01 7A 2B 2C 38 4F 0A A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DB 02 10 07 1A 3A 0E 00 01 E8 33 30 F1 7B 14 00 00 06 04 83 70 ED EB 76 00 00 00 00 65 9A 5D EA 08 DF 00 00 00 00 06 00 2E 83 03 0E 27 08 FC FF FF FF FF FF A6 FD FA 02 42 01 D7 03 26 38 57 0A A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DC 02 10 07 1A 3A 0E 00 01 18 FD 93 F3 7B 14 00 00 06 04 83 0E 8A EC 76 00 00 00 00 5E 9A 69 EA 0A DF F6 FF 00 00 09 00 2E 83 03 0E 27 08 00 00 00 00 04 00 A6 FD FA 02 43 01 F1 AB 23 38 5F 0A 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DD 02 10 07 1A 3A 0E 00 01 30 CA F7 F5 7B 14 00 00 06 04 83 AD 26 ED 76 00 00 00 00 58 9A 74 EA 0F DF 00 00 02 00 0D 00 2F 83 03 0E 27 08 01 00 FC FF 03 00 A6 FD FA 02 43 01 2A 43 1A 38 67 0A A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DE 02 10 07 1A 3A 0E 00 01 60 93 5B F8 7B 14 00 00 06 04 43 4B C3 ED 76 00 00 00 00 54 9A 7B EA 11 DF 02 00 01 00 07 00 2F 83 03 0E 27 08 FD FF 04 00 02 00 A6 FD FA 02 43 01 80 4C BC 37 6F 0A A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DF 02 10 07 1A 3A 0E 00 01 90 5C BF FA 7B 14 00 00 06 04 43 E9 5F EE 76 00 00 00 00 55 9A 86 EA 18 DF 06 00 04 00 10 00 2F 83 03 0E 27 08 FE FF 00 00 00 00 A6 FD FA 02 43 01 B6 51 49 37 77 0A A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E0 02 10 07 1A 3A 0E 00 01 C0 25 23 FD 7B 14 00 00 06 04 43 87 FC EE 76 00 00 00 00 54 9A 96 EA 1F DF FF FF 07 00 12 00 2F 83 03 0E 27 08 FC FF 01 00 FF FF A6 FD FA 02 43 01 45 7E 2F 37 7F 0A 9B 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E1 02 10 07 1A 3A 0E 00 01 F0 EE 86 FF 7B 14 00 00 06 04 43 25 99 EF 76 00 00 00 00 52 9A AC EA 21 DF FF FF 05 00 0E 00 2F 83 03 0E 27 08 02 00 00 00 01 00 A6 FD FA 02 43 01 14 1E 0A 37 87 0A A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E2 02 10 07 1A 3A 0E 00 01 20 B8 EA 01 7C 14 00 00 06 04 43 C3 35 F0 76 00 00 00 00 4E 9A B4 EA 26 DF FC FF FC FF 05 00 2F 83 03 0E 27 08 01 00 00 00 00 00 A7 FD FB 02 44 01 E7 E1 25 37 8F 0A A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E3 02 10 07 1A 3A 0E 00 01 38 85 4E 04 7C 14 00 00 06 04 43 62 D2 F0 76 00 00 00 00 4B 9A B4 EA 2E DF FF FF FA FF 01 00 2F 83 03 0E 27 08 00 00 FE FF 00 00 A7 FD FB 02 44 01 50 23 1F 37 97 0A 91 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E4 02 10 07 1A 3A 0E 00 01 68 4E B2 06 7C 14 00 00 06 04 43 00 6F F1 76 00 00 00 00 47 9A AE EA 36 DF FD FF F7 FF FD FF 2F 83 03 0E 27 08 FE FF FF FF 00 00 A8 FD FB 02 44 01 DC 57 07 37 9F 0A A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E5 02 10 07 1A 3A 0E 00 01 98 17 16 09 7C 14 00 00 06 04 43 9E 0B F2 76 00 00 00 00 44 9A A6 EA 39 DF 00 00 FD FF FE FF 2F 83 03 0E 27 08 FE FF 01 00 01 00 A8 FD FB 02 44 01 CB E1 93 36 A7 0A A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E6 02 10 07 1A 3A 0E 00 01 C8 E0 79 0B 7C 14 00 00 06 04 43 3C A8 F2 76 00 00 00 00 40 9A A4 EA 3A DF 07 00 04 00 0A 00 2F 83 03 0E 27 08 FC FF 03 00 01 00 A8 FD FB 02 44 01 1E 35 16 37 AF 0A A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E7 02 10 07 1A 3A 0E 00 01 F8 A9 DD 0D 7C 14 00 00 06 04 43 DA 44 F3 76 00 00 00 00 3E 9A A3 EA 39 DF EF FF FD FF F3 FF 2F 83 03 0E 27 08 FA FF FE FF 00 00 A8 FD FB 02 44 01 0F F8 D8 37 B7 0A A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E8 02 10 07 1A 3A 0E 00 01 10 77 41 10 7C 14 00 00 06 04 83 79 E1 F3 76 00 00 00 00 41 9A A6 EA 29 DF 01 00 14 00 00 00 2F 83 03 0E 27 08 FE FF 04 00 04 00 A8 FD FB 02 45 01 17 BB 3E 38 BF 0A 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E9 02 10 07 1A 3A 0E 00 01 40 40 A5 12 7C 14 00 00 06 04 83 17 7E F4 76 00 00 00 00 45 9A A5 EA 2E DF 0A 00 F4 FF 08 00 30 83 03 0E 27 08 03 00 FF FF 03 00 A8 FD FC 02 45 01 AC D9 40 38 C7 0A A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EA 02 10 07 1A 3A 0E 00 01 70 09 09 15 7C 14 00 00 06 04 83 B5 1A F5 76 00 00 00 00 45 9A A0 EA 3E DF 07 00 F9 FF 06 00 30 83 03 0E 27 08 FB FF FF FF FD FF A9 FD FB 02 45 01 2A 13 46 38 CF 0A A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EB 02 10 07 1A 3A 0E 00 01 A0 D2 6C 17 7C 14 00 00 06 04 83 53 B7 F5 76 00 00 00 00 42 9A A5 EA 42 DF FA FF 04 00 03 00 30 83 03 0E 27 08 FF FF FD FF FD FF A9 FD FB 02 45 01 58 03 4C 38 D7 0A 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EC 02 10 07 1A 3A 0E 00 01 D0 9B D0 19 7C 14 00 00 06 04 83 F1 53 F6 76 00 00 00 00 3D 9A A9 EA 42 DF FF FF 03 00 04 00 30 83 03 0E 27 08 FC FF 03 00 00 00 A9 FD FB 02 45 01 62 22 45 38 DF 0A 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 ED 02 10 07 1A 3A 0E 00 01 E8 68 34 1C 7C 14 00 00 06 04 83 90 F0 F6 76 00 00 00 00 3E 9A A6 EA 3B DF FF FF 04 00 F8 FF 30 83 03 0E 27 08 FF FF 03 00 00 00 A9 FD FC 02 45 01 8F 58 F8 37 E7 0A A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EE 02 10 07 1A 3A 0E 00 01 18 32 98 1E 7C 14 00 00 06 04 43 2E 8D F7 76 00 00 00 00 44 9A A2 EA 34 DF 03 00 02 00 FE FF 30 83 03 0E 27 08 FE FF 01 00 01 00 A9 FD FC 02 45 01 EA B8 3E 37 EF 0A A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EF 02 10 07 1A 3A 0E 00 01 48 FB FB 20 7C 14 00 00 06 04 43 CC 29 F8 76 00 00 00 00 48 9A A1 EA 35 DF 02 00 01 00 02 00 30 83 03 0E 27 08 FE FF FB FF FD FF A9 FD FC 02 45 01 0F 85 43 37 F7 0A A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F0 02 10 07 1A 3A 0E 00 01 78 C4 5F 23 7C 14 00 00 06 04 43 6A C6 F8 76 00 00 00 00 49 9A A6 EA 31 DF FC FF 09 00 00 00 30 83 03 0E 27 08 00 00 FA FF FD FF A9 FD FC 02 45 01 7E 66 65 37 FF 0A A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F1 02 10 07 1A 3A 0E 00 01 A8 8D C3 25 7C 14 00 00 06 04 43 08 63 F9 76 00 00 00 00 44 9A AE EA 2D DF F6 FF FB FF 07 00 30 83 03 0E 27 08 01 00 02 00 00 00 AA FD FC 02 45 01 FF 03 55 37 07 0B A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F2 02 10 07 1A 3A 0E 00 01 D8 56 27 28 7C 14 00 00 06 04 43 A6 FF F9 76 00 00 00 00 3F 9A B7 EA 38 DF 02 00 FD FF 0B 00 30 83 03 0E 27 08 00 00 FF FF FF FF AA FD FC 02 45 01 68 B0 82 37 0F 0B A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F3 02 10 07 1A 3A 0E 00 01 F0 23 8B 2A 7C 14 00 00 06 04 43 45 9C FA 76 00 00 00 00 3A 9A BB EA 3B DF FC FF FD FF 01 00 30 83 03 0E 27 08 FD FF 03 00 00 00 AA FD FC 02 45 01 D1 D2 8C 37 17 0B A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F4 02 10 07 1A 3A 0E 00 01 20 ED EE 2C 7C 14 00 00 06 04 43 E3 38 FB 76 00 00 00 00 37 9A BD EA 3E DF FF FF 02 00 02 00 30 83 03 0E 27 08 FF FF 02 00 00 00 AA FD FC 02 45 01 30 73 93 37 1F 0B 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F5 02 10 07 1A 3A 0E 00 01 50 B6 52 2F 7C 14 00 00 06 04 43 81 D5 FB 76 00 00 00 00 35 9A BD EA 3B DF 06 00 03 00 02 00 31 83 03 0E 27 08 01 00 00 00 02 00 AA FD FC 02 45 01 34 C4 8E 37 27 0B A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F6 02 10 07 1A 3A 0E 00 01 80 7F B6 31 7C 14 00 00 06 04 83 1F 72 FC 76 00 00 00 00 35 9A B2 EA 3A DF 00 00 F5 FF F6 FF 31 83 03 0E 27 08 FA FF 07 00 00 00 AA FD FC 02 46 01 98 63 F8 37 2F 0B A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F7 02 10 07 1A 3A 0E 00 01 B0 48 1A 34 7C 14 00 00 06 04 83 BD 0E FD 76 00 00 00 00 3F 9A AE EA 3B DF 09 00 08 00 01 00 31 83 03 0E 27 08 01 00 FE FF 01 00 AA FD FC 02 46 01 8C 32 2C 38 37 0B 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F8 02 10 07 1A 3A 0E 00 01 C8 15 7E 36 7C 14 00 00 06 04 83 5C AB FD 76 00 00 00 00 3A 9A AC EA 4B DF FA FF E7 FF 07 00 31 83 03 0E 27 08 01 00 00 00 00 00 AB FD FC 02 46 01 A0 A9 26 38 3F 0B 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F9 02 10 07 1A 3A 0E 00 01 F8 DE E1 38 7C 14 00 00 06 04 83 FA 47 FE 76 00 00 00 00 31 9A AB EA 66 DF 00 00 04 00 08 00 31 83 03 0E 27 08 F6 FF FA FF F6 FF AA FD FC 02 46 01 6F 98 2B 38 47 0B A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FA 02 10 07 1A 3A 0E 00 01 28 A8 45 3B 7C 14 00 00 06 04 83 98 E4 FE 76 00 00 00 00 2E 9A B0 EA 5C DF F6 FF 00 00 FB FF 31 83 03 0E 27 08 03 00 01 00 00 00 AA FD FC 02 46 01 28 CB 2F 38 4F 0B A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FB 02 10 07 1A 3A 0E 00 01 58 71 A9 3D 7C 14 00 00 06 04 83 36 81 FF 76 00 00 00 00 2E 9A A9 EA 59 DF 05 00 FD FF 00 00 31 83 03 0E 27 08 FD FF 01 00 01 00 AB FD FC 02 46 01 50 B5 2F 38 57 0B A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FC 02 10 07 1A 3A 0E 00 01 88 3A 0D 40 7C 14 00 00 06 04 83 D4 1D 00 77 00 00 00 00 2F 9A 9F EA 55 DF FF FF 00 00 F5 FF 31 83 03 0E 27 08 FE FF 01 00 00 00 AB FD FC 02 46 01 4C BA 05 38 5F 0B A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FD 02 10 07 1A 3A 0E 00 01 A0 07 71 42 7C 14 00 00 06 04 43 73 BA 00 77 00 00 00 00 31 9A 9A EA 50 DF 01 00 03 00 01 00 31 83 03 0E 27 08 FB FF 01 00 00 00 AB FD FC 02 46 01 CD 66 8C 37 67 0B A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FE 02 10 07 1A 3A 0E 00 01 D0 D0 D4 44 7C 14 00 00 06 04 43 11 57 01 77 00 00 00 00 33 9A 9C EA 52 DF 01 00 02 00 04 00 31 83 03 0E 27 08 FF FF FC FF 01 00 AB FD FC 02 46 01 53 35 78 37 6F 0B A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FF 02 10 07 1A 3A 0E 00 01 00 9A 38 47 7C 14 00 00 06 04 43 AF F3 01 77 00 00 00 00 31 9A A1 EA 4F DF FA FF 03 00 03 00 31 83 03 0E 27 08 FE FF FE FF 00 00 AB FD FC 02 46 01 D8 9D 59 37 77 0B A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 80 03 10 07 1A 3A 0E 00 01 30 63 9C 49 7C 14 00 00 06 04 43 4D 90 02 77 00 00 00 00 2A 9A AA EA 52 DF F5 FF FA FF 08 00 32 83 03 0E 27 08 FC FF 00 00 00 00 AB FD FC 02 47 01 86 4A 18 37 7F 0B 9A 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 81 03 10 07 1A 3A 0E 00 01 60 2C 00 4C 7C 14 00 00 06 04 43 EB 2C 03 77 00 00 00 00 23 9A B4 EA 56 DF FE FF 09 00 05 00 32 83 03 0E 27 08 FB FF FD FF FD FF AA FD FC 02 47 01 CC E5 22 37 87 0B A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 82 03 10 07 1A 3A 0E 00 01 78 F9 63 4E 7C 14 00 00 06 04 43 8A C9 03 77 00 00 00 00 24 9A B8 EA 4F DF 01 00 FB FF 00 00 32 83 03 0E 27 08 03 00 00 00 03 00 AB FD FC 02 47 01 6E 46 FE 36 8F 0B 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 83 03 10 07 1A 3A 0E 00 01 A8 C2 C7 50 7C 14 00 00 06 04 43 28 66 04 77 00 00 00 00 24 9A B3 EA 59 DF 01 00 F5 FF 04 00 32 83 03 0E 27 08 00 00 FE FF FF FF AB FD FC 02 47 01 54 C5 CE 36 97 0B 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 84 03 10 07 1A 3A 0E 00 01 D8 8B 2B 53 7C 14 00 00 06 04 43 C6 02 05 77 00 00 00 00 20 9A B3 EA 5F DF 03 00 08 00 04 00 32 83 03 0E 27 08 FF FF F8 FF FA FF AB FD FC 02 47 01 A3 DE E5 36 9F 0B 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 85 03 10 07 1A 3A 0E 00 01 08 55 8F 55 7C 14 00 00 06 04 83 64 9F 05 77 00 00 00 00 1B 9A B0 EA 58 DF F7 FF FC FF FA FF 32 83 03 0E 27 08 F9 FF 0B 00 00 00 AB FD FC 02 47 01 6C 63 DA 37 A7 0B A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 86 03 10 07 1A 3A 0E 00 01 38 1E F3 57 7C 14 00 00 06 04 83 02 3C 06 77 00 00 00 00 1D 9A B6 EA 54 DF 02 00 03 00 05 00 32 83 03 0E 27 08 00 00 00 00 03 00 AB FD FC 02 47 01 7F 7F 37 38 AF 0B A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 87 03 10 07 1A 3A 0E 00 01 50 EB 56 5A 7C 14 00 00 06 04 83 A1 D8 06 77 00 00 00 00 1B 9A B9 EA 5F DF F9 FF F8 FF 02 00 32 83 03 0E 27 08 00 00 FE FF FF FF AB FD FC 02 48 01 50 82 34 38 B7 0B 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 88 03 10 07 1A 3A 0E 00 01 80 B4 BA 5C 7C 14 00 00 06 04 83 3F 75 07 77 00 00 00 00 1A 9A C0 EA 61 DF FE FF 06 00 04 00 32 83 03 0E 27 08 02 00 FA FF 01 00 AC FD FC 02 48 01 1D D2 3C 38 BF 0B A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 89 03 10 07 1A 3A 0E 00 01 B0 7D 1E 5F 7C 14 00 00 06 04 83 DD 11 08 77 00 00 00 00 12 9A C6 EA 5F DF F3 FF FE FF 01 00 32 83 03 0E 27 08 01 00 00 00 02 00 AC FD FC 02 48 01 62 D5 45 38 C7 0B A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8A 03 10 07 1A 3A 0E 00 01 E0 46 82 61 7C 14 00 00 06 04 83 7B AE 08 77 00 00 00 00 0E 9A C8 EA 64 DF 04 00 FD FF 04 00 32 83 03 0E 27 08 00 00 FE FF 00 00 AC FD FD 02 48 01 4F 78 51 38 CF 0B A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8B 03 10 07 1A 3A 0E 00 01 10 10 E6 63 7C 14 00 00 06 04 83 19 4B 09 77 00 00 00 00 0B 9A C4 EA 66 DF FF FF FD FF FC FF 32 83 03 0E 27 08 00 00 00 00 01 00 AC FD FC 02 49 01 C1 A9 16 38 D7 0B A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8C 03 10 07 1A 3A 0E 00 01 28 DD 49 66 7C 14 00 00 06 04 43 B8 E7 09 77 00 00 00 00 09 9A C1 EA 69 DF 06 00 FF FF 05 00 33 83 03 0E 27 08 FC FF 02 00 01 00 AC FD FD 02 49 01 5E 93 8F 37 DF 0B 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8D 03 10 07 1A 3A 0E 00 01 58 A6 AD 68 7C 14 00 00 06 04 43 56 84 0A 77 00 00 00 00 09 9A C3 EA 6A DF FB FF 00 00 FF FF 33 83 03 0E 27 08 00 00 FB FF 00 00 AC FD FC 02 49 01 18 B5 9F 37 E7 0B A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8E 03 10 07 1A 3A 0E 00 01 88 6F 11 6B 7C 14 00 00 06 04 43 F4 20 0B 77 00 00 00 00 04 9A C3 EA 68 DF F9 FF FB FF 00 00 33 83 03 0E 27 08 00 00 00 00 01 00 AD FD FC 02 49 01 8C 97 9F 37 EF 0B A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8F 03 10 07 1A 3A 0E 00 01 B8 38 75 6D 7C 14 00 00 06 04 43 92 BD 0B 77 00 00 00 00 FF 99 C1 EA 6D DF FC FF FA FF FF FF 33 83 03 0E 27 08 00 00 FE FF 00 00 AD FD FC 02 49 01 3D C8 8E 37 F7 0B A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 90 03 10 07 1A 3A 0E 00 01 E8 01 D9 6F 7C 14 00 00 06 04 43 30 5A 0C 77 00 00 00 00 FA 99 BC EA 71 DF FD FF FC FF 00 00 33 83 03 0E 27 08 FD FF 01 00 01 00 AD FD FC 02 4A 01 39 33 7C 37 FF 0B 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 91 03 10 07 1A 3A 0E 00 01 00 CF 3C 72 7C 14 00 00 06 04 43 CF F6 0C 77 00 00 00 00 F5 99 BD EA 74 DF F8 FF FC FF 00 00 33 83 03 0E 27 08 FC FF FD FF 00 00 AD FD FC 02 4A 01 04 9C 5B 37 07 0C A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 92 03 10 07 1A 3A 0E 00 01 30 98 A0 74 7C 14 00 00 06 04 43 6D 93 0D 77 00 00 00 00 F2 99 C6 EA 77 DF FF FF 03 00 0A 00 33 83 03 0E 27 08 FF FF FF FF 01 00 AC FD FC 02 4A 01 7C E5 38 37 0F 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 93 03 10 07 1A 3A 0E 00 01 60 61 04 77 7C 14 00 00 06 04 43 0B 30 0E 77 00 00 00 00 ED 99 D4 EA 7B DF 04 00 03 00 14 00 33 83 03 0E 27 08 FF FF 01 00 02 00 AD FD FC 02 4A 01 64 D7 28 37 17 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 94 03 10 07 1A 3A 0E 00 01 90 2A 68 79 7C 14 00 00 06 04 43 A9 CC 0E 77 00 00 00 00 EA 99 DC EA 81 DF FB FF FF FF 03 00 33 83 03 0E 27 08 FA FF 04 00 FD FF AD FD FC 02 4A 01 3E 36 A1 37 1F 0C A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 95 03 10 07 1A 3A 0E 00 01 C0 F3 CB 7B 7C 14 00 00 06 04 43 47 69 0F 77 00 00 00 00 EC 99 EC EA 7E DF 00 00 10 00 0C 00 33 83 03 0E 27 08 00 00 03 00 01 00 AD FD FD 02 4B 01 5A 4D D8 37 27 0C A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 96 03 10 07 1A 3A 0E 00 01 D8 C0 2F 7E 7C 14 00 00 06 04 43 E6 05 10 77 00 00 00 00 EA 99 FA EA 86 DF FC FF F7 FF 0C 00 33 83 03 0E 27 08 03 00 FF FF 01 00 AD FD FD 02 4B 01 44 04 DE 37 2F 0C A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 97 03 10 07 1A 3A 0E 00 01 08 8A 93 80 7C 14 00 00 06 04 43 84 A2 10 77 00 00 00 00 E6 99 05 EB 94 DF 04 00 02 00 0D 00 33 83 03 0E 27 08 FF FF FF FF FD FF AE FD FD 02 4B 01 F4 D2 D7 37 37 0C 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 98 03 10 07 1A 3A 0E 00 01 38 53 F7 82 7C 14 00 00 06 04 83 22 3F 11 77 00 00 00 00 E2 99 10 EB 9B DF F7 FF FD FF 04 00 34 83 03 0E 27 08 05 00 FF FF 02 00 AE FD FD 02 4B 01 83 36 E0 37 3F 0C 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 99 03 10 07 1A 3A 0E 00 01 68 1C 5B 85 7C 14 00 00 06 04 83 C0 DB 11 77 00 00 00 00 DC 99 13 EB A2 DF 04 00 FC FF 05 00 34 83 03 0E 27 08 00 00 03 00 01 00 AF FD FD 02 4C 01 68 05 DB 37 47 0C A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9A 03 10 07 1A 3A 0E 00 01 80 E9 BE 87 7C 14 00 00 06 04 43 5F 78 12 77 00 00 00 00 DA 99 0F EB A7 DF FC FF FE FF FB FF 34 83 03 0E 27 08 FA FF FE FF FC FF AF FD FD 02 4C 01 06 7B 90 37 4F 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9B 03 10 07 1A 3A 0E 00 01 B0 B2 22 8A 7C 14 00 00 06 04 43 FD 14 13 77 00 00 00 00 D9 99 13 EB A0 DF FF FF 0C 00 04 00 34 83 03 0E 27 08 FA FF 02 00 FD FF AF FD FE 02 4C 01 A4 70 3D 37 57 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9C 03 10 07 1A 3A 0E 00 01 E0 7B 86 8C 7C 14 00 00 06 04 43 9B B1 13 77 00 00 00 00 D9 99 23 EB 92 DF F3 FF 0C 00 04 00 34 83 03 0E 27 08 00 00 FD FF FE FF AF FD FD 02 4C 01 A6 E2 37 37 5F 0C 9A 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9D 03 10 07 1A 3A 0E 00 01 10 45 EA 8E 7C 14 00 00 06 04 43 39 4E 14 77 00 00 00 00 D5 99 35 EB 85 DF FC FF 0A 00 08 00 34 83 03 0E 27 08 00 00 04 00 02 00 AF FD FE 02 4C 01 92 9A 39 37 67 0C A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9E 03 10 07 1A 3A 0E 00 01 40 0E 4E 91 7C 14 00 00 06 04 43 D7 EA 14 77 00 00 00 00 D6 99 3D EB 84 DF FF FF 02 00 03 00 34 83 03 0E 27 08 01 00 FE FF 00 00 B0 FD FE 02 4C 01 6B FD 15 37 6F 0C A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9F 03 10 07 1A 3A 0E 00 01 58 DB B1 93 7C 14 00 00 06 04 43 76 87 15 77 00 00 00 00 D4 99 3F EB 83 DF 03 00 00 00 00 00 34 83 03 0E 27 08 05 00 06 00 03 00 B0 FD FE 02 4C 01 76 6B 0D 37 77 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A0 03 10 07 1A 3A 0E 00 01 88 A4 15 96 7C 14 00 00 06 04 43 14 24 16 77 00 00 00 00 DA 99 29 EB 8C DF 0B 00 E5 FF E9 FF 34 83 03 0E 27 08 0C 00 FF FF 01 00 B1 FD FE 02 4D 01 BF 8D 54 37 7F 0C A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A1 03 10 07 1A 3A 0E 00 01 B8 6D 79 98 7C 14 00 00 06 04 43 B2 C0 16 77 00 00 00 00 E1 99 FA EA 95 DF 0E 00 F6 FF E5 FF 34 83 03 0E 27 08 FE FF FD FF FA FF B1 FD FE 02 4D 01 6C 52 38 37 87 0C A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A2 03 10 07 1A 3A 0E 00 01 E8 36 DD 9A 7C 14 00 00 06 04 43 50 5D 17 77 00 00 00 00 E4 99 DB EA 93 DF 04 00 F7 FF F0 FF 34 83 03 0E 27 08 F7 FF 02 00 01 00 B1 FD FE 02 4D 01 29 8A 67 37 8F 0C A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A3 03 10 07 1A 3A 0E 00 01 18 00 41 9D 7C 14 00 00 06 04 43 EE F9 17 77 00 00 00 00 E5 99 C6 EA 94 DF F7 FF F3 FF ED FF 35 83 03 0E 27 08 F8 FF FB FF FF FF B1 FD FE 02 4D 01 74 A0 8D 37 97 0C 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A4 03 10 07 1A 3A 0E 00 01 30 CD A4 9F 7C 14 00 00 06 04 83 8D 96 18 77 00 00 00 00 E8 99 BC EA 92 DF 08 00 0E 00 05 00 35 83 03 0E 27 08 F2 FF 02 00 FD FF B0 FD FE 02 4D 01 55 E6 28 38 9F 0C 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A5 03 10 07 1A 3A 0E 00 01 60 96 08 A2 7C 14 00 00 06 04 83 2B 33 19 77 00 00 00 00 EC 99 C7 EA 90 DF 08 00 00 00 14 00 35 83 03 0E 27 08 FE FF 00 00 02 00 B0 FD FE 02 4D 01 EE 98 2F 38 A7 0C A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A6 03 10 07 1A 3A 0E 00 01 90 5F 6C A4 7C 14 00 00 06 04 83 C9 CF 19 77 00 00 00 00 ED 99 D5 EA 9C DF 06 00 00 00 11 00 35 83 03 0E 27 08 FD FF FA FF FB FF B0 FD FE 02 4D 01 FB 8D 29 38 AF 0C A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A7 03 10 07 1A 3A 0E 00 01 C0 28 D0 A6 7C 14 00 00 06 04 83 67 6C 1A 77 00 00 00 00 EE 99 E2 EA 9E DF FF FF 08 00 0A 00 35 83 03 0E 27 08 02 00 FC FF 00 00 B0 FD FD 02 4D 01 42 77 2C 38 B7 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A8 03 10 07 1A 3A 0E 00 01 F0 F1 33 A9 7C 14 00 00 06 04 83 05 09 1B 77 00 00 00 00 EA 99 ED EA A5 DF FD FF F5 FF 0D 00 35 83 03 0E 27 08 02 00 03 00 03 00 B0 FD FE 02 4D 01 C9 49 28 38 BF 0C 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A9 03 10 07 1A 3A 0E 00 01 08 BF 97 AB 7C 14 00 00 06 04 83 A4 A5 1B 77 00 00 00 00 E4 99 ED EA B6 DF FB FF F3 FF 01 00 35 83 03 0E 27 08 FE FF FF FF 01 00 B0 FD FE 02 4D 01 EA AE 15 38 C7 0C A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AA 03 10 07 1A 3A 0E 00 01 38 88 FB AD 7C 14 00 00 06 04 43 42 42 1C 77 00 00 00 00 E1 99 E9 EA C3 DF 05 00 FF FF 08 00 35 83 03 0E 27 08 FA FF 04 00 01 00 B0 FD FE 02 4D 01 D2 77 B1 37 CF 0C A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AB 03 10 07 1A 3A 0E 00 01 68 51 5F B0 7C 14 00 00 06 04 43 E0 DE 1C 77 00 00 00 00 E0 99 EE EA CF DF FC FF FE FF 0A 00 35 83 03 0E 27 08 FE FF FF FF 00 00 B1 FD FE 02 4D 01 BC D2 88 37 D7 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AC 03 10 07 1A 3A 0E 00 01 98 1A C3 B2 7C 14 00 00 06 04 43 7E 7B 1D 77 00 00 00 00 DA 99 FF EA D9 DF FE FF 01 00 12 00 35 83 03 0E 27 08 FD FF 00 00 01 00 B1 FD FE 02 4E 01 85 3E 83 37 DF 0C A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AD 03 10 07 1A 3A 0E 00 01 C8 E3 26 B5 7C 14 00 00 06 04 43 1C 18 1E 77 00 00 00 00 D9 99 12 EB DD DF 00 00 05 00 0B 00 35 83 03 0E 27 08 02 00 FD FF FF FF B1 FD FE 02 4E 01 B1 61 5B 37 E7 0C A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AE 03 10 07 1A 3A 0E 00 01 E0 B0 8A B7 7C 14 00 00 06 04 43 BB B4 1E 77 00 00 00 00 DA 99 1F EB DB DF 02 00 05 00 07 00 35 83 03 0E 27 08 03 00 02 00 00 00 B2 FD FF 02 4E 01 15 00 47 37 EF 0C A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AF 03 10 07 1A 3A 0E 00 01 10 7A EE B9 7C 14 00 00 06 04 43 59 51 1F 77 00 00 00 00 DD 99 21 EB E0 DF 07 00 FD FF 00 00 36 83 03 0E 27 08 00 00 00 00 FF FF B2 FD FF 02 4E 01 0D 18 2F 37 F7 0C 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B0 03 10 07 1A 3A 0E 00 01 40 43 52 BC 7C 14 00 00 06 04 43 F7 ED 1F 77 00 00 00 00 E0 99 19 EB E4 DF 03 00 FC FF FD FF 36 83 03 0E 27 08 00 00 FF FF FD FF B2 FD FF 02 4D 01 94 CE C7 36 FF 0C 9B 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B1 03 10 07 1A 3A 0E 00 01 70 0C B6 BE 7C 14 00 00 06 04 43 95 8A 20 77 00 00 00 00 DE 99 15 EB E8 DF FA FF 00 00 03 00 36 83 03 0E 27 08 F8 FF 02 00 FD FF B2 FD FF 02 4D 01 D5 65 A1 36 07 0D A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B2 03 10 07 1A 3A 0E 00 01 88 D9 19 C1 7C 14 00 00 06 04 43 34 27 21 77 00 00 00 00 DC 99 16 EB EC DF F6 FF F7 FF F8 FF 36 83 03 0E 27 08 02 00 F2 FF FC FF B3 FD FF 02 4D 01 BF 8D 85 37 0F 0D A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B3 03 10 07 1A 3A 0E 00 01 B8 A2 7D C3 7C 14 00 00 06 04 83 D2 C3 21 77 00 00 00 00 DA 99 0F EB E5 DF 04 00 0F 00 03 00 36 83 03 0E 27 08 F8 FF 06 00 00 00 B2 FD 00 03 4D 01 23 71 07 38 17 0D A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B4 03 10 07 1A 3A 0E 00 01 E8 6B E1 C5 7C 14 00 00 06 04 83 70 60 22 77 00 00 00 00 DC 99 18 EB E7 DF 09 00 F1 FF 10 00 36 83 03 0E 27 08 02 00 01 00 06 00 B3 FD 00 03 4E 01 77 EB 12 38 1F 0D A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B5 03 10 07 1A 3A 0E 00 01 18 35 45 C8 7C 14 00 00 06 04 83 0E FD 22 77 00 00 00 00 DA 99 1B EB FB DF 02 00 FB FF 0B 00 36 83 03 0E 27 08 FB FF FD FF FE FF B3 FD 00 03 4E 01 0B 1A 16 38 27 0D A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B6 03 10 07 1A 3A 0E 00 01 48 FE A8 CA 7C 14 00 00 06 04 83 AC 99 23 77 00 00 00 00 D7 99 25 EB 04 E0 00 00 01 00 0C 00 36 83 03 0E 27 08 FE FF FE FF 00 00 B3 FD 00 03 4E 01 57 B6 14 38 2F 0D A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B7 03 10 07 1A 3A 0E 00 01 60 CB 0C CD 7C 14 00 00 06 04 83 4B 36 24 77 00 00 00 00 D2 99 31 EB 0B E0 FC FF FC FF 08 00 36 83 03 0E 27 08 01 00 00 00 01 00 B4 FD 00 03 4E 01 3B 73 17 38 37 0D A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B8 03 10 07 1A 3A 0E 00 01 90 94 70 CF 7C 14 00 00 06 04 83 E9 D2 24 77 00 00 00 00 CE 99 34 EB 12 E0 FB FF FC FF 01 00 36 83 03 0E 27 08 FC FF 00 00 FF FF B4 FD 00 03 4E 01 03 A4 07 38 3F 0D A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B9 03 10 07 1A 3A 0E 00 01 C0 5D D4 D1 7C 14 00 00 06 04 43 87 6F 25 77 00 00 00 00 CE 99 36 EB 17 E0 06 00 01 00 07 00 36 83 03 0E 27 08 FC FF 02 00 00 00 B4 FD 01 03 4E 01 B6 31 7D 37 47 0D A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BA 03 10 07 1A 3A 0E 00 01 F0 26 38 D4 7C 14 00 00 06 04 43 25 0C 26 77 00 00 00 00 D2 99 3C EB 1C E0 02 00 FF FF 05 00 37 83 03 0E 27 08 FE FF FE FF FF FF B5 FD 01 03 4E 01 D8 E1 05 37 4F 0D A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BB 03 10 07 1A 3A 0E 00 01 20 F0 9B D6 7C 14 00 00 06 04 43 C3 A8 26 77 00 00 00 00 D3 99 44 EB 1E E0 FE FF 0B 00 06 00 37 83 03 0E 27 08 FA FF FD FF FA FF B5 FD 01 03 4E 01 E1 8A F3 36 57 0D 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BC 03 10 07 1A 3A 0E 00 01 38 BD FF D8 7C 14 00 00 06 04 43 62 45 27 77 00 00 00 00 D2 99 55 EB 18 E0 00 00 05 00 0D 00 37 83 03 0E 27 08 00 00 00 00 01 00 B5 FD 01 03 4E 01 D2 5C FB 36 5F 0D 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BD 03 10 07 1A 3A 0E 00 01 68 86 63 DB 7C 14 00 00 06 04 43 00 E2 27 77 00 00 00 00 D1 99 61 EB 1E E0 05 00 FE FF 0B 00 37 83 03 0E 27 08 FE FF FF FF 00 00 B5 FD 01 03 4E 01 06 78 E6 36 67 0D A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BE 03 10 07 1A 3A 0E 00 01 98 4F C7 DD 7C 14 00 00 06 04 43 9E 7E 28 77 00 00 00 00 D4 99 67 EB 1F E0 04 00 08 00 01 00 37 83 03 0E 27 08 FD FF FF FF 00 00 B6 FD 01 03 4E 01 51 EF C4 36 6F 0D A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BF 03 10 07 1A 3A 0E 00 01 C8 18 2B E0 7C 14 00 00 06 04 43 3C 1B 29 77 00 00 00 00 D6 99 6D EB 1E E0 01 00 01 00 07 00 37 83 03 0E 27 08 FF FF FE FF 00 00 B6 FD 02 03 4E 01 62 B9 57 36 77 0D A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C0 03 10 07 1A 3A 0E 00 01 F8 E1 8E E2 7C 14 00 00 06 04 43 DA B7 29 77 00 00 00 00 D4 99 79 EB 27 E0 12 00 00 00 18 00 37 83 03 0E 27 08 00 00 00 00 04 00 B6 FD 02 03 4E 01 0F 45 5C 37 7F 0D A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C1 03 10 07 1A 3A 0E 00 01 10 AF F2 E4 7C 14 00 00 06 04 83 79 54 2A 77 00 00 00 00 D3 99 79 EB 33 E0 FF FF F5 FF 00 00 37 83 03 0E 27 08 F7 FF 06 00 FF FF B7 FD 02 03 4E 01 5F 84 22 38 87 0D A4 00
|
||||
46
head-tracking/README.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# AirPods Head Tracking Project
|
||||
|
||||
This project implements head tracking with AirPods by gathering sensor data over Bluetooth, processing orientation and acceleration values, and detecting head gestures. The codebase is split into the following components:
|
||||
|
||||
- **Connection and Data Collection**
|
||||
The project uses a custom ConnectionManager (imported in multiple files) to connect via Bluetooth to AirPods. Once connected, sensor packets are received in raw hex format. An AirPodsTracker class (in `plot.py`) handles the start/stop of tracking, logging of raw data, and parsing of packets into useful fields.
|
||||
|
||||
- **Orientation Calculation and Visualization**
|
||||
The `HeadOrientation` class (in `head_orientation.py`) is responsible for:
|
||||
- **Calibration:**
|
||||
A set number of samples (default 10) are collected to calculate the neutral (baseline) values for the sensors. For example:
|
||||
`o1_neutral = np.mean(samples[:, 0])`
|
||||
- **Calculating Angles:**
|
||||
For each new packet, the raw orientation values are normalized by subtracting the neutral baseline. Then:
|
||||
- **Pitch** is computed as:
|
||||
```
|
||||
pitch = (o2_norm + o3_norm) / 2 / 32000 * 180
|
||||
```
|
||||
This averages the deviations from neutral, scales the result to degrees (assuming a sensor range around 32000), thus giving a smooth estimation of up/down tilt.
|
||||
- **Yaw** is computed as:
|
||||
```
|
||||
yaw = (o2_norm - o3_norm) / 2 / 32000 * 180
|
||||
```
|
||||
Here, the difference between the two sensor axes is used to detect left/right rotation.
|
||||
- **ASCII Visualization:**
|
||||
Based on the calculated pitch and yaw, an ASCII art "face" is generated. The algorithm rotates points on a circle using simple trigonometric formulas (with scaling factors based on sensor depth) to build an approximate visual representation of head orientation.
|
||||
|
||||
- **Live Plotting and Interactive Commands**
|
||||
The code offers both terminal-based plotting and graphical plotting via matplotlib. The AirPodsTracker manages live plotting by maintaining a buffer of recent packets. When in terminal mode, the code uses libraries like `asciichartpy` and `drawille` to render charts; in graphical mode, it creates live-updating plots.
|
||||
|
||||
- **Gesture Detection**
|
||||
The `GestureDetector` class (in `gestures.py`) processes the head tracking data to detect nodding ("Yes") or head shaking ("No"):
|
||||
- **Smoothing:**
|
||||
Raw horizontal and vertical sensor data undergo moving-average smoothing using small fixed-size buffers. This reduces noise and provides a steadier signal.
|
||||
- **Peak and Trough Detection:**
|
||||
The code monitors small sections (e.g. the last 4 values) to compute variance and dynamically determine thresholds for direction changes. When a significant reversal (e.g. from increasing to decreasing) is detected that surpasses the dynamic threshold value (derived partly from a fixed threshold and variance), a peak or trough is recorded.
|
||||
- **Rhythm Consistency:**
|
||||
Time intervals between detected peaks are captured. The consistency of these intervals (by comparing them to their mean and computing relative variance) is used to evaluate whether the movement is rhythmic—a trait of intentional gestures.
|
||||
- **Confidence Calculation:**
|
||||
Multiple factors are considered:
|
||||
- **Amplitude Factor:** Compares the average detected peak amplitude with a constant (like 600) to provide a normalized measure.
|
||||
- **Rhythm Factor:** Derived from the consistency of the time intervals of the peaks.
|
||||
- **Alternation Factor:** Verifies that the signal alternates (for instance, switching between positive and negative values).
|
||||
- **Isolation Factor:** Checks that movement on the target axis (vertical for nodding, horizontal for shaking) dominates over the non-target axis.
|
||||
|
||||
A weighted sum of these factors forms a confidence score which, if above a predefined threshold (e.g. 0.7), confirms a detected gesture.
|
||||
@@ -1,123 +0,0 @@
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F2 17 10 03 3A 3E 08 0E 1A 3A 01 F8 DE 9D 78 66 06 00 00 03 00 40 67 07 A1 5D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 10 62 10 62 10 2F 03 CC FF 6E 06 2F 03 CE FF 6C 02 29 48 D7 36 21 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F3 17 10 03 3A 3E 08 0E 1A 3A 01 B8 90 01 7B 66 06 00 00 03 00 42 FF A3 A1 5D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 03 00 03 00 2E 03 CD FF 6D 06 2F 03 CE FF 6C 02 66 4A E3 36 29 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F4 17 10 03 3A 3E 08 0E 1A 3A 01 90 3E 65 7D 66 06 00 00 03 00 42 96 40 A2 5D 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 03 00 03 00 03 00 2E 03 CD FF 6F 06 2F 03 CE FF 6C 02 79 7C BF 36 31 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F5 17 10 03 3A 3E 08 0E 1A 3A 01 50 F0 C8 7F 66 06 00 00 03 00 43 2E DD A2 5D 00 00 00 00 3B 07 79 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2F 03 CE FF 6C 02 06 02 B4 36 39 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F6 17 10 03 3A 3E 08 0E 1A 3A 01 10 A2 2C 82 66 06 00 00 03 00 43 C6 79 A3 5D 00 00 00 00 3B 07 79 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2F 03 CE FF 6C 02 AB 08 B6 36 41 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F7 17 10 03 3A 3E 08 0E 1A 3A 01 D0 53 90 84 66 06 00 00 03 00 43 5E 16 A4 5D 00 00 00 00 3E 07 84 72 02 00 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2F 03 CE FF 6D 02 C0 F3 CA 36 49 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F8 17 10 03 3A 3E 08 0E 1A 3A 01 90 05 F4 86 66 06 00 00 03 00 43 F6 B2 A4 5D 00 00 00 00 3D 07 81 72 01 00 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2F 03 CE FF 6D 02 AA BF C3 36 51 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F9 17 10 03 3A 3E 08 0E 1A 3A 01 50 B7 57 89 66 06 00 00 03 00 43 8E 4F A5 5D 00 00 00 00 3C 07 7F 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2F 03 CE FF 6D 02 AD 91 A3 36 59 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FA 17 10 03 3A 3E 08 0E 1A 3A 01 10 69 BB 8B 66 06 00 00 03 00 43 26 EC A5 5D 00 00 00 00 3C 07 80 72 FF FF 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 00 00 2F 03 CE FF 6D 02 1D 91 AA 36 61 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FB 17 10 03 3A 3E 08 0E 1A 3A 01 D0 1A 1F 8E 66 06 00 00 03 00 43 BE 88 A6 5D 00 00 00 00 3D 07 7F 72 00 00 01 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 01 00 2F 03 CE FF 6D 02 BA F4 B0 36 69 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FC 17 10 03 3A 3E 08 0E 1A 3A 01 A8 C8 82 90 66 06 00 00 03 00 43 55 25 A7 5D 00 00 00 00 3E 07 7F 72 01 00 00 00 01 00 01 00 04 00 04 00 04 00 02 00 00 00 00 00 2F 03 CE FF 6D 02 33 B8 9C 36 71 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FD 17 10 03 3A 3E 08 0E 1A 3A 01 68 7A E6 92 66 06 00 00 03 00 43 ED C1 A7 5D 00 00 00 00 3D 07 7D 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 01 00 2F 03 CE FF 6D 02 BB 96 99 36 79 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FE 17 10 03 3A 3E 08 0E 1A 3A 01 28 2C 4A 95 66 06 00 00 03 00 43 85 5E A8 5D 00 00 00 00 3E 07 7D 72 01 00 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 02 00 2F 03 CE FF 6D 02 A0 A1 AC 36 81 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FF 17 10 03 3A 3E 08 0E 1A 3A 01 E8 DD AD 97 66 06 00 00 03 00 43 1D FB A8 5D 00 00 00 00 3E 07 7D 72 00 00 01 00 01 00 01 00 04 00 04 00 04 00 01 00 00 00 01 00 2F 03 CE FF 6D 02 93 AE B9 36 89 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 80 18 10 03 3A 3E 08 0E 1A 3A 01 A8 8F 11 9A 66 06 00 00 03 00 43 B5 97 A9 5D 00 00 00 00 3F 07 7D 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 02 00 2F 03 CD FF 6D 02 51 EF BD 36 91 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 81 18 10 03 3A 3E 08 0E 1A 3A 01 80 3D 75 9C 66 06 00 00 03 00 43 4C 34 AA 5D 00 00 00 00 3E 07 7D 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 00 00 FF FF 00 00 2E 03 CD FF 6D 02 D2 88 BB 36 99 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 82 18 10 03 3A 3E 08 0E 1A 3A 01 40 EF D8 9E 66 06 00 00 03 00 43 E4 D0 AA 5D 00 00 00 00 3F 07 7C 72 00 00 01 00 01 00 00 00 04 00 04 00 04 00 01 00 00 00 00 00 2E 03 CD FF 6D 02 67 34 B9 36 A1 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 83 18 10 03 3A 3E 08 0E 1A 3A 01 00 A1 3C A1 66 06 00 00 03 00 43 7C 6D AB 5D 00 00 00 00 3F 07 7D 72 FF FF 00 00 00 00 00 00 04 00 04 00 04 00 00 00 FF FF 00 00 2E 03 CD FF 6D 02 A9 31 AE 36 A9 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 84 18 10 03 3A 3E 08 0E 1A 3A 01 C0 52 A0 A3 66 06 00 00 03 00 43 14 0A AC 5D 00 00 00 00 40 07 7D 72 FF FF FF FF 01 00 00 00 04 00 04 00 04 00 03 00 00 00 01 00 2E 03 CD FF 6D 02 95 47 CA 36 B1 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 85 18 10 03 3A 3E 08 0E 1A 3A 01 80 04 04 A6 66 06 00 00 03 00 43 AC A6 AC 5D 00 00 00 00 40 07 7C 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 00 00 FF FF 00 00 2E 03 CD FF 6D 02 BB B3 BF 36 B9 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 86 18 10 03 3A 3E 08 0E 1A 3A 01 58 B2 67 A8 66 06 00 00 03 00 43 43 43 AD 5D 00 00 00 00 40 07 7C 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 00 00 2E 03 CD FF 6D 02 06 0F C6 36 C1 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 87 18 10 03 3A 3E 08 0E 1A 3A 01 18 64 CB AA 66 06 00 00 03 00 43 DB DF AD 5D 00 00 00 00 40 07 7C 72 00 00 00 00 FF FF 00 00 04 00 04 00 04 00 01 00 00 00 01 00 2E 03 CD FF 6D 02 7B EE BD 36 C9 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 88 18 10 03 3A 3E 08 0E 1A 3A 01 D8 15 2F AD 66 06 00 00 03 00 43 73 7C AE 5D 00 00 00 00 40 07 7B 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 00 00 2E 03 CD FF 6D 02 DF 9B DA 36 D1 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 89 18 10 03 3A 3E 08 0E 1A 3A 01 98 C7 92 AF 66 06 00 00 03 00 43 0B 19 AF 5D 00 00 00 00 41 07 7C 72 01 00 00 00 00 00 00 00 04 00 04 00 04 00 03 00 00 00 01 00 2E 03 CD FF 6D 02 8F CB E2 36 D9 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8A 18 10 03 3A 3E 08 0E 1A 3A 01 70 75 F6 B1 66 06 00 00 03 00 43 A2 B5 AF 5D 00 00 00 00 41 07 7B 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 00 00 2E 03 CD FF 6D 02 26 7A DE 36 E1 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8B 18 10 03 3A 3E 08 0E 1A 3A 01 30 27 5A B4 66 06 00 00 03 00 43 3A 52 B0 5D 00 00 00 00 41 07 7B 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 00 00 2E 03 CD FF 6D 02 99 BC BD 36 E9 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8C 18 10 03 3A 3E 08 0E 1A 3A 01 F0 D8 BD B6 66 06 00 00 03 00 43 D2 EE B0 5D 00 00 00 00 41 07 7B 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 01 00 2E 03 CD FF 6D 02 6D 51 BA 36 F1 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8D 18 10 03 3A 3E 08 0E 1A 3A 01 B0 8A 21 B9 66 06 00 00 03 00 43 6A 8B B1 5D 00 00 00 00 41 07 7B 72 FF FF 00 00 01 00 00 00 04 00 04 00 04 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 C5 03 D4 36 F9 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8E 18 10 03 3A 3E 08 0E 1A 3A 01 88 38 85 BB 66 06 00 00 03 00 43 01 28 B2 5D 00 00 00 00 41 07 7B 72 FF FF 00 00 FF FF 00 00 03 00 03 00 03 00 01 00 01 00 01 00 2E 03 CD FF 6E 02 E8 E5 C9 36 01 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8F 18 10 03 3A 3E 08 0E 1A 3A 01 48 EA E8 BD 66 06 00 00 03 00 43 99 C4 B2 5D 00 00 00 00 41 07 7B 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 C8 5F B9 36 09 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 90 18 10 03 3A 3E 08 0E 1A 3A 01 08 9C 4C C0 66 06 00 00 03 00 43 31 61 B3 5D 00 00 00 00 40 07 7B 72 FF FF FF FF 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 83 C4 9D 36 11 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 91 18 10 03 3A 3E 08 0E 1A 3A 01 C8 4D B0 C2 66 06 00 00 03 00 43 C9 FD B3 5D 00 00 00 00 41 07 7B 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 01 00 00 00 2E 03 CD FF 6E 02 F9 0A 9E 36 19 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 92 18 10 03 3A 3E 08 0E 1A 3A 01 A0 FB 13 C5 66 06 00 00 03 00 43 60 9A B4 5D 00 00 00 00 41 07 7B 72 FF FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 54 B2 96 36 21 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 93 18 10 03 3A 3E 08 0E 1A 3A 01 60 AD 77 C7 66 06 00 00 03 00 43 F8 36 B5 5D 00 00 00 00 40 07 7B 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 FB 64 A2 36 29 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 94 18 10 03 3A 3E 08 0E 1A 3A 01 20 5F DB C9 66 06 00 00 03 00 43 90 D3 B5 5D 00 00 00 00 40 07 7B 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 21 48 9D 36 31 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 95 18 10 03 3A 3E 08 0E 1A 3A 01 E0 10 3F CC 66 06 00 00 03 00 43 28 70 B6 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 93 25 AC 36 39 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 96 18 10 03 3A 3E 08 0E 1A 3A 01 B8 BE A2 CE 66 06 00 00 03 00 43 BF 0C B7 5D 00 00 00 00 40 07 7B 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 7B 3B CB 36 41 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 97 18 10 03 3A 3E 08 0E 1A 3A 01 78 70 06 D1 66 06 00 00 03 00 43 57 A9 B7 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 9C 2B E3 36 49 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 98 18 10 03 3A 3E 08 0E 1A 3A 01 38 22 6A D3 66 06 00 00 03 00 43 EF 45 B8 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 FF FF 02 00 2E 03 CD FF 6E 02 F1 0D E8 36 51 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 99 18 10 03 3A 3E 08 0E 1A 3A 01 F8 D3 CD D5 66 06 00 00 03 00 43 87 E2 B8 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 F0 1A DF 36 59 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9A 18 10 03 3A 3E 08 0E 1A 3A 01 D0 81 31 D8 66 06 00 00 03 00 43 1E 7F B9 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 FF FF 01 00 2E 03 CD FF 6E 02 BB 9A CB 36 61 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9B 18 10 03 3A 3E 08 0E 1A 3A 01 90 33 95 DA 66 06 00 00 03 00 43 B6 1B BA 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 FF FF 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 85 AF D3 36 69 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9C 18 10 03 3A 3E 08 0E 1A 3A 01 50 E5 F8 DC 66 06 00 00 03 00 43 4E B8 BA 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 47 33 C4 36 71 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9D 18 10 03 3A 3E 08 0E 1A 3A 01 10 97 5C DF 66 06 00 00 03 00 43 E6 54 BB 5D 00 00 00 00 41 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 5D 2C 9C 36 79 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9E 18 10 03 3A 3E 08 0E 1A 3A 01 E8 44 C0 E1 66 06 00 00 03 00 43 7D F1 BB 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 FF FF 01 00 2E 03 CD FF 6E 02 0B 5E A3 36 81 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9F 18 10 03 3A 3E 08 0E 1A 3A 01 A8 F6 23 E4 66 06 00 00 03 00 43 15 8E BC 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 FF FF 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 D9 21 A3 36 89 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A0 18 10 03 3A 3E 08 0E 1A 3A 01 68 A8 87 E6 66 06 00 00 03 00 43 AD 2A BD 5D 00 00 00 00 41 07 79 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 82 84 A9 36 91 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A1 18 10 03 3A 3E 08 0E 1A 3A 01 40 56 EB E8 66 06 00 00 03 00 43 44 C7 BD 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 44 90 A7 36 99 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A2 18 10 03 3A 3E 08 0E 1A 3A 01 00 08 4F EB 66 06 00 00 03 00 43 DC 63 BE 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 FD 3C BA 36 A1 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A3 18 10 03 3A 3E 08 0E 1A 3A 01 C0 B9 B2 ED 66 06 00 00 03 00 43 74 00 BF 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 01 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 D2 05 C7 36 A9 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A4 18 10 03 3A 3E 08 0E 1A 3A 01 80 6B 16 F0 66 06 00 00 03 00 43 0C 9D BF 5D 00 00 00 00 41 07 7A 72 FF FF 00 00 01 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 AB 49 BF 36 B1 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A5 18 10 03 3A 3E 08 0E 1A 3A 01 58 19 7A F2 66 06 00 00 03 00 43 A3 39 C0 5D 00 00 00 00 41 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 31 2E CD 36 B9 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A6 18 10 03 3A 3E 08 0E 1A 3A 01 18 CB DD F4 66 06 00 00 03 00 43 3B D6 C0 5D 00 00 00 00 41 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 09 DB B5 36 C1 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A7 18 10 03 3A 3E 08 0E 1A 3A 01 D8 7C 41 F7 66 06 00 00 03 00 43 D3 72 C1 5D 00 00 00 00 41 07 7A 72 FF FF 00 00 FF FF 00 00 03 00 03 00 03 00 03 00 00 00 01 00 2E 03 CD FF 6E 02 C9 F9 CA 36 C9 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A8 18 10 03 3A 3E 08 0E 1A 3A 01 98 2E A5 F9 66 06 00 00 03 00 43 6B 0F C2 5D 00 00 00 00 42 07 7A 72 FF FF 00 00 01 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 5E 1C C2 36 D1 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A9 18 10 03 3A 3E 08 0E 1A 3A 01 70 DC 08 FC 66 06 00 00 03 00 43 02 AC C2 5D 00 00 00 00 42 07 7A 72 FF FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 85 D9 B3 36 D9 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AA 18 10 03 3A 3E 08 0E 1A 3A 01 30 8E 6C FE 66 06 00 00 03 00 43 9A 48 C3 5D 00 00 00 00 42 07 7A 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 01 00 01 00 00 00 2E 03 CD FF 6E 02 89 F5 D3 36 E1 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AB 18 10 03 3A 3E 08 0E 1A 3A 01 F0 3F D0 00 67 06 00 00 03 00 43 32 E5 C3 5D 00 00 00 00 42 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 5E 85 D3 36 E9 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AC 18 10 03 3A 3E 08 0E 1A 3A 01 C8 ED 33 03 67 06 00 00 03 00 43 C9 81 C4 5D 00 00 00 00 42 07 7A 72 FF FF 00 00 01 00 00 00 03 00 03 00 03 00 01 00 FF FF 02 00 2E 03 CD FF 6E 02 26 22 DF 36 F1 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AD 18 10 03 3A 3E 08 0E 1A 3A 01 88 9F 97 05 67 06 00 00 03 00 43 61 1E C5 5D 00 00 00 00 43 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 06 95 DB 36 F9 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AE 18 10 03 3A 3E 08 0E 1A 3A 01 48 51 FB 07 67 06 00 00 03 00 43 F9 BA C5 5D 00 00 00 00 42 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 66 B7 D2 36 01 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AF 18 10 03 3A 3E 08 0E 1A 3A 01 08 03 5F 0A 67 06 00 00 03 00 43 91 57 C6 5D 00 00 00 00 42 07 7A 72 FE FF FF FF 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 FE 66 EE 36 09 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B0 18 10 03 3A 3E 08 0E 1A 3A 01 E0 B0 C2 0C 67 06 00 00 03 00 43 28 F4 C6 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 13 B3 DB 36 11 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B1 18 10 03 3A 3E 08 0E 1A 3A 01 A0 62 26 0F 67 06 00 00 03 00 43 C0 90 C7 5D 00 00 00 00 42 07 79 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 B1 04 E7 36 19 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B2 18 10 03 3A 3E 08 0E 1A 3A 01 60 14 8A 11 67 06 00 00 03 00 43 58 2D C8 5D 00 00 00 00 42 07 79 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 1A BE E6 36 21 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B3 18 10 03 3A 3E 08 0E 1A 3A 01 38 C2 ED 13 67 06 00 00 03 00 43 EF C9 C8 5D 00 00 00 00 42 07 79 72 FE FF FF FF 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 CE A4 E7 36 29 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B4 18 10 03 3A 3E 08 0E 1A 3A 01 F8 73 51 16 67 06 00 00 03 00 43 87 66 C9 5D 00 00 00 00 42 07 79 72 FE FF 00 00 00 00 FF FF 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 1E DF F0 36 31 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B5 18 10 03 3A 3E 08 0E 1A 3A 01 B8 25 B5 18 67 06 00 00 03 00 43 1F 03 CA 5D 00 00 00 00 42 07 79 72 FE FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 FF FF 01 00 2E 03 CD FF 6E 02 1A 2D E4 36 39 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B6 18 10 03 3A 3E 08 0E 1A 3A 01 78 D7 18 1B 67 06 00 00 03 00 43 B7 9F CA 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 E2 B0 D6 36 41 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B7 18 10 03 3A 3E 08 0E 1A 3A 01 50 85 7C 1D 67 06 00 00 03 00 43 4E 3C CB 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 23 5D C1 36 49 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B8 18 10 03 3A 3E 08 0E 1A 3A 01 10 37 E0 1F 67 06 00 00 03 00 43 E6 D8 CB 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 92 5E CD 36 51 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B9 18 10 03 3A 3E 08 0E 1A 3A 01 D0 E8 43 22 67 06 00 00 03 00 43 7E 75 CC 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 8B E6 C4 36 59 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BA 18 10 03 3A 3E 08 0E 1A 3A 01 A8 96 A7 24 67 06 00 00 03 00 43 15 12 CD 5D 00 00 00 00 42 07 79 72 FD FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 B1 27 DE 36 61 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BB 18 10 03 3A 3E 08 0E 1A 3A 01 68 48 0B 27 67 06 00 00 03 00 43 AD AE CD 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 A1 EC C8 36 69 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BC 18 10 03 3A 3E 08 0E 1A 3A 01 28 FA 6E 29 67 06 00 00 03 00 43 45 4B CE 5D 00 00 00 00 42 07 79 72 FD FF 01 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 02 00 2E 03 CD FF 6E 02 50 61 D8 36 71 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BD 18 10 03 3A 3E 08 0E 1A 3A 01 E8 AB D2 2B 67 06 00 00 03 00 43 DD E7 CE 5D 00 00 00 00 42 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 CE C8 DA 36 79 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BE 18 10 03 3A 3E 08 0E 1A 3A 01 C0 59 36 2E 67 06 00 00 03 00 43 74 84 CF 5D 00 00 00 00 42 07 79 72 FC FF 01 00 01 00 00 00 03 00 03 00 03 00 02 00 01 00 02 00 2E 03 CD FF 6E 02 9A 6D DA 36 81 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BF 18 10 03 3A 3E 08 0E 1A 3A 01 80 0B 9A 30 67 06 00 00 03 00 43 0C 21 D0 5D 00 00 00 00 42 07 79 72 FC FF 00 00 00 00 FF FF 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 89 9B D5 36 89 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C0 18 10 03 3A 3E 08 0E 1A 3A 01 40 BD FD 32 67 06 00 00 03 00 43 A4 BD D0 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 72 06 B4 36 91 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C1 18 10 03 3A 3E 08 0E 1A 3A 01 18 6B 61 35 67 06 00 00 03 00 43 3B 5A D1 5D 00 00 00 00 42 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 55 DF C2 36 99 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C2 18 10 03 3A 3E 08 0E 1A 3A 01 D8 1C C5 37 67 06 00 00 03 00 43 D3 F6 D1 5D 00 00 00 00 41 07 79 72 FC FF 00 00 01 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 74 F7 D0 36 A1 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C3 18 10 03 3A 3E 08 0E 1A 3A 01 98 CE 28 3A 67 06 00 00 03 00 43 6B 93 D2 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 01 00 2E 03 CD FF 6E 02 71 C0 C4 36 A9 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C4 18 10 03 3A 3E 08 0E 1A 3A 01 58 80 8C 3C 67 06 00 00 03 00 43 03 30 D3 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 21 D3 B6 36 B1 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C5 18 10 03 3A 3E 08 0E 1A 3A 01 30 2E F0 3E 67 06 00 00 03 00 43 9A CC D3 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 CF C1 B8 36 B9 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C6 18 10 03 3A 3E 08 0E 1A 3A 01 F0 DF 53 41 67 06 00 00 03 00 43 32 69 D4 5D 00 00 00 00 41 07 79 72 FC FF 01 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 D4 88 B7 36 C1 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C7 18 10 03 3A 3E 08 0E 1A 3A 01 B0 91 B7 43 67 06 00 00 03 00 43 CA 05 D5 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 FF FF 03 00 03 00 03 00 02 00 01 00 00 00 2E 03 CD FF 6E 02 A8 80 AB 36 C9 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C8 18 10 03 3A 3E 08 0E 1A 3A 01 88 3F 1B 46 67 06 00 00 03 00 43 61 A2 D5 5D 00 00 00 00 40 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 6C D8 B9 36 D1 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C9 18 10 03 3A 3E 08 0E 1A 3A 01 48 F1 7E 48 67 06 00 00 03 00 43 F9 3E D6 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 23 46 C4 36 D9 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CA 18 10 03 3A 3E 08 0E 1A 3A 01 08 A3 E2 4A 67 06 00 00 03 00 43 91 DB D6 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 33 F8 D9 36 E1 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CB 18 10 03 3A 3E 08 0E 1A 3A 01 E0 50 46 4D 67 06 00 00 03 00 43 28 78 D7 5D 00 00 00 00 42 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 DA 2F DD 36 E9 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CC 18 10 03 3A 3E 08 0E 1A 3A 01 A0 02 AA 4F 67 06 00 00 03 00 43 C0 14 D8 5D 00 00 00 00 41 07 79 72 FC FF 00 00 FF FF 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 31 13 DC 36 F1 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CD 18 10 03 3A 3E 08 0E 1A 3A 01 60 B4 0D 52 67 06 00 00 03 00 43 58 B1 D8 5D 00 00 00 00 41 07 79 72 FC FF 00 00 FF FF 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 22 72 DF 36 F9 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CE 18 10 03 3A 3E 08 0E 1A 3A 01 20 66 71 54 67 06 00 00 03 00 43 F0 4D D9 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 73 6E CA 36 01 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CF 18 10 03 3A 3E 08 0E 1A 3A 01 F8 13 D5 56 67 06 00 00 03 00 43 87 EA D9 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 01 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6D 02 07 0A C4 36 09 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D0 18 10 03 3A 3E 08 0E 1A 3A 01 B8 C5 38 59 67 06 00 00 03 00 43 1F 87 DA 5D 00 00 00 00 41 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6D 02 F6 BA 9E 36 11 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D1 18 10 03 3A 3E 08 0E 1A 3A 01 78 77 9C 5B 67 06 00 00 03 00 43 B7 23 DB 5D 00 00 00 00 41 07 79 72 FB FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6D 02 F0 20 B7 36 19 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D2 18 10 03 3A 3E 08 0E 1A 3A 01 50 25 00 5E 67 06 00 00 03 00 43 4E C0 DB 5D 00 00 00 00 42 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6D 02 D1 7E 9C 36 21 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D3 18 10 03 3A 3E 08 0E 1A 3A 01 10 D7 63 60 67 06 00 00 03 00 43 E6 5C DC 5D 00 00 00 00 42 07 79 72 FB FF 00 00 01 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6D 02 8B 94 A3 36 29 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D4 18 10 03 3A 3E 08 0E 1A 3A 01 D0 88 C7 62 67 06 00 00 03 00 43 7E F9 DC 5D 00 00 00 00 42 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 C9 DA B9 36 31 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D5 18 10 03 3A 3E 08 0E 1A 3A 01 A8 36 2B 65 67 06 00 00 03 00 43 15 96 DD 5D 00 00 00 00 42 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 01 00 01 00 2E 03 CD FF 6E 02 22 07 D8 36 39 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D6 18 10 03 3A 3E 08 0E 1A 3A 01 68 E8 8E 67 67 06 00 00 03 00 43 AD 32 DE 5D 00 00 00 00 43 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 4E CE E7 36 41 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D7 18 10 03 3A 3E 08 0E 1A 3A 01 28 9A F2 69 67 06 00 00 03 00 43 45 CF DE 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 CB 69 CC 36 49 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D8 18 10 03 3A 3E 08 0E 1A 3A 01 E8 4B 56 6C 67 06 00 00 03 00 43 DD 6B DF 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 01 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 D6 F8 E0 36 51 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D9 18 10 03 3A 3E 08 0E 1A 3A 01 C0 F9 B9 6E 67 06 00 00 03 00 43 74 08 E0 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 EC AA DD 36 59 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DA 18 10 03 3A 3E 08 0E 1A 3A 01 80 AB 1D 71 67 06 00 00 03 00 43 0C A5 E0 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 55 EF D3 36 61 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DB 18 10 03 3A 3E 08 0E 1A 3A 01 40 5D 81 73 67 06 00 00 03 00 43 A4 41 E1 5D 00 00 00 00 43 07 78 72 FB FF 01 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 48 1A D8 36 69 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DC 18 10 03 3A 3E 08 0E 1A 3A 01 18 0B E5 75 67 06 00 00 03 00 43 3B DE E1 5D 00 00 00 00 42 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 13 D6 D0 36 71 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DD 18 10 03 3A 3E 08 0E 1A 3A 01 D8 BC 48 78 67 06 00 00 03 00 43 D3 7A E2 5D 00 00 00 00 42 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 03 00 2E 03 CD FF 6E 02 29 20 DB 36 79 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DE 18 10 03 3A 3E 08 0E 1A 3A 01 98 6E AC 7A 67 06 00 00 03 00 43 6B 17 E3 5D 00 00 00 00 42 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 E1 CD D8 36 81 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DF 18 10 03 3A 3E 08 0E 1A 3A 01 70 1C 10 7D 67 06 00 00 03 00 43 02 B4 E3 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 01 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 D7 F4 DB 36 89 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E0 18 10 03 3A 3E 08 0E 1A 3A 01 30 CE 73 7F 67 06 00 00 03 00 43 9A 50 E4 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 C1 54 D8 36 91 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E1 18 10 03 3A 3E 08 0E 1A 3A 01 F0 7F D7 81 67 06 00 00 03 00 43 32 ED E4 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 5F 88 C6 36 99 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E2 18 10 03 3A 3E 08 0E 1A 3A 01 C8 2D 3B 84 67 06 00 00 03 00 43 C9 89 E5 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 A7 D9 C9 36 A1 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E3 18 10 03 3A 3E 08 0E 1A 3A 01 88 DF 9E 86 67 06 00 00 03 00 43 61 26 E6 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 64 E3 B4 36 A9 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E4 18 10 03 3A 3E 08 0E 1A 3A 01 48 91 02 89 67 06 00 00 03 00 43 F9 C2 E6 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 01 00 2E 03 CD FF 6E 02 EC D3 C4 36 B1 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E5 18 10 03 3A 3E 08 0E 1A 3A 01 08 43 66 8B 67 06 00 00 03 00 43 91 5F E7 5D 00 00 00 00 42 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 FF FF 01 00 2E 03 CD FF 6E 02 01 E4 C2 36 B9 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E6 18 10 03 3A 3E 08 0E 1A 3A 01 E0 F0 C9 8D 67 06 00 00 03 00 43 28 FC E7 5D 00 00 00 00 41 07 78 72 FC FF 00 00 FF FF FF FF 03 00 03 00 03 00 06 00 02 00 03 00 2E 03 CD FF 6D 02 EF 0F 33 37 C1 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E7 18 10 03 3A 3E 08 0E 1A 3A 01 A0 A2 2D 90 67 06 00 00 03 00 43 C0 98 E8 5D 00 00 00 00 41 07 78 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 FE FF 04 00 2E 03 CD FF 6E 02 29 5F 74 37 C9 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E8 18 10 03 3A 3E 08 0E 1A 3A 01 60 54 91 92 67 06 00 00 03 00 43 58 35 E9 5D 00 00 00 00 41 07 78 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 FB B7 79 37 D1 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E9 18 10 03 3A 3E 08 0E 1A 3A 01 38 02 F5 94 67 06 00 00 03 00 43 EF D1 E9 5D 00 00 00 00 41 07 78 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 12 03 81 37 D9 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EA 18 10 03 3A 3E 08 0E 1A 3A 01 F8 B3 58 97 67 06 00 00 03 00 43 87 6E EA 5D 00 00 00 00 40 07 77 72 FC FF FF FF 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 A0 67 7D 37 E1 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EB 18 10 03 3A 3E 08 0E 1A 3A 01 B8 65 BC 99 67 06 00 00 03 00 43 1F 0B EB 5D 00 00 00 00 40 07 78 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 03 00 2E 03 CD FF 6E 02 5B 04 94 37 E9 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EC 18 10 03 3A 3E 08 0E 1A 3A 01 90 13 20 9C 67 06 00 00 03 00 43 B6 A7 EB 5D 00 00 00 00 40 07 77 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 86 E3 73 37 F1 61 00 00
|
||||
@@ -1,82 +0,0 @@
|
||||
# AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
|
||||
#
|
||||
# Copyright (C) 2024 Kavish Devar
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as published
|
||||
# by the Free Software Foundation, either version 3 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import matplotlib.pyplot as plt
|
||||
import mplcursors
|
||||
import bluetooth
|
||||
import threading
|
||||
import time
|
||||
from matplotlib.animation import FuncAnimation
|
||||
|
||||
sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
|
||||
|
||||
bt_addr = "28:2D:7F:C2:05:5B"
|
||||
psm = 0x1001
|
||||
|
||||
sock.connect((bt_addr, psm))
|
||||
running = threading.Event()
|
||||
|
||||
data = []
|
||||
|
||||
def hex_to_base10(hex_string):
|
||||
hex_values = hex_string.split()
|
||||
base10_values = [int(hex_value, 16) for hex_value in hex_values]
|
||||
return base10_values
|
||||
|
||||
def listen():
|
||||
global running, data
|
||||
while not running.is_set():
|
||||
res = sock.recv(1024)
|
||||
if len(res.hex()) == 162:
|
||||
hex_string = " ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2))
|
||||
base10_values = hex_to_base10(hex_string)
|
||||
data.append(base10_values)
|
||||
|
||||
t = threading.Thread(target=listen)
|
||||
t.start()
|
||||
|
||||
try:
|
||||
byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
except:
|
||||
...
|
||||
|
||||
def update(frame):
|
||||
plt.clf()
|
||||
plt.title('Bluetooth Data')
|
||||
# columns = [33, 69, 44, 46, 48, 67, 69, 71, 78]
|
||||
columns = [34]
|
||||
# columns_to_remove = [0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 32, 35, 36, 37, 38, 43, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 59, 46, 61, 62, 63, 64, 65, 66, 67, 68, 70,71, 73, 74, 75, 77, 78]
|
||||
# columns_to_remove = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 46, 60, 61, 62, 63, 64, 65, 66, 67, 68, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80]
|
||||
for i in range(len(data[0])):
|
||||
if i in columns:
|
||||
plt.plot([row[i] for row in data], label=f'Column {i}', alpha=1, linewidth=1.2)
|
||||
# plt.legend()
|
||||
plt.xlabel('Time')
|
||||
plt.ylabel('Value')
|
||||
mplcursors.cursor(hover=True, highlight=True)
|
||||
|
||||
fig = plt.figure()
|
||||
ani = FuncAnimation(fig, update, interval=0.5, repeat=True, cache_frame_data=False)
|
||||
|
||||
plt.show()
|
||||
|
||||
running.set()
|
||||
sock.close()
|
||||
62
head-tracking/connection_manager.py
Normal file
@@ -0,0 +1,62 @@
|
||||
import bluetooth
|
||||
import logging
|
||||
|
||||
class ConnectionManager:
|
||||
INIT_CMD = "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00"
|
||||
START_CMD = "04 00 04 00 17 00 00 00 10 00 10 00 08 A1 02 42 0B 08 0E 10 02 1A 05 01 40 9C 00 00"
|
||||
STOP_CMD = "04 00 04 00 17 00 00 00 10 00 11 00 08 7E 10 02 42 0B 08 4E 10 02 1A 05 01 00 00 00 00"
|
||||
|
||||
def __init__(self, bt_addr="28:2D:7F:C2:05:5B", psm=0x1001, logger=None):
|
||||
self.bt_addr = bt_addr
|
||||
self.psm = psm
|
||||
self.logger = logger if logger else logging.getLogger(__name__)
|
||||
self.sock = None
|
||||
self.connected = False
|
||||
self.started = False
|
||||
|
||||
def connect(self):
|
||||
self.logger.info(f"Connecting to {self.bt_addr} on PSM {self.psm:#04x}...")
|
||||
try:
|
||||
self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
|
||||
self.sock.connect((self.bt_addr, self.psm))
|
||||
self.connected = True
|
||||
self.logger.info("Connected to AirPods.")
|
||||
self.sock.send(bytes.fromhex(self.INIT_CMD))
|
||||
self.logger.info("Initialization complete.")
|
||||
except Exception as e:
|
||||
self.logger.error(f"Connection failed: {e}")
|
||||
self.connected = False
|
||||
return self.connected
|
||||
|
||||
def send_start(self):
|
||||
if not self.connected:
|
||||
self.logger.error("Not connected. Cannot send START command.")
|
||||
return False
|
||||
if not self.started:
|
||||
self.sock.send(bytes.fromhex(self.START_CMD))
|
||||
self.started = True
|
||||
self.logger.info("START command sent.")
|
||||
else:
|
||||
self.logger.info("START command has already been sent.")
|
||||
return True
|
||||
|
||||
def send_stop(self):
|
||||
if self.connected and self.started:
|
||||
try:
|
||||
self.sock.send(bytes.fromhex(self.STOP_CMD))
|
||||
self.logger.info("STOP command sent.")
|
||||
self.started = False
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error sending STOP command: {e}")
|
||||
else:
|
||||
self.logger.info("Cannot send STOP; not started or not connected.")
|
||||
|
||||
def disconnect(self):
|
||||
if self.sock:
|
||||
try:
|
||||
self.sock.close()
|
||||
self.logger.info("Disconnected from AirPods.")
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error during disconnect: {e}")
|
||||
self.connected = False
|
||||
self.started = False
|
||||
@@ -1 +0,0 @@
|
||||
./yes
|
||||
@@ -1,117 +0,0 @@
|
||||
# AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
|
||||
#
|
||||
# Copyright (C) 2024 Kavish Devar
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as published
|
||||
# by the Free Software Foundation, either version 3 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import bluetooth
|
||||
import threading
|
||||
import time
|
||||
|
||||
sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
|
||||
|
||||
bt_addr = "28:2D:7F:C2:05:5B"
|
||||
psm = 0x1001
|
||||
|
||||
sock.connect((bt_addr, psm))
|
||||
running = threading.Event()
|
||||
|
||||
data = []
|
||||
|
||||
def hex_to_base10(hex_string):
|
||||
hex_values = hex_string.split()
|
||||
base10_values = [int(hex_value, 16) for hex_value in hex_values]
|
||||
return base10_values
|
||||
|
||||
def listen():
|
||||
global running, data
|
||||
while not running.is_set():
|
||||
res = sock.recv(1024)
|
||||
if len(res.hex()) == 162:
|
||||
hex_string = " ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2))
|
||||
base10_values = hex_to_base10(hex_string)
|
||||
data.append(base10_values)
|
||||
|
||||
t = threading.Thread(target=listen)
|
||||
t.start()
|
||||
|
||||
try:
|
||||
byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
except:
|
||||
...
|
||||
|
||||
start_time = time.time()
|
||||
timeout = 10 # seconds
|
||||
|
||||
vertical_count = 0
|
||||
horizontal_count = 0
|
||||
horizontal_fluctuation_count = 0
|
||||
initial_131_sequence = True
|
||||
|
||||
while time.time() - start_time < timeout:
|
||||
if len(data) > 0:
|
||||
column_34_data = [row[34] for row in data]
|
||||
|
||||
for i in range(len(column_34_data)):
|
||||
print(column_34_data[i])
|
||||
if initial_131_sequence:
|
||||
if column_34_data[i] == 131:
|
||||
if i >= 4:
|
||||
continue
|
||||
else:
|
||||
initial_131_sequence = False
|
||||
|
||||
if column_34_data[i] == 131 and not initial_131_sequence:
|
||||
vertical_count += 1
|
||||
horizontal_count = 0
|
||||
if vertical_count >= 45:
|
||||
print("vertical")
|
||||
running.set()
|
||||
sock.close()
|
||||
exit()
|
||||
elif column_34_data[i] == 3:
|
||||
horizontal_count += 1
|
||||
vertical_count = 0
|
||||
if horizontal_count >= 40:
|
||||
print("horizontal")
|
||||
running.set()
|
||||
sock.close()
|
||||
exit()
|
||||
else:
|
||||
vertical_count = 0
|
||||
horizontal_count = 0
|
||||
|
||||
# Check for horizontal nodding (fluctuation between 3 and 67 or higher)
|
||||
fluctuation_window = 40
|
||||
if len(column_34_data) >= fluctuation_window:
|
||||
fluctuation_count = 0
|
||||
for i in range(len(column_34_data) - fluctuation_window + 1):
|
||||
segment = column_34_data[i:i+fluctuation_window]
|
||||
if any(value == 3 for value in segment) and any(value >= 67 for value in segment):
|
||||
count_67 = segment.count(67)
|
||||
if count_67 <= 10:
|
||||
fluctuation_count += 1
|
||||
if fluctuation_count >= 10:
|
||||
print("horizontal")
|
||||
running.set()
|
||||
sock.close()
|
||||
exit()
|
||||
|
||||
print("unknown")
|
||||
running.set()
|
||||
sock.close()
|
||||
381
head-tracking/gestures.py
Normal file
@@ -0,0 +1,381 @@
|
||||
import bluetooth
|
||||
import threading
|
||||
import time
|
||||
import logging
|
||||
import statistics
|
||||
from collections import deque
|
||||
|
||||
class Colors:
|
||||
RESET = "\033[0m"
|
||||
BOLD = "\033[1m"
|
||||
RED = "\033[91m"
|
||||
GREEN = "\033[92m"
|
||||
YELLOW = "\033[93m"
|
||||
BLUE = "\033[94m"
|
||||
MAGENTA = "\033[95m"
|
||||
CYAN = "\033[96m"
|
||||
WHITE = "\033[97m"
|
||||
BG_BLACK = "\033[40m"
|
||||
|
||||
class ColorFormatter(logging.Formatter):
|
||||
FORMATS = {
|
||||
logging.DEBUG: Colors.BLUE + "[%(levelname)s] %(message)s" + Colors.RESET,
|
||||
logging.INFO: Colors.GREEN + "%(message)s" + Colors.RESET,
|
||||
logging.WARNING: Colors.YELLOW + "%(message)s" + Colors.RESET,
|
||||
logging.ERROR: Colors.RED + "[%(levelname)s] %(message)s" + Colors.RESET,
|
||||
logging.CRITICAL: Colors.RED + Colors.BOLD + "[%(levelname)s] %(message)s" + Colors.RESET
|
||||
}
|
||||
|
||||
def format(self, record):
|
||||
log_fmt = self.FORMATS.get(record.levelno)
|
||||
formatter = logging.Formatter(log_fmt, datefmt="%H:%M:%S")
|
||||
return formatter.format(record)
|
||||
|
||||
handler = logging.StreamHandler()
|
||||
handler.setFormatter(ColorFormatter())
|
||||
log = logging.getLogger(__name__)
|
||||
log.setLevel(logging.INFO)
|
||||
log.addHandler(handler)
|
||||
log.propagate = False
|
||||
|
||||
class GestureDetector:
|
||||
INIT_CMD = "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00"
|
||||
START_CMD = "04 00 04 00 17 00 00 00 10 00 10 00 08 A1 02 42 0B 08 0E 10 02 1A 05 01 40 9C 00 00"
|
||||
STOP_CMD = "04 00 04 00 17 00 00 00 10 00 11 00 08 7E 10 02 42 0B 08 4E 10 02 1A 05 01 00 00 00 00"
|
||||
|
||||
def __init__(self, conn=None):
|
||||
self.sock = None
|
||||
self.bt_addr = "28:2D:7F:C2:05:5B"
|
||||
self.psm = 0x1001
|
||||
self.running = False
|
||||
self.data_lock = threading.Lock()
|
||||
|
||||
self.horiz_buffer = deque(maxlen=100)
|
||||
self.vert_buffer = deque(maxlen=100)
|
||||
|
||||
self.horiz_avg_buffer = deque(maxlen=5)
|
||||
self.vert_avg_buffer = deque(maxlen=5)
|
||||
|
||||
self.horiz_peaks = []
|
||||
self.horiz_troughs = []
|
||||
self.vert_peaks = []
|
||||
self.vert_troughs = []
|
||||
|
||||
self.last_peak_time = 0
|
||||
self.peak_intervals = deque(maxlen=5)
|
||||
|
||||
self.peak_threshold = 400
|
||||
self.direction_change_threshold = 175
|
||||
self.rhythm_consistency_threshold = 0.5
|
||||
|
||||
self.horiz_increasing = None
|
||||
self.vert_increasing = None
|
||||
|
||||
self.required_extremes = 3
|
||||
self.detection_timeout = 15
|
||||
|
||||
self.min_confidence_threshold = 0.7
|
||||
|
||||
self.conn = conn
|
||||
|
||||
def connect(self):
|
||||
try:
|
||||
log.info(f"Connecting to AirPods at {self.bt_addr}...")
|
||||
if self.conn is None:
|
||||
from connection_manager import ConnectionManager
|
||||
self.conn = ConnectionManager(self.bt_addr, self.psm, logger=log)
|
||||
if not self.conn.connect():
|
||||
return False
|
||||
else:
|
||||
if not self.conn.connected:
|
||||
if not self.conn.connect():
|
||||
return False
|
||||
self.sock = self.conn.sock
|
||||
log.info(f"{Colors.GREEN}✓ Connected to AirPods via ConnectionManager{Colors.RESET}")
|
||||
return True
|
||||
except Exception as e:
|
||||
log.error(f"{Colors.RED}Connection failed: {e}{Colors.RESET}")
|
||||
return False
|
||||
|
||||
def process_data(self):
|
||||
"""Process incoming head tracking data."""
|
||||
self.conn.send_start()
|
||||
log.info(f"{Colors.GREEN}✓ Head tracking activated{Colors.RESET}")
|
||||
|
||||
self.running = True
|
||||
start_time = time.time()
|
||||
|
||||
log.info(f"{Colors.GREEN}Ready! Make a YES or NO gesture{Colors.RESET}")
|
||||
log.info(f"{Colors.YELLOW}Tip: Use natural, moderate speed head movements{Colors.RESET}")
|
||||
|
||||
while self.running:
|
||||
if time.time() - start_time > self.detection_timeout:
|
||||
log.warning(f"{Colors.YELLOW}⚠️ Detection timeout reached. No gesture detected.{Colors.RESET}")
|
||||
self.running = False
|
||||
break
|
||||
|
||||
try:
|
||||
if not self.sock:
|
||||
log.error("Socket not available.")
|
||||
break
|
||||
data = self.sock.recv(1024)
|
||||
formatted = self.format_hex(data)
|
||||
if self.is_valid_tracking_packet(formatted):
|
||||
raw_bytes = bytes.fromhex(formatted.replace(" ", ""))
|
||||
horizontal, vertical = self.extract_orientation_values(raw_bytes)
|
||||
|
||||
if horizontal is not None and vertical is not None:
|
||||
smooth_h, smooth_v = self.apply_smoothing(horizontal, vertical)
|
||||
|
||||
with self.data_lock:
|
||||
self.horiz_buffer.append(smooth_h)
|
||||
self.vert_buffer.append(smooth_v)
|
||||
|
||||
self.detect_peaks_and_troughs()
|
||||
gesture = self.detect_gestures()
|
||||
|
||||
if gesture:
|
||||
self.running = False
|
||||
break
|
||||
|
||||
except Exception as e:
|
||||
if self.running:
|
||||
log.error(f"Data processing error: {e}")
|
||||
break
|
||||
|
||||
def disconnect(self):
|
||||
"""Disconnect from socket."""
|
||||
self.conn.disconnect()
|
||||
|
||||
def format_hex(self, data):
|
||||
"""Format binary data to readable hex string."""
|
||||
hex_str = data.hex()
|
||||
return ' '.join(hex_str[i:i+2] for i in range(0, len(hex_str), 2))
|
||||
|
||||
def is_valid_tracking_packet(self, hex_string):
|
||||
"""Verify packet is a valid head tracking packet."""
|
||||
standard_header = "04 00 04 00 17 00 00 00 10 00 45 00"
|
||||
alternate_header = "04 00 04 00 17 00 00 00 10 00 44 00"
|
||||
if not hex_string.startswith(standard_header) and not hex_string.startswith(alternate_header):
|
||||
return False
|
||||
|
||||
if len(hex_string.split()) < 80:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def extract_orientation_values(self, raw_bytes):
|
||||
"""Extract head orientation data from packet."""
|
||||
try:
|
||||
horizontal = int.from_bytes(raw_bytes[51:53], byteorder='little', signed=True)
|
||||
vertical = int.from_bytes(raw_bytes[53:55], byteorder='little', signed=True)
|
||||
|
||||
return horizontal, vertical
|
||||
except Exception as e:
|
||||
log.debug(f"Failed to extract orientation: {e}")
|
||||
return None, None
|
||||
|
||||
def apply_smoothing(self, horizontal, vertical):
|
||||
"""Apply moving average smoothing (Apple-like filtering)."""
|
||||
self.horiz_avg_buffer.append(horizontal)
|
||||
self.vert_avg_buffer.append(vertical)
|
||||
|
||||
smooth_horiz = sum(self.horiz_avg_buffer) / len(self.horiz_avg_buffer)
|
||||
smooth_vert = sum(self.vert_avg_buffer) / len(self.vert_avg_buffer)
|
||||
|
||||
return smooth_horiz, smooth_vert
|
||||
|
||||
def detect_peaks_and_troughs(self):
|
||||
"""Detect motion direction changes with Apple-like refinements."""
|
||||
if len(self.horiz_buffer) < 4 or len(self.vert_buffer) < 4:
|
||||
return
|
||||
|
||||
h_values = list(self.horiz_buffer)[-4:]
|
||||
v_values = list(self.vert_buffer)[-4:]
|
||||
|
||||
h_variance = statistics.variance(h_values) if len(h_values) > 1 else 0
|
||||
v_variance = statistics.variance(v_values) if len(v_values) > 1 else 0
|
||||
|
||||
current = self.horiz_buffer[-1]
|
||||
prev = self.horiz_buffer[-2]
|
||||
|
||||
if self.horiz_increasing is None:
|
||||
self.horiz_increasing = current > prev
|
||||
|
||||
dynamic_h_threshold = max(100, min(self.direction_change_threshold, h_variance / 3))
|
||||
|
||||
if self.horiz_increasing and current < prev - dynamic_h_threshold:
|
||||
if abs(prev) > self.peak_threshold:
|
||||
self.horiz_peaks.append((len(self.horiz_buffer)-1, prev, time.time()))
|
||||
direction = "➡️ " if prev > 0 else "⬅️ "
|
||||
log.info(f"{Colors.CYAN}{direction} Horizontal max: {prev} (threshold: {dynamic_h_threshold:.1f}){Colors.RESET}")
|
||||
|
||||
now = time.time()
|
||||
if self.last_peak_time > 0:
|
||||
interval = now - self.last_peak_time
|
||||
self.peak_intervals.append(interval)
|
||||
self.last_peak_time = now
|
||||
|
||||
self.horiz_increasing = False
|
||||
|
||||
elif not self.horiz_increasing and current > prev + dynamic_h_threshold:
|
||||
if abs(prev) > self.peak_threshold:
|
||||
self.horiz_troughs.append((len(self.horiz_buffer)-1, prev, time.time()))
|
||||
direction = "➡️ " if prev > 0 else "⬅️ "
|
||||
log.info(f"{Colors.CYAN}{direction} Horizontal max: {prev} (threshold: {dynamic_h_threshold:.1f}){Colors.RESET}")
|
||||
|
||||
now = time.time()
|
||||
if self.last_peak_time > 0:
|
||||
interval = now - self.last_peak_time
|
||||
self.peak_intervals.append(interval)
|
||||
self.last_peak_time = now
|
||||
|
||||
self.horiz_increasing = True
|
||||
|
||||
current = self.vert_buffer[-1]
|
||||
prev = self.vert_buffer[-2]
|
||||
|
||||
if self.vert_increasing is None:
|
||||
self.vert_increasing = current > prev
|
||||
|
||||
dynamic_v_threshold = max(100, min(self.direction_change_threshold, v_variance / 3))
|
||||
|
||||
if self.vert_increasing and current < prev - dynamic_v_threshold:
|
||||
if abs(prev) > self.peak_threshold:
|
||||
self.vert_peaks.append((len(self.vert_buffer)-1, prev, time.time()))
|
||||
direction = "⬆️ " if prev > 0 else "⬇️ "
|
||||
log.info(f"{Colors.MAGENTA}{direction} Vertical max: {prev} (threshold: {dynamic_v_threshold:.1f}){Colors.RESET}")
|
||||
|
||||
now = time.time()
|
||||
if self.last_peak_time > 0:
|
||||
interval = now - self.last_peak_time
|
||||
self.peak_intervals.append(interval)
|
||||
self.last_peak_time = now
|
||||
|
||||
self.vert_increasing = False
|
||||
|
||||
elif not self.vert_increasing and current > prev + dynamic_v_threshold:
|
||||
if abs(prev) > self.peak_threshold:
|
||||
self.vert_troughs.append((len(self.vert_buffer)-1, prev, time.time()))
|
||||
direction = "⬆️ " if prev > 0 else "⬇️ "
|
||||
log.info(f"{Colors.MAGENTA}{direction} Vertical max: {prev} (threshold: {dynamic_v_threshold:.1f}){Colors.RESET}")
|
||||
|
||||
now = time.time()
|
||||
if self.last_peak_time > 0:
|
||||
interval = now - self.last_peak_time
|
||||
self.peak_intervals.append(interval)
|
||||
self.last_peak_time = now
|
||||
|
||||
self.vert_increasing = True
|
||||
|
||||
def calculate_rhythm_consistency(self):
|
||||
"""Calculate how consistent the timing between peaks is (Apple-like)."""
|
||||
if len(self.peak_intervals) < 2:
|
||||
return 0
|
||||
|
||||
mean_interval = statistics.mean(self.peak_intervals)
|
||||
if mean_interval == 0:
|
||||
return 0
|
||||
|
||||
variances = [(i/mean_interval - 1.0) ** 2 for i in self.peak_intervals]
|
||||
consistency = 1.0 - min(1.0, statistics.mean(variances) / self.rhythm_consistency_threshold)
|
||||
return max(0, consistency)
|
||||
|
||||
def calculate_confidence_score(self, extremes, is_vertical=True):
|
||||
"""Calculate confidence score for gesture detection (Apple-like)."""
|
||||
if len(extremes) < self.required_extremes:
|
||||
return 0.0
|
||||
|
||||
sorted_extremes = sorted(extremes, key=lambda x: x[0])
|
||||
|
||||
recent = sorted_extremes[-self.required_extremes:]
|
||||
|
||||
avg_amplitude = sum(abs(val) for _, val, _ in recent) / len(recent)
|
||||
amplitude_factor = min(1.0, avg_amplitude / 600)
|
||||
|
||||
rhythm_factor = self.calculate_rhythm_consistency()
|
||||
|
||||
signs = [1 if val > 0 else -1 for _, val, _ in recent]
|
||||
alternating = all(signs[i] != signs[i-1] for i in range(1, len(signs)))
|
||||
alternation_factor = 1.0 if alternating else 0.5
|
||||
|
||||
if is_vertical:
|
||||
vert_amp = sum(abs(val) for _, val, _ in recent) / len(recent)
|
||||
horiz_vals = list(self.horiz_buffer)[-len(recent)*2:]
|
||||
horiz_amp = sum(abs(val) for val in horiz_vals) / len(horiz_vals) if horiz_vals else 0
|
||||
isolation_factor = min(1.0, vert_amp / (horiz_amp + 0.1) * 1.2)
|
||||
else:
|
||||
horiz_amp = sum(abs(val) for _, val, _ in recent)
|
||||
vert_vals = list(self.vert_buffer)[-len(recent)*2:]
|
||||
vert_amp = sum(abs(val) for val in vert_vals) / len(vert_vals) if vert_vals else 0
|
||||
isolation_factor = min(1.0, horiz_amp / (vert_amp + 0.1) * 1.2)
|
||||
|
||||
confidence = (
|
||||
amplitude_factor * 0.4 +
|
||||
rhythm_factor * 0.2 +
|
||||
alternation_factor * 0.2 +
|
||||
isolation_factor * 0.2
|
||||
)
|
||||
|
||||
return confidence
|
||||
|
||||
def detect_gestures(self):
|
||||
"""Recognize head gesture patterns with Apple-like intelligence."""
|
||||
if len(self.vert_peaks) + len(self.vert_troughs) >= self.required_extremes:
|
||||
all_extremes = sorted(self.vert_peaks + self.vert_troughs, key=lambda x: x[0])
|
||||
|
||||
confidence = self.calculate_confidence_score(all_extremes, is_vertical=True)
|
||||
|
||||
log.info(f"Vertical motion confidence: {confidence:.2f} (need {self.min_confidence_threshold:.2f})")
|
||||
|
||||
if confidence >= self.min_confidence_threshold:
|
||||
log.info(f"{Colors.GREEN}🎯 \"Yes\" Gesture Detected (confidence: {confidence:.2f}){Colors.RESET}")
|
||||
return "YES"
|
||||
|
||||
if len(self.horiz_peaks) + len(self.horiz_troughs) >= self.required_extremes:
|
||||
all_extremes = sorted(self.horiz_peaks + self.horiz_troughs, key=lambda x: x[0])
|
||||
|
||||
confidence = self.calculate_confidence_score(all_extremes, is_vertical=False)
|
||||
|
||||
log.info(f"Horizontal motion confidence: {confidence:.2f} (need {self.min_confidence_threshold:.2f})")
|
||||
|
||||
if confidence >= self.min_confidence_threshold:
|
||||
log.info(f"{Colors.GREEN}🎯 \"No\" gesture detected (confidence: {confidence:.2f}){Colors.RESET}")
|
||||
return "NO"
|
||||
|
||||
return None
|
||||
|
||||
def start_detection(self):
|
||||
"""Begin gesture detection process."""
|
||||
log.info(f"{Colors.BOLD}{Colors.WHITE}Starting gesture detection...{Colors.RESET}")
|
||||
|
||||
if not self.connect():
|
||||
log.error(f"{Colors.RED}Failed to connect to AirPods.{Colors.RESET}")
|
||||
return
|
||||
|
||||
data_thread = threading.Thread(target=self.process_data)
|
||||
data_thread.daemon = True
|
||||
data_thread.start()
|
||||
|
||||
try:
|
||||
data_thread.join(timeout=self.detection_timeout + 2)
|
||||
if data_thread.is_alive():
|
||||
log.warning(f"{Colors.YELLOW}⚠️ Timeout reached. Stopping detection.{Colors.RESET}")
|
||||
self.running = False
|
||||
except KeyboardInterrupt:
|
||||
log.info(f"{Colors.YELLOW}Detection canceled by user.{Colors.RESET}")
|
||||
self.running = False
|
||||
if __name__ == "__main__":
|
||||
self.disconnect()
|
||||
log.info(f"{Colors.GREEN}Gesture detection complete.{Colors.RESET}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(f"{Colors.BG_BLACK}{Colors.CYAN}╔════════════════════════════════════════╗{Colors.RESET}")
|
||||
print(f"{Colors.BG_BLACK}{Colors.CYAN}║ AirPods Head Gesture Detector ║{Colors.RESET}")
|
||||
print(f"{Colors.BG_BLACK}{Colors.CYAN}╚════════════════════════════════════════╝{Colors.RESET}")
|
||||
print(f"\n{Colors.WHITE}This program detects head gestures using AirPods:{Colors.RESET}")
|
||||
print(f"{Colors.GREEN}• YES: {Colors.WHITE}nodding head up and down{Colors.RESET}")
|
||||
print(f"{Colors.RED}• NO: {Colors.WHITE}shaking head left and right{Colors.RESET}\n")
|
||||
|
||||
detector = GestureDetector()
|
||||
detector.start_detection()
|
||||
142
head-tracking/head_orientation.py
Normal file
@@ -0,0 +1,142 @@
|
||||
import math
|
||||
import drawille
|
||||
import numpy as np
|
||||
import logging
|
||||
import os
|
||||
|
||||
class Colors:
|
||||
RESET = "\033[0m"
|
||||
BOLD = "\033[1m"
|
||||
RED = "\033[91m"
|
||||
GREEN = "\033[92m"
|
||||
YELLOW = "\033[93m"
|
||||
BLUE = "\033[94m"
|
||||
MAGENTA = "\033[95m"
|
||||
CYAN = "\033[96m"
|
||||
WHITE = "\033[97m"
|
||||
BG_BLACK = "\033[40m"
|
||||
|
||||
class ColorFormatter(logging.Formatter):
|
||||
FORMATS = {
|
||||
logging.DEBUG: Colors.BLUE + "[%(levelname)s] %(message)s" + Colors.RESET,
|
||||
logging.INFO: Colors.GREEN + "%(message)s" + Colors.RESET,
|
||||
logging.WARNING: Colors.YELLOW + "%(message)s" + Colors.RESET,
|
||||
logging.ERROR: Colors.RED + "[%(levelname)s] %(message)s" + Colors.RESET,
|
||||
logging.CRITICAL: Colors.RED + Colors.BOLD + "[%(levelname)s] %(message)s" + Colors.RESET
|
||||
}
|
||||
|
||||
def format(self, record):
|
||||
log_fmt = self.FORMATS.get(record.levelno)
|
||||
formatter = logging.Formatter(log_fmt, datefmt="%H:%M:%S")
|
||||
return formatter.format(record)
|
||||
|
||||
handler = logging.StreamHandler()
|
||||
handler.setFormatter(ColorFormatter())
|
||||
log = logging.getLogger(__name__)
|
||||
log.setLevel(logging.INFO)
|
||||
log.addHandler(handler)
|
||||
log.propagate = False
|
||||
|
||||
|
||||
class HeadOrientation:
|
||||
def __init__(self, use_terminal=False):
|
||||
self.orientation_offset = 5500
|
||||
self.o1_neutral = 19000
|
||||
self.o2_neutral = 0
|
||||
self.o3_neutral = 0
|
||||
self.calibration_samples = []
|
||||
self.calibration_complete = False
|
||||
self.calibration_sample_count = 10
|
||||
self.fig = None
|
||||
self.ax = None
|
||||
self.arrow = None
|
||||
self.animation = None
|
||||
self.use_terminal = use_terminal
|
||||
|
||||
def reset_calibration(self):
|
||||
self.calibration_samples = []
|
||||
self.calibration_complete = False
|
||||
|
||||
def add_calibration_sample(self, orientation_values):
|
||||
if len(self.calibration_samples) < self.calibration_sample_count:
|
||||
self.calibration_samples.append(orientation_values)
|
||||
return False
|
||||
if not self.calibration_complete:
|
||||
self._calculate_calibration()
|
||||
return True
|
||||
return True
|
||||
|
||||
def _calculate_calibration(self):
|
||||
if len(self.calibration_samples) < 3:
|
||||
log.warning("Not enough calibration samples")
|
||||
return
|
||||
samples = np.array(self.calibration_samples)
|
||||
self.o1_neutral = np.mean(samples[:, 0])
|
||||
avg_o2 = np.mean(samples[:, 1])
|
||||
avg_o3 = np.mean(samples[:, 2])
|
||||
self.o2_neutral = avg_o2
|
||||
self.o3_neutral = avg_o3
|
||||
log.info("Calibration complete: o1_neutral=%.2f, o2_neutral=%.2f, o3_neutral=%.2f",
|
||||
self.o1_neutral, self.o2_neutral, self.o3_neutral)
|
||||
self.calibration_complete = True
|
||||
|
||||
def calculate_orientation(self, o1, o2, o3):
|
||||
if not self.calibration_complete:
|
||||
return {'pitch': 0, 'yaw': 0}
|
||||
o1_norm = o1 - self.o1_neutral
|
||||
o2_norm = o2 - self.o2_neutral
|
||||
o3_norm = o3 - self.o3_neutral
|
||||
pitch = (o2_norm + o3_norm) / 2 / 32000 * 180
|
||||
yaw = (o2_norm - o3_norm) / 2 / 32000 * 180
|
||||
return {'pitch': pitch, 'yaw': yaw}
|
||||
|
||||
def create_face_art(self, pitch, yaw):
|
||||
if self.use_terminal:
|
||||
try:
|
||||
ts = os.get_terminal_size()
|
||||
width, height = ts.columns, ts.lines * 2
|
||||
except Exception:
|
||||
width, height = 80, 40
|
||||
else:
|
||||
width, height = 80, 40
|
||||
center_x, center_y = width // 2, height // 2
|
||||
radius = (min(width, height) // 2 - 2) // 2
|
||||
pitch_rad = math.radians(pitch)
|
||||
yaw_rad = math.radians(yaw)
|
||||
canvas = drawille.Canvas()
|
||||
def rotate_point(x, y, z, pitch_r, yaw_r):
|
||||
cos_y, sin_y = math.cos(yaw_r), math.sin(yaw_r)
|
||||
cos_p, sin_p = math.cos(pitch_r), math.sin(pitch_r)
|
||||
x1 = x * cos_y - z * sin_y
|
||||
z1 = x * sin_y + z * cos_y
|
||||
y1 = y * cos_p - z1 * sin_p
|
||||
z2 = y * sin_p + z1 * cos_p
|
||||
scale = 1 + (z2 / width)
|
||||
return int(center_x + x1 * scale), int(center_y + y1 * scale)
|
||||
for angle in range(0, 360, 2):
|
||||
rad = math.radians(angle)
|
||||
x = radius * math.cos(rad)
|
||||
y = radius * math.sin(rad)
|
||||
x1, y1 = rotate_point(x, y, 0, pitch_rad, yaw_rad)
|
||||
canvas.set(x1, y1)
|
||||
for eye in [(-radius//2, -radius//3, 2), (radius//2, -radius//3, 2)]:
|
||||
ex, ey, ez = eye
|
||||
x1, y1 = rotate_point(ex, ey, ez, pitch_rad, yaw_rad)
|
||||
for dx in [-1, 0, 1]:
|
||||
for dy in [-1, 0, 1]:
|
||||
canvas.set(x1 + dx, y1 + dy)
|
||||
nx, ny = rotate_point(0, 0, 1, pitch_rad, yaw_rad)
|
||||
for dx in [-1, 0, 1]:
|
||||
for dy in [-1, 0, 1]:
|
||||
canvas.set(nx + dx, ny + dy)
|
||||
smile_depth = radius // 8
|
||||
mouth_local_y = radius // 4
|
||||
mouth_length = radius
|
||||
for x_offset in range(-mouth_length // 2, mouth_length // 2 + 1):
|
||||
norm = abs(x_offset) / (mouth_length / 2)
|
||||
y_offset = int((1 - norm ** 2) * smile_depth)
|
||||
local_x = x_offset
|
||||
local_y = mouth_local_y + y_offset
|
||||
mx, my = rotate_point(local_x, local_y, 0, pitch_rad, yaw_rad)
|
||||
canvas.set(mx, my)
|
||||
return canvas.frame()
|
||||
@@ -1,65 +0,0 @@
|
||||
# AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
|
||||
#
|
||||
# Copyright (C) 2024 Kavish Devar
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as published
|
||||
# by the Free Software Foundation, either version 3 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import os
|
||||
import matplotlib.pyplot as plt
|
||||
import mplcursors
|
||||
|
||||
def hex_to_base10(hex_string):
|
||||
hex_values = hex_string.split()
|
||||
base10_values = [int(hex_value, 16) for hex_value in hex_values]
|
||||
return base10_values
|
||||
|
||||
def convert_file(input_filepath):
|
||||
data = []
|
||||
with open(input_filepath, 'r') as infile:
|
||||
for line in infile:
|
||||
base10_line = hex_to_base10(line.strip())
|
||||
data.append(base10_line)
|
||||
return data
|
||||
|
||||
def plot_data(data, title, directory):
|
||||
plt.figure()
|
||||
plt.title(title)
|
||||
# columns_to_remove = [0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 32, 35, 36, 37, 38, 43, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 59, 46, 61, 63, 64, 65, 67, 68, 70, 71, 73, 74, 75, 77]
|
||||
columns_to_remove = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 ]
|
||||
for i in range(len(data[0])):
|
||||
if i in columns_to_remove:
|
||||
continue
|
||||
plt.plot([row[i] for row in data], label=f'Column {i}', alpha=1, linewidth=1.2)
|
||||
|
||||
plt.legend()
|
||||
plt.xlabel('Time')
|
||||
plt.ylabel('Value')
|
||||
|
||||
# Add interactive cursor
|
||||
mplcursors.cursor(hover=True)
|
||||
|
||||
plt.show()
|
||||
plt.close()
|
||||
|
||||
def process_files(directory):
|
||||
for filename in os.listdir(directory):
|
||||
if filename.endswith('.txt'):
|
||||
input_filepath = os.path.join(directory, filename)
|
||||
data = convert_file(input_filepath)
|
||||
plot_data(data, f'{filename}', directory)
|
||||
|
||||
# Directory containing the files
|
||||
directory = 'yes'
|
||||
|
||||
# Process each file in the directory
|
||||
process_files(directory)
|
||||
@@ -1,122 +0,0 @@
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E2 1C 10 03 3A 3E 08 0E 1A 3A 01 08 ED A4 83 29 09 00 00 03 00 42 81 04 A2 12 01 00 00 00 00 00 00 00 00 00 FF FF 04 00 04 00 1C 83 1C 83 1C 83 83 FE B2 03 47 04 86 FE B1 03 4A 00 5F 94 03 37 44 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E3 1C 10 03 3A 3E 08 0E 1A 3A 01 50 B2 08 86 29 09 00 00 03 00 42 1E A1 A2 12 01 00 00 00 00 00 00 00 00 00 FC FF 08 00 0A 00 1D 83 1D 83 1D 83 85 FE B5 03 49 04 86 FE B2 03 4A 00 4C 29 E0 36 4C 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E4 1C 10 03 3A 3E 08 0E 1A 3A 01 80 7B 6C 88 29 09 00 00 03 00 43 BC 3D A3 12 01 00 00 00 C3 A3 99 EF 42 EE FE FF 0D 00 0C 00 1D 83 1D 83 1D 83 00 00 02 00 01 00 86 FE B2 03 4A 00 3F 26 F3 36 54 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E5 1C 10 03 3A 3E 08 0E 1A 3A 01 B0 44 D0 8A 29 09 00 00 03 00 43 5A DA A3 12 01 00 00 00 BF A3 9F EF 3D EE FA FF 00 00 FC FF 1D 83 1D 83 1D 83 00 00 FD FF 02 00 86 FE B2 03 4A 00 D2 34 5D 37 5C 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E6 1C 10 03 3A 3E 08 0E 1A 3A 01 F8 09 34 8D 29 09 00 00 03 00 43 F7 76 A4 12 01 00 00 00 B7 A3 B6 EF 44 EE FF FF 18 00 09 00 1D 83 1D 83 1D 83 FA FF 01 00 FD FF 86 FE B2 03 4A 00 B4 44 70 37 64 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E7 1C 10 03 3A 3E 08 0E 1A 3A 01 28 D3 97 8F 29 09 00 00 03 00 43 95 13 A5 12 01 00 00 00 95 A3 C3 EF 47 EE 01 00 F9 FF 0F 00 1D 83 1D 83 1D 83 07 00 05 00 06 00 86 FE B2 03 4A 00 81 F0 4F 37 6C 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E8 1C 10 03 3A 3E 08 0E 1A 3A 01 58 9C FB 91 29 09 00 00 03 00 43 33 B0 A5 12 01 00 00 00 C0 A3 A6 EF 43 EE 1A 00 DC FF 07 00 1D 83 1D 83 1D 83 0F 00 02 00 11 00 86 FE B2 03 4B 00 9C 7C 5C 37 74 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E9 1C 10 03 3A 3E 08 0E 1A 3A 01 A0 61 5F 94 29 09 00 00 03 00 83 D0 4C A6 12 01 00 00 00 DC A3 49 EF B5 EE B4 00 64 FF 23 00 1D 83 1D 83 1D 83 26 00 52 00 41 00 89 FE B5 03 4D 00 70 21 85 39 7C 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EA 1C 10 03 3A 3E 08 0E 1A 3A 01 D0 2A C3 96 29 09 00 00 03 00 03 6E E9 A6 12 01 00 00 00 A4 A4 2D EE 43 F0 24 02 DB FD 45 00 1D 83 1D 83 1D 83 80 00 A9 00 D7 00 8F FE BC 03 56 00 31 B5 F7 3A 84 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EB 1C 10 03 3A 3E 08 0E 1A 3A 01 00 F4 26 99 29 09 00 00 03 00 03 0C 86 A7 12 01 00 00 00 18 A7 1C EB 18 F5 97 04 E8 FA 3D 01 1D 83 1D 83 1D 83 5D 00 8E 00 1E 01 97 FE C8 03 64 00 48 3B F2 3B 8C 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EC 1C 10 03 3A 3E 08 0E 1A 3A 01 30 BD 8A 9B 29 09 00 00 03 00 83 AA 22 A8 12 01 00 00 00 0F AB 8A E6 F8 FC B7 05 F0 F8 CE 01 1D 83 1D 83 1D 83 14 00 18 00 41 01 9C FE CB 03 6F 00 2E EA 0B 3C 94 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 ED 1C 10 03 3A 3E 08 0E 1A 3A 01 78 82 EE 9D 29 09 00 00 03 00 83 47 BF A8 12 01 00 00 00 4B B0 C6 E0 49 07 22 06 41 F7 3C 02 1D 83 1D 83 1D 83 3F FF 73 FF 3C 00 99 FE C8 03 71 00 58 20 0F 3C 9C 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EE 1C 10 03 3A 3E 08 0E 1A 3A 01 A8 4B 52 A0 29 09 00 00 03 00 83 E5 5B A9 12 01 00 00 00 46 B4 BA DC E7 0E 4C 01 8E FD 93 00 1D 83 1D 83 1D 83 53 FE 32 FE F5 FD 85 FE B1 03 4C 00 4D 8B 14 3C A4 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EF 1C 10 03 3A 3E 08 0E 1A 3A 01 D8 14 B6 A2 29 09 00 00 03 00 83 83 F8 A9 12 01 00 00 00 EF B2 44 DD D5 0D 1A FC C2 03 2C FF 1E 83 1E 83 1E 83 7F FE 45 FE F2 FD 72 FE 97 03 1D 00 72 29 29 3C AC 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F0 1C 10 03 3A 3E 08 0E 1A 3A 01 20 DA 19 A5 29 09 00 00 03 00 83 20 95 AA 12 01 00 00 00 66 AD B8 E1 D3 05 96 F9 FD 07 C5 FE 1E 83 1E 83 1E 83 8A FE 40 FF 65 FF 61 FE 89 03 03 00 90 35 1E 3C B4 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F1 1C 10 03 3A 3E 08 0E 1A 3A 01 50 A3 7D A7 29 09 00 00 03 00 83 BE 31 AB 12 01 00 00 00 43 A7 11 E9 E3 FA 08 F8 D1 0A 68 FE 1E 83 1E 83 1E 83 4F FE C0 FE 23 00 4F FE 7E 03 00 00 31 1E 88 3B BC 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F2 1C 10 03 3A 3E 08 0E 1A 3A 01 80 6C E1 A9 29 09 00 00 03 00 83 5C CE AB 12 01 00 00 00 85 A1 AF F2 12 ED E4 F6 22 0C 52 FE 1E 83 1E 83 1E 83 BD FE 35 FF 44 01 3D FE 72 03 12 00 62 25 2D 3B C4 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F3 1C 10 03 3A 3E 08 0E 1A 3A 01 B0 35 45 AC 29 09 00 00 03 00 03 FA 6A AC 12 01 00 00 00 C1 9D EB FC 55 E0 26 F8 7E 0A 41 FF 1E 83 1E 83 1E 83 03 00 F4 FF 60 02 38 FE 71 03 39 00 D6 50 0C 3C CC 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F4 1C 10 03 3A 3E 08 0E 1A 3A 01 F8 FA A8 AE 29 09 00 00 03 00 03 97 07 AD 12 01 00 00 00 99 9B E7 02 7D D8 BF FC 7D 02 21 FF 1E 83 1E 83 1E 83 0A 02 49 02 E2 02 4F FE 83 03 71 00 6E A5 52 3D D4 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F5 1C 10 03 3A 3E 08 0E 1A 3A 01 28 C4 0C B1 29 09 00 00 03 00 03 35 A4 AD 12 01 00 00 00 E2 9B 5A 02 4F DA A9 04 91 FB 9F 01 1E 83 1E 83 1E 83 C0 01 53 02 5B 02 6B FE AC 03 A0 00 0F 22 16 3E DC 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F6 1C 10 03 3A 3E 08 0E 1A 3A 01 58 8D 70 B3 29 09 00 00 03 00 03 D3 40 AE 12 01 00 00 00 CE 9E 31 FD 90 E3 6A 09 44 F6 E9 03 1E 83 1E 83 1E 83 72 00 55 01 56 02 7A FE C6 03 C6 00 7A 27 48 3E E4 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F7 1C 10 03 3A 3E 08 0E 1A 3A 01 A0 52 D4 B5 29 09 00 00 03 00 03 70 DD AE 12 01 00 00 00 00 A5 89 F5 E0 F2 52 0B 5F F2 73 04 1E 83 1E 83 1E 83 00 FF D3 FE 72 01 78 FE C5 03 E0 00 34 37 53 3E EC 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F8 1C 10 03 3A 3E 08 0E 1A 3A 01 D0 1B 38 B8 29 09 00 00 03 00 03 0E 7A AF 12 01 00 00 00 E3 AA 24 EE 35 FF 82 03 AB FA 73 00 1E 83 1E 83 1E 83 7D FD E6 FC 4A FD 5E FE 9C 03 BB 00 85 DB 55 3E F4 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F9 1C 10 03 3A 3E 08 0E 1A 3A 01 00 E5 9B BA 29 09 00 00 03 00 03 AC 16 B0 12 01 00 00 00 E4 A9 4E EF 3A FD BE FA F3 06 2D FE 1E 83 1E 83 1E 83 64 FD 3C FD 6F FD 3B FE 73 03 78 00 F0 41 66 3E FC 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FA 1C 10 03 3A 3E 08 0E 1A 3A 01 48 AA FF BC 29 09 00 00 03 00 03 49 B3 B0 12 01 00 00 00 F3 A3 BD F6 5A F1 30 F6 0A 0C D4 FD 1F 83 1F 83 1F 83 41 FE 9B FE 18 00 28 FE 5B 03 62 00 28 58 4D 3E 04 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FB 1C 10 03 3A 3E 08 0E 1A 3A 01 78 73 63 BF 29 09 00 00 03 00 03 E7 4F B1 12 01 00 00 00 33 9E C4 FF B3 E4 18 F7 AF 07 E0 FC 1F 83 1F 83 1F 83 EC 00 43 00 AB 02 2F FE 5B 03 84 00 5C 20 D8 3D 0C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FC 1C 10 03 3A 3E 08 0E 1A 3A 01 A8 3C C7 C1 29 09 00 00 03 00 03 85 EC B1 12 01 00 00 00 F5 9B 09 02 CA DF 90 01 65 FE 21 00 1F 83 1F 83 1F 83 9E 02 B4 03 9E 03 53 FE 8A 03 B9 00 27 3E 3D 3E 14 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FD 1C 10 03 3A 3E 08 0E 1A 3A 01 D8 05 2B C4 29 09 00 00 03 00 03 23 89 B2 12 01 00 00 00 6E 9E 9F FD D8 E6 EE 07 1B F7 24 03 1F 83 1F 83 1F 83 FB 00 CC 01 96 02 73 FE B6 03 EA 00 7C 4B 94 3E 1C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FE 1C 10 03 3A 3E 08 0E 1A 3A 01 20 CB 8E C6 29 09 00 00 03 00 03 C0 25 B3 12 01 00 00 00 B5 A3 5B F6 20 F5 D3 09 A2 F2 23 04 1F 83 1F 83 1F 83 61 FF 59 FF A0 01 7B FE BC 03 04 01 62 85 9A 3E 24 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FF 1C 10 03 3A 3E 08 0E 1A 3A 01 50 94 F2 C8 29 09 00 00 03 00 03 5E C2 B3 12 01 00 00 00 B8 A9 3F EE A8 02 33 04 67 FA D2 00 1F 83 1F 83 1F 83 F4 FC 46 FD 37 FD 64 FE 9C 03 E2 00 07 B4 92 3E 2C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 80 1D 10 03 3A 3E 08 0E 1A 3A 01 80 5D 56 CB 29 09 00 00 03 00 03 FC 5E B4 12 01 00 00 00 25 A9 7E EE 15 01 E9 FA 62 06 B2 FD 1F 83 1F 83 1F 83 60 FD 34 FD 59 FD 44 FE 72 03 A1 00 38 C0 97 3E 34 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 81 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 26 BA CD 29 09 00 00 03 00 03 9A FB B4 12 01 00 00 00 10 A3 C0 F4 0E F5 54 F6 97 0B 99 FD 1F 83 1F 83 1F 83 41 FE C1 FE 09 00 31 FE 5C 03 88 00 E0 59 97 3E 3C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 82 1D 10 03 3A 3E 08 0E 1A 3A 01 F8 EB 1D D0 29 09 00 00 03 00 03 37 98 B5 12 01 00 00 00 3E 9D B6 FC 24 E8 7C F7 54 07 14 FC 1F 83 1F 83 1F 83 5D 01 98 00 B3 02 3C FE 5E 03 A8 00 19 81 5D 3E 44 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 83 1D 10 03 3A 3E 08 0E 1A 3A 01 28 B5 81 D2 29 09 00 00 03 00 03 D5 34 B6 12 01 00 00 00 C4 9B 3B FD CA E4 BD 03 B9 FC E8 00 1F 83 1F 83 1F 83 46 02 ED 03 83 03 63 FE 98 03 DF 00 7D 19 72 3E 4C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 84 1D 10 03 3A 3E 08 0E 1A 3A 01 58 7E E5 D4 29 09 00 00 03 00 03 73 D1 B6 12 01 00 00 00 44 9F 34 F8 13 ED 89 08 5C F6 0F 03 1F 83 1F 83 1F 83 A5 00 3D 01 43 02 7E FE B9 03 07 01 48 27 94 3E 54 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 85 1D 10 03 3A 3E 08 0E 1A 3A 01 A0 43 49 D7 29 09 00 00 03 00 03 10 6E B7 12 01 00 00 00 4B A5 70 F0 73 FB 5A 07 08 F6 42 02 1F 83 1F 83 1F 83 D4 FD FD FD 16 FF 78 FE B0 03 04 01 D4 D8 94 3E 5C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 86 1D 10 03 3A 3E 08 0E 1A 3A 01 D0 0C AD D9 29 09 00 00 03 00 03 AE 0A B8 12 01 00 00 00 3B A8 E0 EE 20 FF 59 FE F1 03 3B FF 20 83 20 83 20 83 E6 FC 70 FC 30 FD 52 FE 87 03 CA 00 8E 08 93 3E 64 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 87 1D 10 03 3A 3E 08 0E 1A 3A 01 00 D6 10 DC 29 09 00 00 03 00 03 4C A7 B8 12 01 00 00 00 7E A3 53 F4 34 F4 25 F6 D4 0B 7B FC 20 83 20 83 20 83 B8 FD E9 FD 3C FF 36 FE 5F 03 A4 00 D8 07 93 3E 6C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 88 1D 10 03 3A 3E 08 0E 1A 3A 01 30 9F 74 DE 29 09 00 00 03 00 03 EA 43 B9 12 01 00 00 00 8A 9D EF FD 5D E5 A4 F6 1B 09 3B FD 20 83 20 83 20 83 EA 00 3F 00 EC 02 35 FE 5D 03 BC 00 B2 CE 95 3E 74 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 89 1D 10 03 3A 3E 08 0E 1A 3A 01 78 64 D8 E0 29 09 00 00 03 00 03 87 E0 B9 12 01 00 00 00 E7 9A D2 00 CA DF 20 00 AB FF D3 FF 20 83 20 83 20 83 64 02 5D 03 1A 03 59 FE 86 03 ED 00 07 1C 88 3E 7C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8A 1D 10 03 3A 3E 08 0E 1A 3A 01 A8 2D 3C E3 29 09 00 00 03 00 03 25 7D BA 12 01 00 00 00 DA 9C CD FC 14 E5 80 07 9C F7 DA 01 20 83 20 83 20 83 67 01 EE 01 9F 02 7B FE B0 03 1B 01 24 A6 80 3E 84 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8B 1D 10 03 3A 3E 08 0E 1A 3A 01 D8 F6 9F E5 29 09 00 00 03 00 03 C3 19 BB 12 01 00 00 00 96 A1 FE F4 59 F2 F2 09 64 F3 44 03 20 83 20 83 20 83 40 FF 9E FF 1B 01 82 FE BA 03 2E 01 60 CD 82 3E 8C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8C 1D 10 03 3A 3E 08 0E 1A 3A 01 08 C0 03 E8 29 09 00 00 03 00 03 61 B6 BB 12 01 00 00 00 0D A7 0E EE F3 FD B7 04 1A FC 25 01 20 83 20 83 20 83 F3 FC CF FD 6C FD 65 FE 9F 03 0A 01 25 0E 81 3E 94 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8D 1D 10 03 3A 3E 08 0E 1A 3A 01 50 85 67 EA 29 09 00 00 03 00 03 FE 52 BC 12 01 00 00 00 BC A6 DB EF 5F FB 52 FA DB 07 4E FD 20 83 20 83 20 83 54 FD D5 FC B0 FD 41 FE 72 03 CE 00 4C 28 84 3E 9C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8E 1D 10 03 3A 3E 08 0E 1A 3A 01 80 4E CB EC 29 09 00 00 03 00 03 9C EF BC 12 01 00 00 00 18 A1 93 F7 FC ED 35 F6 8F 0C D9 FD 20 83 20 83 20 83 C1 FE F5 FE D0 00 2E FE 5D 03 BE 00 52 47 83 3E A4 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8F 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 17 2F EF 29 09 00 00 03 00 03 3A 8C BD 12 01 00 00 00 4C 9C 8C FE B5 E2 72 F9 36 04 0C FD 20 83 20 83 20 83 11 02 78 01 B3 02 45 FE 66 03 E5 00 9D 45 53 3E AC 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 90 1D 10 03 3A 3E 08 0E 1A 3A 01 E0 E0 92 F1 29 09 00 00 03 00 03 D8 28 BE 12 01 00 00 00 6B 9B BE FD 3C E2 42 04 6E FB 6B 00 20 83 20 83 20 83 35 02 18 03 FC 02 6A FE 99 03 13 01 66 25 54 3E B4 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 91 1D 10 03 3A 3E 08 0E 1A 3A 01 28 A6 F6 F3 29 09 00 00 03 00 03 75 C5 BE 12 01 00 00 00 75 9E B8 F7 E0 EA D9 07 78 F6 45 02 21 83 21 83 21 83 81 00 FB 00 E0 01 7F FE B4 03 31 01 90 7E 66 3E BC 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 92 1D 10 03 3A 3E 08 0E 1A 3A 01 58 6F 5A F6 29 09 00 00 03 00 03 13 62 BF 12 01 00 00 00 A1 A3 29 F0 43 F8 35 09 30 F4 BE 02 21 83 21 83 21 83 FE FE 45 FF B5 00 7D FE B5 03 3B 01 BF E5 69 3E C4 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 93 1D 10 03 3A 3E 08 0E 1A 3A 01 88 38 BE F8 29 09 00 00 03 00 03 B1 FE BF 12 01 00 00 00 F9 A8 15 EA 6D 02 42 03 63 FD 2A 00 21 83 21 83 21 83 2C FD 91 FD 66 FD 60 FE 98 03 12 01 02 3F 61 3E CC 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 94 1D 10 03 3A 3E 08 0E 1A 3A 01 D0 FD 21 FB 29 09 00 00 03 00 03 4E 9B C0 12 01 00 00 00 2D A8 D6 EB D1 FE 36 FB 2D 07 E1 FD 21 83 21 83 21 83 A9 FD A4 FD DE FD 42 FE 74 03 D8 00 86 2C 65 3E D4 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 95 1D 10 03 3A 3E 08 0E 1A 3A 01 00 C7 85 FD 29 09 00 00 03 00 03 EC 37 C1 12 01 00 00 00 D1 A2 E7 F2 8F F2 D7 F6 11 0C 02 FE 21 83 21 83 21 83 73 FE C5 FE 3A 00 2F FE 60 03 C1 00 23 91 5E 3E DC 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 96 1D 10 03 3A 3E 08 0E 1A 3A 01 30 90 E9 FF 29 09 00 00 03 00 03 8A D4 C1 12 01 00 00 00 A3 9D 37 FB B6 E5 E1 F7 CA 06 4D FC 21 83 21 83 21 83 BD 01 6A 00 BB 02 3D FE 5F 03 DF 00 50 90 D3 3D E4 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 97 1D 10 03 3A 3E 08 0E 1A 3A 01 60 59 4D 02 2A 09 00 00 03 00 03 28 71 C2 12 01 00 00 00 D9 9B 8F FB 97 E2 BB 02 06 FD 64 00 21 83 21 83 21 83 21 02 75 03 01 03 62 FE 90 03 0D 01 5C 40 1C 3E EC 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 98 1D 10 03 3A 3E 08 0E 1A 3A 01 A8 1E B1 04 2A 09 00 00 03 00 03 C5 0D C3 12 01 00 00 00 14 9E 8A F6 8B E9 BA 06 7B F7 DC 01 21 83 21 83 21 83 D6 00 45 01 CC 01 7A FE AD 03 2C 01 2C 46 4C 3E F4 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 99 1D 10 03 3A 3E 08 0E 1A 3A 01 D8 E7 14 07 2A 09 00 00 03 00 03 63 AA C3 12 01 00 00 00 53 A2 77 EF 3F F6 7B 08 17 F5 85 02 21 83 21 83 21 83 CB FE 5D FF 0A 00 78 FE B1 03 31 01 B8 99 50 3E FC 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9A 1D 10 03 3A 3E 08 0E 1A 3A 01 08 B1 78 09 2A 09 00 00 03 00 03 01 47 C4 12 01 00 00 00 51 A6 C6 EB 7E FD 54 01 F6 00 F6 FF 21 83 21 83 21 83 1E FD 63 FD 7E FD 56 FE 93 03 02 01 AE 71 4F 3E 04 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9B 1D 10 03 3A 3E 08 0E 1A 3A 01 38 7A DC 0B 2A 09 00 00 03 00 03 9F E3 C4 12 01 00 00 00 81 A4 FA EE 0A F7 01 FA 3E 08 99 FD 21 83 21 83 21 83 F7 FD 03 FE 88 FE 3C FE 71 03 D6 00 F7 68 4F 3E 0C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9C 1D 10 03 3A 3E 08 0E 1A 3A 01 80 3F 40 0E 2A 09 00 00 03 00 03 3C 80 C5 12 01 00 00 00 D5 9F D8 F6 51 EA 09 F8 97 0A 7E FE 21 83 21 83 21 83 B8 FF 8A FF 6C 01 32 FE 66 03 D3 00 58 A6 4E 3E 14 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9D 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 08 A4 10 2A 09 00 00 03 00 03 DA 1C C6 12 01 00 00 00 28 9C CE FB 98 E1 25 FB D9 02 D9 FD 22 83 22 83 22 83 FA 01 95 01 31 02 4C FE 71 03 F4 00 5C D3 FE 3D 1C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9E 1D 10 03 3A 3E 08 0E 1A 3A 01 E0 D1 07 13 2A 09 00 00 03 00 03 78 B9 C6 12 01 00 00 00 9B 9B F9 F9 3E E2 21 04 E7 FA 11 00 22 83 22 83 22 83 F7 01 74 02 5B 02 6E FE 9B 03 1A 01 14 19 00 3E 24 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9F 1D 10 03 3A 3E 08 0E 1A 3A 01 10 9B 6B 15 2A 09 00 00 03 00 03 16 56 C7 12 01 00 00 00 FB 9D 6F F3 CF EA D7 06 C4 F6 67 01 22 83 22 83 22 83 3B 00 B1 00 05 01 7C FE AF 03 2E 01 75 27 0E 3E 2C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A0 1D 10 03 3A 3E 08 0E 1A 3A 01 58 60 CF 17 2A 09 00 00 03 00 03 B3 F2 C7 12 01 00 00 00 C0 A1 E9 EC 73 F5 83 05 D3 F9 8F 01 22 83 22 83 22 83 1D FE 0F FF 15 FF 6D FE AA 03 22 01 C1 EB 0B 3E 34 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A1 1D 10 03 3A 3E 08 0E 1A 3A 01 88 29 33 1A 2A 09 00 00 03 00 03 51 8F C8 12 01 00 00 00 15 A4 4B EB 17 F9 A4 00 26 01 20 00 22 83 22 83 22 83 06 FE 0D FE 44 FE 53 FE 93 03 FE 00 B4 9B 0A 3E 3C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A2 1D 10 03 3A 3E 08 0E 1A 3A 01 B8 F2 96 1C 2A 09 00 00 03 00 03 EF 2B C9 12 01 00 00 00 B6 A2 1F EE 02 F4 8B FB B9 06 B4 FE 22 83 22 83 22 83 9D FE A4 FE F4 FE 41 FE 7B 03 DE 00 D0 4D 0B 3E 44 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A3 1D 10 03 3A 3E 08 0E 1A 3A 01 E8 BB FA 1E 2A 09 00 00 03 00 03 8D C8 C9 12 01 00 00 00 AB 9F D7 F3 38 EB 97 FA FF 05 5C FE 22 83 22 83 22 83 94 00 A6 FF 06 01 42 FE 74 03 DD 00 02 34 06 3E 4C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A4 1D 10 03 3A 3E 08 0E 1A 3A 01 30 81 5E 21 2A 09 00 00 03 00 03 2A 65 CA 12 01 00 00 00 9E 9D E5 F5 10 E6 DF FE 0F 01 65 FF 22 83 22 83 22 83 58 01 B5 01 56 01 57 FE 87 03 EE 00 2C 71 81 3D 54 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A5 1D 10 03 3A 3E 08 0E 1A 3A 01 60 4A C2 23 2A 09 00 00 03 00 03 C8 01 CB 12 01 00 00 00 16 9E 6E F4 3A E7 DA 02 00 FD 92 00 22 83 22 83 22 83 F3 00 15 01 CA 00 6A FE 9E 03 FD 00 8A B7 22 3D 5C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A6 1D 10 03 3A 3E 08 0E 1A 3A 01 90 13 26 26 2A 09 00 00 03 00 03 66 9E CB 12 01 00 00 00 8E 9F 3D F1 CB EB 24 03 68 FC B0 00 22 83 22 83 22 83 D1 FF E1 FF B1 FF 6F FE A3 03 FA 00 AB FF 1B 3D 64 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A7 1D 10 03 3A 3E 08 0E 1A 3A 01 C0 DC 89 28 2A 09 00 00 03 00 03 04 3B CC 12 01 00 00 00 97 A0 4B EF 08 EE AB 00 A2 FF C7 FF 22 83 22 83 22 83 63 FF 49 FF 38 FF 67 FE 9A 03 E9 00 72 B8 1D 3D 6C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A8 1D 10 03 3A 3E 08 0E 1A 3A 01 08 A2 ED 2A 2A 09 00 00 03 00 03 A1 D7 CC 12 01 00 00 00 5D A0 57 EF BC EC D7 FE 67 01 69 FF 22 83 22 83 22 83 D9 FF A1 FF 99 FF 62 FE 92 03 DB 00 2C 49 1F 3D 74 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A9 1D 10 03 3A 3E 08 0E 1A 3A 01 38 6B 51 2D 2A 09 00 00 03 00 03 3F 74 CD 12 01 00 00 00 9B 9F C0 EF D3 EA 27 FF A9 00 A8 FF 23 83 23 83 23 83 47 00 63 00 F0 FF 65 FE 94 03 D5 00 0C 2F 1B 3D 7C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AA 1D 10 03 3A 3E 08 0E 1A 3A 01 68 34 B5 2F 2A 09 00 00 03 00 03 DD 10 CE 12 01 00 00 00 6C 9F D0 EF 55 EA 5C 00 E7 FF 2B 00 23 83 23 83 23 83 5D 00 72 00 F3 FF 69 FE 9C 03 D2 00 C1 28 02 3D 84 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AB 1D 10 03 3A 3E 08 0E 1A 3A 01 98 FD 18 32 2A 09 00 00 03 00 83 7B AD CE 12 01 00 00 00 BD 9F C3 EF 46 EB AB 00 68 FF 5D 00 23 83 23 83 23 83 32 00 14 00 CA FF 6D FE 9F 03 CE 00 FC 82 EA 3B 8C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AC 1D 10 03 3A 3E 08 0E 1A 3A 01 E0 C2 7C 34 2A 09 00 00 03 00 83 18 4A CF 12 01 00 00 00 C1 9F 52 F0 DA EC 22 00 D7 FF 32 00 23 83 23 83 23 83 EC FF DA FF A6 FF 6E FE 9E 03 C6 00 1D 5A 7A 3B 94 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AD 1D 10 03 3A 3E 08 0E 1A 3A 01 10 8C E0 36 2A 09 00 00 03 00 83 B6 E6 CF 12 01 00 00 00 B4 9F DA F0 19 ED 93 FF 57 00 E3 FF 23 83 23 83 23 83 EF FF D5 FF BE FF 6E FE 9C 03 BF 00 3F D4 69 3B 9C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AE 1D 10 03 3A 3E 08 0E 1A 3A 01 40 55 44 39 2A 09 00 00 03 00 83 54 83 D0 12 01 00 00 00 D0 9F EC F0 3A EC 98 FF 54 00 C3 FF 23 83 23 83 23 83 0B 00 17 00 DB FF 6F FE 9C 03 BB 00 19 74 1E 3B A4 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AF 1D 10 03 3A 3E 08 0E 1A 3A 01 70 1E A8 3B 2A 09 00 00 03 00 83 F2 1F D1 12 01 00 00 00 06 A0 F5 F0 83 EB ED FF 44 00 ED FF 23 83 23 83 23 83 1A 00 34 00 E9 FF 70 FE 9F 03 B7 00 C8 C1 0B 3B AC 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B0 1D 10 03 3A 3E 08 0E 1A 3A 01 A0 E7 0B 3E 2A 09 00 00 03 00 83 90 BC D1 12 01 00 00 00 41 A0 23 F1 62 EB 29 00 0B 00 0F 00 23 83 23 83 23 83 22 00 21 00 ED FF 73 FE A2 03 B4 00 E9 73 97 3A B4 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B1 1D 10 03 3A 3E 08 0E 1A 3A 01 E8 AC 6F 40 2A 09 00 00 03 00 83 2D 59 D2 12 01 00 00 00 78 A0 51 F1 A6 EB 37 00 F9 FF 1E 00 23 83 23 83 23 83 0F 00 09 00 D9 FF 74 FE A3 03 B0 00 89 99 4F 3A BC 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B2 1D 10 03 3A 3E 08 0E 1A 3A 01 18 76 D3 42 2A 09 00 00 03 00 83 CB F5 D2 12 01 00 00 00 9F A0 87 F1 DE EB 2C 00 02 00 0F 00 23 83 23 83 23 83 11 00 03 00 E4 FF 75 FE A4 03 AC 00 9E AB 30 3A C4 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B3 1D 10 03 3A 3E 08 0E 1A 3A 01 48 3F 37 45 2A 09 00 00 03 00 83 69 92 D3 12 01 00 00 00 EC A0 80 F1 2B EC 92 00 BE FF 23 00 23 83 23 83 23 83 0E 00 25 00 EE FF 77 FE A6 03 A8 00 0B 2C EA 39 CC 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B4 1D 10 03 3A 3E 08 0E 1A 3A 01 78 08 9B 47 2A 09 00 00 03 00 83 07 2F D4 12 01 00 00 00 7A A1 4D F1 98 EC A2 00 D3 FF 13 00 24 83 24 83 24 83 01 00 00 00 DF FF 78 FE A7 03 A4 00 C8 82 B1 39 D4 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B5 1D 10 03 3A 3E 08 0E 1A 3A 01 C0 CD FE 49 2A 09 00 00 03 00 83 A4 CB D4 12 01 00 00 00 D4 A1 48 F1 D7 EC 39 00 FE FF FE FF 24 83 24 83 24 83 0F 00 E0 FF E2 FF 79 FE A6 03 9F 00 46 62 B4 39 DC 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B6 1D 10 03 3A 3E 08 0E 1A 3A 01 F0 96 62 4C 2A 09 00 00 03 00 83 42 68 D5 12 01 00 00 00 EC A1 3F F1 D3 EC F8 FF FB FF FC FF 24 83 24 83 24 83 0E 00 00 00 DF FF 7B FE A6 03 9A 00 01 0B A5 39 E4 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B7 1D 10 03 3A 3E 08 0E 1A 3A 01 20 60 C6 4E 2A 09 00 00 03 00 83 E0 04 D6 12 01 00 00 00 EE A1 5E F1 BE EC D5 FF 28 00 0E 00 24 83 24 83 24 83 08 00 00 00 DC FF 7C FE A7 03 95 00 B5 AB 9B 39 EC 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B8 1D 10 03 3A 3E 08 0E 1A 3A 01 50 29 2A 51 2A 09 00 00 03 00 83 7E A1 D6 12 01 00 00 00 D8 A1 AB F1 96 EC CC FF 34 00 0B 00 24 83 24 83 24 83 12 00 07 00 F3 FF 7D FE A8 03 91 00 85 00 9A 39 F4 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B9 1D 10 03 3A 3E 08 0E 1A 3A 01 98 EE 8D 53 2A 09 00 00 03 00 83 1B 3E D7 12 01 00 00 00 D7 A1 D9 F1 7B EC F7 FF 0E 00 0B 00 24 83 24 83 24 83 11 00 13 00 F4 FF 7F FE A9 03 8E 00 1A 2F 8D 39 FC 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BA 1D 10 03 3A 3E 08 0E 1A 3A 01 C8 B7 F1 55 2A 09 00 00 03 00 83 B9 DA D7 12 01 00 00 00 E8 A1 FB F1 78 EC 0B 00 15 00 0D 00 24 83 24 83 24 83 0D 00 0D 00 ED FF 81 FE AB 03 8B 00 DD 24 70 39 04 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BB 1D 10 03 3A 3E 08 0E 1A 3A 01 F8 80 55 58 2A 09 00 00 03 00 83 57 77 D8 12 01 00 00 00 F5 A1 24 F2 81 EC 08 00 10 00 0C 00 24 83 24 83 24 83 0B 00 03 00 EB FF 82 FE AC 03 88 00 D9 AD 3D 39 0C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BC 1D 10 03 3A 3E 08 0E 1A 3A 01 28 4A B9 5A 2A 09 00 00 03 00 43 F5 13 D9 12 01 00 00 00 0D A2 46 F2 86 EC 21 00 01 00 0F 00 24 83 24 83 24 83 10 00 06 00 F8 FF 83 FE AD 03 85 00 03 4E DB 37 14 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BD 1D 10 03 3A 3E 08 0E 1A 3A 01 70 0F 1D 5D 2A 09 00 00 03 00 43 92 B0 D9 12 01 00 00 00 33 A2 46 F2 A5 EC 29 00 F2 FF 0C 00 24 83 24 83 24 83 07 00 03 00 ED FF 85 FE AD 03 82 00 D4 2C C8 37 1C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BE 1D 10 03 3A 3E 08 0E 1A 3A 01 A0 D8 80 5F 2A 09 00 00 03 00 43 30 4D DA 12 01 00 00 00 52 A2 4C F2 C8 EC 13 00 FA FF 10 00 24 83 24 83 24 83 04 00 FB FF E9 FF 86 FE AE 03 7F 00 9F 1C D3 37 24 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BF 1D 10 03 3A 3E 08 0E 1A 3A 01 D0 A1 E4 61 2A 09 00 00 03 00 83 CE E9 DA 12 01 00 00 00 56 A2 61 F2 DB EC F2 FF 09 00 0D 00 24 83 24 83 24 83 03 00 F8 FF EB FF 86 FE AE 03 7B 00 B9 5B 18 38 2C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C0 1D 10 03 3A 3E 08 0E 1A 3A 01 00 6B 48 64 2A 09 00 00 03 00 43 6C 86 DB 12 01 00 00 00 4D A2 79 F2 D0 EC E7 FF 10 00 07 00 25 83 25 83 25 83 06 00 03 00 EC FF 88 FE AE 03 78 00 F8 19 01 38 34 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C1 1D 10 03 3A 3E 08 0E 1A 3A 01 48 30 AC 66 2A 09 00 00 03 00 43 09 23 DC 12 01 00 00 00 46 A2 93 F2 BE EC EA FF 19 00 03 00 25 83 25 83 25 83 00 00 03 00 E9 FF 88 FE AF 03 76 00 86 35 F2 37 3C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C2 1D 10 03 3A 3E 08 0E 1A 3A 01 78 F9 0F 69 2A 09 00 00 03 00 43 A7 BF DC 12 01 00 00 00 3E A2 C4 F2 9A EC D2 FF 4F 00 0A 00 25 83 25 83 25 83 E8 FF F8 FF C6 FF 88 FE B0 03 72 00 C5 E5 EC 37 44 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C3 1D 10 03 3A 3E 08 0E 1A 3A 01 A8 C2 73 6B 2A 09 00 00 03 00 83 45 5C DD 12 01 00 00 00 07 A2 9E F3 E0 EB 2A FF 4F 01 22 00 25 83 25 83 25 83 D0 FF D3 FF C1 FF 86 FE AE 03 6C 00 C0 05 8F 38 4C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C4 1D 10 03 3A 3E 08 0E 1A 3A 01 D8 8B D7 6D 2A 09 00 00 03 00 83 E3 F8 DD 12 01 00 00 00 4D A1 41 F5 97 EA 7C FE EE 00 41 00 25 83 25 83 25 83 6C 00 E2 FF 63 00 89 FE AC 03 6E 00 7C FA C4 39 54 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C5 1D 10 03 3A 3E 08 0E 1A 3A 01 20 51 3B 70 2A 09 00 00 03 00 83 80 95 DE 12 01 00 00 00 17 A0 DA F5 12 EB 1A FF FA FE D2 00 25 83 25 83 25 83 3E 00 61 00 21 00 91 FE B0 03 74 00 76 2F 3D 3A 5C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C6 1D 10 03 3A 3E 08 0E 1A 3A 01 50 1A 9F 72 2A 09 00 00 03 00 83 1E 32 DF 12 01 00 00 00 92 9F CF F5 CA EC 2A 00 04 FF 81 00 25 83 25 83 25 83 F9 FF 0D 00 D9 FF 92 FE B4 03 75 00 EA 09 A8 3A 64 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C7 1D 10 03 3A 3E 08 0E 1A 3A 01 80 E3 02 75 2A 09 00 00 03 00 83 BC CE DF 12 01 00 00 00 8F 9F 70 F5 E2 ED 44 00 99 FF 02 00 25 83 25 83 25 83 D6 FF F5 FF C5 FF 93 FE B4 03 74 00 93 20 A8 3A 6C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C8 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 AC 66 77 2A 09 00 00 03 00 83 5A 6B E0 12 01 00 00 00 B6 9F 42 F5 FF ED 0C 00 F5 FF F3 FF 25 83 25 83 25 83 F3 FF FC FF EF FF 94 FE B4 03 74 00 F2 55 A8 3A 74 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C9 1D 10 03 3A 3E 08 0E 1A 3A 01 F8 71 CA 79 2A 09 00 00 03 00 83 F7 07 E1 12 01 00 00 00 C4 9F 47 F5 D1 ED F2 FF 30 00 04 00 25 83 25 83 25 83 FC FF 0C 00 F9 FF 95 FE B5 03 75 00 41 DA A7 3A 7C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CA 1D 10 03 3A 3E 08 0E 1A 3A 01 28 3B 2E 7C 2A 09 00 00 03 00 83 95 A4 E1 12 01 00 00 00 D1 9F 6E F5 B0 ED 01 00 15 00 16 00 25 83 25 83 25 83 0B 00 07 00 FF FF 98 FE B7 03 77 00 DA 94 88 3A 84 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CB 1D 10 03 3A 3E 08 0E 1A 3A 01 58 04 92 7E 2A 09 00 00 03 00 83 33 41 E2 12 01 00 00 00 DE 9F 85 F5 B7 ED 11 00 F8 FF 18 00 25 83 25 83 25 83 10 00 03 00 00 00 9B FE B7 03 78 00 EA D4 59 3A 8C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CC 1D 10 03 3A 3E 08 0E 1A 3A 01 88 CD F5 80 2A 09 00 00 03 00 83 D1 DD E2 12 01 00 00 00 E8 9F 90 F5 D1 ED 0D 00 03 00 07 00 26 83 26 83 26 83 07 00 FA FF F8 FF 9D FE B8 03 79 00 BF ED 2B 38 94 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CD 1D 10 03 3A 3E 08 0E 1A 3A 01 D0 92 59 83 2A 09 00 00 03 00 83 6E 7A E3 12 01 00 00 00 EE 9F 9A F5 D4 ED 01 00 04 00 FA FF 26 83 26 83 26 83 09 00 FA FF F4 FF A0 FE B8 03 7A 00 A6 7A 57 38 9C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CE 1D 10 03 3A 3E 08 0E 1A 3A 01 00 5C BD 85 2A 09 00 00 03 00 83 0C 17 E4 12 01 00 00 00 F2 9F 98 F5 C3 ED 00 00 08 00 F2 FF 26 83 26 83 26 83 04 00 06 00 F2 FF A2 FE B8 03 7A 00 29 B1 59 38 A4 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CF 1D 10 03 3A 3E 08 0E 1A 3A 01 30 25 21 88 2A 09 00 00 03 00 83 AA B3 E4 12 01 00 00 00 FC 9F 94 F5 BB ED 05 00 FB FF F7 FF 26 83 26 83 26 83 0C 00 04 00 F9 FF A3 FE B9 03 7B 00 57 BD 57 38 AC 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D0 1D 10 03 3A 3E 08 0E 1A 3A 01 60 EE 84 8A 2A 09 00 00 03 00 83 48 50 E5 12 01 00 00 00 02 A0 8C F5 C4 ED 08 00 F5 FF 0A 00 26 83 26 83 26 83 05 00 08 00 F5 FF A5 FE BA 03 7B 00 83 EA 00 38 B4 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D1 1D 10 03 3A 3E 08 0E 1A 3A 01 90 B7 E8 8C 2A 09 00 00 03 00 83 E6 EC E5 12 01 00 00 00 05 A0 8D F5 D4 ED 01 00 F8 FF 01 00 26 83 26 83 26 83 03 00 FF FF F5 FF A7 FE BA 03 7C 00 1A C4 08 38 BC 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D2 1D 10 03 3A 3E 08 0E 1A 3A 01 D8 7C 4C 8F 2A 09 00 00 03 00 83 83 89 E6 12 01 00 00 00 07 A0 8A F5 D5 ED F9 FF 08 00 F5 FF 26 83 26 83 26 83 00 00 FD FF F5 FF A8 FE BB 03 7C 00 55 51 0A 38 C4 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D3 1D 10 03 3A 3E 08 0E 1A 3A 01 08 46 B0 91 2A 09 00 00 03 00 43 21 26 E7 12 01 00 00 00 09 A0 8B F5 C2 ED FB FF 06 00 F1 FF 26 83 26 83 26 83 06 00 00 00 FF FF AA FE BB 03 7D 00 CB CF 9E 37 CC 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D4 1D 10 03 3A 3E 08 0E 1A 3A 01 38 0F 14 94 2A 09 00 00 03 00 43 BF C2 E7 12 01 00 00 00 11 A0 75 F5 B3 ED 16 00 F5 FF E0 FF 26 83 26 83 26 83 02 00 08 00 FF FF AB FE BB 03 7E 00 A6 9C 78 37 D4 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D5 1D 10 03 3A 3E 08 0E 1A 3A 01 68 D8 77 96 2A 09 00 00 03 00 83 5D 5F E8 12 01 00 00 00 41 A0 37 F5 9A ED 58 00 E8 FF C8 FF 26 83 26 83 26 83 0D 00 15 00 06 00 AC FE BD 03 7F 00 13 BA 1A 38 DC 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D6 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 9D DB 98 2A 09 00 00 03 00 83 FA FB E8 12 01 00 00 00 96 A0 F1 F4 9B ED 54 00 12 00 DF FF 26 83 26 83 26 83 F6 FF 01 00 E9 FF AC FE BE 03 7E 00 78 26 8F 38 E4 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D7 1D 10 03 3A 3E 08 0E 1A 3A 01 E0 66 3F 9B 2A 09 00 00 03 00 83 98 98 E9 12 01 00 00 00 C6 A0 01 F5 64 ED 0A 00 44 00 F2 FF 27 83 27 83 27 83 FC FF F4 FF F1 FF AC FE BD 03 7D 00 14 65 9A 38 EC 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D8 1D 10 03 3A 3E 08 0E 1A 3A 01 10 30 A3 9D 2A 09 00 00 03 00 83 36 35 EA 12 01 00 00 00 C5 A0 2F F5 13 ED E0 FF 35 00 F4 FF 27 83 27 83 27 83 0B 00 FB FF FE FF AD FE BD 03 7C 00 67 C3 E9 38 F4 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D9 1D 10 03 3A 3E 08 0E 1A 3A 01 40 F9 06 A0 2A 09 00 00 03 00 83 D4 D1 EA 12 01 00 00 00 BE A0 44 F5 F0 EC F9 FF 00 00 05 00 27 83 27 83 27 83 0D 00 06 00 02 00 AE FE BD 03 7C 00 ED 89 EB 38 FC 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DA 1D 10 03 3A 3E 08 0E 1A 3A 01 88 BE 6A A2 2A 09 00 00 03 00 83 71 6E EB 12 01 00 00 00 C1 A0 3E F5 0D ED 10 00 DE FF 06 00 27 83 27 83 27 83 07 00 FF FF FD FF AF FE BD 03 7C 00 92 04 EC 38 04 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DB 1D 10 03 3A 3E 08 0E 1A 3A 01 B8 87 CE A4 2A 09 00 00 03 00 83 0F 0B EC 12 01 00 00 00 C6 A0 1D F5 31 ED 07 00 E5 FF EB FF 27 83 27 83 27 83 FC FF F8 FF F0 FF AF FE BD 03 7C 00 61 0B E3 38 0C 75 00 00
|
||||
@@ -1,123 +0,0 @@
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E9 1A 10 03 3A 3E 08 0E 1A 3A 01 B8 95 C7 C5 2C 07 00 00 03 00 40 EE FA 64 90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 10 62 10 62 10 A3 FD 3D 03 20 04 A6 FD 36 03 23 00 73 3A BB 37 99 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EA 1A 10 03 3A 3E 08 0E 1A 3A 01 60 4B 2B C8 2C 07 00 00 03 00 42 87 97 65 90 00 00 00 00 00 00 00 00 00 00 00 00 01 00 09 00 18 00 18 00 18 00 A7 FD 3A 03 22 04 A6 FD 36 03 23 00 58 50 AC 37 A1 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EB 1A 10 03 3A 3E 08 0E 1A 3A 01 20 FD 8E CA 2C 07 00 00 03 00 42 1F 34 66 90 00 00 00 00 00 00 00 00 00 00 FE FF 01 00 09 00 18 00 18 00 18 00 A7 FD 3C 03 25 04 A6 FD 37 03 23 00 3C 70 7A 37 A9 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EC 1A 10 03 3A 3E 08 0E 1A 3A 01 C8 B2 F2 CC 2C 07 00 00 03 00 43 B8 D0 66 90 00 00 00 00 1D A8 9D E4 66 E3 FF FF 04 00 07 00 18 00 18 00 18 00 00 00 00 00 00 00 A6 FD 37 03 23 00 57 9B 51 37 B1 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 ED 1A 10 03 3A 3E 08 0E 1A 3A 01 70 68 56 CF 2C 07 00 00 03 00 43 51 6D 67 90 00 00 00 00 1C A8 A3 E4 69 E3 00 00 FF FF 01 00 18 00 18 00 18 00 03 00 FF FF 00 00 A6 FD 37 03 23 00 68 8E D6 36 B9 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EE 1A 10 03 3A 3E 08 0E 1A 3A 01 18 1E BA D1 2C 07 00 00 03 00 43 EA 09 68 90 00 00 00 00 1E A8 A0 E4 6F E3 05 00 F8 FF 00 00 18 00 18 00 18 00 05 00 FF FF FF FF A6 FD 37 03 23 00 BB 1C E4 36 C1 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EF 1A 10 03 3A 3E 08 0E 1A 3A 01 C0 D3 1D D4 2C 07 00 00 03 00 43 83 A6 68 90 00 00 00 00 1A A8 AA E4 89 E3 FF FF F6 FF 02 00 18 00 18 00 18 00 00 00 FE FF FE FF A6 FD 37 03 23 00 2D 37 EB 36 C9 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F0 1A 10 03 3A 3E 08 0E 1A 3A 01 80 85 81 D6 2C 07 00 00 03 00 43 1B 43 69 90 00 00 00 00 15 A8 AA E4 98 E3 FC FF F3 FF 04 00 18 00 18 00 18 00 00 00 FF FF 00 00 A7 FD 38 03 23 00 5B 7B E1 36 D1 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F1 1A 10 03 3A 3E 08 0E 1A 3A 01 28 3B E5 D8 2C 07 00 00 03 00 43 B4 DF 69 90 00 00 00 00 15 A8 A2 E4 A4 E3 02 00 F1 FF 0E 00 18 00 18 00 18 00 FE FF 02 00 00 00 A7 FD 38 03 23 00 D4 7D FB 36 D9 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F2 1A 10 03 3A 3E 08 0E 1A 3A 01 D0 F0 48 DB 2C 07 00 00 03 00 43 4D 7C 6A 90 00 00 00 00 14 A8 9C E4 B7 E3 FF FF EC FF 0A 00 18 00 18 00 18 00 01 00 00 00 02 00 A7 FD 38 03 23 00 49 81 05 37 E1 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F3 1A 10 03 3A 3E 08 0E 1A 3A 01 78 A6 AC DD 2C 07 00 00 03 00 43 E6 18 6B 90 00 00 00 00 11 A8 93 E4 D4 E3 07 00 E5 FF 0B 00 18 00 18 00 18 00 04 00 FE FF 04 00 A7 FD 38 03 23 00 02 C7 11 37 E9 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F4 1A 10 03 3A 3E 08 0E 1A 3A 01 20 5C 10 E0 2C 07 00 00 03 00 43 7F B5 6B 90 00 00 00 00 0D A8 7D E4 01 E4 14 00 D7 FF 15 00 19 00 19 00 19 00 01 00 09 00 00 00 A7 FD 39 03 23 00 89 6A 2D 37 F1 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F5 1A 10 03 3A 3E 08 0E 1A 3A 01 C8 11 74 E2 2C 07 00 00 03 00 83 18 52 6C 90 00 00 00 00 16 A8 72 E4 46 E4 39 00 E4 FF 34 00 19 00 19 00 19 00 FC FF 15 00 02 00 A7 FD 3B 03 23 00 FC 50 79 38 F9 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F6 1A 10 03 3A 3E 08 0E 1A 3A 01 88 C3 D7 E4 2C 07 00 00 03 00 83 B0 EE 6C 90 00 00 00 00 37 A8 6B E4 BC E4 5E 00 BB FF 44 00 19 00 19 00 19 00 0A 00 06 00 0D 00 A8 FD 3C 03 24 00 09 E4 93 38 01 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F7 1A 10 03 3A 3E 08 0E 1A 3A 01 30 79 3B E7 2C 07 00 00 03 00 83 49 8B 6D 90 00 00 00 00 64 A8 39 E4 5E E5 75 00 94 FF 41 00 19 00 19 00 19 00 0C 00 06 00 0B 00 AA FD 3D 03 24 00 8A E8 96 38 09 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F8 1A 10 03 3A 3E 08 0E 1A 3A 01 D8 2E 9F E9 2C 07 00 00 03 00 83 E2 27 6E 90 00 00 00 00 99 A8 DB E3 37 E6 AA 00 6A FF 41 00 19 00 19 00 19 00 0D 00 0F 00 10 00 AC FD 3E 03 25 00 18 A5 98 38 11 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F9 1A 10 03 3A 3E 08 0E 1A 3A 01 80 E4 02 EC 2C 07 00 00 03 00 83 7B C4 6E 90 00 00 00 00 FA A8 37 E3 60 E7 0B 01 02 FF 4E 00 19 00 19 00 19 00 20 00 28 00 28 00 AE FD 41 03 26 00 F8 CE C6 38 19 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FA 1A 10 03 3A 3E 08 0E 1A 3A 01 28 9A 66 EE 2C 07 00 00 03 00 83 14 61 6F 90 00 00 00 00 A3 A9 38 E2 2D E9 9C 01 9E FE 72 00 19 00 19 00 19 00 20 00 31 00 38 00 B1 FD 45 03 28 00 4A 24 52 39 21 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FB 1A 10 03 3A 3E 08 0E 1A 3A 01 D0 4F CA F0 2C 07 00 00 03 00 83 AD FD 6F 90 00 00 00 00 BA AA C0 E0 C0 EB 3D 02 05 FE A6 00 19 00 19 00 19 00 0F 00 2C 00 2F 00 B5 FD 49 03 2A 00 27 4D 92 39 29 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FC 1A 10 03 3A 3E 08 0E 1A 3A 01 78 05 2E F3 2C 07 00 00 03 00 83 46 9A 70 90 00 00 00 00 32 AC 27 DF DF EE 5B 02 05 FE CB 00 19 00 19 00 19 00 EC FF F6 FF 0C 00 B6 FD 4A 03 29 00 EC 15 9C 39 31 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FD 1A 10 03 3A 3E 08 0E 1A 3A 01 38 B7 91 F5 2C 07 00 00 03 00 83 DE 36 71 90 00 00 00 00 A3 AD C2 DD ED F1 07 02 3D FE C6 00 19 00 19 00 19 00 D6 FF C8 FF F2 FF B7 FD 4A 03 24 00 A7 8C AD 39 39 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FE 1A 10 03 3A 3E 08 0E 1A 3A 01 E0 6C F5 F7 2C 07 00 00 03 00 83 77 D3 71 90 00 00 00 00 C1 AE B4 DC 6B F4 55 01 C2 FE 9F 00 19 00 19 00 19 00 BE FF AF FF CA FF B7 FD 47 03 1E 00 00 2E ED 39 41 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FF 1A 10 03 3A 3E 08 0E 1A 3A 01 88 22 59 FA 2C 07 00 00 03 00 83 10 70 72 90 00 00 00 00 4E AF 3F DC E9 F5 76 00 86 FF 65 00 19 00 19 00 19 00 C1 FF A5 FF C7 FF B7 FD 44 03 15 00 C4 E2 1E 3A 49 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 80 1B 10 03 3A 3E 08 0E 1A 3A 01 30 D8 BC FC 2C 07 00 00 03 00 83 A9 0C 73 90 00 00 00 00 3C AF 44 DC 5E F6 B1 FF 0A 00 30 00 1A 00 1A 00 1A 00 CE FF BA FF D4 FF B9 FD 43 03 0E 00 28 3A 3A 3A 51 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 81 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 8D 20 FF 2C 07 00 00 03 00 83 42 A9 73 90 00 00 00 00 B3 AE B7 DC 00 F6 35 FF 99 00 0A 00 1A 00 1A 00 1A 00 D0 FF D3 FF DA FF BA FD 43 03 08 00 36 11 28 3A 59 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 82 1B 10 03 3A 3E 08 0E 1A 3A 01 80 43 84 01 2D 07 00 00 03 00 83 DB 45 74 90 00 00 00 00 03 AE 76 DD E0 F4 DF FE FC 00 EA FF 1A 00 1A 00 1A 00 DA FF D9 FF E9 FF BC FD 43 03 03 00 7B 0A 19 3A 61 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 83 1B 10 03 3A 3E 08 0E 1A 3A 01 28 F9 E7 03 2D 07 00 00 03 00 83 74 E2 74 90 00 00 00 00 37 AD 75 DE 27 F3 90 FE 51 01 D0 FF 1A 00 1A 00 1A 00 E6 FF E2 FF F9 FF BF FD 44 03 00 00 EC 66 1B 3A 69 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 84 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 AA 4B 06 2D 07 00 00 03 00 83 0C 7F 75 90 00 00 00 00 31 AC BB DF 1A F1 4C FE 7C 01 BF FF 1A 00 1A 00 1A 00 F2 FF E5 FF 02 00 C1 FD 45 03 00 00 82 87 06 3A 71 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 85 1B 10 03 3A 3E 08 0E 1A 3A 01 90 60 AF 08 2D 07 00 00 03 00 83 A5 1B 76 90 00 00 00 00 F9 AA 2A E1 DE EE F5 FD D3 01 A5 FF 1A 00 1A 00 1A 00 D8 FF D2 FF EC FF C2 FD 46 03 FF FF E0 E9 D4 39 79 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 86 1B 10 03 3A 3E 08 0E 1A 3A 01 38 16 13 0B 2D 07 00 00 03 00 43 3E B8 76 90 00 00 00 00 76 A9 18 E3 1E EC 87 FD 21 02 B9 FF 1A 00 1A 00 1A 00 E2 FF D5 FF FE FF C3 FD 46 03 FF FF 6C B9 6C 39 81 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 87 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 CB 76 0D 2D 07 00 00 03 00 43 D7 54 77 90 00 00 00 00 A0 A7 7E E5 09 E9 DE FC DE 02 BF FF 1A 00 1A 00 1A 00 AD FF C2 FF D8 FF C1 FD 44 03 FF FF CD DA 54 39 89 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 88 1B 10 03 3A 3E 08 0E 1A 3A 01 88 81 DA 0F 2D 07 00 00 03 00 43 70 F1 77 90 00 00 00 00 9D A5 C9 E8 1E E5 6A FC 51 03 BE FF 1A 00 1A 00 1A 00 DB FF CB FF 17 00 C0 FD 42 03 02 00 5A E4 79 39 91 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 89 1B 10 03 3A 3E 08 0E 1A 3A 01 30 37 3E 12 2D 07 00 00 03 00 83 09 8E 78 90 00 00 00 00 9A A3 60 EC 0E E1 52 FC 63 03 D3 FF 1A 00 1A 00 1A 00 EB FF FB FF 2F 00 C0 FD 42 03 09 00 07 D8 7E 39 99 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8A 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 EC A1 14 2D 07 00 00 03 00 83 A2 2A 79 90 00 00 00 00 ED A1 11 F0 44 DD 9E FC 44 03 F3 FF 1A 00 1A 00 1A 00 F6 FF F8 FF 39 00 C1 FD 43 03 12 00 E1 14 84 39 A1 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8B 1B 10 03 3A 3E 08 0E 1A 3A 01 98 9E 05 17 2D 07 00 00 03 00 83 3A C7 79 90 00 00 00 00 90 A0 B6 F3 B6 D9 C8 FC 0C 03 02 00 1A 00 1A 00 1A 00 0D 00 FC FF 4B 00 C1 FD 43 03 1D 00 8A 01 66 39 A9 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8C 1B 10 03 3A 3E 08 0E 1A 3A 01 40 54 69 19 2D 07 00 00 03 00 83 D3 63 7A 90 00 00 00 00 71 9F 22 F7 98 D6 14 FD F1 02 10 00 1B 00 1B 00 1B 00 F5 FF 05 00 28 00 C1 FD 43 03 27 00 2E A6 59 39 B1 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8D 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 09 CD 1B 2D 07 00 00 03 00 83 6C 00 7B 90 00 00 00 00 AF 9E 7F FA 86 D3 45 FD D1 02 00 00 1B 00 1B 00 1B 00 21 00 12 00 52 00 C1 FD 43 03 32 00 2F 73 32 39 B9 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8E 1B 10 03 3A 3E 08 0E 1A 3A 01 90 BF 30 1E 2D 07 00 00 03 00 83 05 9D 7B 90 00 00 00 00 18 9E 59 FD 18 D1 E0 FD 0D 02 16 00 1B 00 1B 00 1B 00 35 00 3D 00 4F 00 C3 FD 45 03 3F 00 7D 5F 85 39 C1 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8F 1B 10 03 3A 3E 08 0E 1A 3A 01 38 75 94 20 2D 07 00 00 03 00 83 9E 39 7C 90 00 00 00 00 D1 9D 7A FF 5D CF C4 FE 7E 01 1C 00 1B 00 1B 00 1B 00 44 00 5A 00 4D 00 C5 FD 48 03 4B 00 54 52 17 3A C9 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 90 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 2A F8 22 2D 07 00 00 03 00 83 37 D6 7C 90 00 00 00 00 D2 9D B6 00 6B CE AC FF A7 00 3B 00 1B 00 1B 00 1B 00 4C 00 69 00 4B 00 C8 FD 4C 03 56 00 B7 1F 85 3A D1 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 91 1B 10 03 3A 3E 08 0E 1A 3A 01 88 E0 5B 25 2D 07 00 00 03 00 83 D0 72 7D 90 00 00 00 00 00 9E 17 01 69 CE 87 00 BC FF 62 00 1B 00 1B 00 1B 00 5A 00 65 00 4F 00 CB FD 50 03 60 00 EE 97 BD 3A D9 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 92 1B 10 03 3A 3E 08 0E 1A 3A 01 30 96 BF 27 2D 07 00 00 03 00 83 69 0F 7E 90 00 00 00 00 46 9E 9C 00 6E CF 56 01 DB FE 89 00 1B 00 1B 00 1B 00 48 00 54 00 40 00 CF FD 54 03 69 00 1C 76 EA 3A E1 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 93 1B 10 03 3A 3E 08 0E 1A 3A 01 F0 47 23 2A 2D 07 00 00 03 00 83 01 AC 7E 90 00 00 00 00 BF 9E 69 FF 3A D1 0E 02 4B FE A6 00 1B 00 1B 00 1B 00 36 00 45 00 3A 00 D1 FD 57 03 70 00 2A E1 05 3B E9 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 94 1B 10 03 3A 3E 08 0E 1A 3A 01 98 FD 86 2C 2D 07 00 00 03 00 83 9A 48 7F 90 00 00 00 00 74 9F 8A FD BC D3 A5 02 83 FD AC 00 1B 00 1B 00 1B 00 3B 00 2A 00 5B 00 D4 FD 59 03 77 00 20 AB 08 3B F1 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 95 1B 10 03 3A 3E 08 0E 1A 3A 01 40 B3 EA 2E 2D 07 00 00 03 00 83 33 E5 7F 90 00 00 00 00 54 A0 D0 FA 1E D7 33 03 BE FC A7 00 1B 00 1B 00 1B 00 2E 00 1D 00 58 00 D8 FD 5B 03 7D 00 03 A8 EE 3A F9 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 96 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 68 4E 31 2D 07 00 00 03 00 83 CC 81 80 90 00 00 00 00 8B A1 54 F7 3E DB B5 03 25 FC 91 00 1B 00 1B 00 1B 00 17 00 0B 00 4E 00 DC FD 5D 03 81 00 A3 89 B7 3A 01 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 97 1B 10 03 3A 3E 08 0E 1A 3A 01 90 1E B2 33 2D 07 00 00 03 00 83 65 1E 81 90 00 00 00 00 34 A3 4F F3 DD DF 0C 04 D6 FB 8F 00 1B 00 1B 00 1B 00 07 00 04 00 4E 00 DF FD 5F 03 83 00 ED E5 78 3A 09 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 98 1B 10 03 3A 3E 08 0E 1A 3A 01 38 D4 15 36 2D 07 00 00 03 00 83 FE BA 81 90 00 00 00 00 45 A5 08 EF FA E4 39 04 76 FB A8 00 1C 00 1C 00 1C 00 FC FF F2 FF 58 00 E3 FD 61 03 84 00 99 24 16 3A 11 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 99 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 89 79 38 2D 07 00 00 03 00 83 97 57 82 90 00 00 00 00 AD A7 AA EA 7D EA 38 04 5E FB B4 00 1C 00 1C 00 1C 00 E9 FF E5 FF 5B 00 E5 FD 62 03 82 00 8E A3 92 39 19 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9A 1B 10 03 3A 3E 08 0E 1A 3A 01 88 3F DD 3A 2D 07 00 00 03 00 83 30 F4 82 90 00 00 00 00 61 AA 63 E6 22 F0 24 04 78 FB BC 00 1C 00 1C 00 1C 00 D3 FF DE FF 3F 00 E8 FD 63 03 7E 00 5C 8E 08 39 21 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9B 1B 10 03 3A 3E 08 0E 1A 3A 01 30 F5 40 3D 2D 07 00 00 03 00 83 C9 90 83 90 00 00 00 00 48 AD 74 E2 86 F5 C9 03 D7 FB 8B 00 1C 00 1C 00 1C 00 C9 FF BC FF 2E 00 EA FD 62 03 76 00 B2 12 47 39 29 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9C 1B 10 03 3A 3E 08 0E 1A 3A 01 F0 A6 A4 3F 2D 07 00 00 03 00 83 61 2D 84 90 00 00 00 00 2A B0 DA DE 43 FA 4E 03 4F FC 4E 00 1C 00 1C 00 1C 00 C1 FF B1 FF 1C 00 EB FD 61 03 6C 00 D1 B2 BA 39 31 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9D 1B 10 03 3A 3E 08 0E 1A 3A 01 98 5C 08 42 2D 07 00 00 03 00 83 FA C9 84 90 00 00 00 00 D8 B2 B0 DB 26 FE CD 02 FC FC 22 00 1C 00 1C 00 1C 00 B7 FF CB FF FF FF EC FD 60 03 60 00 95 BB E8 39 39 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9E 1B 10 03 3A 3E 08 0E 1A 3A 01 40 12 6C 44 2D 07 00 00 03 00 83 93 66 85 90 00 00 00 00 45 B5 2F D9 45 01 4D 02 AD FD 17 00 1C 00 1C 00 1C 00 B4 FF CE FF E9 FF EC FD 5F 03 51 00 CA AA EB 39 41 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9F 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 C7 CF 46 2D 07 00 00 03 00 83 2C 03 86 90 00 00 00 00 40 B7 93 D7 A2 03 D6 01 A1 FE 38 00 1C 00 1C 00 1C 00 AC FF D3 FF E0 FF EB FD 5F 03 41 00 73 6A F0 39 49 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A0 1B 10 03 3A 3E 08 0E 1A 3A 01 90 7D 33 49 2D 07 00 00 03 00 83 C5 9F 86 90 00 00 00 00 BE B8 F5 D6 45 05 43 01 70 FF 51 00 1C 00 1C 00 1C 00 BF FF B8 FF EA FF EB FD 5E 03 31 00 A6 3A FD 39 51 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A1 1B 10 03 3A 3E 08 0E 1A 3A 01 38 33 97 4B 2D 07 00 00 03 00 83 5E 3C 87 90 00 00 00 00 6D B9 ED D6 06 06 48 00 1B 00 2C 00 1C 00 1C 00 1C 00 C8 FF AA FF DA FF ED FD 5B 03 21 00 E0 A0 28 3A 59 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A2 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 E8 FA 4D 2D 07 00 00 03 00 83 F7 D8 87 90 00 00 00 00 1C B9 69 D7 B1 05 32 FF C2 00 05 00 1C 00 1C 00 1C 00 D6 FF AA FF CA FF EF FD 58 03 10 00 39 FF 40 3A 61 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A3 1B 10 03 3A 3E 08 0E 1A 3A 01 88 9E 5E 50 2D 07 00 00 03 00 83 90 75 88 90 00 00 00 00 CD B7 61 D8 59 04 54 FE 6B 01 ED FF 1C 00 1C 00 1C 00 C4 FF C4 FF C3 FF F1 FD 57 03 01 00 9C 7B 32 3A 69 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A4 1B 10 03 3A 3E 08 0E 1A 3A 01 30 54 C2 52 2D 07 00 00 03 00 83 29 12 89 90 00 00 00 00 C0 B5 00 DA 14 02 6C FD 31 02 BE FF 1D 00 1D 00 1D 00 C5 FF 9C FF C6 FF F2 FD 55 03 F4 FF 8C 81 52 3A 71 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A5 1B 10 03 3A 3E 08 0E 1A 3A 01 F0 05 26 55 2D 07 00 00 03 00 83 C1 AE 89 90 00 00 00 00 D9 B2 0D DC 8F FE 4A FC CF 02 60 FF 1D 00 1D 00 1D 00 CB FF 98 FF D7 FF F4 FD 52 03 EA FF AE DB B9 3A 79 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A6 1B 10 03 3A 3E 08 0E 1A 3A 01 98 BB 89 57 2D 07 00 00 03 00 83 5A 4B 8A 90 00 00 00 00 43 AF BA DE F9 F9 6A FB A9 03 56 FF 1D 00 1D 00 1D 00 B2 FF 9F FF F9 FF F4 FD 50 03 E4 FF E9 C0 DE 3A 81 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A7 1B 10 03 3A 3E 08 0E 1A 3A 01 40 71 ED 59 2D 07 00 00 03 00 83 F3 E7 8A 90 00 00 00 00 49 AB 0A E2 8C F4 D7 FA C8 03 28 FF 1D 00 1D 00 1D 00 E1 FF B8 FF 41 00 F6 FD 4F 03 E6 FF 44 A3 04 3B 89 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A8 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 26 51 5C 2D 07 00 00 03 00 83 8C 84 8B 90 00 00 00 00 79 A7 8A E5 0B EF D8 FA 17 04 4C FF 1D 00 1D 00 1D 00 BA FF D9 FF 35 00 F5 FD 50 03 ED FF DC AF EB 3A 91 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A9 1B 10 03 3A 3E 08 0E 1A 3A 01 90 DC B4 5E 2D 07 00 00 03 00 83 25 21 8C 90 00 00 00 00 16 A4 A5 E9 60 E9 EF FA 42 04 73 FF 1D 00 1D 00 1D 00 DB FF E7 FF 67 00 F4 FD 51 03 F7 FF E8 66 D6 3A 99 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AA 1B 10 03 3A 3E 08 0E 1A 3A 01 38 92 18 61 2D 07 00 00 03 00 83 BE BD 8C 90 00 00 00 00 48 A1 C9 ED 1E E4 67 FB FC 03 94 FF 1D 00 1D 00 1D 00 FB FF 0A 00 72 00 F4 FD 53 03 05 00 72 5D DD 3A A1 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AB 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 47 7C 63 2D 07 00 00 03 00 83 57 5A 8D 90 00 00 00 00 3A 9F A3 F1 99 DF 3F FC A5 03 CF FF 1D 00 1D 00 1D 00 FB FF 37 00 54 00 F4 FD 56 03 14 00 0A 6C CB 3A A9 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AC 1B 10 03 3A 3E 08 0E 1A 3A 01 88 FD DF 65 2D 07 00 00 03 00 83 F0 F6 8D 90 00 00 00 00 FB 9D 55 F5 CC DB 2B FD 32 03 1F 00 1D 00 1D 00 1D 00 12 00 22 00 51 00 F4 FD 59 03 24 00 C4 5B E7 3A B1 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AD 1B 10 03 3A 3E 08 0E 1A 3A 01 30 B3 43 68 2D 07 00 00 03 00 83 89 93 8E 90 00 00 00 00 1D 9D A6 F8 86 D8 27 FD 07 03 EC FF 1D 00 1D 00 1D 00 09 00 F3 FF 41 00 F3 FD 58 03 32 00 AE D5 A4 3A B9 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AE 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 68 A7 6A 2D 07 00 00 03 00 83 22 30 8F 90 00 00 00 00 50 9C B2 FB 54 D5 F6 FC DD 02 AF FF 1D 00 1D 00 1D 00 10 00 E3 FF 27 00 F2 FD 55 03 3F 00 6B D7 9A 3A C1 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AF 1B 10 03 3A 3E 08 0E 1A 3A 01 98 1A 0B 6D 2D 07 00 00 03 00 83 BA CC 8F 90 00 00 00 00 8A 9B AF FE 2D D2 F1 FC D2 02 C0 FF 1D 00 1D 00 1D 00 0F 00 0D 00 3C 00 F0 FD 52 03 4C 00 E6 A0 9C 3A C9 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B0 1B 10 03 3A 3E 08 0E 1A 3A 01 40 D0 6E 6F 2D 07 00 00 03 00 83 53 69 90 90 00 00 00 00 ED 9A 6F 01 6B CF 5F FD 49 02 C3 FF 1E 00 1E 00 1E 00 31 00 42 00 5C 00 EE FD 51 03 5C 00 D0 3E B1 3A D1 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B1 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 85 D2 71 2D 07 00 00 03 00 03 EC 05 91 90 00 00 00 00 8F 9A 5E 03 8F CD B2 FE 1E 01 F2 FF 1E 00 1E 00 1E 00 60 00 96 00 7B 00 EE FD 54 03 6D 00 1D 67 11 3B D9 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B2 1B 10 03 3A 3E 08 0E 1A 3A 01 90 3B 36 74 2D 07 00 00 03 00 03 85 A2 91 90 00 00 00 00 96 9A 10 04 01 CD 53 00 27 00 3D 00 1E 00 1E 00 1E 00 5C 00 AE 00 66 00 EE FD 5A 03 7D 00 10 F7 6C 3B E1 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B3 1B 10 03 3A 3E 08 0E 1A 3A 01 38 F1 99 76 2D 07 00 00 03 00 83 1E 3F 92 90 00 00 00 00 0F 9B C4 03 A3 CD CD 01 0B FF B4 00 1E 00 1E 00 1E 00 5F 00 91 00 6F 00 EF FD 5F 03 8C 00 ED A9 B2 3B E9 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B4 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 A6 FD 78 2D 07 00 00 03 00 83 B7 DB 92 90 00 00 00 00 CF 9B 7E 02 8B CF E7 02 04 FE E9 00 1E 00 1E 00 1E 00 54 00 74 00 7D 00 F1 FD 62 03 99 00 E2 F3 D4 3B F1 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B5 1B 10 03 3A 3E 08 0E 1A 3A 01 88 5C 61 7B 2D 07 00 00 03 00 83 50 78 93 90 00 00 00 00 E2 9C 24 00 C4 D2 0F 04 C0 FC 0F 01 1E 00 1E 00 1E 00 4D 00 56 00 A0 00 F3 FD 66 03 A6 00 84 96 F5 3B F9 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B6 1B 10 03 3A 3E 08 0E 1A 3A 01 30 12 C5 7D 2D 07 00 00 03 00 83 E9 14 94 90 00 00 00 00 6D 9E 8B FC 6F D7 33 05 8D FB 40 01 1E 00 1E 00 1E 00 27 00 4E 00 A7 00 F6 FD 69 03 B1 00 F1 09 09 3C 01 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B7 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 C7 28 80 2D 07 00 00 03 00 83 82 B1 94 90 00 00 00 00 D5 A0 2E F8 5D DD 0A 06 1E FB 7D 01 1E 00 1E 00 1E 00 E5 FF 10 00 97 00 F7 FD 6C 03 B8 00 D8 F3 06 3C 09 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B8 1B 10 03 3A 3E 08 0E 1A 3A 01 80 7D 8C 82 2D 07 00 00 03 00 83 1B 4E 95 90 00 00 00 00 27 A4 8E F3 F7 E3 52 06 DE FA 92 01 1E 00 1E 00 1E 00 C8 FF D3 FF 8D 00 F8 FD 6D 03 BA 00 7A 37 D1 3B 11 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B9 1B 10 03 3A 3E 08 0E 1A 3A 01 28 33 F0 84 2D 07 00 00 03 00 83 B4 EA 95 90 00 00 00 00 0E A8 EB EE CE EA 25 06 D9 FA 4F 01 1E 00 1E 00 1E 00 B9 FF 9B FF 8C 00 F9 FD 6B 03 B8 00 9E DD 92 3B 19 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BA 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 E4 53 87 2D 07 00 00 03 00 83 4C 87 96 90 00 00 00 00 B3 AC AA E9 41 F1 90 06 BD FA 45 00 1E 00 1E 00 1E 00 E9 FF BE FF B8 00 FD FD 69 03 B2 00 F0 BB 7E 3B 21 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BB 1B 10 03 3A 3E 08 0E 1A 3A 01 90 9A B7 89 2D 07 00 00 03 00 83 E5 23 97 90 00 00 00 00 AA B2 90 E3 E0 F7 62 07 EA F9 AD 00 1E 00 1E 00 1E 00 CD FF 08 00 E0 00 02 FE 6B 03 AC 00 2C CF 3E 3B 29 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BC 1B 10 03 3A 3E 08 0E 1A 3A 01 38 50 1B 8C 2D 07 00 00 03 00 83 7E C0 97 90 00 00 00 00 41 B9 26 DE 9C FF A7 06 C8 FA 4E 01 1F 00 1F 00 1F 00 42 FF 57 FF 0E 00 FE FD 67 03 9A 00 7A 9B 0A 3B 31 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BD 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 05 7F 8E 2D 07 00 00 03 00 83 17 5D 98 90 00 00 00 00 85 BE B7 DA 7E 05 D1 03 E1 FC A1 00 1F 00 1F 00 1F 00 36 FF B5 FE 86 FF F7 FD 56 03 7B 00 71 E8 05 3B 39 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BE 1B 10 03 3A 3E 08 0E 1A 3A 01 88 BB E2 90 2D 07 00 00 03 00 83 B0 F9 98 90 00 00 00 00 B3 C0 EE D8 B0 07 7C 00 2B FF D7 FF 1F 00 1F 00 1F 00 6C FF 0D FF 64 FF F1 FD 44 03 56 00 08 5A 1D 3B 41 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BF 1B 10 03 3A 3E 08 0E 1A 3A 01 30 71 46 93 2D 07 00 00 03 00 83 49 96 99 90 00 00 00 00 6D C0 B4 D8 71 07 1B FF 77 00 E0 FF 1F 00 1F 00 1F 00 B0 FF C1 FF BB FF EF FD 3E 03 36 00 9E 1A 1A 3B 49 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C0 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 26 AA 95 2D 07 00 00 03 00 83 E2 32 9A 90 00 00 00 00 57 BF 4A D9 A3 06 E9 FE D8 00 12 00 1F 00 1F 00 1F 00 C9 FF E9 FF D6 FF F1 FD 3F 03 1D 00 C5 D9 F3 3A 51 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C1 1B 10 03 3A 3E 08 0E 1A 3A 01 80 DC 0D 98 2D 07 00 00 03 00 83 7B CF 9A 90 00 00 00 00 E4 BD 52 DA 41 05 6A FE 4F 01 C6 FF 1F 00 1F 00 1F 00 EE FF DA FF EC FF F4 FD 3F 03 07 00 4C F1 DD 3A 59 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C2 1B 10 03 3A 3E 08 0E 1A 3A 01 28 92 71 9A 2D 07 00 00 03 00 83 14 6C 9B 90 00 00 00 00 1C BC 71 DB 48 03 D6 FD 9D 01 9E FF 1F 00 1F 00 1F 00 D2 FF CB FF D3 FF F8 FD 3F 03 F4 FF A7 43 DA 3A 61 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C3 1B 10 03 3A 3E 08 0E 1A 3A 01 D0 47 D5 9C 2D 07 00 00 03 00 83 AD 08 9C 90 00 00 00 00 96 B9 30 DD 90 00 DD FC 41 02 7E FF 1F 00 1F 00 1F 00 DB FF 96 FF E9 FF FA FD 3D 03 E2 FF 4A DC A8 3A 69 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C4 1B 10 03 3A 3E 08 0E 1A 3A 01 78 FD 38 9F 2D 07 00 00 03 00 83 46 A5 9C 90 00 00 00 00 1A B6 65 DF FE FC E2 FB AD 02 77 FF 1F 00 1F 00 1F 00 E4 FF 9D FF 09 00 FD FD 3B 03 D6 FF 4A B3 9C 3A 71 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C5 1B 10 03 3A 3E 08 0E 1A 3A 01 20 B3 9C A1 2D 07 00 00 03 00 83 DF 41 9D 90 00 00 00 00 F8 B1 F2 E1 D9 F8 12 FB 2E 03 69 FF 1F 00 1F 00 1F 00 AD FF 9F FF E6 FF FE FD 3A 03 CD FF E8 E4 E0 3A 79 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C6 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 64 00 A4 2D 07 00 00 03 00 83 77 DE 9D 90 00 00 00 00 91 AD 63 E5 C7 F3 95 FA F7 03 3A FF 1F 00 1F 00 1F 00 D1 FF AC FF 3A 00 FF FD 3A 03 CB FF E6 7B 03 3B 81 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C7 1B 10 03 3A 3E 08 0E 1A 3A 01 88 1A 64 A6 2D 07 00 00 03 00 83 10 7B 9E 90 00 00 00 00 44 A9 04 E9 86 EE 79 FA 9C 03 55 FF 1F 00 1F 00 1F 00 F2 FF D8 FF 5A 00 02 FE 3D 03 D1 FF 16 8F 17 3B 89 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C8 1B 10 03 3A 3E 08 0E 1A 3A 01 30 D0 C7 A8 2D 07 00 00 03 00 83 A9 17 9F 90 00 00 00 00 65 A5 9C EC AD E9 C2 FA A0 03 65 FF 20 00 20 00 20 00 D5 FF 00 00 3E 00 04 FE 41 03 DA FF 75 CC 14 3B 91 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C9 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 85 2B AB 2D 07 00 00 03 00 83 42 B4 9F 90 00 00 00 00 41 A2 6F F0 F2 E4 50 FB 9A 03 79 FF 20 00 20 00 20 00 14 00 0A 00 86 00 06 FE 46 03 E8 FF BA 24 16 3B 99 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CA 1B 10 03 3A 3E 08 0E 1A 3A 01 80 3B 8F AD 2D 07 00 00 03 00 83 DB 50 A0 90 00 00 00 00 D5 9F 4E F3 09 E1 73 FC 57 02 6B FF 20 00 20 00 20 00 23 00 6E 00 68 00 0A FE 4D 03 FA FF 92 47 18 3B A1 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CB 1B 10 03 3A 3E 08 0E 1A 3A 01 28 F1 F2 AF 2D 07 00 00 03 00 83 74 ED A0 90 00 00 00 00 58 9E 96 F5 1B DE 7E FD 3C 02 AC FF 20 00 20 00 20 00 19 00 64 00 3C 00 0B FE 56 03 08 00 31 5D 44 3B A9 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CC 1B 10 03 3A 3E 08 0E 1A 3A 01 D0 A6 56 B2 2D 07 00 00 03 00 83 0D 8A A1 90 00 00 00 00 7A 9D 9C F7 C3 DB 0E FE C5 01 C0 FF 20 00 20 00 20 00 38 00 2D 00 5B 00 0D FE 5A 03 18 00 F1 03 50 3B B1 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CD 1B 10 03 3A 3E 08 0E 1A 3A 01 78 5C BA B4 2D 07 00 00 03 00 83 A6 26 A2 90 00 00 00 00 DB 9C C7 F8 2C DA 05 FF D6 00 CB FF 20 00 20 00 20 00 2F 00 6C 00 44 00 0F FE 5F 03 28 00 84 04 5E 3B B9 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CE 1B 10 03 3A 3E 08 0E 1A 3A 01 20 12 1E B7 2D 07 00 00 03 00 83 3F C3 A2 90 00 00 00 00 C7 9C 64 F9 3C D9 D7 FF A4 00 E3 FF 20 00 20 00 20 00 38 00 5E 00 3C 00 0F FE 64 03 36 00 84 A6 89 3B C1 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CF 1B 10 03 3A 3E 08 0E 1A 3A 01 C8 C7 81 B9 2D 07 00 00 03 00 83 D8 5F A3 90 00 00 00 00 01 9D 80 F9 FB D8 82 00 F6 FF 17 00 20 00 20 00 20 00 34 00 4D 00 33 00 10 FE 67 03 43 00 8E 7A 95 3B C9 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D0 1B 10 03 3A 3E 08 0E 1A 3A 01 70 7D E5 BB 2D 07 00 00 03 00 83 71 FC A3 90 00 00 00 00 7A 9D 3A F9 47 D9 EB 00 C6 FF 23 00 20 00 20 00 20 00 1C 00 1D 00 15 00 10 FE 69 03 4D 00 43 04 91 3B D1 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D1 1B 10 03 3A 3E 08 0E 1A 3A 01 18 33 49 BE 2D 07 00 00 03 00 83 0A 99 A4 90 00 00 00 00 FA 9D CA F8 CA D9 EB 00 AD FF 03 00 20 00 20 00 20 00 15 00 FD FF 12 00 0F FE 68 03 55 00 CD C5 3E 3B D9 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D2 1B 10 03 3A 3E 08 0E 1A 3A 01 C0 E8 AC C0 2D 07 00 00 03 00 83 A3 35 A5 90 00 00 00 00 69 9E 30 F8 61 DA F0 00 78 FF FE FF 20 00 20 00 20 00 18 00 05 00 13 00 0E FE 67 03 5B 00 FB 08 10 3B E1 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D3 1B 10 03 3A 3E 08 0E 1A 3A 01 68 9E 10 C3 2D 07 00 00 03 00 83 3C D2 A5 90 00 00 00 00 D2 9E 6A F7 1C DB 01 01 51 FF 01 00 20 00 20 00 20 00 1B 00 0E 00 18 00 0E FE 67 03 61 00 B4 52 EA 3A E9 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D4 1B 10 03 3A 3E 08 0E 1A 3A 01 10 54 74 C5 2D 07 00 00 03 00 83 D5 6E A6 90 00 00 00 00 48 9F 7E F6 17 DC 30 01 2D FF 10 00 21 00 21 00 21 00 0C 00 12 00 0F 00 0D FE 68 03 66 00 C4 29 5D 3A F1 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D5 1B 10 03 3A 3E 08 0E 1A 3A 01 D0 05 D8 C7 2D 07 00 00 03 00 83 6D 0B A7 90 00 00 00 00 D7 9F 86 F5 2E DD 59 01 1D FF 1F 00 21 00 21 00 21 00 16 00 18 00 2D 00 0D FE 69 03 6B 00 DE CC AC 39 F9 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D6 1B 10 03 3A 3E 08 0E 1A 3A 01 78 BB 3B CA 2D 07 00 00 03 00 83 06 A8 A7 90 00 00 00 00 86 A0 2D F4 9C DE BF 01 84 FE 20 00 21 00 21 00 21 00 22 00 33 00 2E 00 0F FE 6B 03 70 00 DE 8A 2B 39 01 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D7 1B 10 03 3A 3E 08 0E 1A 3A 01 20 71 9F CC 2D 07 00 00 03 00 83 9F 44 A8 90 00 00 00 00 85 A1 95 F2 71 E0 21 02 A3 FE 3E 00 21 00 21 00 21 00 FC FF 25 00 0B 00 0E FE 6E 03 72 00 2E 4E CB 39 09 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D8 1B 10 03 3A 3E 08 0E 1A 3A 01 C8 26 03 CF 2D 07 00 00 03 00 83 38 E1 A8 90 00 00 00 00 D1 A2 0A F1 56 E2 43 02 AA FE 39 00 21 00 21 00 21 00 E5 FF F1 FF F9 FF 0D FE 6F 03 71 00 53 F0 E7 39 11 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D9 1B 10 03 3A 3E 08 0E 1A 3A 01 70 DC 66 D1 2D 07 00 00 03 00 83 D1 7D A9 90 00 00 00 00 32 A4 96 EF D3 E3 EB 01 F3 FE 00 00 21 00 21 00 21 00 F3 FF CE FF 00 00 0C FE 6E 03 6E 00 3C 77 0A 3A 19 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DA 1B 10 03 3A 3E 08 0E 1A 3A 01 18 92 CA D3 2D 07 00 00 03 00 83 6A 1A AA 90 00 00 00 00 4F A5 12 EE 12 E5 7A 01 C3 FE D5 FF 21 00 21 00 21 00 FB FF CD FF FA FF 0C FE 6C 03 6B 00 68 5A 61 3A 21 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DB 1B 10 03 3A 3E 08 0E 1A 3A 01 C0 47 2E D6 2D 07 00 00 03 00 83 03 B7 AA 90 00 00 00 00 2B A6 AB EC 1F E6 0B 01 30 FF BF FF 21 00 21 00 21 00 E0 FF C2 FF DA FF 0B FE 6A 03 64 00 46 28 80 3A 29 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DC 1B 10 03 3A 3E 08 0E 1A 3A 01 68 FD 91 D8 2D 07 00 00 03 00 83 9C 53 AB 90 00 00 00 00 BC A6 91 EB A7 E6 9B 00 4D FF A7 FF 21 00 21 00 21 00 F4 FF D2 FF ED FF 0A FE 68 03 5E 00 D8 E4 94 3A 31 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DD 1B 10 03 3A 3E 08 0E 1A 3A 01 10 B3 F5 DA 2D 07 00 00 03 00 83 35 F0 AB 90 00 00 00 00 12 A7 8F EA F0 E6 49 00 76 FF 9D FF 21 00 21 00 21 00 ED FF D5 FF E9 FF 08 FE 66 03 58 00 9C 62 88 3A 39 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DE 1B 10 03 3A 3E 08 0E 1A 3A 01 B8 68 59 DD 2D 07 00 00 03 00 83 CE 8C AC 90 00 00 00 00 31 A7 C5 E9 06 E7 07 00 A2 FF AE FF 21 00 21 00 21 00 E7 FF E8 FF EB FF 06 FE 65 03 53 00 55 F1 7C 3A 41 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DF 1B 10 03 3A 3E 08 0E 1A 3A 01 60 1E BD DF 2D 07 00 00 03 00 83 67 29 AD 90 00 00 00 00 2C A7 37 E9 01 E7 E3 FF B0 FF B9 FF 21 00 21 00 21 00 F6 FF EF FF FD FF 05 FE 64 03 4F 00 06 20 78 3A 49 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E0 1B 10 03 3A 3E 08 0E 1A 3A 01 08 D4 20 E2 2D 07 00 00 03 00 83 00 C6 AD 90 00 00 00 00 1A A7 B4 E8 FD E6 EB FF 9F FF BB FF 22 00 22 00 22 00 08 00 00 00 0B 00 04 FE 65 03 4C 00 88 25 24 3A 51 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E1 1B 10 03 3A 3E 08 0E 1A 3A 01 B0 89 84 E4 2D 07 00 00 03 00 83 99 62 AE 90 00 00 00 00 16 A7 16 E8 25 E7 16 00 92 FF C9 FF 22 00 22 00 22 00 F7 FF 0E 00 FE FF 02 FE 66 03 4A 00 91 6C F9 39 59 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E2 1B 10 03 3A 3E 08 0E 1A 3A 01 58 3F E8 E6 2D 07 00 00 03 00 83 32 FF AE 90 00 00 00 00 2A A7 9F E7 56 E7 29 00 BE FF DE FF 22 00 22 00 22 00 F1 FF 02 00 FD FF 00 FE 66 03 47 00 B3 52 9F 39 61 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E3 1B 10 03 3A 3E 08 0E 1A 3A 01 00 F5 4B E9 2D 07 00 00 03 00 83 CB 9B AF 90 00 00 00 00 3F A7 50 E7 7C E7 17 00 D6 FF E7 FF 22 00 22 00 22 00 F0 FF F0 FF FF FF FD FD 66 03 45 00 03 8E 21 39 69 6D 00 00
|
||||
860
head-tracking/plot.py
Normal file
@@ -0,0 +1,860 @@
|
||||
import struct
|
||||
import bluetooth
|
||||
import threading
|
||||
import time
|
||||
from datetime import datetime
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib.animation import FuncAnimation
|
||||
import os
|
||||
import asciichartpy as acp
|
||||
from rich.live import Live
|
||||
from rich.layout import Layout
|
||||
from rich.panel import Panel
|
||||
from rich.console import Console
|
||||
import drawille
|
||||
from head_orientation import HeadOrientation
|
||||
import logging
|
||||
from connection_manager import ConnectionManager
|
||||
|
||||
class Colors:
|
||||
RESET = "\033[0m"
|
||||
BOLD = "\033[1m"
|
||||
RED = "\033[91m"
|
||||
GREEN = "\033[92m"
|
||||
YELLOW = "\033[93m"
|
||||
BLUE = "\033[94m"
|
||||
MAGENTA = "\033[95m"
|
||||
CYAN = "\033[96m"
|
||||
WHITE = "\033[97m"
|
||||
BG_BLACK = "\033[40m"
|
||||
|
||||
class ColorFormatter(logging.Formatter):
|
||||
FORMATS = {
|
||||
logging.DEBUG: Colors.BLUE + "[%(levelname)s] %(message)s" + Colors.RESET,
|
||||
logging.INFO: Colors.GREEN + "%(message)s" + Colors.RESET,
|
||||
logging.WARNING: Colors.YELLOW + "%(message)s" + Colors.RESET,
|
||||
logging.ERROR: Colors.RED + "[%(levelname)s] %(message)s" + Colors.RESET,
|
||||
logging.CRITICAL: Colors.RED + Colors.BOLD + "[%(levelname)s] %(message)s" + Colors.RESET
|
||||
}
|
||||
|
||||
def format(self, record):
|
||||
log_fmt = self.FORMATS.get(record.levelno)
|
||||
formatter = logging.Formatter(log_fmt, datefmt="%H:%M:%S")
|
||||
return formatter.format(record)
|
||||
|
||||
handler = logging.StreamHandler()
|
||||
handler.setFormatter(ColorFormatter())
|
||||
logger = logging.getLogger("airpods-head-tracking")
|
||||
logger.setLevel(logging.INFO)
|
||||
logger.addHandler(handler)
|
||||
logger.propagate = True
|
||||
|
||||
INIT_CMD = "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00"
|
||||
NOTIF_CMD = "04 00 04 00 0F 00 FF FF FE FF"
|
||||
START_CMD = "04 00 04 00 17 00 00 00 10 00 10 00 08 A1 02 42 0B 08 0E 10 02 1A 05 01 40 9C 00 00"
|
||||
STOP_CMD = "04 00 04 00 17 00 00 00 10 00 11 00 08 7E 10 02 42 0B 08 4E 10 02 1A 05 01 00 00 00 00"
|
||||
|
||||
KEY_FIELDS = {
|
||||
"orientation 1": (43, 2),
|
||||
"orientation 2": (45, 2),
|
||||
"orientation 3": (47, 2),
|
||||
|
||||
"Horizontal Acceleration": (51, 2),
|
||||
"Vertical Acceleration": (53, 2),
|
||||
|
||||
"unkown 1": (61, 2),
|
||||
"unkown 2 ": (49, 2),
|
||||
}
|
||||
|
||||
class AirPodsTracker:
|
||||
def __init__(self):
|
||||
self.sock = None
|
||||
self.recording = False
|
||||
self.log_file = None
|
||||
self.listener_thread = None
|
||||
self.bt_addr = "28:2D:7F:C2:05:5B"
|
||||
self.psm = 0x1001
|
||||
self.raw_packets = []
|
||||
self.parsed_packets = []
|
||||
self.live_data = []
|
||||
self.live_plotting = False
|
||||
self.animation = None
|
||||
self.fig = None
|
||||
self.axes = None
|
||||
self.lines = {}
|
||||
self.selected_fields = []
|
||||
self.data_lock = threading.Lock()
|
||||
self.orientation_offset = 5500
|
||||
self.use_terminal = True # '--terminal' in sys.argv
|
||||
self.orientation_visualizer = HeadOrientation(use_terminal=self.use_terminal)
|
||||
|
||||
self.conn = None
|
||||
|
||||
def connect(self):
|
||||
try:
|
||||
logger.info("Trying to connect to %s on PSM 0x%04X...", self.bt_addr, self.psm)
|
||||
self.conn = ConnectionManager(self.bt_addr, self.psm, logger=logger)
|
||||
if not self.conn.connect():
|
||||
logger.error("Connection failed via ConnectionManager.")
|
||||
return False
|
||||
self.sock = self.conn.sock
|
||||
self.sock.send(bytes.fromhex(NOTIF_CMD))
|
||||
logger.info("Sent initialization command.")
|
||||
|
||||
self.listener_thread = threading.Thread(target=self.listen, daemon=True)
|
||||
self.listener_thread.start()
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error("Connection error: %s", e)
|
||||
return False
|
||||
|
||||
def start_tracking(self, duration=None):
|
||||
if not self.recording:
|
||||
self.conn.send_start()
|
||||
filename = "head_tracking_" + datetime.now().strftime("%Y%m%d_%H%M%S") + ".log"
|
||||
self.log_file = open(filename, "w")
|
||||
self.recording = True
|
||||
logger.info("Recording started. Saving data to %s", filename)
|
||||
|
||||
if duration is not None and duration > 0:
|
||||
def auto_stop():
|
||||
time.sleep(duration)
|
||||
if self.recording:
|
||||
self.stop_tracking()
|
||||
logger.info("Recording automatically stopped after %s seconds.", duration)
|
||||
|
||||
timer_thread = threading.Thread(target=auto_stop, daemon=True)
|
||||
timer_thread.start()
|
||||
logger.info("Will automatically stop recording after %s seconds.", duration)
|
||||
else:
|
||||
logger.info("Already recording.")
|
||||
|
||||
def stop_tracking(self):
|
||||
if self.recording:
|
||||
self.conn.send_stop()
|
||||
self.recording = False
|
||||
if self.log_file is not None:
|
||||
self.log_file.close()
|
||||
self.log_file = None
|
||||
logger.info("Recording stopped.")
|
||||
else:
|
||||
logger.info("Not currently recording.")
|
||||
|
||||
def format_hex(self, data):
|
||||
hex_str = data.hex()
|
||||
return ' '.join(hex_str[i:i + 2] for i in range(0, len(hex_str), 2))
|
||||
|
||||
def parse_raw_packet(self, hex_string):
|
||||
return bytes.fromhex(hex_string.replace(" ", ""))
|
||||
|
||||
def interpret_bytes(self, raw_bytes, start, length, data_type="signed_short"):
|
||||
if start + length > len(raw_bytes):
|
||||
return None
|
||||
|
||||
if data_type == "signed_short":
|
||||
return int.from_bytes(raw_bytes[start:start + 2], byteorder='little', signed=True)
|
||||
elif data_type == "unsigned_short":
|
||||
return int.from_bytes(raw_bytes[start:start + 2], byteorder='little', signed=False)
|
||||
elif data_type == "signed_short_be":
|
||||
return int.from_bytes(raw_bytes[start:start + 2], byteorder='big', signed=True)
|
||||
elif data_type == "float_le":
|
||||
if start + 4 <= len(raw_bytes):
|
||||
return struct.unpack('<f', raw_bytes[start:start + 4])[0]
|
||||
elif data_type == "float_be":
|
||||
if start + 4 <= len(raw_bytes):
|
||||
return struct.unpack('>f', raw_bytes[start:start + 4])[0]
|
||||
return None
|
||||
|
||||
def normalize_orientation(self, value, field_name):
|
||||
if 'orientation' in field_name.lower():
|
||||
return value + self.orientation_offset
|
||||
|
||||
return value
|
||||
|
||||
def parse_packet_all_fields(self, raw_bytes):
|
||||
packet = {}
|
||||
|
||||
packet["seq_num"] = int.from_bytes(raw_bytes[12:14], byteorder='little')
|
||||
|
||||
for field_name, (start, length) in KEY_FIELDS.items():
|
||||
if field_name == "float_val" and start + 4 <= len(raw_bytes):
|
||||
packet[field_name] = self.interpret_bytes(raw_bytes, start, 4, "float_le")
|
||||
else:
|
||||
raw_value = self.interpret_bytes(raw_bytes, start, length, "signed_short")
|
||||
if raw_value is not None:
|
||||
packet[field_name] = self.normalize_orientation(raw_value, field_name)
|
||||
|
||||
for i in range(30, min(90, len(raw_bytes) - 1), 2):
|
||||
field_name = f"byte_{i:02d}"
|
||||
raw_value = self.interpret_bytes(raw_bytes, i, 2, "signed_short")
|
||||
if raw_value is not None:
|
||||
packet[field_name] = self.normalize_orientation(raw_value, field_name)
|
||||
|
||||
return packet
|
||||
|
||||
def apply_dark_theme(self, fig, axes):
|
||||
fig.patch.set_facecolor('#1e1e1e')
|
||||
for ax in axes:
|
||||
ax.set_facecolor('#2d2d2d')
|
||||
|
||||
ax.title.set_color('white')
|
||||
ax.xaxis.label.set_color('white')
|
||||
ax.yaxis.label.set_color('white')
|
||||
ax.tick_params(colors='white')
|
||||
ax.tick_params(axis='x', colors='white')
|
||||
ax.tick_params(axis='y', colors='white')
|
||||
|
||||
ax.grid(True, color='#555555', alpha=0.3, linestyle='--')
|
||||
|
||||
for spine in ax.spines.values():
|
||||
spine.set_color('#555555')
|
||||
|
||||
legend = ax.get_legend()
|
||||
if (legend):
|
||||
legend.get_frame().set_facecolor('#2d2d2d')
|
||||
legend.get_frame().set_alpha(0.7)
|
||||
for text in legend.get_texts():
|
||||
text.set_color('white')
|
||||
|
||||
def listen(self):
|
||||
while True:
|
||||
try:
|
||||
data = self.sock.recv(1024)
|
||||
formatted = self.format_hex(data)
|
||||
timestamp = datetime.now().isoformat()
|
||||
|
||||
is_valid = self.is_valid_tracking_packet(formatted)
|
||||
|
||||
if not self.live_plotting:
|
||||
if is_valid:
|
||||
logger.info("%s - Response: %s...", timestamp, formatted[:60])
|
||||
else:
|
||||
logger.info("%s - Skipped non-tracking packet.", timestamp)
|
||||
|
||||
if is_valid:
|
||||
if self.recording and self.log_file is not None:
|
||||
self.log_file.write(formatted + "\n")
|
||||
self.log_file.flush()
|
||||
|
||||
try:
|
||||
raw_bytes = self.parse_raw_packet(formatted)
|
||||
packet = self.parse_packet_all_fields(raw_bytes)
|
||||
|
||||
with self.data_lock:
|
||||
self.live_data.append(packet)
|
||||
if len(self.live_data) > 300:
|
||||
self.live_data.pop(0)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error parsing packet: {e}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error("Error receiving data: %s", e)
|
||||
break
|
||||
|
||||
def load_log_file(self, filepath):
|
||||
self.raw_packets = []
|
||||
self.parsed_packets = []
|
||||
try:
|
||||
with open(filepath, 'r') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line:
|
||||
try:
|
||||
raw_bytes = self.parse_raw_packet(line)
|
||||
self.raw_packets.append(raw_bytes)
|
||||
packet = self.parse_packet_all_fields(raw_bytes)
|
||||
|
||||
min_seq_num = min(
|
||||
[parsed_packet["seq_num"] for parsed_packet in self.parsed_packets], default=0
|
||||
)
|
||||
|
||||
if packet["seq_num"] > min_seq_num:
|
||||
self.parsed_packets.append(packet)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error parsing line: {e}")
|
||||
|
||||
logger.info(f"Loaded {len(self.parsed_packets)} packets from {filepath}")
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(f"Error loading log file: {e}")
|
||||
return False
|
||||
|
||||
def extract_field_values(self, field_name, data_source='loaded'):
|
||||
if data_source == 'loaded':
|
||||
data = self.parsed_packets
|
||||
else:
|
||||
with self.data_lock:
|
||||
data = self.live_data.copy()
|
||||
|
||||
values = [packet.get(field_name, 0) for packet in data if field_name in packet]
|
||||
|
||||
if data_source == 'live' and len(values) > 5:
|
||||
try:
|
||||
values = np.array(values, dtype=float)
|
||||
values = np.convolve(values, np.ones(5) / 5, mode='valid')
|
||||
except Exception as e:
|
||||
logger.warning(f"Smoothing error (non-critical): {e}")
|
||||
|
||||
return values
|
||||
|
||||
def is_valid_tracking_packet(self, hex_string):
|
||||
standard_header = "04 00 04 00 17 00 00 00 10 00"
|
||||
|
||||
if not hex_string.startswith(standard_header):
|
||||
if self.live_plotting:
|
||||
logger.warning("Invalid packet header: %s", hex_string[:30])
|
||||
return False
|
||||
|
||||
if len(hex_string.split()) < 80:
|
||||
if self.live_plotting:
|
||||
logger.warning("Invalid packet length: %s", hex_string[:30])
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def plot_fields(self, field_names=None):
|
||||
if not self.parsed_packets:
|
||||
logger.error("No data to plot. Load a log file first.")
|
||||
return
|
||||
|
||||
if field_names is None:
|
||||
field_names = list(KEY_FIELDS.keys())
|
||||
|
||||
if not self.orientation_visualizer.calibration_complete:
|
||||
if len(self.parsed_packets) < self.orientation_visualizer.calibration_sample_count:
|
||||
logger.error("Not enough packets for calibration. Need at least 10 packets.")
|
||||
return
|
||||
for packet in self.parsed_packets[:self.orientation_visualizer.calibration_sample_count]:
|
||||
self.orientation_visualizer.add_calibration_sample([
|
||||
packet.get('orientation 1', 0),
|
||||
packet.get('orientation 2', 0),
|
||||
packet.get('orientation 3', 0)
|
||||
])
|
||||
|
||||
if self.use_terminal:
|
||||
self._plot_fields_terminal(field_names)
|
||||
|
||||
else:
|
||||
acceleration_fields = [f for f in field_names if 'acceleration' in f.lower()]
|
||||
orientation_fields = [f for f in field_names if 'orientation' in f.lower()]
|
||||
other_fields = [f for f in field_names if f not in acceleration_fields + orientation_fields]
|
||||
|
||||
fig, axes = plt.subplots(3, 1, figsize=(14, 12), sharex=True)
|
||||
self.apply_dark_theme(fig, axes)
|
||||
|
||||
acceleration_colors = ['#FFFF00', '#00FFFF']
|
||||
orientation_colors = ['#FF00FF', '#00FF00', '#FFA500']
|
||||
other_colors = ['#52b788', '#f4a261', '#e76f51', '#2a9d8f']
|
||||
|
||||
if acceleration_fields:
|
||||
for i, field in enumerate(acceleration_fields):
|
||||
values = self.extract_field_values(field)
|
||||
axes[0].plot(values, label=field, color=acceleration_colors[i % len(acceleration_colors)], linewidth=2)
|
||||
axes[0].set_title("Acceleration Data", fontsize=14)
|
||||
axes[0].legend()
|
||||
|
||||
if orientation_fields:
|
||||
for i, field in enumerate(orientation_fields):
|
||||
values = self.extract_field_values(field)
|
||||
axes[1].plot(values, label=field, color=orientation_colors[i % len(orientation_colors)], linewidth=2)
|
||||
axes[1].set_title("Orientation Data", fontsize=14)
|
||||
axes[1].legend()
|
||||
|
||||
if other_fields:
|
||||
for i, field in enumerate(other_fields):
|
||||
values = self.extract_field_values(field)
|
||||
axes[2].plot(values, label=field, color=other_colors[i % len(other_colors)], linewidth=2)
|
||||
axes[2].set_title("Other Fields", fontsize=14)
|
||||
axes[2].legend()
|
||||
|
||||
plt.xlabel("Packet Index", fontsize=12)
|
||||
plt.tight_layout()
|
||||
plt.show()
|
||||
|
||||
def _plot_fields_terminal(self, field_names):
|
||||
"""Internal method for terminal-based plotting"""
|
||||
terminal_width = os.get_terminal_size().columns
|
||||
plot_width = min(terminal_width - 10, 120)
|
||||
plot_height = 15
|
||||
|
||||
acceleration_fields = [f for f in field_names if 'acceleration' in f.lower()]
|
||||
orientation_fields = [f for f in field_names if 'orientation' in f.lower()]
|
||||
other_fields = [f for f in field_names if f not in acceleration_fields + orientation_fields]
|
||||
|
||||
def plot_group(fields, title):
|
||||
if not fields:
|
||||
return
|
||||
|
||||
print(f"\n{title}")
|
||||
print("=" * len(title))
|
||||
|
||||
for field in fields:
|
||||
values = self.extract_field_values(field)
|
||||
if len(values) > plot_width:
|
||||
values = values[-plot_width:]
|
||||
|
||||
if title == "Acceleration Data":
|
||||
chart = acp.plot(values, {'height': plot_height})
|
||||
print(chart)
|
||||
else:
|
||||
chart = acp.plot(values, {'height': plot_height})
|
||||
print(chart)
|
||||
|
||||
print(f"Min: {min(values):.2f}, Max: {max(values):.2f}, " +
|
||||
f"Mean: {np.mean(values):.2f}")
|
||||
print()
|
||||
|
||||
plot_group(acceleration_fields, "Acceleration Data")
|
||||
plot_group(orientation_fields, "Orientation Data")
|
||||
plot_group(other_fields, "Other Fields")
|
||||
|
||||
def create_braille_plot(self, values, width=80, height=20, y_label=True, fixed_y_min=None, fixed_y_max=None):
|
||||
canvas = drawille.Canvas()
|
||||
if fixed_y_min is None or fixed_y_max is None:
|
||||
local_min, local_max = min(values), max(values)
|
||||
else:
|
||||
local_min, local_max = fixed_y_min, fixed_y_max
|
||||
y_range = local_max - local_min or 1
|
||||
x_step = max(1, len(values) // width)
|
||||
for i, v in enumerate(values[::x_step]):
|
||||
y = int(((v - local_min) / y_range) * (height * 2 - 1))
|
||||
canvas.set(i, y)
|
||||
frame = canvas.frame()
|
||||
if y_label:
|
||||
lines = frame.split('\n')
|
||||
labeled_lines = []
|
||||
for idx, line in enumerate(lines):
|
||||
if idx == 0:
|
||||
labeled_lines.append(f"{local_max:6.0f} {line}")
|
||||
elif idx == len(lines)-1:
|
||||
labeled_lines.append(f"{local_min:6.0f} {line}")
|
||||
else:
|
||||
labeled_lines.append(" " + line)
|
||||
frame = "\n".join(labeled_lines)
|
||||
return frame
|
||||
|
||||
def _start_live_plotting_terminal(self, record_data=False, duration=None):
|
||||
import sys, select, tty, termios
|
||||
old_settings = termios.tcgetattr(sys.stdin)
|
||||
tty.setcbreak(sys.stdin.fileno())
|
||||
console = Console()
|
||||
term_width = console.width
|
||||
plot_width = round(min(term_width / 2 - 15, 120))
|
||||
ori_height = 10
|
||||
|
||||
def make_compact_layout():
|
||||
layout = Layout()
|
||||
layout.split_column(
|
||||
Layout(name="header", size=3),
|
||||
Layout(name="main", ratio=1),
|
||||
)
|
||||
layout["main"].split_row(
|
||||
Layout(name="accelerations", ratio=1),
|
||||
Layout(name="orientations", ratio=1)
|
||||
)
|
||||
layout["accelerations"].split_column(
|
||||
Layout(name="vertical", ratio=1),
|
||||
Layout(name="horizontal", ratio=1)
|
||||
)
|
||||
layout["orientations"].split_column(
|
||||
Layout(name="face", ratio=1),
|
||||
Layout(name="raw", ratio=1)
|
||||
)
|
||||
return layout
|
||||
|
||||
layout = make_compact_layout()
|
||||
|
||||
try:
|
||||
import time
|
||||
with Live(layout, refresh_per_second=20, screen=True) as live:
|
||||
while True:
|
||||
if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
|
||||
ch = sys.stdin.read(1)
|
||||
if ch == 'p':
|
||||
self.paused = not self.paused
|
||||
logger.info("Paused" if self.paused else "Resumed")
|
||||
if self.paused:
|
||||
time.sleep(0.1)
|
||||
rec_str = " [red][REC][/red]" if record_data else ""
|
||||
left = "AirPods Head Tracking - v1.0.0"
|
||||
right = "Ctrl+C - Close | p - Pause" + rec_str
|
||||
status = "[bold red]Paused[/bold red]"
|
||||
header = list(" " * term_width)
|
||||
header[0:len(left)] = list(left)
|
||||
header[term_width - len(right):] = list(right)
|
||||
start = (term_width - len(status)) // 2
|
||||
header[start:start+len(status)] = list(status)
|
||||
header_text = "".join(header)
|
||||
layout["header"].update(Panel(header_text, style="bold white on black"))
|
||||
continue
|
||||
|
||||
with self.data_lock:
|
||||
if len(self.live_data) < 1:
|
||||
continue
|
||||
latest = self.live_data[-1]
|
||||
data = self.live_data[-plot_width:]
|
||||
|
||||
if not self.orientation_visualizer.calibration_complete:
|
||||
sample = [
|
||||
latest.get('orientation 1', 0),
|
||||
latest.get('orientation 2', 0),
|
||||
latest.get('orientation 3', 0)
|
||||
]
|
||||
self.orientation_visualizer.add_calibration_sample(sample)
|
||||
time.sleep(0.05)
|
||||
rec_str = " [red][REC][/red]" if record_data else ""
|
||||
|
||||
left = "AirPods Head Tracking - v1.0.0"
|
||||
status = "[bold yellow]Calibrating...[/bold yellow]"
|
||||
right = "Ctrl+C - Close | p - Pause"
|
||||
remaining = max(term_width - len(left) - len(right), 0)
|
||||
header_text = f"{left}{status.center(remaining)}{right}{rec_str}"
|
||||
layout["header"].update(Panel(header_text, style="bold white on black"))
|
||||
live.refresh()
|
||||
continue
|
||||
|
||||
o1 = latest.get('orientation 1', 0)
|
||||
o2 = latest.get('orientation 2', 0)
|
||||
o3 = latest.get('orientation 3', 0)
|
||||
orientation = self.orientation_visualizer.calculate_orientation(o1, o2, o3)
|
||||
pitch = orientation['pitch']
|
||||
yaw = orientation['yaw']
|
||||
|
||||
h_accel = [p.get('Horizontal Acceleration', 0) for p in data]
|
||||
v_accel = [p.get('Vertical Acceleration', 0) for p in data]
|
||||
if len(h_accel) > plot_width:
|
||||
h_accel = h_accel[-plot_width:]
|
||||
if len(v_accel) > plot_width:
|
||||
v_accel = v_accel[-plot_width:]
|
||||
global_min = min(min(v_accel), min(h_accel))
|
||||
global_max = max(max(v_accel), max(h_accel))
|
||||
config_acc = {'height': 20, 'min': global_min, 'max': global_max}
|
||||
vert_plot = acp.plot(v_accel, config_acc)
|
||||
horiz_plot = acp.plot(h_accel, config_acc)
|
||||
|
||||
rec_str = " [red][REC][/red]" if record_data else ""
|
||||
left = "AirPods Head Tracking - v1.0.0"
|
||||
right = "Ctrl+C - Close | p - Pause" + rec_str
|
||||
status = "[bold green]Live[/bold green]"
|
||||
header = list(" " * term_width)
|
||||
header[0:len(left)] = list(left)
|
||||
header[term_width - len(right):] = list(right)
|
||||
start = (term_width - len(status)) // 2
|
||||
header[start:start+len(status)] = list(status)
|
||||
header_text = "".join(header)
|
||||
layout["header"].update(Panel(header_text, style="bold white on black"))
|
||||
|
||||
face_art = self.orientation_visualizer.create_face_art(pitch, yaw)
|
||||
layout["accelerations"]["vertical"].update(Panel(
|
||||
"[bold yellow]Vertical Acceleration[/]\n" +
|
||||
vert_plot + "\n" +
|
||||
f"Cur: {v_accel[-1]:6.1f} | Min: {min(v_accel):6.1f} | Max: {max(v_accel):6.1f}",
|
||||
style="yellow"
|
||||
))
|
||||
layout["accelerations"]["horizontal"].update(Panel(
|
||||
"[bold cyan]Horizontal Acceleration[/]\n" +
|
||||
horiz_plot + "\n" +
|
||||
f"Cur: {h_accel[-1]:6.1f} | Min: {min(h_accel):6.1f} | Max: {max(h_accel):6.1f}",
|
||||
style="cyan"
|
||||
))
|
||||
layout["orientations"]["face"].update(Panel(face_art, title="[green]Orientation - Visualization[/]", style="green"))
|
||||
|
||||
o2_values = [p.get('orientation 2', 0) for p in data[-plot_width:]]
|
||||
o3_values = [p.get('orientation 3', 0) for p in data[-plot_width:]]
|
||||
o2_values = o2_values[:plot_width]
|
||||
o3_values = o3_values[:plot_width]
|
||||
common_min = min(min(o2_values), min(o3_values))
|
||||
common_max = max(max(o2_values), max(o3_values))
|
||||
config_ori = {'height': ori_height, 'min': common_min, 'max': common_max, 'format': "{:6.0f}"}
|
||||
chart_o2 = acp.plot(o2_values, config_ori)
|
||||
chart_o3 = acp.plot(o3_values, config_ori)
|
||||
layout["orientations"]["raw"].update(Panel(
|
||||
"[bold yellow]Orientation 1:[/]\n" + chart_o2 + "\n" +
|
||||
f"Cur: {o2_values[-1]:6.1f} | Min: {min(o2_values):6.1f} | Max: {max(o2_values):6.1f}\n\n" +
|
||||
"[bold green]Orientation 2:[/]\n" + chart_o3 + "\n" +
|
||||
f"Cur: {o3_values[-1]:6.1f} | Min: {min(o3_values):6.1f} | Max: {max(o3_values):6.1f}",
|
||||
title="[cyan]Orientation Raw[/]", style="yellow"
|
||||
))
|
||||
live.refresh()
|
||||
time.sleep(0.05)
|
||||
except KeyboardInterrupt:
|
||||
logger.info("\nStopped.")
|
||||
if record_data:
|
||||
self.stop_tracking()
|
||||
else:
|
||||
if self.sock:
|
||||
self.sock.send(bytes.fromhex(STOP_CMD))
|
||||
finally:
|
||||
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)
|
||||
|
||||
def _start_live_plotting(self, record_data=False, duration=None):
|
||||
terminal_width = os.get_terminal_size().columns
|
||||
plot_width = min(terminal_width - 10, 80)
|
||||
plot_height = 10
|
||||
|
||||
try:
|
||||
while True:
|
||||
os.system('clear' if os.name == 'posix' else 'cls')
|
||||
with self.data_lock:
|
||||
if len(self.live_data) == 0:
|
||||
print("\nWaiting for data...")
|
||||
time.sleep(0.1)
|
||||
continue
|
||||
|
||||
data = self.live_data[-plot_width:]
|
||||
|
||||
acceleration_fields = [f for f in KEY_FIELDS.keys() if 'acceleration' in f.lower()]
|
||||
orientation_fields = [f for f in KEY_FIELDS.keys() if 'orientation' in f.lower()]
|
||||
other_fields = [f for f in KEY_FIELDS.keys() if f not in acceleration_fields + orientation_fields]
|
||||
|
||||
def plot_group(fields, title):
|
||||
if not fields:
|
||||
return
|
||||
|
||||
print(f"\n{title}")
|
||||
print("=" * len(title))
|
||||
|
||||
for field in fields:
|
||||
values = [packet.get(field, 0) for packet in data if field in packet]
|
||||
if len(values) > 0:
|
||||
chart = acp.plot(values, {'height': plot_height})
|
||||
print(chart)
|
||||
print(f"Current: {values[-1]:.2f}, " +
|
||||
f"Min: {min(values):.2f}, Max: {max(values):.2f}")
|
||||
print()
|
||||
|
||||
plot_group(acceleration_fields, "Acceleration Data")
|
||||
plot_group(orientation_fields, "Orientation Data")
|
||||
plot_group(other_fields, "Other Fields")
|
||||
|
||||
print("\nPress Ctrl+C to stop plotting")
|
||||
time.sleep(0.1)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
logger.info("\nLive plotting stopped.")
|
||||
self.sock.send(bytes.fromhex(STOP_CMD))
|
||||
if record_data:
|
||||
self.stop_tracking()
|
||||
self.live_plotting = False
|
||||
|
||||
def start_live_plotting(self, record_data=False, duration=None):
|
||||
if self.sock is None:
|
||||
if not self.connect():
|
||||
logger.error("Could not connect to AirPods. Live plotting aborted.")
|
||||
return
|
||||
if not self.recording and record_data:
|
||||
self.start_tracking(duration)
|
||||
logger.info("Recording enabled during live plotting")
|
||||
elif not self.recording:
|
||||
self.sock.send(bytes.fromhex(START_CMD))
|
||||
logger.info("Head tracking started (not recording to file)")
|
||||
with self.data_lock:
|
||||
self.live_data = []
|
||||
self.live_plotting = True
|
||||
self.paused = False
|
||||
if self.use_terminal:
|
||||
self._start_live_plotting_terminal(record_data, duration)
|
||||
else:
|
||||
from matplotlib.gridspec import GridSpec, GridSpecFromSubplotSpec
|
||||
fig = plt.figure(figsize=(14, 6))
|
||||
gs = GridSpec(1, 2, width_ratios=[1, 1])
|
||||
ax_accel = fig.add_subplot(gs[0])
|
||||
subgs = GridSpecFromSubplotSpec(2, 1, subplot_spec=gs[1], height_ratios=[2, 1])
|
||||
ax_head_top = fig.add_subplot(subgs[0], projection='3d')
|
||||
ax_ori = fig.add_subplot(subgs[1])
|
||||
|
||||
ax_accel.set_title("Acceleration Data")
|
||||
ax_accel.set_xlabel("Packet Index")
|
||||
ax_accel.set_ylabel("Acceleration")
|
||||
ax_accel.legend(loc='upper right', framealpha=0.7)
|
||||
fig.patch.set_facecolor('#1e1e1e')
|
||||
ax_accel.set_facecolor('#2d2d2d')
|
||||
self.apply_dark_theme(fig, [ax_accel, ax_head_top, ax_ori])
|
||||
plt.ion()
|
||||
|
||||
def update_plot(_):
|
||||
with self.data_lock:
|
||||
data = self.live_data.copy()
|
||||
if len(data) == 0:
|
||||
return
|
||||
|
||||
latest = data[-1]
|
||||
|
||||
if not self.orientation_visualizer.calibration_complete:
|
||||
sample = [
|
||||
latest.get('orientation 1', 0),
|
||||
latest.get('orientation 2', 0),
|
||||
latest.get('orientation 3', 0)
|
||||
]
|
||||
self.orientation_visualizer.add_calibration_sample(sample)
|
||||
ax_head_top.cla()
|
||||
ax_head_top.text(0.5, 0.5, "Calibrating... please wait", horizontalalignment='center', verticalalignment='center', transform=ax_head_top.transAxes, color='white')
|
||||
fig.canvas.draw_idle()
|
||||
return
|
||||
|
||||
h_accel = [p.get('Horizontal Acceleration', 0) for p in data]
|
||||
v_accel = [p.get('Vertical Acceleration', 0) for p in data]
|
||||
x_vals = list(range(len(h_accel)))
|
||||
ax_accel.cla()
|
||||
ax_accel.plot(x_vals, v_accel, label='Vertical Acceleration', color='#FFFF00', linewidth=2)
|
||||
ax_accel.plot(x_vals, h_accel, label='Horizontal Acceleration', color='#00FFFF', linewidth=2)
|
||||
ax_accel.set_title("Acceleration Data")
|
||||
ax_accel.set_xlabel("Packet Index")
|
||||
ax_accel.set_ylabel("Acceleration")
|
||||
ax_accel.legend(loc='upper right', framealpha=0.7)
|
||||
ax_accel.set_facecolor('#2d2d2d')
|
||||
ax_accel.title.set_color('white')
|
||||
ax_accel.xaxis.label.set_color('white')
|
||||
ax_accel.yaxis.label.set_color('white')
|
||||
|
||||
latest = data[-1]
|
||||
o1 = latest.get('orientation 1', 0)
|
||||
o2 = latest.get('orientation 2', 0)
|
||||
o3 = latest.get('orientation 3', 0)
|
||||
orientation = self.orientation_visualizer.calculate_orientation(o1, o2, o3)
|
||||
pitch = orientation['pitch']
|
||||
yaw = orientation['yaw']
|
||||
|
||||
ax_head_top.cla()
|
||||
ax_head_top.set_title("Head Orientation")
|
||||
ax_head_top.set_xlim([-1, 1])
|
||||
ax_head_top.set_ylim([-1, 1])
|
||||
ax_head_top.set_zlim([-1, 1])
|
||||
ax_head_top.set_facecolor('#2d2d2d')
|
||||
pitch_rad = np.radians(pitch)
|
||||
yaw_rad = np.radians(yaw)
|
||||
Rz = np.array([
|
||||
[np.cos(yaw_rad), np.sin(yaw_rad), 0],
|
||||
[-np.sin(yaw_rad), np.cos(yaw_rad), 0],
|
||||
[0, 0, 1]
|
||||
])
|
||||
Ry = np.array([
|
||||
[np.cos(pitch_rad), 0, np.sin(pitch_rad)],
|
||||
[0, 1, 0],
|
||||
[-np.sin(pitch_rad), 0, np.cos(pitch_rad)]
|
||||
])
|
||||
R = Rz @ Ry
|
||||
dir_vec = R @ np.array([1, 0, 0])
|
||||
ax_head_top.quiver(0, 0, 0, dir_vec[0], dir_vec[1], dir_vec[2],
|
||||
color='r', length=0.8, linewidth=3)
|
||||
|
||||
ax_ori.cla()
|
||||
o2_values = [p.get('orientation 2', 0) for p in data]
|
||||
o3_values = [p.get('orientation 3', 0) for p in data]
|
||||
x_range = list(range(len(o2_values)))
|
||||
ax_ori.plot(x_range, o2_values, label='Orientation 1', color='red', linewidth=2)
|
||||
ax_ori.plot(x_range, o3_values, label='Orientation 2', color='green', linewidth=2)
|
||||
ax_ori.set_facecolor('#2d2d2d')
|
||||
ax_ori.tick_params(colors='white')
|
||||
ax_ori.set_title("Orientation Raw")
|
||||
ax_ori.legend(facecolor='#2d2d2d', edgecolor='#555555',
|
||||
labelcolor='white', loc='upper right')
|
||||
ax_ori.text(0.95, 0.9, f"Pitch: {pitch:.1f}°\nYaw: {yaw:.1f}°",
|
||||
transform=ax_ori.transAxes, color='white',
|
||||
ha='right', va='top', bbox=dict(facecolor='#2d2d2d', alpha=0.5))
|
||||
fig.canvas.draw_idle()
|
||||
self.animation = FuncAnimation(
|
||||
fig, update_plot,
|
||||
interval=20,
|
||||
blit=False,
|
||||
cache_frame_data=False
|
||||
)
|
||||
plt.show(block=True)
|
||||
self.sock.send(bytes.fromhex(STOP_CMD))
|
||||
logger.info("Stopping head tracking AirPods.")
|
||||
if self.recording and record_data:
|
||||
self.stop_tracking()
|
||||
logger.info("Recording stopped after sending close command")
|
||||
else:
|
||||
logger.info("Live plotting ended (no recording to stop).")
|
||||
self.live_plotting = False
|
||||
self.animation = None
|
||||
plt.ioff()
|
||||
|
||||
def interactive_mode(self):
|
||||
from prompt_toolkit import PromptSession
|
||||
session = PromptSession("> ")
|
||||
logger.info("\nAirPods Head Tracking Analyzer")
|
||||
print("------------------------------")
|
||||
logger.info("Commands:")
|
||||
print(" connect - connect to your AirPods")
|
||||
print(" start [seconds] - start recording head tracking data, optionally for specified duration")
|
||||
print(" stop - stop recording")
|
||||
print(" load <file> - load and parse a log file")
|
||||
print(" plot - plot all sensor data fields")
|
||||
print(" live [seconds] - start live plotting (without recording), optionally stop recording after seconds")
|
||||
print(" liver [seconds] - start live plotting with recording, optionally stop recording after seconds")
|
||||
print(" gestures - start gesture detection")
|
||||
print(" quit - exit the program")
|
||||
|
||||
while True:
|
||||
try:
|
||||
cmd_input = session.prompt("> ")
|
||||
cmd_parts = cmd_input.strip().split()
|
||||
if not cmd_parts:
|
||||
continue
|
||||
cmd = cmd_parts[0].lower()
|
||||
if cmd == "connect":
|
||||
self.connect()
|
||||
elif cmd == "start":
|
||||
duration = float(cmd_parts[1]) if len(cmd_parts) > 1 else None
|
||||
self.start_tracking(duration)
|
||||
elif cmd == "stop":
|
||||
self.stop_tracking()
|
||||
elif cmd == "load" and len(cmd_parts) > 1:
|
||||
self.load_log_file(cmd_parts[1])
|
||||
elif cmd == "plot":
|
||||
self.plot_fields()
|
||||
elif cmd == "live":
|
||||
duration = float(cmd_parts[1]) if len(cmd_parts) > 1 else None
|
||||
logger.info("Starting live plotting mode (without recording)%s.",
|
||||
f" for {duration} seconds" if duration else "")
|
||||
self.start_live_plotting(record_data=False, duration=duration)
|
||||
elif cmd == "liver":
|
||||
duration = float(cmd_parts[1]) if len(cmd_parts) > 1 else None
|
||||
logger.info("Starting live plotting mode WITH recording%s.",
|
||||
f" for {duration} seconds" if duration else "")
|
||||
self.start_live_plotting(record_data=True, duration=duration)
|
||||
elif cmd == "gestures":
|
||||
from gestures import GestureDetector
|
||||
if self.conn is not None:
|
||||
detector = GestureDetector(conn=self.conn)
|
||||
else:
|
||||
detector = GestureDetector()
|
||||
detector.start_detection()
|
||||
elif cmd == "quit":
|
||||
logger.info("Exiting.")
|
||||
if self.conn != None:
|
||||
self.conn.disconnect()
|
||||
break
|
||||
elif cmd == "help":
|
||||
logger.info("\nAirPods Head Tracking Analyzer")
|
||||
logger.info("------------------------------")
|
||||
logger.info("Commands:")
|
||||
logger.info(" connect - connect to your AirPods")
|
||||
logger.info(" start [seconds] - start recording head tracking data, optionally for specified duration")
|
||||
logger.info(" stop - stop recording")
|
||||
logger.info(" load <file> - load and parse a log file")
|
||||
logger.info(" plot - plot all sensor data fields")
|
||||
logger.info(" live [seconds] - start live plotting (without recording), optionally stop recording after seconds")
|
||||
logger.info(" liver [seconds] - start live plotting with recording, optionally stop recording after seconds")
|
||||
logger.info(" gestures - start gesture detection")
|
||||
logger.info(" quit - exit the program")
|
||||
else:
|
||||
logger.info("Unknown command. Type 'help' to see available commands.")
|
||||
except KeyboardInterrupt:
|
||||
logger.info("Use 'quit' to exit.")
|
||||
except EOFError:
|
||||
logger.info("Exiting.")
|
||||
if self.conn != None:
|
||||
self.conn.disconnect()
|
||||
break
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
tracker = AirPodsTracker()
|
||||
tracker.interactive_mode()
|
||||
6
head-tracking/requirements.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
drawille
|
||||
numpy
|
||||
pybluez
|
||||
matplotlib
|
||||
asciichartpy
|
||||
rich
|
||||
@@ -1,92 +0,0 @@
|
||||
# AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
|
||||
#
|
||||
# Copyright (C) 2024 Kavish Devar
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as published
|
||||
# by the Free Software Foundation, either version 3 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import matplotlib.pyplot as plt
|
||||
import mplcursors
|
||||
import bluetooth
|
||||
import threading
|
||||
import time
|
||||
from matplotlib.animation import FuncAnimation
|
||||
|
||||
sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
|
||||
|
||||
bt_addr = "28:2D:7F:C2:05:5B"
|
||||
psm = 0x1001
|
||||
|
||||
sock.connect((bt_addr, psm))
|
||||
running = threading.Event()
|
||||
|
||||
data = []
|
||||
start_column = 0
|
||||
columns_per_view = 5
|
||||
paused = False
|
||||
|
||||
def hex_to_base10(hex_string):
|
||||
hex_values = hex_string.split()
|
||||
base10_values = [int(hex_value, 16) for hex_value in hex_values]
|
||||
return base10_values
|
||||
|
||||
def listen():
|
||||
global running, data
|
||||
while not running.is_set():
|
||||
res = sock.recv(1024)
|
||||
if len(res.hex()) == 162:
|
||||
hex_string = " ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2))
|
||||
base10_values = hex_to_base10(hex_string)
|
||||
data.append(base10_values)
|
||||
|
||||
t = threading.Thread(target=listen)
|
||||
t.start()
|
||||
|
||||
try:
|
||||
byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
except:
|
||||
...
|
||||
|
||||
def update(frame):
|
||||
if not paused:
|
||||
plt.clf()
|
||||
plt.title('Bluetooth Data')
|
||||
end_column = start_column + columns_per_view
|
||||
for i in range(start_column, min(end_column, len(data[0]))):
|
||||
plt.plot([row[i] for row in data], label=f'Column {i}', alpha=0.6, linewidth=1.2)
|
||||
plt.xlabel('Time')
|
||||
plt.ylabel('Value')
|
||||
mplcursors.cursor(hover=True, highlight=True)
|
||||
|
||||
def on_key(event):
|
||||
global start_column, paused
|
||||
if event.key == ' ':
|
||||
start_column += columns_per_view
|
||||
if start_column >= len(data[0]):
|
||||
start_column = 0
|
||||
elif event.key == 'p':
|
||||
paused = not paused
|
||||
|
||||
fig = plt.figure()
|
||||
fig.tight_layout()
|
||||
fig.canvas.mpl_connect('key_press_event', on_key)
|
||||
ani = FuncAnimation(fig, update, interval=0.5, repeat=True, cache_frame_data=False)
|
||||
|
||||
plt.show()
|
||||
|
||||
running.set()
|
||||
sock.close()
|
||||
@@ -1,52 +0,0 @@
|
||||
# AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
|
||||
#
|
||||
# Copyright (C) 2024 Kavish Devar
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as published
|
||||
# by the Free Software Foundation, either version 3 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import bluetooth
|
||||
import threading
|
||||
|
||||
sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
|
||||
|
||||
bt_addr = "28:2D:7F:C2:05:5B"
|
||||
psm = 0x1001
|
||||
|
||||
sock.connect((bt_addr, psm))
|
||||
running = threading.Event()
|
||||
|
||||
def listen():
|
||||
global running
|
||||
while not running.is_set():
|
||||
res = sock.recv(1024)
|
||||
if len(res.hex()) == 162:
|
||||
print(" ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2)))
|
||||
|
||||
t = threading.Thread(target=listen)
|
||||
t.start()
|
||||
|
||||
try:
|
||||
byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
import time
|
||||
time.sleep(5)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7E 10 02 42 0B 08 4E 10 02 1A 05 01 00 00 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
except:
|
||||
...
|
||||
running.set()
|
||||
sock.close()
|
||||
@@ -1,120 +0,0 @@
|
||||
# AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
|
||||
#
|
||||
# Copyright (C) 2024 Kavish Devar
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as published
|
||||
# by the Free Software Foundation, either version 3 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import matplotlib.pyplot as plt
|
||||
import mplcursors
|
||||
import bluetooth
|
||||
import threading
|
||||
import time
|
||||
from matplotlib.animation import FuncAnimation
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
|
||||
sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
|
||||
|
||||
bt_addr = "28:2D:7F:C2:05:5B"
|
||||
psm = 0x1001
|
||||
|
||||
sock.connect((bt_addr, psm))
|
||||
running = threading.Event()
|
||||
|
||||
data = []
|
||||
selected_columns = list(range(80))
|
||||
|
||||
def hex_to_base10(hex_string):
|
||||
hex_values = hex_string.split()
|
||||
base10_values = [int(hex_value, 16) for hex_value in hex_values]
|
||||
return base10_values
|
||||
|
||||
def listen():
|
||||
global running, data
|
||||
while not running.is_set():
|
||||
res = sock.recv(1024)
|
||||
if len(res.hex()) == 162:
|
||||
hex_string = " ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2))
|
||||
base10_values = hex_to_base10(hex_string)
|
||||
data.append(base10_values)
|
||||
|
||||
t = threading.Thread(target=listen)
|
||||
t.start()
|
||||
|
||||
try:
|
||||
byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
except:
|
||||
...
|
||||
|
||||
def update(frame):
|
||||
plt.clf()
|
||||
plt.title('Bluetooth Data')
|
||||
for i in range(len(data[0])):
|
||||
if i in selected_columns:
|
||||
plt.plot([row[i] for row in data], label=f'Column {i}', alpha=1, linewidth=1.2)
|
||||
plt.xlabel('Time')
|
||||
plt.ylabel('Value')
|
||||
mplcursors.cursor(hover=True, highlight=True)
|
||||
|
||||
def on_checkbox_change():
|
||||
global selected_columns
|
||||
selected_columns = [i for i, var in enumerate(checkbox_vars) if var.get()]
|
||||
|
||||
def create_checkbox_window():
|
||||
root = tk.Tk()
|
||||
root.title("Select Columns")
|
||||
frame = ttk.Frame(root)
|
||||
frame.pack(fill=tk.BOTH, expand=True)
|
||||
canvas = tk.Canvas(frame)
|
||||
scrollbar = ttk.Scrollbar(frame, orient="vertical", command=canvas.yview)
|
||||
scrollable_frame = ttk.Frame(canvas)
|
||||
|
||||
scrollable_frame.bind(
|
||||
"<Configure>",
|
||||
lambda e: canvas.configure(
|
||||
scrollregion=canvas.bbox("all")
|
||||
)
|
||||
)
|
||||
|
||||
canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
|
||||
canvas.configure(yscrollcommand=scrollbar.set)
|
||||
|
||||
global checkbox_vars
|
||||
checkbox_vars = []
|
||||
for i in range(80):
|
||||
var = tk.BooleanVar(value=True)
|
||||
checkbox = ttk.Checkbutton(scrollable_frame, text=f"Column {i}", variable=var, command=on_checkbox_change)
|
||||
checkbox.pack(anchor='w')
|
||||
checkbox_vars.append(var)
|
||||
|
||||
canvas.pack(side="left", fill=tk.BOTH, expand=True)
|
||||
scrollbar.pack(side="right", fill="y")
|
||||
|
||||
root.mainloop()
|
||||
|
||||
checkbox_thread = threading.Thread(target=create_checkbox_window)
|
||||
checkbox_thread.start()
|
||||
|
||||
fig = plt.figure()
|
||||
fig.tight_layout()
|
||||
ani = FuncAnimation(fig, update, interval=500, repeat=True, cache_frame_data=False)
|
||||
|
||||
plt.show()
|
||||
|
||||
running.set()
|
||||
sock.close()
|
||||
@@ -1,125 +0,0 @@
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 98 1D 10 01 3A 3E 08 0E 1A 3A 01 A8 E4 00 50 A9 23 00 00 03 04 43 C6 2A 22 58 00 00 00 00 0A B0 24 3A 4C F0 EB FF 14 00 F8 FF 51 8F 51 8F 51 8F 0A 00 00 00 FE FF A9 01 8F 03 BE 00 8A 97 95 36 19 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 99 1D 10 01 3A 3E 08 0E 1A 3A 01 C0 C9 60 52 A9 23 00 00 03 04 43 65 C6 22 58 00 00 00 00 F4 AF 24 3A 47 F0 E9 FF FF FF F4 FF 51 8F 51 8F 51 8F 02 00 FF FF FF FF AA 01 8F 03 BE 00 19 B0 D2 36 21 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9A 1D 10 01 3A 3E 08 0E 1A 3A 01 D8 AE C0 54 A9 23 00 00 03 04 43 04 62 23 58 00 00 00 00 DF AF 1D 3A 4C F0 EF FF 04 00 F4 FF 51 8F 51 8F 51 8F F8 FF 00 00 04 00 A9 01 8F 03 BF 00 52 5C CF 36 29 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9B 1D 10 01 3A 3E 08 0E 1A 3A 01 F0 93 20 57 A9 23 00 00 03 04 43 A3 FD 23 58 00 00 00 00 D1 AF 1E 3A 42 F0 FC FF 12 00 ED FF 51 8F 51 8F 51 8F FC FF 09 00 01 00 A8 01 90 03 C0 00 1C 97 29 37 31 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9C 1D 10 01 3A 3E 08 0E 1A 3A 01 08 79 80 59 A9 23 00 00 03 04 43 42 99 24 58 00 00 00 00 C3 AF 16 3A 1C F0 02 00 15 00 DD FF 51 8F 51 8F 51 8F 00 00 03 00 00 00 A8 01 90 03 C1 00 F9 C3 88 37 39 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9D 1D 10 01 3A 3E 08 0E 1A 3A 01 38 5A E0 5B A9 23 00 00 03 04 43 E0 34 25 58 00 00 00 00 AB AF 0B 3A E7 EF F4 FF 24 00 D2 FF 52 8F 52 8F 52 8F F9 FF FF FF 01 00 A7 01 90 03 C1 00 16 BD 83 37 41 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9E 1D 10 01 3A 3E 08 0E 1A 3A 01 50 3F 40 5E A9 23 00 00 03 04 43 7F D0 25 58 00 00 00 00 73 AF F1 39 8F EF D9 FF 2B 00 76 FF 52 8F 52 8F 52 8F FF FF 0C 00 08 00 A6 01 91 03 C2 00 73 61 0D 38 49 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9F 1D 10 01 3A 3E 08 0E 1A 3A 01 68 24 A0 60 A9 23 00 00 03 04 83 1E 6C 26 58 00 00 00 00 DE AE 8F 39 D9 EE BB FF 59 00 DA FE 52 8F 52 8F 52 8F FA FF 18 00 06 00 A5 01 93 03 C4 00 92 0D D6 38 51 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A0 1D 10 01 3A 3E 08 0E 1A 3A 01 80 09 00 63 A9 23 00 00 03 04 83 BD 07 27 58 00 00 00 00 E6 AD D3 38 92 ED 9C FF 92 00 41 FE 52 8F 52 8F 52 8F FB FF 14 00 04 00 A1 01 95 03 C6 00 F8 8C 18 39 59 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A1 1D 10 01 3A 3E 08 0E 1A 3A 01 B0 EA 5F 65 A9 23 00 00 03 00 83 5B A3 27 58 00 00 00 00 8B AC BF 37 AC EB 94 FF D7 00 A8 FD 52 8F 52 8F 52 8F 0A 00 0D 00 08 00 9D 01 97 03 C8 00 DE D9 63 39 61 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A2 1D 10 01 3A 3E 08 0E 1A 3A 01 C8 CF BF 67 A9 23 00 00 03 00 83 FA 3E 28 58 00 00 00 00 F7 AA 7C 36 6C E9 2B FF BC 00 9C FD 52 8F 52 8F 52 8F 11 00 E7 FF 1B 00 97 01 98 03 CB 00 86 84 71 39 69 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A3 1D 10 01 3A 3E 08 0E 1A 3A 01 E0 B4 1F 6A A9 23 00 00 03 00 83 99 DA 28 58 00 00 00 00 62 A9 98 35 34 E7 40 FF A8 01 D9 FD 52 8F 52 8F 52 8F F6 FF F8 FF 0E 00 8C 01 9A 03 D1 00 2E 72 71 39 71 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A4 1D 10 01 3A 3E 08 0E 1A 3A 01 F8 99 7F 6C A9 23 00 00 03 00 83 38 76 29 58 00 00 00 00 5D A8 39 35 D3 E4 83 FF 16 01 94 FE 52 8F 52 8F 52 8F 24 00 C8 FF BB FF 81 01 9A 03 D3 00 CE 4E 14 3A 79 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A5 1D 10 01 3A 3E 08 0E 1A 3A 01 28 7B DF 6E A9 23 00 00 03 00 83 D6 11 2A 58 00 00 00 00 BF A7 E7 34 E2 E3 D2 FF 3F 00 6B FF 52 8F 52 8F 52 8F FD FF 0B 00 F5 FF 75 01 9C 03 D6 00 CF CC 1F 3A 81 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A6 1D 10 01 3A 3E 08 0E 1A 3A 01 40 60 3F 71 A9 23 00 00 03 00 83 75 AD 2A 58 00 00 00 00 A0 A7 CF 34 AF E3 06 00 F1 FF 31 00 52 8F 52 8F 52 8F FC FF FC FF 00 00 67 01 9F 03 DB 00 A3 68 13 3A 89 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A7 1D 10 01 3A 3E 08 0E 1A 3A 01 58 45 9F 73 A9 23 00 00 03 00 83 14 49 2B 58 00 00 00 00 F5 A7 15 35 39 E4 4C 00 8D FF F6 00 52 8F 52 8F 52 8F 10 00 F8 FF F2 FF 5B 01 A1 03 DF 00 95 C1 00 3A 91 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A8 1D 10 01 3A 3E 08 0E 1A 3A 01 70 2A FF 75 A9 23 00 00 03 04 83 B3 E4 2B 58 00 00 00 00 CC A8 A8 35 95 E5 97 00 29 FF B8 01 53 8F 53 8F 53 8F FE FF 09 00 0A 00 52 01 A4 03 E3 00 F2 CA F7 39 99 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A9 1D 10 01 3A 3E 08 0E 1A 3A 01 A0 0B 5F 78 A9 23 00 00 03 00 83 51 80 2C 58 00 00 00 00 4E AA C1 36 4C E7 FA 00 86 FF 86 02 53 8F 53 8F 53 8F 16 00 F5 FF 0C 00 4B 01 A5 03 E7 00 C1 EB FC 39 A1 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AA 1D 10 01 3A 3E 08 0E 1A 3A 01 B8 F0 BE 7A A9 23 00 00 03 00 83 F0 1B 2D 58 00 00 00 00 AC AC 9E 38 AA E9 EF 00 CD FE C6 03 53 8F 53 8F 53 8F 03 00 EC FF ED FF 4A 01 A4 03 E7 00 79 2F C5 39 A9 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AB 1D 10 01 3A 3E 08 0E 1A 3A 01 D0 D5 1E 7D A9 23 00 00 03 00 83 8F B7 2D 58 00 00 00 00 4D AF AE 3A B6 EC 16 01 63 FF 25 03 53 8F 53 8F 53 8F B7 FF 56 00 18 00 48 01 A8 03 E8 00 B0 84 F9 39 B1 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AC 1D 10 01 3A 3E 08 0E 1A 3A 01 E8 BA 7E 7F A9 23 00 00 03 00 83 2E 53 2E 58 00 00 00 00 B8 B1 54 3C 41 EE 24 01 F9 FF 0B 02 53 8F 53 8F 53 8F C6 FF 1E 00 19 00 49 01 AA 03 E8 00 29 E2 17 3A B9 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AD 1D 10 01 3A 3E 08 0E 1A 3A 01 00 A0 DE 81 A9 23 00 00 03 00 83 CD EE 2E 58 00 00 00 00 77 B3 8A 3D B0 EE C1 00 61 00 07 01 53 8F 53 8F 53 8F F8 FF F3 FF 06 00 4E 01 A8 03 E6 00 0F C0 19 3A C1 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AE 1D 10 01 3A 3E 08 0E 1A 3A 01 30 81 3E 84 A9 23 00 00 03 00 83 6B 8A 2F 58 00 00 00 00 45 B4 37 3E 8C EE 2F 00 60 00 0C 00 53 8F 53 8F 53 8F 0D 00 F5 FF F0 FF 56 01 A4 03 E2 00 E7 FD 21 3A C9 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AF 1D 10 01 3A 3E 08 0E 1A 3A 01 48 66 9E 86 A9 23 00 00 03 00 83 0A 26 30 58 00 00 00 00 DC B3 FF 3D D6 ED C0 FF 7B 00 A1 FE 53 8F 53 8F 53 8F F5 FF 03 00 FF FF 5D 01 A3 03 DF 00 A3 46 1D 3A D1 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B0 1D 10 01 3A 3E 08 0E 1A 3A 01 60 4B FE 88 A9 23 00 00 03 00 83 A9 C1 30 58 00 00 00 00 44 B2 EB 3C 42 EC 43 FF 96 00 6B FD 53 8F 53 8F 53 8F DF FF 03 00 07 00 60 01 A2 03 DD 00 C6 DA 0C 3A D9 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B1 1D 10 01 3A 3E 08 0E 1A 3A 01 78 30 5E 8B A9 23 00 00 03 00 83 48 5D 31 58 00 00 00 00 E4 AF 4D 3B 18 EA B7 FE 7B 00 05 FD 53 8F 53 8F 53 8F F0 FF EE FF 04 00 61 01 A0 03 DC 00 34 0D E6 39 E1 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B2 1D 10 01 3A 3E 08 0E 1A 3A 01 A8 11 BE 8D A9 23 00 00 03 00 83 E6 F8 31 58 00 00 00 00 4C AD 8D 39 06 E8 F6 FE 93 00 ED FC 53 8F 53 8F 53 8F 2D 00 1F 00 DC FF 5F 01 A3 03 DC 00 36 55 BA 39 E9 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B3 1D 10 01 3A 3E 08 0E 1A 3A 01 C0 F6 1D 90 A9 23 00 00 03 00 83 85 94 32 58 00 00 00 00 3D AB C8 37 60 E6 4B FF DB FF FB FD 53 8F 53 8F 53 8F 4F 00 F2 FF D2 FF 5E 01 A5 03 DB 00 C4 AB C7 39 F1 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B4 1D 10 01 3A 3E 08 0E 1A 3A 01 D8 DB 7D 92 A9 23 00 00 03 00 83 24 30 33 58 00 00 00 00 F3 A9 74 36 0B E6 9D FF 76 FF 25 FF 54 8F 54 8F 54 8F 05 00 11 00 0A 00 59 01 A7 03 DE 00 42 72 BD 39 F9 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B5 1D 10 01 3A 3E 08 0E 1A 3A 01 F0 C0 DD 94 A9 23 00 00 03 00 83 C3 CB 33 58 00 00 00 00 7B A9 BB 35 12 E6 10 00 BE FF D9 FF 54 8F 54 8F 54 8F E8 FF 03 00 17 00 4F 01 A9 03 E2 00 10 E3 D2 39 01 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B6 1D 10 01 3A 3E 08 0E 1A 3A 01 08 A6 3D 97 A9 23 00 00 03 00 83 62 67 34 58 00 00 00 00 AB A9 AB 35 51 E6 53 00 B6 FF 87 00 54 8F 54 8F 54 8F F2 FF 00 00 02 00 47 01 AB 03 E5 00 90 F4 D0 39 09 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B7 1D 10 01 3A 3E 08 0E 1A 3A 01 38 87 9D 99 A9 23 00 00 03 04 83 00 03 35 58 00 00 00 00 61 AA 0F 36 03 E7 9B 00 A2 FF 4A 01 54 8F 54 8F 54 8F 0C 00 E4 FF F3 FF 41 01 AC 03 E7 00 CC 5D B1 39 11 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B8 1D 10 01 3A 3E 08 0E 1A 3A 01 50 6C FD 9B A9 23 00 00 03 00 83 9F 9E 35 58 00 00 00 00 BC AB 1B 37 4C E8 BE 00 7E FF 7A 02 54 8F 54 8F 54 8F 30 00 C1 FF E4 FF 3F 01 AA 03 E7 00 34 79 04 3A 19 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B9 1D 10 01 3A 3E 08 0E 1A 3A 01 68 51 5D 9E A9 23 00 00 03 00 83 3E 3A 36 58 00 00 00 00 AD AD BE 38 EF EA AB 00 0A FF 3E 03 54 8F 54 8F 54 8F F9 FF 0B 00 FA FF 3F 01 A9 03 E5 00 FB 14 04 3A 21 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BA 1D 10 01 3A 3E 08 0E 1A 3A 01 80 36 BD A0 A9 23 00 00 03 00 83 DD D5 36 58 00 00 00 00 AD AF 51 3A DF ED 74 00 E8 FE CB 02 54 8F 54 8F 54 8F D5 FF 41 00 16 00 41 01 AC 03 E5 00 52 E4 36 3A 29 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BB 1D 10 01 3A 3E 08 0E 1A 3A 01 B0 17 1D A3 A9 23 00 00 03 00 83 7B 71 37 58 00 00 00 00 27 B1 4D 3B E8 EF 58 00 92 FF 85 01 54 8F 54 8F 54 8F B6 FF 2C 00 30 00 43 01 AE 03 E5 00 B9 14 73 3A 31 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BC 1D 10 01 3A 3E 08 0E 1A 3A 01 C8 FC 7C A5 A9 23 00 00 03 00 83 1A 0D 38 58 00 00 00 00 E1 B1 E5 3B 8E F0 23 00 17 00 4D 00 54 8F 54 8F 54 8F DC FF 15 00 18 00 48 01 AD 03 E5 00 EB 13 82 3A 39 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BD 1D 10 01 3A 3E 08 0E 1A 3A 01 E0 E1 DC A7 A9 23 00 00 03 00 83 B9 A8 38 58 00 00 00 00 CD B1 E7 3B 39 F0 0E 00 81 00 47 FF 54 8F 54 8F 54 8F EB FF 10 00 11 00 4D 01 AC 03 E4 00 7B B8 81 3A 41 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BE 1D 10 01 3A 3E 08 0E 1A 3A 01 F8 C6 3C AA A9 23 00 00 03 00 83 58 44 39 58 00 00 00 00 38 B1 77 3B 07 EF D1 FF 65 00 AB FE 54 8F 54 8F 54 8F 07 00 EC FF F8 FF 54 01 AA 03 E1 00 BD 5F 4A 3A 49 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BF 1D 10 01 3A 3E 08 0E 1A 3A 01 28 A8 9C AC A9 23 00 00 03 04 83 F6 DF 39 58 00 00 00 00 17 B0 96 3A A9 ED 80 FF 6E 00 3D FE 55 8F 55 8F 55 8F FF FF E4 FF F7 FF 58 01 A7 03 DF 00 91 04 30 3A 51 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C0 1D 10 01 3A 3E 08 0E 1A 3A 01 40 8D FC AE A9 23 00 00 03 00 83 95 7B 3A 58 00 00 00 00 9C AE 81 39 34 EC 5D FF 6F 00 CE FD 55 8F 55 8F 55 8F 17 00 05 00 F0 FF 5A 01 A7 03 DD 00 C8 43 19 3A 59 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C1 1D 10 01 3A 3E 08 0E 1A 3A 01 58 72 5C B1 A9 23 00 00 03 04 83 34 17 3B 58 00 00 00 00 E1 AC 23 38 A5 EA 14 FF 47 00 C4 FD 55 8F 55 8F 55 8F 15 00 07 00 F7 FF 5B 01 A7 03 DD 00 58 9B 6B 39 61 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C2 1D 10 01 3A 3E 08 0E 1A 3A 01 70 57 BC B3 A9 23 00 00 03 00 83 D3 B2 3B 58 00 00 00 00 03 AB 99 36 0E E9 62 FF 78 00 65 FD 55 8F 55 8F 55 8F 1A 00 24 00 EC FF 58 01 AA 03 DD 00 F4 88 C9 39 69 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C3 1D 10 01 3A 3E 08 0E 1A 3A 01 88 3C 1C B6 A9 23 00 00 03 00 83 72 4E 3C 58 00 00 00 00 7A A9 FC 34 1D E7 90 FF 39 00 FE FD 55 8F 55 8F 55 8F 38 00 DB FF DA FF 55 01 AA 03 DD 00 E8 76 F6 39 71 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C4 1D 10 01 3A 3E 08 0E 1A 3A 01 B8 1D 7C B8 A9 23 00 00 03 00 83 10 EA 3C 58 00 00 00 00 6F A8 B0 33 0A E6 E1 FF E7 FF C6 FE 55 8F 55 8F 55 8F 01 00 E2 FF FF FF 4E 01 AA 03 DF 00 9C 94 06 3A 79 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C5 1D 10 01 3A 3E 08 0E 1A 3A 01 D0 02 DC BA A9 23 00 00 03 00 83 AF 85 3D 58 00 00 00 00 F8 A7 02 33 AE E5 F4 FF DE FF B7 FF 55 8F 55 8F 55 8F E7 FF FE FF 07 00 44 01 AB 03 E2 00 BD C9 10 3A 81 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C6 1D 10 01 3A 3E 08 0E 1A 3A 01 E8 E7 3B BD A9 23 00 00 03 00 83 4E 21 3E 58 00 00 00 00 02 A8 EF 32 D5 E5 2C 00 C2 FF 6E 00 55 8F 55 8F 55 8F F5 FF 0A 00 00 00 3A 01 AE 03 E5 00 72 58 07 3A 89 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C7 1D 10 01 3A 3E 08 0E 1A 3A 01 00 CD 9B BF A9 23 00 00 03 04 83 ED BC 3E 58 00 00 00 00 8E A8 4E 33 7E E6 78 00 9D FF 35 01 55 8F 55 8F 55 8F 0F 00 FD FF F6 FF 32 01 B0 03 E7 00 77 D5 06 3A 91 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C8 1D 10 01 3A 3E 08 0E 1A 3A 01 30 AE FB C1 A9 23 00 00 03 00 83 8B 58 3F 58 00 00 00 00 BD A9 3B 34 DD E7 C8 00 5A FF 5A 02 55 8F 55 8F 55 8F 19 00 F5 FF F3 FF 2E 01 B1 03 E7 00 5C A1 A7 39 99 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C9 1D 10 01 3A 3E 08 0E 1A 3A 01 48 93 5B C4 A9 23 00 00 03 00 83 2A F4 3F 58 00 00 00 00 9D AB C6 35 49 EA DE 00 FB FE EF 02 55 8F 55 8F 55 8F 00 00 39 00 FD FF 2D 01 B3 03 E6 00 FB 6D CA 39 A1 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CA 1D 10 01 3A 3E 08 0E 1A 3A 01 60 78 BB C6 A9 23 00 00 03 00 83 C9 8F 40 58 00 00 00 00 85 AD FF 36 89 EC BB 00 3F FF 3A 02 55 8F 55 8F 55 8F C3 FF 00 00 12 00 2C 01 B5 03 E6 00 A0 BA 08 3A A9 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CB 1D 10 01 3A 3E 08 0E 1A 3A 01 78 5D 1B C9 A9 23 00 00 03 00 83 68 2B 41 58 00 00 00 00 BE AE EC 37 37 EE 2E 00 87 FF 5E 01 56 8F 56 8F 56 8F D4 FF 11 00 0F 00 2D 01 B5 03 E5 00 31 46 D7 39 B1 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CC 1D 10 01 3A 3E 08 0E 1A 3A 01 90 42 7B CB A9 23 00 00 03 00 83 07 C7 41 58 00 00 00 00 35 AF 3A 38 3D EF F4 FF 93 FF 60 00 56 8F 56 8F 56 8F D8 FF 0A 00 12 00 30 01 B5 03 E4 00 C4 F1 DF 39 B9 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CD 1D 10 01 3A 3E 08 0E 1A 3A 01 C0 23 DB CD A9 23 00 00 03 00 83 A5 62 42 58 00 00 00 00 0F AF 0B 38 60 EF ED FF 14 00 78 FF 56 8F 56 8F 56 8F FB FF 04 00 FB FF 34 01 B5 03 E2 00 8F 57 DE 39 C1 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CE 1D 10 01 3A 3E 08 0E 1A 3A 01 D8 08 3B D0 A9 23 00 00 03 00 83 44 FE 42 58 00 00 00 00 6F AE 65 37 BC EE B2 FF 22 00 D9 FE 56 8F 56 8F 56 8F F0 FF E6 FF FE FF 38 01 B2 03 DF 00 2A 60 FD 39 C9 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CF 1D 10 01 3A 3E 08 0E 1A 3A 01 F0 ED 9A D2 A9 23 00 00 03 04 83 E3 99 43 58 00 00 00 00 50 AD 7B 36 B3 ED 4D FF 40 00 4E FE 56 8F 56 8F 56 8F E5 FF F4 FF F8 FF 3A 01 B1 03 DD 00 55 5A 03 3A D1 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D0 1D 10 01 3A 3E 08 0E 1A 3A 01 28 AA F9 D4 A9 23 00 00 03 00 83 82 35 44 58 00 00 00 00 B5 AB 3F 35 4B EC 29 FF 80 00 96 FD 56 8F 56 8F 56 8F E9 FF 1A 00 00 00 39 01 B2 03 DC 00 8F 5D 74 39 D9 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D1 1D 10 01 3A 3E 08 0E 1A 3A 01 58 8B 59 D7 A9 23 00 00 03 00 83 20 D1 44 58 00 00 00 00 D0 A9 A6 33 2C EA 44 FF AA 00 29 FD 56 8F 56 8F 56 8F 17 00 26 00 EB FF 38 01 B5 03 DC 00 A8 DE D0 39 E1 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D2 1D 10 01 3A 3E 08 0E 1A 3A 01 70 70 B9 D9 A9 23 00 00 03 00 83 BF 6C 45 58 00 00 00 00 2D A8 D1 31 C7 E7 DF FF 97 00 64 FD 56 8F 56 8F 56 8F 31 00 0F 00 E8 FF 34 01 B8 03 DC 00 26 DE 0D 3A E9 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D3 1D 10 01 3A 3E 08 0E 1A 3A 01 88 55 19 DC A9 23 00 00 03 00 83 5E 08 46 58 00 00 00 00 76 A7 6F 30 F4 E5 17 00 07 00 32 FF 56 8F 56 8F 56 8F 22 00 AA FF 00 00 2F 01 B6 03 DD 00 D4 E5 93 3A F1 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D4 1D 10 01 3A 3E 08 0E 1A 3A 01 A0 3A 79 DE A9 23 00 00 03 00 83 FD A3 46 58 00 00 00 00 7D A7 42 30 EB E5 35 00 F6 FF 64 00 56 8F 56 8F 56 8F D1 FF 0B 00 17 00 25 01 B7 03 E0 00 49 A9 9B 3A F9 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D5 1D 10 01 3A 3E 08 0E 1A 3A 01 D0 1B D9 E0 A9 23 00 00 03 00 83 9B 3F 47 58 00 00 00 00 FA A7 B7 30 3F E6 57 00 00 00 B8 00 56 8F 56 8F 56 8F ED FF 1C 00 FA FF 1B 01 BA 03 E1 00 95 D2 98 3A 01 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D6 1D 10 01 3A 3E 08 0E 1A 3A 01 E8 00 39 E3 A9 23 00 00 03 00 83 3A DB 47 58 00 00 00 00 A8 A8 4E 31 D6 E6 61 00 C8 FF 15 01 56 8F 56 8F 56 8F 03 00 FA FF F3 FF 15 01 BC 03 E1 00 62 9C 96 3A 09 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D7 1D 10 01 3A 3E 08 0E 1A 3A 01 00 E6 98 E5 A9 23 00 00 03 04 83 D9 76 48 58 00 00 00 00 82 A9 20 32 BE E7 7A 00 C2 FF D0 01 57 8F 57 8F 57 8F 23 00 DA FF E8 FF 12 01 BC 03 E0 00 DA B6 8F 3A 11 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D8 1D 10 01 3A 3E 08 0E 1A 3A 01 18 CB F8 E7 A9 23 00 00 03 00 83 78 12 49 58 00 00 00 00 0A AB A7 33 79 E9 C2 00 9B FF E6 02 57 8F 57 8F 57 8F 36 00 DB FF DF FF 13 01 BB 03 DE 00 6C 02 80 3A 19 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D9 1D 10 01 3A 3E 08 0E 1A 3A 01 30 B0 58 EA A9 23 00 00 03 00 83 17 AE 49 58 00 00 00 00 4A AD CA 35 28 EC D3 00 1A FF 8C 03 57 8F 57 8F 57 8F 29 00 F9 FF D5 FF 18 01 BA 03 DA 00 B8 49 1B 3A 21 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DA 1D 10 01 3A 3E 08 0E 1A 3A 01 60 91 B8 EC A9 23 00 00 03 00 83 B5 49 4A 58 00 00 00 00 6E AF 83 37 40 EF 73 00 09 FF D5 02 57 8F 57 8F 57 8F A4 FF 27 00 28 00 1B 01 BA 03 D8 00 CA 59 A0 39 29 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DB 1D 10 01 3A 3E 08 0E 1A 3A 01 78 76 18 EF A9 23 00 00 03 00 83 54 E5 4A 58 00 00 00 00 CD B0 B8 38 04 F1 51 00 EE FF 14 01 57 8F 57 8F 57 8F C0 FF 4C 00 29 00 1E 01 BC 03 D8 00 F6 30 14 3A 31 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DC 1D 10 01 3A 3E 08 0E 1A 3A 01 90 5B 78 F1 A9 23 00 00 03 00 83 F3 80 4B 58 00 00 00 00 17 B1 09 39 27 F1 D7 FF 54 00 BA FF 57 8F 57 8F 57 8F D7 FF 16 00 21 00 24 01 BC 03 D7 00 FD CA 1F 3A 39 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DD 1D 10 01 3A 3E 08 0E 1A 3A 01 A8 40 D8 F3 A9 23 00 00 03 00 83 92 1C 4C 58 00 00 00 00 AF B0 FD 38 3D F0 D9 FF 67 00 20 FF 57 8F 57 8F 57 8F 2F 00 D1 FF E3 FF 2E 01 B9 03 D4 00 4D 17 1D 3A 41 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DE 1D 10 01 3A 3E 08 0E 1A 3A 01 D8 21 38 F6 A9 23 00 00 03 00 83 30 B8 4C 58 00 00 00 00 11 B0 A5 38 B5 EF A2 FF 1F 00 67 FF 57 8F 57 8F 57 8F 08 00 E0 FF F0 FF 36 01 B4 03 D0 00 B0 7E 32 3A 49 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DF 1D 10 01 3A 3E 08 0E 1A 3A 01 F0 06 98 F8 A9 23 00 00 03 04 83 CF 53 4D 58 00 00 00 00 A7 AF 80 38 99 EF B2 FF 03 00 AC FF 57 8F 57 8F 57 8F 00 00 06 00 F4 FF 3C 01 B2 03 CD 00 B2 0B 33 3A 51 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E0 1D 10 01 3A 3E 08 0E 1A 3A 01 08 EC F7 FA A9 23 00 00 03 04 83 6E EF 4D 58 00 00 00 00 70 AF 6B 38 96 EF D3 FF 1D 00 C9 FF 57 8F 57 8F 57 8F ED FF 16 00 0D 00 40 01 B1 03 CC 00 28 29 38 3A 59 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E1 1D 10 01 3A 3E 08 0E 1A 3A 01 20 D1 57 FD A9 23 00 00 03 04 83 0D 8B 4E 58 00 00 00 00 55 AF 6F 38 65 EF F2 FF 32 00 E1 FF 57 8F 57 8F 57 8F F6 FF 15 00 08 00 44 01 B1 03 CC 00 75 E4 06 3A 61 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E2 1D 10 01 3A 3E 08 0E 1A 3A 01 38 B6 B7 FF A9 23 00 00 03 04 83 AC 26 4F 58 00 00 00 00 43 AF 7A 38 1D EF 00 00 35 00 E4 FF 58 8F 58 8F 58 8F F9 FF 0B 00 08 00 48 01 B1 03 CB 00 04 CD BC 39 69 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E3 1D 10 01 3A 3E 08 0E 1A 3A 01 68 97 17 02 AA 23 00 00 03 04 83 4A C2 4F 58 00 00 00 00 34 AF 85 38 DC EE 00 00 2C 00 E7 FF 58 8F 58 8F 58 8F FE FF 0A 00 01 00 4C 01 B1 03 CB 00 48 17 BB 39 71 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E4 1D 10 01 3A 3E 08 0E 1A 3A 01 80 7C 77 04 AA 23 00 00 03 04 83 E9 5D 50 58 00 00 00 00 25 AF 83 38 A6 EE FE FF 10 00 DE FF 58 8F 58 8F 58 8F 01 00 FD FF FA FF 4F 01 B0 03 CA 00 51 A4 3F 39 79 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E5 1D 10 01 3A 3E 08 0E 1A 3A 01 98 61 D7 06 AA 23 00 00 03 04 83 88 F9 50 58 00 00 00 00 0C AF 6C 38 89 EE F0 FF 01 00 D9 FF 58 8F 58 8F 58 8F FD FF F7 FF FB FF 52 01 AF 03 C9 00 35 C6 01 39 81 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E6 1D 10 01 3A 3E 08 0E 1A 3A 01 B0 46 37 09 AA 23 00 00 03 04 83 27 95 51 58 00 00 00 00 DE AE 4A 38 74 EE E6 FF 06 00 BF FF 58 8F 58 8F 58 8F 00 00 08 00 FC FF 55 01 AE 03 C8 00 52 4E FD 38 89 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E7 1D 10 01 3A 3E 08 0E 1A 3A 01 E0 27 97 0B AA 23 00 00 03 04 83 C5 30 52 58 00 00 00 00 AE AE 0B 38 4A EE F9 FF F2 FF C3 FF 58 8F 58 8F 58 8F F7 FF FB FF 00 00 57 01 AD 03 C8 00 5B 82 B4 38 91 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E8 1D 10 01 3A 3E 08 0E 1A 3A 01 F8 0C F7 0D AA 23 00 00 03 04 83 64 CC 52 58 00 00 00 00 8E AE D7 37 35 EE 00 00 EE FF D9 FF 58 8F 58 8F 58 8F F7 FF 06 00 03 00 58 01 AD 03 C8 00 B5 0C 3A 38 99 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E9 1D 10 01 3A 3E 08 0E 1A 3A 01 10 F2 56 10 AA 23 00 00 03 04 83 03 68 53 58 00 00 00 00 82 AE B8 37 21 EE 07 00 00 00 EB FF 58 8F 58 8F 58 8F F7 FF 02 00 00 00 59 01 AD 03 C7 00 5C 2D 09 38 A1 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EA 1D 10 01 3A 3E 08 0E 1A 3A 01 28 D7 B6 12 AA 23 00 00 03 04 83 A2 03 54 58 00 00 00 00 7D AE AC 37 1B EE 06 00 FC FF 02 00 58 8F 58 8F 58 8F F3 FF 02 00 FF FF 5A 01 AD 03 C7 00 DD 2C D4 37 A9 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EB 1D 10 01 3A 3E 08 0E 1A 3A 01 40 BC 16 15 AA 23 00 00 03 04 43 41 9F 54 58 00 00 00 00 84 AE B0 37 1D EE 06 00 00 00 0A 00 58 8F 58 8F 58 8F F4 FF 04 00 02 00 5B 01 AD 03 C7 00 20 42 BF 37 B1 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EC 1D 10 01 3A 3E 08 0E 1A 3A 01 70 9D 76 17 AA 23 00 00 03 04 43 DF 3A 55 58 00 00 00 00 8C AE BC 37 14 EE 00 00 13 00 05 00 58 8F 58 8F 58 8F F5 FF 05 00 04 00 5C 01 AC 03 C7 00 69 E7 83 37 B9 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 ED 1D 10 01 3A 3E 08 0E 1A 3A 01 88 82 D6 19 AA 23 00 00 03 04 43 7E D6 55 58 00 00 00 00 93 AE D4 37 FD ED 00 00 1F 00 0A 00 58 8F 58 8F 58 8F FC FF 02 00 FE FF 5D 01 AC 03 C7 00 56 C0 11 37 C1 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EE 1D 10 01 3A 3E 08 0E 1A 3A 01 A0 67 36 1C AA 23 00 00 03 04 43 1D 72 56 58 00 00 00 00 9B AE DD 37 E7 ED 0E 00 06 00 00 00 59 8F 59 8F 59 8F FD FF 00 00 FE FF 5E 01 AC 03 C6 00 E0 72 1B 37 C9 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EF 1D 10 01 3A 3E 08 0E 1A 3A 01 B8 4C 96 1E AA 23 00 00 03 04 43 BC 0D 57 58 00 00 00 00 A0 AE DB 37 D8 ED 0B 00 00 00 FA FF 59 8F 59 8F 59 8F 01 00 04 00 FB FF 5F 01 AC 03 C6 00 E4 89 FD 36 D1 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F0 1D 10 01 3A 3E 08 0E 1A 3A 01 E8 2D F6 20 AA 23 00 00 03 04 43 5A A9 57 58 00 00 00 00 9E AE C8 37 D1 ED 02 00 F2 FF F4 FF 59 8F 59 8F 59 8F FF FF 00 00 FA FF 60 01 AC 03 C5 00 4A C1 09 37 D9 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F1 1D 10 01 3A 3E 08 0E 1A 3A 01 00 13 56 23 AA 23 00 00 03 04 43 F9 44 58 58 00 00 00 00 94 AE B5 37 D0 ED FC FF F8 FF F6 FF 59 8F 59 8F 59 8F F9 FF 00 00 F9 FF 61 01 AC 03 C4 00 9E 6E 02 37 E1 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F2 1D 10 01 3A 3E 08 0E 1A 3A 01 18 F8 B5 25 AA 23 00 00 03 04 43 98 E0 58 58 00 00 00 00 8F AE A8 37 CF ED FF FF 04 00 00 00 59 8F 59 8F 59 8F F5 FF FB FF FE FF 61 01 AB 03 C4 00 7B D9 43 37 E9 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F3 1D 10 01 3A 3E 08 0E 1A 3A 01 30 DD 15 28 AA 23 00 00 03 04 43 37 7C 59 58 00 00 00 00 92 AE B2 37 CA ED 03 00 0E 00 0A 00 59 8F 59 8F 59 8F FD FF FE FF FA FF 62 01 AB 03 C3 00 7E 65 57 37 F1 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F4 1D 10 01 3A 3E 08 0E 1A 3A 01 48 C2 75 2A AA 23 00 00 03 04 43 D6 17 5A 58 00 00 00 00 A4 AE CE 37 D1 ED F7 FF 05 00 32 00 59 8F 59 8F 59 8F 00 00 F5 FF F5 FF 62 01 AA 03 C2 00 49 7B ED 37 F9 76 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F5 1D 10 01 3A 3E 08 0E 1A 3A 01 78 A3 D5 2C AA 23 00 00 03 04 43 74 B3 5A 58 00 00 00 00 B4 AE F1 37 02 EE F1 FF FA FF 2F 00 59 8F 59 8F 59 8F FA FF 08 00 00 00 63 01 AA 03 C2 00 9E 05 FF 37 01 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F6 1D 10 01 3A 3E 08 0E 1A 3A 01 90 88 35 2F AA 23 00 00 03 04 83 13 4F 5B 58 00 00 00 00 BF AE 0B 38 20 EE F8 FF 04 00 14 00 59 8F 59 8F 59 8F F7 FF 09 00 01 00 64 01 AB 03 C2 00 39 7A 1C 38 09 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F7 1D 10 01 3A 3E 08 0E 1A 3A 01 A8 6D 95 31 AA 23 00 00 03 04 83 B2 EA 5B 58 00 00 00 00 C2 AE 17 38 20 EE FF FF 07 00 00 00 59 8F 59 8F 59 8F FC FF 07 00 FE FF 65 01 AB 03 C2 00 E8 BC 36 38 11 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F8 1D 10 01 3A 3E 08 0E 1A 3A 01 C0 52 F5 33 AA 23 00 00 03 04 83 51 86 5C 58 00 00 00 00 BB AE 12 38 0D EE 00 00 0D 00 EF FF 59 8F 59 8F 59 8F FA FF 03 00 01 00 65 01 AB 03 C2 00 2F 07 3D 38 19 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F9 1D 10 01 3A 3E 08 0E 1A 3A 01 F0 33 55 36 AA 23 00 00 03 04 83 EF 21 5D 58 00 00 00 00 B0 AE 0A 38 EE ED FB FF 09 00 E7 FF 59 8F 59 8F 59 8F 01 00 FE FF FB FF 66 01 AB 03 C2 00 2C 03 2D 38 21 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FA 1D 10 01 3A 3E 08 0E 1A 3A 01 08 19 B5 38 AA 23 00 00 03 04 83 8E BD 5D 58 00 00 00 00 9C AE FB 37 DE ED F2 FF FC FF F4 FF 5A 8F 5A 8F 5A 8F FA FF F8 FF F9 FF 67 01 AA 03 C2 00 06 FE 0C 38 29 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FB 1D 10 01 3A 3E 08 0E 1A 3A 01 20 FE 14 3B AA 23 00 00 03 04 83 2D 59 5E 58 00 00 00 00 8A AE F1 37 E4 ED F5 FF FF FF F2 FF 5A 8F 5A 8F 5A 8F F9 FF 05 00 04 00 67 01 AA 03 C2 00 A9 FA 02 38 31 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FC 1D 10 01 3A 3E 08 0E 1A 3A 01 38 E3 74 3D AA 23 00 00 03 04 43 CC F4 5E 58 00 00 00 00 7E AE F0 37 D5 ED FD FF 12 00 F2 FF 5A 8F 5A 8F 5A 8F FD FF 06 00 00 00 68 01 AA 03 C2 00 FE C0 F8 37 39 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FD 1D 10 01 3A 3E 08 0E 1A 3A 01 50 C8 D4 3F AA 23 00 00 03 04 43 6B 90 5F 58 00 00 00 00 7A AE F4 37 C8 ED FF FF 05 00 00 00 5A 8F 5A 8F 5A 8F FE FF 03 00 FD FF 68 01 AA 03 C2 00 D3 A5 BF 37 41 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FE 1D 10 01 3A 3E 08 0E 1A 3A 01 80 A9 34 42 AA 23 00 00 03 04 43 09 2C 60 58 00 00 00 00 79 AE F7 37 C7 ED 00 00 03 00 02 00 5A 8F 5A 8F 5A 8F FA FF 03 00 00 00 68 01 AA 03 C2 00 95 29 9C 37 49 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FF 1D 10 01 3A 3E 08 0E 1A 3A 01 98 8E 94 44 AA 23 00 00 03 04 43 A8 C7 60 58 00 00 00 00 78 AE F9 37 C3 ED FE FF 04 00 FF FF 5A 8F 5A 8F 5A 8F FC FF 00 00 00 00 69 01 AA 03 C3 00 73 B0 9C 37 51 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 80 1E 10 01 3A 3E 08 0E 1A 3A 01 B0 73 F4 46 AA 23 00 00 03 04 43 47 63 61 58 00 00 00 00 74 AE F7 37 C0 ED FC FF 01 00 FD FF 5A 8F 5A 8F 5A 8F FA FF 03 00 00 00 69 01 AA 03 C3 00 FC 53 89 37 59 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 81 1E 10 01 3A 3E 08 0E 1A 3A 01 C8 58 54 49 AA 23 00 00 03 04 43 E6 FE 61 58 00 00 00 00 6F AE F7 37 BA ED 00 00 03 00 FC FF 5A 8F 5A 8F 5A 8F FC FF 02 00 FE FF 69 01 AA 03 C3 00 9C C0 26 37 61 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 82 1E 10 01 3A 3E 08 0E 1A 3A 01 F8 39 B4 4B AA 23 00 00 03 04 43 84 9A 62 58 00 00 00 00 6C AE F5 37 B5 ED FC FF 08 00 02 00 5A 8F 5A 8F 5A 8F FA FF 00 00 01 00 69 01 AA 03 C3 00 4F C5 AA 36 69 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 83 1E 10 01 3A 3E 08 0E 1A 3A 01 10 1F 14 4E AA 23 00 00 03 04 43 23 36 63 58 00 00 00 00 6A AE FC 37 AE ED FE FF 09 00 00 00 5A 8F 5A 8F 5A 8F FB FF 00 00 00 00 69 01 AA 03 C3 00 38 D1 66 36 71 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 84 1E 10 01 3A 3E 08 0E 1A 3A 01 28 04 74 50 AA 23 00 00 03 04 43 C2 D1 63 58 00 00 00 00 68 AE 02 38 A9 ED FF FF 06 00 00 00 5A 8F 5A 8F 5A 8F FD FF 03 00 01 00 69 01 AA 03 C4 00 B6 66 74 36 79 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 85 1E 10 01 3A 3E 08 0E 1A 3A 01 40 E9 D3 52 AA 23 00 00 03 04 43 61 6D 64 58 00 00 00 00 69 AE 0C 38 A4 ED FF FF 07 00 07 00 5B 8F 5B 8F 5B 8F 00 00 01 00 00 00 69 01 AA 03 C4 00 4E E8 6D 36 81 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 86 1E 10 01 3A 3E 08 0E 1A 3A 01 58 CE 33 55 AA 23 00 00 03 04 43 00 09 65 58 00 00 00 00 6E AE 18 38 A5 ED FF FF 05 00 0D 00 5B 8F 5B 8F 5B 8F 00 00 01 00 00 00 69 01 AA 03 C4 00 4D 1E 75 36 89 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 87 1E 10 01 3A 3E 08 0E 1A 3A 01 88 AF 93 57 AA 23 00 00 03 04 43 9E A4 65 58 00 00 00 00 72 AE 1F 38 AB ED 00 00 FF FF 06 00 5B 8F 5B 8F 5B 8F FD FF 02 00 00 00 6A 01 AA 03 C4 00 9C BA 8C 36 91 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 88 1E 10 01 3A 3E 08 0E 1A 3A 01 A0 94 F3 59 AA 23 00 00 03 04 43 3D 40 66 58 00 00 00 00 75 AE 23 38 B0 ED FF FF 00 00 08 00 5B 8F 5B 8F 5B 8F FE FF 00 00 00 00 6A 01 A9 03 C5 00 4E C6 5B 36 99 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 89 1E 10 01 3A 3E 08 0E 1A 3A 01 B8 79 53 5C AA 23 00 00 03 04 43 DC DB 66 58 00 00 00 00 79 AE 27 38 B4 ED 03 00 FE FF 07 00 5B 8F 5B 8F 5B 8F FD FF FD FF FC FF 6A 01 A9 03 C5 00 1E 75 7C 36 A1 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8A 1E 10 01 3A 3E 08 0E 1A 3A 01 D0 5E B3 5E AA 23 00 00 03 04 43 7B 77 67 58 00 00 00 00 7E AE 27 38 BB ED 02 00 F9 FF 00 00 5B 8F 5B 8F 5B 8F FE FF 00 00 01 00 6A 01 A9 03 C5 00 09 01 94 36 A9 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8B 1E 10 01 3A 3E 08 0E 1A 3A 01 00 40 13 61 AA 23 00 00 03 04 43 19 13 68 58 00 00 00 00 7D AE 27 38 B9 ED 00 00 0C 00 FA FF 5B 8F 5B 8F 5B 8F FD FF 08 00 02 00 6B 01 A9 03 C5 00 9B 3A 1F 37 B1 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8C 1E 10 01 3A 3E 08 0E 1A 3A 01 18 25 73 63 AA 23 00 00 03 04 43 B8 AE 68 58 00 00 00 00 7E AE 2B 38 A8 ED 00 00 0A 00 FF FF 5B 8F 5B 8F 5B 8F FD FF 00 00 02 00 6B 01 A9 03 C5 00 0C B8 33 37 B9 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8D 1E 10 01 3A 3E 08 0E 1A 3A 01 30 0A D3 65 AA 23 00 00 03 04 43 57 4A 69 58 00 00 00 00 80 AE 30 38 9E ED 01 00 07 00 00 00 5B 8F 5B 8F 5B 8F FC FF 00 00 00 00 6B 01 A9 03 C6 00 E2 ED 23 37 C1 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8E 1E 10 01 3A 3E 08 0E 1A 3A 01 48 EF 32 68 AA 23 00 00 03 04 43 F6 E5 69 58 00 00 00 00 82 AE 31 38 9B ED 06 00 FC FF FF FF 5B 8F 5B 8F 5B 8F FD FF 04 00 FF FF 6B 01 A9 03 C6 00 4A 8D 33 37 C9 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8F 1E 10 01 3A 3E 08 0E 1A 3A 01 60 D4 92 6A AA 23 00 00 03 04 43 95 81 6A 58 00 00 00 00 84 AE 2C 38 9B ED 00 00 FE FF 05 00 5B 8F 5B 8F 5B 8F FA FF 00 00 03 00 6B 01 A9 03 C6 00 6C 59 3A 37 D1 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 90 1E 10 01 3A 3E 08 0E 1A 3A 01 90 B5 F2 6C AA 23 00 00 03 04 43 33 1D 6B 58 00 00 00 00 89 AE 33 38 9D ED 00 00 01 00 0B 00 5B 8F 5B 8F 5B 8F FF FF 01 00 FB FF 6B 01 A9 03 C6 00 49 60 2A 37 D9 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 91 1E 10 01 3A 3E 08 0E 1A 3A 01 A8 9A 52 6F AA 23 00 00 03 04 43 D2 B8 6B 58 00 00 00 00 8E AE 34 38 A5 ED 00 00 00 00 0D 00 5C 8F 5C 8F 5C 8F FC FF FE FF FF FF 6B 01 A9 03 C6 00 6E 4F FC 36 E1 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 92 1E 10 01 3A 3E 08 0E 1A 3A 01 C0 7F B2 71 AA 23 00 00 03 04 43 71 54 6C 58 00 00 00 00 90 AE 39 38 A9 ED 01 00 03 00 03 00 5C 8F 5C 8F 5C 8F FC FF 01 00 FE FF 6B 01 A9 03 C6 00 09 8D BA 36 E9 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 93 1E 10 01 3A 3E 08 0E 1A 3A 01 D8 64 12 74 AA 23 00 00 03 04 43 10 F0 6C 58 00 00 00 00 92 AE 3B 38 AA ED 00 00 02 00 03 00 5C 8F 5C 8F 5C 8F FA FF FF FF 00 00 6B 01 A9 03 C6 00 5D AD BB 36 F1 77 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 94 1E 10 01 3A 3E 08 0E 1A 3A 01 08 46 72 76 AA 23 00 00 03 04 43 AE 8B 6D 58 00 00 00 00 96 AE 47 38 A7 ED FF FF 07 00 05 00 5C 8F 5C 8F 5C 8F 00 00 00 00 FD FF 6C 01 A8 03 C6 00 6C E2 B0 36 F9 77 00 00
|
||||
@@ -1,125 +0,0 @@
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,152 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,168 ,228 , 0 , 80 ,169 ,35 ,0 ,0 ,3 ,4 , 67 ,198 , 42 , 34 ,88 ,0 ,0 ,0 ,0 , 10 ,176 , 36 ,58 , 76 ,240 ,235 ,255 , 20 , 0 ,248 ,255 ,81 ,143 ,81 ,143 ,81 ,143 , 10 , 0 , 0 , 0 ,254 ,255 ,169 ,1 ,143 ,3 ,190 ,0 ,138 ,151 ,149 ,54 , 25 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,153 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,192 ,201 , 96 , 82 ,169 ,35 ,0 ,0 ,3 ,4 , 67 ,101 ,198 , 34 ,88 ,0 ,0 ,0 ,0 ,244 ,175 , 36 ,58 , 71 ,240 ,233 ,255 ,255 ,255 ,244 ,255 ,81 ,143 ,81 ,143 ,81 ,143 , 2 , 0 ,255 ,255 ,255 ,255 ,170 ,1 ,143 ,3 ,190 ,0 , 25 ,176 ,210 ,54 , 33 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,154 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,216 ,174 ,192 , 84 ,169 ,35 ,0 ,0 ,3 ,4 , 67 , 4 , 98 , 35 ,88 ,0 ,0 ,0 ,0 ,223 ,175 , 29 ,58 , 76 ,240 ,239 ,255 , 4 , 0 ,244 ,255 ,81 ,143 ,81 ,143 ,81 ,143 ,248 ,255 , 0 , 0 , 4 , 0 ,169 ,1 ,143 ,3 ,191 ,0 , 82 , 92 ,207 ,54 , 41 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,155 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,240 ,147 , 32 , 87 ,169 ,35 ,0 ,0 ,3 ,4 , 67 ,163 ,253 , 35 ,88 ,0 ,0 ,0 ,0 ,209 ,175 , 30 ,58 , 66 ,240 ,252 ,255 , 18 , 0 ,237 ,255 ,81 ,143 ,81 ,143 ,81 ,143 ,252 ,255 , 9 , 0 , 1 , 0 ,168 ,1 ,144 ,3 ,192 ,0 , 28 ,151 , 41 ,55 , 49 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,156 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 8 ,121 ,128 , 89 ,169 ,35 ,0 ,0 ,3 ,4 , 67 , 66 ,153 , 36 ,88 ,0 ,0 ,0 ,0 ,195 ,175 , 22 ,58 , 28 ,240 , 2 , 0 , 21 , 0 ,221 ,255 ,81 ,143 ,81 ,143 ,81 ,143 , 0 , 0 , 3 , 0 , 0 , 0 ,168 ,1 ,144 ,3 ,193 ,0 ,249 ,195 ,136 ,55 , 57 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,157 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 56 , 90 ,224 , 91 ,169 ,35 ,0 ,0 ,3 ,4 , 67 ,224 , 52 , 37 ,88 ,0 ,0 ,0 ,0 ,171 ,175 , 11 ,58 ,231 ,239 ,244 ,255 , 36 , 0 ,210 ,255 ,82 ,143 ,82 ,143 ,82 ,143 ,249 ,255 ,255 ,255 , 1 , 0 ,167 ,1 ,144 ,3 ,193 ,0 , 22 ,189 ,131 ,55 , 65 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,158 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 80 , 63 , 64 , 94 ,169 ,35 ,0 ,0 ,3 ,4 , 67 ,127 ,208 , 37 ,88 ,0 ,0 ,0 ,0 ,115 ,175 ,241 ,57 ,143 ,239 ,217 ,255 , 43 , 0 ,118 ,255 ,82 ,143 ,82 ,143 ,82 ,143 ,255 ,255 , 12 , 0 , 8 , 0 ,166 ,1 ,145 ,3 ,194 ,0 ,115 , 97 , 13 ,56 , 73 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,159 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,104 , 36 ,160 , 96 ,169 ,35 ,0 ,0 ,3 ,4 ,131 , 30 ,108 , 38 ,88 ,0 ,0 ,0 ,0 ,222 ,174 ,143 ,57 ,217 ,238 ,187 ,255 , 89 , 0 ,218 ,254 ,82 ,143 ,82 ,143 ,82 ,143 ,250 ,255 , 24 , 0 , 6 , 0 ,165 ,1 ,147 ,3 ,196 ,0 ,146 , 13 ,214 ,56 , 81 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,160 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,128 , 9 , 0 , 99 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,189 , 7 , 39 ,88 ,0 ,0 ,0 ,0 ,230 ,173 ,211 ,56 ,146 ,237 ,156 ,255 ,146 , 0 , 65 ,254 ,82 ,143 ,82 ,143 ,82 ,143 ,251 ,255 , 20 , 0 , 4 , 0 ,161 ,1 ,149 ,3 ,198 ,0 ,248 ,140 , 24 ,57 , 89 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,161 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,176 ,234 , 95 ,101 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 91 ,163 , 39 ,88 ,0 ,0 ,0 ,0 ,139 ,172 ,191 ,55 ,172 ,235 ,148 ,255 ,215 , 0 ,168 ,253 ,82 ,143 ,82 ,143 ,82 ,143 , 10 , 0 , 13 , 0 , 8 , 0 ,157 ,1 ,151 ,3 ,200 ,0 ,222 ,217 , 99 ,57 , 97 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,162 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,200 ,207 ,191 ,103 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,250 , 62 , 40 ,88 ,0 ,0 ,0 ,0 ,247 ,170 ,124 ,54 ,108 ,233 , 43 ,255 ,188 , 0 ,156 ,253 ,82 ,143 ,82 ,143 ,82 ,143 , 17 , 0 ,231 ,255 , 27 , 0 ,151 ,1 ,152 ,3 ,203 ,0 ,134 ,132 ,113 ,57 ,105 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,163 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,224 ,180 , 31 ,106 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,153 ,218 , 40 ,88 ,0 ,0 ,0 ,0 , 98 ,169 ,152 ,53 , 52 ,231 , 64 ,255 ,168 , 1 ,217 ,253 ,82 ,143 ,82 ,143 ,82 ,143 ,246 ,255 ,248 ,255 , 14 , 0 ,140 ,1 ,154 ,3 ,209 ,0 , 46 ,114 ,113 ,57 ,113 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,164 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,248 ,153 ,127 ,108 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 56 ,118 , 41 ,88 ,0 ,0 ,0 ,0 , 93 ,168 , 57 ,53 ,211 ,228 ,131 ,255 , 22 , 1 ,148 ,254 ,82 ,143 ,82 ,143 ,82 ,143 , 36 , 0 ,200 ,255 ,187 ,255 ,129 ,1 ,154 ,3 ,211 ,0 ,206 , 78 , 20 ,58 ,121 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,165 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 40 ,123 ,223 ,110 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,214 , 17 , 42 ,88 ,0 ,0 ,0 ,0 ,191 ,167 ,231 ,52 ,226 ,227 ,210 ,255 , 63 , 0 ,107 ,255 ,82 ,143 ,82 ,143 ,82 ,143 ,253 ,255 , 11 , 0 ,245 ,255 ,117 ,1 ,156 ,3 ,214 ,0 ,207 ,204 , 31 ,58 ,129 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,166 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 64 , 96 , 63 ,113 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,117 ,173 , 42 ,88 ,0 ,0 ,0 ,0 ,160 ,167 ,207 ,52 ,175 ,227 , 6 , 0 ,241 ,255 , 49 , 0 ,82 ,143 ,82 ,143 ,82 ,143 ,252 ,255 ,252 ,255 , 0 , 0 ,103 ,1 ,159 ,3 ,219 ,0 ,163 ,104 , 19 ,58 ,137 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,167 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 88 , 69 ,159 ,115 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 20 , 73 , 43 ,88 ,0 ,0 ,0 ,0 ,245 ,167 , 21 ,53 , 57 ,228 , 76 , 0 ,141 ,255 ,246 , 0 ,82 ,143 ,82 ,143 ,82 ,143 , 16 , 0 ,248 ,255 ,242 ,255 , 91 ,1 ,161 ,3 ,223 ,0 ,149 ,193 , 0 ,58 ,145 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,168 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,112 , 42 ,255 ,117 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,179 ,228 , 43 ,88 ,0 ,0 ,0 ,0 ,204 ,168 ,168 ,53 ,149 ,229 ,151 , 0 , 41 ,255 ,184 , 1 ,83 ,143 ,83 ,143 ,83 ,143 ,254 ,255 , 9 , 0 , 10 , 0 , 82 ,1 ,164 ,3 ,227 ,0 ,242 ,202 ,247 ,57 ,153 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,169 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,160 , 11 , 95 ,120 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 81 ,128 , 44 ,88 ,0 ,0 ,0 ,0 , 78 ,170 ,193 ,54 , 76 ,231 ,250 , 0 ,134 ,255 ,134 , 2 ,83 ,143 ,83 ,143 ,83 ,143 , 22 , 0 ,245 ,255 , 12 , 0 , 75 ,1 ,165 ,3 ,231 ,0 ,193 ,235 ,252 ,57 ,161 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,170 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,184 ,240 ,190 ,122 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,240 , 27 , 45 ,88 ,0 ,0 ,0 ,0 ,172 ,172 ,158 ,56 ,170 ,233 ,239 , 0 ,205 ,254 ,198 , 3 ,83 ,143 ,83 ,143 ,83 ,143 , 3 , 0 ,236 ,255 ,237 ,255 , 74 ,1 ,164 ,3 ,231 ,0 ,121 , 47 ,197 ,57 ,169 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,171 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,208 ,213 , 30 ,125 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,143 ,183 , 45 ,88 ,0 ,0 ,0 ,0 , 77 ,175 ,174 ,58 ,182 ,236 , 22 , 1 , 99 ,255 , 37 , 3 ,83 ,143 ,83 ,143 ,83 ,143 ,183 ,255 , 86 , 0 , 24 , 0 , 72 ,1 ,168 ,3 ,232 ,0 ,176 ,132 ,249 ,57 ,177 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,172 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,232 ,186 ,126 ,127 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 46 , 83 , 46 ,88 ,0 ,0 ,0 ,0 ,184 ,177 , 84 ,60 , 65 ,238 , 36 , 1 ,249 ,255 , 11 , 2 ,83 ,143 ,83 ,143 ,83 ,143 ,198 ,255 , 30 , 0 , 25 , 0 , 73 ,1 ,170 ,3 ,232 ,0 , 41 ,226 , 23 ,58 ,185 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,173 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 0 ,160 ,222 ,129 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,205 ,238 , 46 ,88 ,0 ,0 ,0 ,0 ,119 ,179 ,138 ,61 ,176 ,238 ,193 , 0 , 97 , 0 , 7 , 1 ,83 ,143 ,83 ,143 ,83 ,143 ,248 ,255 ,243 ,255 , 6 , 0 , 78 ,1 ,168 ,3 ,230 ,0 , 15 ,192 , 25 ,58 ,193 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,174 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 48 ,129 , 62 ,132 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,107 ,138 , 47 ,88 ,0 ,0 ,0 ,0 , 69 ,180 , 55 ,62 ,140 ,238 , 47 , 0 , 96 , 0 , 12 , 0 ,83 ,143 ,83 ,143 ,83 ,143 , 13 , 0 ,245 ,255 ,240 ,255 , 86 ,1 ,164 ,3 ,226 ,0 ,231 ,253 , 33 ,58 ,201 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,175 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 72 ,102 ,158 ,134 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 10 , 38 , 48 ,88 ,0 ,0 ,0 ,0 ,220 ,179 ,255 ,61 ,214 ,237 ,192 ,255 ,123 , 0 ,161 ,254 ,83 ,143 ,83 ,143 ,83 ,143 ,245 ,255 , 3 , 0 ,255 ,255 , 93 ,1 ,163 ,3 ,223 ,0 ,163 , 70 , 29 ,58 ,209 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,176 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 96 , 75 ,254 ,136 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,169 ,193 , 48 ,88 ,0 ,0 ,0 ,0 , 68 ,178 ,235 ,60 , 66 ,236 , 67 ,255 ,150 , 0 ,107 ,253 ,83 ,143 ,83 ,143 ,83 ,143 ,223 ,255 , 3 , 0 , 7 , 0 , 96 ,1 ,162 ,3 ,221 ,0 ,198 ,218 , 12 ,58 ,217 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,177 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,120 , 48 , 94 ,139 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 72 , 93 , 49 ,88 ,0 ,0 ,0 ,0 ,228 ,175 , 77 ,59 , 24 ,234 ,183 ,254 ,123 , 0 , 5 ,253 ,83 ,143 ,83 ,143 ,83 ,143 ,240 ,255 ,238 ,255 , 4 , 0 , 97 ,1 ,160 ,3 ,220 ,0 , 52 , 13 ,230 ,57 ,225 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,178 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,168 , 17 ,190 ,141 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,230 ,248 , 49 ,88 ,0 ,0 ,0 ,0 , 76 ,173 ,141 ,57 , 6 ,232 ,246 ,254 ,147 , 0 ,237 ,252 ,83 ,143 ,83 ,143 ,83 ,143 , 45 , 0 , 31 , 0 ,220 ,255 , 95 ,1 ,163 ,3 ,220 ,0 , 54 , 85 ,186 ,57 ,233 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,179 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,192 ,246 , 29 ,144 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,133 ,148 , 50 ,88 ,0 ,0 ,0 ,0 , 61 ,171 ,200 ,55 , 96 ,230 , 75 ,255 ,219 ,255 ,251 ,253 ,83 ,143 ,83 ,143 ,83 ,143 , 79 , 0 ,242 ,255 ,210 ,255 , 94 ,1 ,165 ,3 ,219 ,0 ,196 ,171 ,199 ,57 ,241 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,180 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,216 ,219 ,125 ,146 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 36 , 48 , 51 ,88 ,0 ,0 ,0 ,0 ,243 ,169 ,116 ,54 , 11 ,230 ,157 ,255 ,118 ,255 , 37 ,255 ,84 ,143 ,84 ,143 ,84 ,143 , 5 , 0 , 17 , 0 , 10 , 0 , 89 ,1 ,167 ,3 ,222 ,0 , 66 ,114 ,189 ,57 ,249 ,116 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,181 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,240 ,192 ,221 ,148 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,195 ,203 , 51 ,88 ,0 ,0 ,0 ,0 ,123 ,169 ,187 ,53 , 18 ,230 , 16 , 0 ,190 ,255 ,217 ,255 ,84 ,143 ,84 ,143 ,84 ,143 ,232 ,255 , 3 , 0 , 23 , 0 , 79 ,1 ,169 ,3 ,226 ,0 , 16 ,227 ,210 ,57 , 1 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,182 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 8 ,166 , 61 ,151 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 98 ,103 , 52 ,88 ,0 ,0 ,0 ,0 ,171 ,169 ,171 ,53 , 81 ,230 , 83 , 0 ,182 ,255 ,135 , 0 ,84 ,143 ,84 ,143 ,84 ,143 ,242 ,255 , 0 , 0 , 2 , 0 , 71 ,1 ,171 ,3 ,229 ,0 ,144 ,244 ,208 ,57 , 9 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,183 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 56 ,135 ,157 ,153 ,169 ,35 ,0 ,0 ,3 ,4 ,131 , 0 , 3 , 53 ,88 ,0 ,0 ,0 ,0 , 97 ,170 , 15 ,54 , 3 ,231 ,155 , 0 ,162 ,255 , 74 , 1 ,84 ,143 ,84 ,143 ,84 ,143 , 12 , 0 ,228 ,255 ,243 ,255 , 65 ,1 ,172 ,3 ,231 ,0 ,204 , 93 ,177 ,57 , 17 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,184 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 80 ,108 ,253 ,155 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,159 ,158 , 53 ,88 ,0 ,0 ,0 ,0 ,188 ,171 , 27 ,55 , 76 ,232 ,190 , 0 ,126 ,255 ,122 , 2 ,84 ,143 ,84 ,143 ,84 ,143 , 48 , 0 ,193 ,255 ,228 ,255 , 63 ,1 ,170 ,3 ,231 ,0 , 52 ,121 , 4 ,58 , 25 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,185 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,104 , 81 , 93 ,158 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 62 , 58 , 54 ,88 ,0 ,0 ,0 ,0 ,173 ,173 ,190 ,56 ,239 ,234 ,171 , 0 , 10 ,255 , 62 , 3 ,84 ,143 ,84 ,143 ,84 ,143 ,249 ,255 , 11 , 0 ,250 ,255 , 63 ,1 ,169 ,3 ,229 ,0 ,251 , 20 , 4 ,58 , 33 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,186 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,128 , 54 ,189 ,160 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,221 ,213 , 54 ,88 ,0 ,0 ,0 ,0 ,173 ,175 , 81 ,58 ,223 ,237 ,116 , 0 ,232 ,254 ,203 , 2 ,84 ,143 ,84 ,143 ,84 ,143 ,213 ,255 , 65 , 0 , 22 , 0 , 65 ,1 ,172 ,3 ,229 ,0 , 82 ,228 , 54 ,58 , 41 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,187 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,176 , 23 , 29 ,163 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,123 ,113 , 55 ,88 ,0 ,0 ,0 ,0 , 39 ,177 , 77 ,59 ,232 ,239 , 88 , 0 ,146 ,255 ,133 , 1 ,84 ,143 ,84 ,143 ,84 ,143 ,182 ,255 , 44 , 0 , 48 , 0 , 67 ,1 ,174 ,3 ,229 ,0 ,185 , 20 ,115 ,58 , 49 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,188 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,200 ,252 ,124 ,165 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 26 , 13 , 56 ,88 ,0 ,0 ,0 ,0 ,225 ,177 ,229 ,59 ,142 ,240 , 35 , 0 , 23 , 0 , 77 , 0 ,84 ,143 ,84 ,143 ,84 ,143 ,220 ,255 , 21 , 0 , 24 , 0 , 72 ,1 ,173 ,3 ,229 ,0 ,235 , 19 ,130 ,58 , 57 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,189 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,224 ,225 ,220 ,167 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,185 ,168 , 56 ,88 ,0 ,0 ,0 ,0 ,205 ,177 ,231 ,59 , 57 ,240 , 14 , 0 ,129 , 0 , 71 ,255 ,84 ,143 ,84 ,143 ,84 ,143 ,235 ,255 , 16 , 0 , 17 , 0 , 77 ,1 ,172 ,3 ,228 ,0 ,123 ,184 ,129 ,58 , 65 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,190 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,248 ,198 , 60 ,170 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 88 , 68 , 57 ,88 ,0 ,0 ,0 ,0 , 56 ,177 ,119 ,59 , 7 ,239 ,209 ,255 ,101 , 0 ,171 ,254 ,84 ,143 ,84 ,143 ,84 ,143 , 7 , 0 ,236 ,255 ,248 ,255 , 84 ,1 ,170 ,3 ,225 ,0 ,189 , 95 , 74 ,58 , 73 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,191 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 40 ,168 ,156 ,172 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,246 ,223 , 57 ,88 ,0 ,0 ,0 ,0 , 23 ,176 ,150 ,58 ,169 ,237 ,128 ,255 ,110 , 0 , 61 ,254 ,85 ,143 ,85 ,143 ,85 ,143 ,255 ,255 ,228 ,255 ,247 ,255 , 88 ,1 ,167 ,3 ,223 ,0 ,145 , 4 , 48 ,58 , 81 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,192 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 64 ,141 ,252 ,174 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,149 ,123 , 58 ,88 ,0 ,0 ,0 ,0 ,156 ,174 ,129 ,57 , 52 ,236 , 93 ,255 ,111 , 0 ,206 ,253 ,85 ,143 ,85 ,143 ,85 ,143 , 23 , 0 , 5 , 0 ,240 ,255 , 90 ,1 ,167 ,3 ,221 ,0 ,200 , 67 , 25 ,58 , 89 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,193 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 88 ,114 , 92 ,177 ,169 ,35 ,0 ,0 ,3 ,4 ,131 , 52 , 23 , 59 ,88 ,0 ,0 ,0 ,0 ,225 ,172 , 35 ,56 ,165 ,234 , 20 ,255 , 71 , 0 ,196 ,253 ,85 ,143 ,85 ,143 ,85 ,143 , 21 , 0 , 7 , 0 ,247 ,255 , 91 ,1 ,167 ,3 ,221 ,0 , 88 ,155 ,107 ,57 , 97 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,194 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,112 , 87 ,188 ,179 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,211 ,178 , 59 ,88 ,0 ,0 ,0 ,0 , 3 ,171 ,153 ,54 , 14 ,233 , 98 ,255 ,120 , 0 ,101 ,253 ,85 ,143 ,85 ,143 ,85 ,143 , 26 , 0 , 36 , 0 ,236 ,255 , 88 ,1 ,170 ,3 ,221 ,0 ,244 ,136 ,201 ,57 ,105 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,195 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,136 , 60 , 28 ,182 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,114 , 78 , 60 ,88 ,0 ,0 ,0 ,0 ,122 ,169 ,252 ,52 , 29 ,231 ,144 ,255 , 57 , 0 ,254 ,253 ,85 ,143 ,85 ,143 ,85 ,143 , 56 , 0 ,219 ,255 ,218 ,255 , 85 ,1 ,170 ,3 ,221 ,0 ,232 ,118 ,246 ,57 ,113 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,196 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,184 , 29 ,124 ,184 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 16 ,234 , 60 ,88 ,0 ,0 ,0 ,0 ,111 ,168 ,176 ,51 , 10 ,230 ,225 ,255 ,231 ,255 ,198 ,254 ,85 ,143 ,85 ,143 ,85 ,143 , 1 , 0 ,226 ,255 ,255 ,255 , 78 ,1 ,170 ,3 ,223 ,0 ,156 ,148 , 6 ,58 ,121 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,197 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,208 , 2 ,220 ,186 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,175 ,133 , 61 ,88 ,0 ,0 ,0 ,0 ,248 ,167 , 2 ,51 ,174 ,229 ,244 ,255 ,222 ,255 ,183 ,255 ,85 ,143 ,85 ,143 ,85 ,143 ,231 ,255 ,254 ,255 , 7 , 0 , 68 ,1 ,171 ,3 ,226 ,0 ,189 ,201 , 16 ,58 ,129 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,198 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,232 ,231 , 59 ,189 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 78 , 33 , 62 ,88 ,0 ,0 ,0 ,0 , 2 ,168 ,239 ,50 ,213 ,229 , 44 , 0 ,194 ,255 ,110 , 0 ,85 ,143 ,85 ,143 ,85 ,143 ,245 ,255 , 10 , 0 , 0 , 0 , 58 ,1 ,174 ,3 ,229 ,0 ,114 , 88 , 7 ,58 ,137 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,199 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 0 ,205 ,155 ,191 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,237 ,188 , 62 ,88 ,0 ,0 ,0 ,0 ,142 ,168 , 78 ,51 ,126 ,230 ,120 , 0 ,157 ,255 , 53 , 1 ,85 ,143 ,85 ,143 ,85 ,143 , 15 , 0 ,253 ,255 ,246 ,255 , 50 ,1 ,176 ,3 ,231 ,0 ,119 ,213 , 6 ,58 ,145 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,200 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 48 ,174 ,251 ,193 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,139 , 88 , 63 ,88 ,0 ,0 ,0 ,0 ,189 ,169 , 59 ,52 ,221 ,231 ,200 , 0 , 90 ,255 , 90 , 2 ,85 ,143 ,85 ,143 ,85 ,143 , 25 , 0 ,245 ,255 ,243 ,255 , 46 ,1 ,177 ,3 ,231 ,0 , 92 ,161 ,167 ,57 ,153 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,201 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 72 ,147 , 91 ,196 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 42 ,244 , 63 ,88 ,0 ,0 ,0 ,0 ,157 ,171 ,198 ,53 , 73 ,234 ,222 , 0 ,251 ,254 ,239 , 2 ,85 ,143 ,85 ,143 ,85 ,143 , 0 , 0 , 57 , 0 ,253 ,255 , 45 ,1 ,179 ,3 ,230 ,0 ,251 ,109 ,202 ,57 ,161 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,202 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 96 ,120 ,187 ,198 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,201 ,143 , 64 ,88 ,0 ,0 ,0 ,0 ,133 ,173 ,255 ,54 ,137 ,236 ,187 , 0 , 63 ,255 , 58 , 2 ,85 ,143 ,85 ,143 ,85 ,143 ,195 ,255 , 0 , 0 , 18 , 0 , 44 ,1 ,181 ,3 ,230 ,0 ,160 ,186 , 8 ,58 ,169 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,203 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,120 , 93 , 27 ,201 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,104 , 43 , 65 ,88 ,0 ,0 ,0 ,0 ,190 ,174 ,236 ,55 , 55 ,238 , 46 , 0 ,135 ,255 , 94 , 1 ,86 ,143 ,86 ,143 ,86 ,143 ,212 ,255 , 17 , 0 , 15 , 0 , 45 ,1 ,181 ,3 ,229 ,0 , 49 , 70 ,215 ,57 ,177 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,204 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,144 , 66 ,123 ,203 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 7 ,199 , 65 ,88 ,0 ,0 ,0 ,0 , 53 ,175 , 58 ,56 , 61 ,239 ,244 ,255 ,147 ,255 , 96 , 0 ,86 ,143 ,86 ,143 ,86 ,143 ,216 ,255 , 10 , 0 , 18 , 0 , 48 ,1 ,181 ,3 ,228 ,0 ,196 ,241 ,223 ,57 ,185 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,205 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,192 , 35 ,219 ,205 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,165 , 98 , 66 ,88 ,0 ,0 ,0 ,0 , 15 ,175 , 11 ,56 , 96 ,239 ,237 ,255 , 20 , 0 ,120 ,255 ,86 ,143 ,86 ,143 ,86 ,143 ,251 ,255 , 4 , 0 ,251 ,255 , 52 ,1 ,181 ,3 ,226 ,0 ,143 , 87 ,222 ,57 ,193 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,206 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,216 , 8 , 59 ,208 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 68 ,254 , 66 ,88 ,0 ,0 ,0 ,0 ,111 ,174 ,101 ,55 ,188 ,238 ,178 ,255 , 34 , 0 ,217 ,254 ,86 ,143 ,86 ,143 ,86 ,143 ,240 ,255 ,230 ,255 ,254 ,255 , 56 ,1 ,178 ,3 ,223 ,0 , 42 , 96 ,253 ,57 ,201 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,207 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,240 ,237 ,154 ,210 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,227 ,153 , 67 ,88 ,0 ,0 ,0 ,0 , 80 ,173 ,123 ,54 ,179 ,237 , 77 ,255 , 64 , 0 , 78 ,254 ,86 ,143 ,86 ,143 ,86 ,143 ,229 ,255 ,244 ,255 ,248 ,255 , 58 ,1 ,177 ,3 ,221 ,0 , 85 , 90 , 3 ,58 ,209 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,208 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 40 ,170 ,249 ,212 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,130 , 53 , 68 ,88 ,0 ,0 ,0 ,0 ,181 ,171 , 63 ,53 , 75 ,236 , 41 ,255 ,128 , 0 ,150 ,253 ,86 ,143 ,86 ,143 ,86 ,143 ,233 ,255 , 26 , 0 , 0 , 0 , 57 ,1 ,178 ,3 ,220 ,0 ,143 , 93 ,116 ,57 ,217 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,209 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 88 ,139 , 89 ,215 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 32 ,209 , 68 ,88 ,0 ,0 ,0 ,0 ,208 ,169 ,166 ,51 , 44 ,234 , 68 ,255 ,170 , 0 , 41 ,253 ,86 ,143 ,86 ,143 ,86 ,143 , 23 , 0 , 38 , 0 ,235 ,255 , 56 ,1 ,181 ,3 ,220 ,0 ,168 ,222 ,208 ,57 ,225 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,210 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,112 ,112 ,185 ,217 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,191 ,108 , 69 ,88 ,0 ,0 ,0 ,0 , 45 ,168 ,209 ,49 ,199 ,231 ,223 ,255 ,151 , 0 ,100 ,253 ,86 ,143 ,86 ,143 ,86 ,143 , 49 , 0 , 15 , 0 ,232 ,255 , 52 ,1 ,184 ,3 ,220 ,0 , 38 ,222 , 13 ,58 ,233 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,211 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,136 , 85 , 25 ,220 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 94 , 8 , 70 ,88 ,0 ,0 ,0 ,0 ,118 ,167 ,111 ,48 ,244 ,229 , 23 , 0 , 7 , 0 , 50 ,255 ,86 ,143 ,86 ,143 ,86 ,143 , 34 , 0 ,170 ,255 , 0 , 0 , 47 ,1 ,182 ,3 ,221 ,0 ,212 ,229 ,147 ,58 ,241 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,212 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,160 , 58 ,121 ,222 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,253 ,163 , 70 ,88 ,0 ,0 ,0 ,0 ,125 ,167 , 66 ,48 ,235 ,229 , 53 , 0 ,246 ,255 ,100 , 0 ,86 ,143 ,86 ,143 ,86 ,143 ,209 ,255 , 11 , 0 , 23 , 0 , 37 ,1 ,183 ,3 ,224 ,0 , 73 ,169 ,155 ,58 ,249 ,117 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,213 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,208 , 27 ,217 ,224 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,155 , 63 , 71 ,88 ,0 ,0 ,0 ,0 ,250 ,167 ,183 ,48 , 63 ,230 , 87 , 0 , 0 , 0 ,184 , 0 ,86 ,143 ,86 ,143 ,86 ,143 ,237 ,255 , 28 , 0 ,250 ,255 , 27 ,1 ,186 ,3 ,225 ,0 ,149 ,210 ,152 ,58 , 1 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,214 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,232 , 0 , 57 ,227 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 58 ,219 , 71 ,88 ,0 ,0 ,0 ,0 ,168 ,168 , 78 ,49 ,214 ,230 , 97 , 0 ,200 ,255 , 21 , 1 ,86 ,143 ,86 ,143 ,86 ,143 , 3 , 0 ,250 ,255 ,243 ,255 , 21 ,1 ,188 ,3 ,225 ,0 , 98 ,156 ,150 ,58 , 9 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,215 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 0 ,230 ,152 ,229 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,217 ,118 , 72 ,88 ,0 ,0 ,0 ,0 ,130 ,169 , 32 ,50 ,190 ,231 ,122 , 0 ,194 ,255 ,208 , 1 ,87 ,143 ,87 ,143 ,87 ,143 , 35 , 0 ,218 ,255 ,232 ,255 , 18 ,1 ,188 ,3 ,224 ,0 ,218 ,182 ,143 ,58 , 17 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,216 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 24 ,203 ,248 ,231 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,120 , 18 , 73 ,88 ,0 ,0 ,0 ,0 , 10 ,171 ,167 ,51 ,121 ,233 ,194 , 0 ,155 ,255 ,230 , 2 ,87 ,143 ,87 ,143 ,87 ,143 , 54 , 0 ,219 ,255 ,223 ,255 , 19 ,1 ,187 ,3 ,222 ,0 ,108 , 2 ,128 ,58 , 25 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,217 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 48 ,176 , 88 ,234 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 23 ,174 , 73 ,88 ,0 ,0 ,0 ,0 , 74 ,173 ,202 ,53 , 40 ,236 ,211 , 0 , 26 ,255 ,140 , 3 ,87 ,143 ,87 ,143 ,87 ,143 , 41 , 0 ,249 ,255 ,213 ,255 , 24 ,1 ,186 ,3 ,218 ,0 ,184 , 73 , 27 ,58 , 33 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,218 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 96 ,145 ,184 ,236 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,181 , 73 , 74 ,88 ,0 ,0 ,0 ,0 ,110 ,175 ,131 ,55 , 64 ,239 ,115 , 0 , 9 ,255 ,213 , 2 ,87 ,143 ,87 ,143 ,87 ,143 ,164 ,255 , 39 , 0 , 40 , 0 , 27 ,1 ,186 ,3 ,216 ,0 ,202 , 89 ,160 ,57 , 41 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,219 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,120 ,118 , 24 ,239 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 84 ,229 , 74 ,88 ,0 ,0 ,0 ,0 ,205 ,176 ,184 ,56 , 4 ,241 , 81 , 0 ,238 ,255 , 20 , 1 ,87 ,143 ,87 ,143 ,87 ,143 ,192 ,255 , 76 , 0 , 41 , 0 , 30 ,1 ,188 ,3 ,216 ,0 ,246 , 48 , 20 ,58 , 49 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,220 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,144 , 91 ,120 ,241 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,243 ,128 , 75 ,88 ,0 ,0 ,0 ,0 , 23 ,177 , 9 ,57 , 39 ,241 ,215 ,255 , 84 , 0 ,186 ,255 ,87 ,143 ,87 ,143 ,87 ,143 ,215 ,255 , 22 , 0 , 33 , 0 , 36 ,1 ,188 ,3 ,215 ,0 ,253 ,202 , 31 ,58 , 57 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,221 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,168 , 64 ,216 ,243 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,146 , 28 , 76 ,88 ,0 ,0 ,0 ,0 ,175 ,176 ,253 ,56 , 61 ,240 ,217 ,255 ,103 , 0 , 32 ,255 ,87 ,143 ,87 ,143 ,87 ,143 , 47 , 0 ,209 ,255 ,227 ,255 , 46 ,1 ,185 ,3 ,212 ,0 , 77 , 23 , 29 ,58 , 65 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,222 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,216 , 33 , 56 ,246 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 48 ,184 , 76 ,88 ,0 ,0 ,0 ,0 , 17 ,176 ,165 ,56 ,181 ,239 ,162 ,255 , 31 , 0 ,103 ,255 ,87 ,143 ,87 ,143 ,87 ,143 , 8 , 0 ,224 ,255 ,240 ,255 , 54 ,1 ,180 ,3 ,208 ,0 ,176 ,126 , 50 ,58 , 73 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,223 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,240 , 6 ,152 ,248 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,207 , 83 , 77 ,88 ,0 ,0 ,0 ,0 ,167 ,175 ,128 ,56 ,153 ,239 ,178 ,255 , 3 , 0 ,172 ,255 ,87 ,143 ,87 ,143 ,87 ,143 , 0 , 0 , 6 , 0 ,244 ,255 , 60 ,1 ,178 ,3 ,205 ,0 ,178 , 11 , 51 ,58 , 81 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,224 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 8 ,236 ,247 ,250 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,110 ,239 , 77 ,88 ,0 ,0 ,0 ,0 ,112 ,175 ,107 ,56 ,150 ,239 ,211 ,255 , 29 , 0 ,201 ,255 ,87 ,143 ,87 ,143 ,87 ,143 ,237 ,255 , 22 , 0 , 13 , 0 , 64 ,1 ,177 ,3 ,204 ,0 , 40 , 41 , 56 ,58 , 89 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,225 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 32 ,209 , 87 ,253 ,169 ,35 ,0 ,0 ,3 ,4 ,131 , 13 ,139 , 78 ,88 ,0 ,0 ,0 ,0 , 85 ,175 ,111 ,56 ,101 ,239 ,242 ,255 , 50 , 0 ,225 ,255 ,87 ,143 ,87 ,143 ,87 ,143 ,246 ,255 , 21 , 0 , 8 , 0 , 68 ,1 ,177 ,3 ,204 ,0 ,117 ,228 , 6 ,58 , 97 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,226 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 56 ,182 ,183 ,255 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,172 , 38 , 79 ,88 ,0 ,0 ,0 ,0 , 67 ,175 ,122 ,56 , 29 ,239 , 0 , 0 , 53 , 0 ,228 ,255 ,88 ,143 ,88 ,143 ,88 ,143 ,249 ,255 , 11 , 0 , 8 , 0 , 72 ,1 ,177 ,3 ,203 ,0 , 4 ,205 ,188 ,57 ,105 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,227 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,104 ,151 , 23 , 2 ,170 ,35 ,0 ,0 ,3 ,4 ,131 , 74 ,194 , 79 ,88 ,0 ,0 ,0 ,0 , 52 ,175 ,133 ,56 ,220 ,238 , 0 , 0 , 44 , 0 ,231 ,255 ,88 ,143 ,88 ,143 ,88 ,143 ,254 ,255 , 10 , 0 , 1 , 0 , 76 ,1 ,177 ,3 ,203 ,0 , 72 , 23 ,187 ,57 ,113 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,228 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,128 ,124 ,119 , 4 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,233 , 93 , 80 ,88 ,0 ,0 ,0 ,0 , 37 ,175 ,131 ,56 ,166 ,238 ,254 ,255 , 16 , 0 ,222 ,255 ,88 ,143 ,88 ,143 ,88 ,143 , 1 , 0 ,253 ,255 ,250 ,255 , 79 ,1 ,176 ,3 ,202 ,0 , 81 ,164 , 63 ,57 ,121 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,229 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,152 , 97 ,215 , 6 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,136 ,249 , 80 ,88 ,0 ,0 ,0 ,0 , 12 ,175 ,108 ,56 ,137 ,238 ,240 ,255 , 1 , 0 ,217 ,255 ,88 ,143 ,88 ,143 ,88 ,143 ,253 ,255 ,247 ,255 ,251 ,255 , 82 ,1 ,175 ,3 ,201 ,0 , 53 ,198 , 1 ,57 ,129 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,230 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,176 , 70 , 55 , 9 ,170 ,35 ,0 ,0 ,3 ,4 ,131 , 39 ,149 , 81 ,88 ,0 ,0 ,0 ,0 ,222 ,174 , 74 ,56 ,116 ,238 ,230 ,255 , 6 , 0 ,191 ,255 ,88 ,143 ,88 ,143 ,88 ,143 , 0 , 0 , 8 , 0 ,252 ,255 , 85 ,1 ,174 ,3 ,200 ,0 , 82 , 78 ,253 ,56 ,137 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,231 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,224 , 39 ,151 , 11 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,197 , 48 , 82 ,88 ,0 ,0 ,0 ,0 ,174 ,174 , 11 ,56 , 74 ,238 ,249 ,255 ,242 ,255 ,195 ,255 ,88 ,143 ,88 ,143 ,88 ,143 ,247 ,255 ,251 ,255 , 0 , 0 , 87 ,1 ,173 ,3 ,200 ,0 , 91 ,130 ,180 ,56 ,145 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,232 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,248 , 12 ,247 , 13 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,100 ,204 , 82 ,88 ,0 ,0 ,0 ,0 ,142 ,174 ,215 ,55 , 53 ,238 , 0 , 0 ,238 ,255 ,217 ,255 ,88 ,143 ,88 ,143 ,88 ,143 ,247 ,255 , 6 , 0 , 3 , 0 , 88 ,1 ,173 ,3 ,200 ,0 ,181 , 12 , 58 ,56 ,153 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,233 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 16 ,242 , 86 , 16 ,170 ,35 ,0 ,0 ,3 ,4 ,131 , 3 ,104 , 83 ,88 ,0 ,0 ,0 ,0 ,130 ,174 ,184 ,55 , 33 ,238 , 7 , 0 , 0 , 0 ,235 ,255 ,88 ,143 ,88 ,143 ,88 ,143 ,247 ,255 , 2 , 0 , 0 , 0 , 89 ,1 ,173 ,3 ,199 ,0 , 92 , 45 , 9 ,56 ,161 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,234 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 40 ,215 ,182 , 18 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,162 , 3 , 84 ,88 ,0 ,0 ,0 ,0 ,125 ,174 ,172 ,55 , 27 ,238 , 6 , 0 ,252 ,255 , 2 , 0 ,88 ,143 ,88 ,143 ,88 ,143 ,243 ,255 , 2 , 0 ,255 ,255 , 90 ,1 ,173 ,3 ,199 ,0 ,221 , 44 ,212 ,55 ,169 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,235 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 64 ,188 , 22 , 21 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 65 ,159 , 84 ,88 ,0 ,0 ,0 ,0 ,132 ,174 ,176 ,55 , 29 ,238 , 6 , 0 , 0 , 0 , 10 , 0 ,88 ,143 ,88 ,143 ,88 ,143 ,244 ,255 , 4 , 0 , 2 , 0 , 91 ,1 ,173 ,3 ,199 ,0 , 32 , 66 ,191 ,55 ,177 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,236 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,112 ,157 ,118 , 23 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,223 , 58 , 85 ,88 ,0 ,0 ,0 ,0 ,140 ,174 ,188 ,55 , 20 ,238 , 0 , 0 , 19 , 0 , 5 , 0 ,88 ,143 ,88 ,143 ,88 ,143 ,245 ,255 , 5 , 0 , 4 , 0 , 92 ,1 ,172 ,3 ,199 ,0 ,105 ,231 ,131 ,55 ,185 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,237 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,136 ,130 ,214 , 25 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,126 ,214 , 85 ,88 ,0 ,0 ,0 ,0 ,147 ,174 ,212 ,55 ,253 ,237 , 0 , 0 , 31 , 0 , 10 , 0 ,88 ,143 ,88 ,143 ,88 ,143 ,252 ,255 , 2 , 0 ,254 ,255 , 93 ,1 ,172 ,3 ,199 ,0 , 86 ,192 , 17 ,55 ,193 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,238 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,160 ,103 , 54 , 28 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 29 ,114 , 86 ,88 ,0 ,0 ,0 ,0 ,155 ,174 ,221 ,55 ,231 ,237 , 14 , 0 , 6 , 0 , 0 , 0 ,89 ,143 ,89 ,143 ,89 ,143 ,253 ,255 , 0 , 0 ,254 ,255 , 94 ,1 ,172 ,3 ,198 ,0 ,224 ,114 , 27 ,55 ,201 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,239 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,184 , 76 ,150 , 30 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,188 , 13 , 87 ,88 ,0 ,0 ,0 ,0 ,160 ,174 ,219 ,55 ,216 ,237 , 11 , 0 , 0 , 0 ,250 ,255 ,89 ,143 ,89 ,143 ,89 ,143 , 1 , 0 , 4 , 0 ,251 ,255 , 95 ,1 ,172 ,3 ,198 ,0 ,228 ,137 ,253 ,54 ,209 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,240 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,232 , 45 ,246 , 32 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 90 ,169 , 87 ,88 ,0 ,0 ,0 ,0 ,158 ,174 ,200 ,55 ,209 ,237 , 2 , 0 ,242 ,255 ,244 ,255 ,89 ,143 ,89 ,143 ,89 ,143 ,255 ,255 , 0 , 0 ,250 ,255 , 96 ,1 ,172 ,3 ,197 ,0 , 74 ,193 , 9 ,55 ,217 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,241 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 0 , 19 , 86 , 35 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,249 , 68 , 88 ,88 ,0 ,0 ,0 ,0 ,148 ,174 ,181 ,55 ,208 ,237 ,252 ,255 ,248 ,255 ,246 ,255 ,89 ,143 ,89 ,143 ,89 ,143 ,249 ,255 , 0 , 0 ,249 ,255 , 97 ,1 ,172 ,3 ,196 ,0 ,158 ,110 , 2 ,55 ,225 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,242 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 24 ,248 ,181 , 37 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,152 ,224 , 88 ,88 ,0 ,0 ,0 ,0 ,143 ,174 ,168 ,55 ,207 ,237 ,255 ,255 , 4 , 0 , 0 , 0 ,89 ,143 ,89 ,143 ,89 ,143 ,245 ,255 ,251 ,255 ,254 ,255 , 97 ,1 ,171 ,3 ,196 ,0 ,123 ,217 , 67 ,55 ,233 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,243 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 48 ,221 , 21 , 40 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 55 ,124 , 89 ,88 ,0 ,0 ,0 ,0 ,146 ,174 ,178 ,55 ,202 ,237 , 3 , 0 , 14 , 0 , 10 , 0 ,89 ,143 ,89 ,143 ,89 ,143 ,253 ,255 ,254 ,255 ,250 ,255 , 98 ,1 ,171 ,3 ,195 ,0 ,126 ,101 , 87 ,55 ,241 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,244 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 72 ,194 ,117 , 42 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,214 , 23 , 90 ,88 ,0 ,0 ,0 ,0 ,164 ,174 ,206 ,55 ,209 ,237 ,247 ,255 , 5 , 0 , 50 , 0 ,89 ,143 ,89 ,143 ,89 ,143 , 0 , 0 ,245 ,255 ,245 ,255 , 98 ,1 ,170 ,3 ,194 ,0 , 73 ,123 ,237 ,55 ,249 ,118 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,245 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,120 ,163 ,213 , 44 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,116 ,179 , 90 ,88 ,0 ,0 ,0 ,0 ,180 ,174 ,241 ,55 , 2 ,238 ,241 ,255 ,250 ,255 , 47 , 0 ,89 ,143 ,89 ,143 ,89 ,143 ,250 ,255 , 8 , 0 , 0 , 0 , 99 ,1 ,170 ,3 ,194 ,0 ,158 , 5 ,255 ,55 , 1 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,246 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,144 ,136 , 53 , 47 ,170 ,35 ,0 ,0 ,3 ,4 ,131 , 19 , 79 , 91 ,88 ,0 ,0 ,0 ,0 ,191 ,174 , 11 ,56 , 32 ,238 ,248 ,255 , 4 , 0 , 20 , 0 ,89 ,143 ,89 ,143 ,89 ,143 ,247 ,255 , 9 , 0 , 1 , 0 ,100 ,1 ,171 ,3 ,194 ,0 , 57 ,122 , 28 ,56 , 9 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,247 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,168 ,109 ,149 , 49 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,178 ,234 , 91 ,88 ,0 ,0 ,0 ,0 ,194 ,174 , 23 ,56 , 32 ,238 ,255 ,255 , 7 , 0 , 0 , 0 ,89 ,143 ,89 ,143 ,89 ,143 ,252 ,255 , 7 , 0 ,254 ,255 ,101 ,1 ,171 ,3 ,194 ,0 ,232 ,188 , 54 ,56 , 17 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,248 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,192 , 82 ,245 , 51 ,170 ,35 ,0 ,0 ,3 ,4 ,131 , 81 ,134 , 92 ,88 ,0 ,0 ,0 ,0 ,187 ,174 , 18 ,56 , 13 ,238 , 0 , 0 , 13 , 0 ,239 ,255 ,89 ,143 ,89 ,143 ,89 ,143 ,250 ,255 , 3 , 0 , 1 , 0 ,101 ,1 ,171 ,3 ,194 ,0 , 47 , 7 , 61 ,56 , 25 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,249 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,240 , 51 , 85 , 54 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,239 , 33 , 93 ,88 ,0 ,0 ,0 ,0 ,176 ,174 , 10 ,56 ,238 ,237 ,251 ,255 , 9 , 0 ,231 ,255 ,89 ,143 ,89 ,143 ,89 ,143 , 1 , 0 ,254 ,255 ,251 ,255 ,102 ,1 ,171 ,3 ,194 ,0 , 44 , 3 , 45 ,56 , 33 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,250 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 8 , 25 ,181 , 56 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,142 ,189 , 93 ,88 ,0 ,0 ,0 ,0 ,156 ,174 ,251 ,55 ,222 ,237 ,242 ,255 ,252 ,255 ,244 ,255 ,90 ,143 ,90 ,143 ,90 ,143 ,250 ,255 ,248 ,255 ,249 ,255 ,103 ,1 ,170 ,3 ,194 ,0 , 6 ,254 , 12 ,56 , 41 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,251 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 32 ,254 , 20 , 59 ,170 ,35 ,0 ,0 ,3 ,4 ,131 , 45 , 89 , 94 ,88 ,0 ,0 ,0 ,0 ,138 ,174 ,241 ,55 ,228 ,237 ,245 ,255 ,255 ,255 ,242 ,255 ,90 ,143 ,90 ,143 ,90 ,143 ,249 ,255 , 5 , 0 , 4 , 0 ,103 ,1 ,170 ,3 ,194 ,0 ,169 ,250 , 2 ,56 , 49 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,252 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 56 ,227 ,116 , 61 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,204 ,244 , 94 ,88 ,0 ,0 ,0 ,0 ,126 ,174 ,240 ,55 ,213 ,237 ,253 ,255 , 18 , 0 ,242 ,255 ,90 ,143 ,90 ,143 ,90 ,143 ,253 ,255 , 6 , 0 , 0 , 0 ,104 ,1 ,170 ,3 ,194 ,0 ,254 ,192 ,248 ,55 , 57 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,253 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 80 ,200 ,212 , 63 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,107 ,144 , 95 ,88 ,0 ,0 ,0 ,0 ,122 ,174 ,244 ,55 ,200 ,237 ,255 ,255 , 5 , 0 , 0 , 0 ,90 ,143 ,90 ,143 ,90 ,143 ,254 ,255 , 3 , 0 ,253 ,255 ,104 ,1 ,170 ,3 ,194 ,0 ,211 ,165 ,191 ,55 , 65 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,254 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,128 ,169 , 52 , 66 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 9 , 44 , 96 ,88 ,0 ,0 ,0 ,0 ,121 ,174 ,247 ,55 ,199 ,237 , 0 , 0 , 3 , 0 , 2 , 0 ,90 ,143 ,90 ,143 ,90 ,143 ,250 ,255 , 3 , 0 , 0 , 0 ,104 ,1 ,170 ,3 ,194 ,0 ,149 , 41 ,156 ,55 , 73 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,255 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,152 ,142 ,148 , 68 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,168 ,199 , 96 ,88 ,0 ,0 ,0 ,0 ,120 ,174 ,249 ,55 ,195 ,237 ,254 ,255 , 4 , 0 ,255 ,255 ,90 ,143 ,90 ,143 ,90 ,143 ,252 ,255 , 0 , 0 , 0 , 0 ,105 ,1 ,170 ,3 ,195 ,0 ,115 ,176 ,156 ,55 , 81 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,128 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,176 ,115 ,244 , 70 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 71 , 99 , 97 ,88 ,0 ,0 ,0 ,0 ,116 ,174 ,247 ,55 ,192 ,237 ,252 ,255 , 1 , 0 ,253 ,255 ,90 ,143 ,90 ,143 ,90 ,143 ,250 ,255 , 3 , 0 , 0 , 0 ,105 ,1 ,170 ,3 ,195 ,0 ,252 , 83 ,137 ,55 , 89 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,129 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,200 , 88 , 84 , 73 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,230 ,254 , 97 ,88 ,0 ,0 ,0 ,0 ,111 ,174 ,247 ,55 ,186 ,237 , 0 , 0 , 3 , 0 ,252 ,255 ,90 ,143 ,90 ,143 ,90 ,143 ,252 ,255 , 2 , 0 ,254 ,255 ,105 ,1 ,170 ,3 ,195 ,0 ,156 ,192 , 38 ,55 , 97 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,130 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,248 , 57 ,180 , 75 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,132 ,154 , 98 ,88 ,0 ,0 ,0 ,0 ,108 ,174 ,245 ,55 ,181 ,237 ,252 ,255 , 8 , 0 , 2 , 0 ,90 ,143 ,90 ,143 ,90 ,143 ,250 ,255 , 0 , 0 , 1 , 0 ,105 ,1 ,170 ,3 ,195 ,0 , 79 ,197 ,170 ,54 ,105 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,131 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 16 , 31 , 20 , 78 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 35 , 54 , 99 ,88 ,0 ,0 ,0 ,0 ,106 ,174 ,252 ,55 ,174 ,237 ,254 ,255 , 9 , 0 , 0 , 0 ,90 ,143 ,90 ,143 ,90 ,143 ,251 ,255 , 0 , 0 , 0 , 0 ,105 ,1 ,170 ,3 ,195 ,0 , 56 ,209 ,102 ,54 ,113 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,132 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 40 , 4 ,116 , 80 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,194 ,209 , 99 ,88 ,0 ,0 ,0 ,0 ,104 ,174 , 2 ,56 ,169 ,237 ,255 ,255 , 6 , 0 , 0 , 0 ,90 ,143 ,90 ,143 ,90 ,143 ,253 ,255 , 3 , 0 , 1 , 0 ,105 ,1 ,170 ,3 ,196 ,0 ,182 ,102 ,116 ,54 ,121 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,133 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 64 ,233 ,211 , 82 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 97 ,109 ,100 ,88 ,0 ,0 ,0 ,0 ,105 ,174 , 12 ,56 ,164 ,237 ,255 ,255 , 7 , 0 , 7 , 0 ,91 ,143 ,91 ,143 ,91 ,143 , 0 , 0 , 1 , 0 , 0 , 0 ,105 ,1 ,170 ,3 ,196 ,0 , 78 ,232 ,109 ,54 ,129 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,134 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 88 ,206 , 51 , 85 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 0 , 9 ,101 ,88 ,0 ,0 ,0 ,0 ,110 ,174 , 24 ,56 ,165 ,237 ,255 ,255 , 5 , 0 , 13 , 0 ,91 ,143 ,91 ,143 ,91 ,143 , 0 , 0 , 1 , 0 , 0 , 0 ,105 ,1 ,170 ,3 ,196 ,0 , 77 , 30 ,117 ,54 ,137 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,135 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,136 ,175 ,147 , 87 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,158 ,164 ,101 ,88 ,0 ,0 ,0 ,0 ,114 ,174 , 31 ,56 ,171 ,237 , 0 , 0 ,255 ,255 , 6 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,253 ,255 , 2 , 0 , 0 , 0 ,106 ,1 ,170 ,3 ,196 ,0 ,156 ,186 ,140 ,54 ,145 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,136 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,160 ,148 ,243 , 89 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 61 , 64 ,102 ,88 ,0 ,0 ,0 ,0 ,117 ,174 , 35 ,56 ,176 ,237 ,255 ,255 , 0 , 0 , 8 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,254 ,255 , 0 , 0 , 0 , 0 ,106 ,1 ,169 ,3 ,197 ,0 , 78 ,198 , 91 ,54 ,153 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,137 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,184 ,121 , 83 , 92 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,220 ,219 ,102 ,88 ,0 ,0 ,0 ,0 ,121 ,174 , 39 ,56 ,180 ,237 , 3 , 0 ,254 ,255 , 7 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,253 ,255 ,253 ,255 ,252 ,255 ,106 ,1 ,169 ,3 ,197 ,0 , 30 ,117 ,124 ,54 ,161 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,138 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,208 , 94 ,179 , 94 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,123 ,119 ,103 ,88 ,0 ,0 ,0 ,0 ,126 ,174 , 39 ,56 ,187 ,237 , 2 , 0 ,249 ,255 , 0 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,254 ,255 , 0 , 0 , 1 , 0 ,106 ,1 ,169 ,3 ,197 ,0 , 9 , 1 ,148 ,54 ,169 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,139 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 0 , 64 , 19 , 97 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 25 , 19 ,104 ,88 ,0 ,0 ,0 ,0 ,125 ,174 , 39 ,56 ,185 ,237 , 0 , 0 , 12 , 0 ,250 ,255 ,91 ,143 ,91 ,143 ,91 ,143 ,253 ,255 , 8 , 0 , 2 , 0 ,107 ,1 ,169 ,3 ,197 ,0 ,155 , 58 , 31 ,55 ,177 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,140 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 24 , 37 ,115 , 99 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,184 ,174 ,104 ,88 ,0 ,0 ,0 ,0 ,126 ,174 , 43 ,56 ,168 ,237 , 0 , 0 , 10 , 0 ,255 ,255 ,91 ,143 ,91 ,143 ,91 ,143 ,253 ,255 , 0 , 0 , 2 , 0 ,107 ,1 ,169 ,3 ,197 ,0 , 12 ,184 , 51 ,55 ,185 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,141 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 48 , 10 ,211 ,101 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 87 , 74 ,105 ,88 ,0 ,0 ,0 ,0 ,128 ,174 , 48 ,56 ,158 ,237 , 1 , 0 , 7 , 0 , 0 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,252 ,255 , 0 , 0 , 0 , 0 ,107 ,1 ,169 ,3 ,198 ,0 ,226 ,237 , 35 ,55 ,193 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,142 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 72 ,239 , 50 ,104 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,246 ,229 ,105 ,88 ,0 ,0 ,0 ,0 ,130 ,174 , 49 ,56 ,155 ,237 , 6 , 0 ,252 ,255 ,255 ,255 ,91 ,143 ,91 ,143 ,91 ,143 ,253 ,255 , 4 , 0 ,255 ,255 ,107 ,1 ,169 ,3 ,198 ,0 , 74 ,141 , 51 ,55 ,201 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,143 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 96 ,212 ,146 ,106 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,149 ,129 ,106 ,88 ,0 ,0 ,0 ,0 ,132 ,174 , 44 ,56 ,155 ,237 , 0 , 0 ,254 ,255 , 5 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,250 ,255 , 0 , 0 , 3 , 0 ,107 ,1 ,169 ,3 ,198 ,0 ,108 , 89 , 58 ,55 ,209 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,144 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,144 ,181 ,242 ,108 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 51 , 29 ,107 ,88 ,0 ,0 ,0 ,0 ,137 ,174 , 51 ,56 ,157 ,237 , 0 , 0 , 1 , 0 , 11 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,255 ,255 , 1 , 0 ,251 ,255 ,107 ,1 ,169 ,3 ,198 ,0 , 73 , 96 , 42 ,55 ,217 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,145 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,168 ,154 , 82 ,111 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,210 ,184 ,107 ,88 ,0 ,0 ,0 ,0 ,142 ,174 , 52 ,56 ,165 ,237 , 0 , 0 , 0 , 0 , 13 , 0 ,92 ,143 ,92 ,143 ,92 ,143 ,252 ,255 ,254 ,255 ,255 ,255 ,107 ,1 ,169 ,3 ,198 ,0 ,110 , 79 ,252 ,54 ,225 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,146 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,192 ,127 ,178 ,113 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,113 , 84 ,108 ,88 ,0 ,0 ,0 ,0 ,144 ,174 , 57 ,56 ,169 ,237 , 1 , 0 , 3 , 0 , 3 , 0 ,92 ,143 ,92 ,143 ,92 ,143 ,252 ,255 , 1 , 0 ,254 ,255 ,107 ,1 ,169 ,3 ,198 ,0 , 9 ,141 ,186 ,54 ,233 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,147 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,216 ,100 , 18 ,116 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 16 ,240 ,108 ,88 ,0 ,0 ,0 ,0 ,146 ,174 , 59 ,56 ,170 ,237 , 0 , 0 , 2 , 0 , 3 , 0 ,92 ,143 ,92 ,143 ,92 ,143 ,250 ,255 ,255 ,255 , 0 , 0 ,107 ,1 ,169 ,3 ,198 ,0 , 93 ,173 ,187 ,54 ,241 ,119 ,0 ,0 ,
|
||||
4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,148 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 8 , 70 ,114 ,118 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,174 ,139 ,109 ,88 ,0 ,0 ,0 ,0 ,150 ,174 , 71 ,56 ,167 ,237 ,255 ,255 , 7 , 0 , 5 , 0 ,92 ,143 ,92 ,143 ,92 ,143 , 0 , 0 , 0 , 0 ,253 ,255 ,108 ,1 ,168 ,3 ,198 ,0 ,108 ,226 ,176 ,54 ,249 ,119 ,0 ,0 ,
|
||||