diff --git a/.gitignore b/.gitignore
index f3d48ea..02c6db3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -170,3 +170,4 @@ qtcreator-*
COLCON_IGNORE
AMENT_IGNORE
+.claude/
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..43df713
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,84 @@
+cmake_minimum_required(VERSION 3.16.3)
+
+project(mr_vision)
+
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_BUILD_TYPE Release)
+message(STATUS "--------------------CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}--------------------")
+
+find_package(OpenCV REQUIRED)
+find_package(fmt REQUIRED)
+find_package(Eigen3 REQUIRED)
+find_package(spdlog REQUIRED)
+find_package(yaml-cpp REQUIRED)
+find_package(nlohmann_json REQUIRED)
+set(OpenVINO_DIR "/opt/intel/openvino_2024.6.0/runtime/cmake/")
+find_package(OpenVINO REQUIRED)
+
+include_directories(${EIGEN3_INCLUDE_DIR})
+include_directories(${OpenCV_INCLUDE_DIRS})
+include_directories(${PROJECT_SOURCE_DIR})
+
+
+add_subdirectory(src/component)
+add_subdirectory(src/device)
+add_subdirectory(src/module/auto_aim)
+add_subdirectory(src/module/auto_buff)
+add_subdirectory(src/module/omniperception)
+
+
+
+##################calibration################
+add_executable(capture calibration/capture.cpp)
+add_executable(calibrate_camera calibration/calibrate_camera.cpp)
+add_executable(calibrate_handeye calibration/calibrate_handeye.cpp)
+add_executable(calibrate_robotworld_handeye calibration/calibrate_robotworld_handeye.cpp)
+add_executable(split_video calibration/split_video.cpp)
+
+target_link_libraries(capture ${OpenCV_LIBS} fmt::fmt component device)
+target_link_libraries(calibrate_camera ${OpenCV_LIBS} fmt::fmt yaml-cpp component)
+target_link_libraries(calibrate_handeye ${OpenCV_LIBS} fmt::fmt yaml-cpp component)
+target_link_libraries(calibrate_robotworld_handeye ${OpenCV_LIBS} fmt::fmt yaml-cpp component)
+target_link_libraries(split_video ${OpenCV_LIBS} fmt::fmt component)
+
+##################tests##################
+add_executable(auto_aim_test src/task/auto_aim_test.cpp)
+add_executable(auto_buff_test src/task/auto_buff_test.cpp)
+add_executable(camera_detect_test src/task/camera_detect_test.cpp)
+add_executable(camera_test src/task/camera_test.cpp)
+add_executable(camera_thread_test src/task/camera_thread_test.cpp)
+add_executable(cboard_test src/task/cboard_test.cpp)
+add_executable(fire_test src/task/fire_test.cpp)
+add_executable(detector_video_test src/task/detector_video_test.cpp)
+add_executable(gimbal_response_test src/task/gimbal_response_test.cpp)
+add_executable(multi_usbcamera_test src/task/multi_usbcamera_test.cpp)
+add_executable(usbcamera_detect_test src/task/usbcamera_detect_test.cpp)
+add_executable(usbcamera_test src/task/usbcamera_test.cpp)
+add_executable(handeye_test src/task/handeye_test.cpp)
+add_executable(dm_test src/task/dm_test.cpp)
+add_executable(minimum_vision_system src/task/minimum_vision_system.cpp)
+
+target_link_libraries(auto_aim_test ${OpenCV_LIBS} fmt::fmt yaml-cpp component device auto_aim)
+target_link_libraries(auto_buff_test ${OpenCV_LIBS} fmt::fmt yaml-cpp auto_buff component device)
+target_link_libraries(camera_detect_test ${OpenCV_LIBS} fmt::fmt yaml-cpp component auto_aim device)
+target_link_libraries(camera_test ${OpenCV_LIBS} fmt::fmt component device)
+target_link_libraries(camera_thread_test ${OpenCV_LIBS} fmt::fmt auto_aim component device)
+target_link_libraries(cboard_test ${OpenCV_LIBS} fmt::fmt component device)
+target_link_libraries(fire_test ${OpenCV_LIBS} fmt::fmt component device)
+target_link_libraries(detector_video_test ${OpenCV_LIBS} fmt::fmt yaml-cpp component auto_aim)
+target_link_libraries(gimbal_response_test ${OpenCV_LIBS} fmt::fmt yaml-cpp component device)
+target_link_libraries(multi_usbcamera_test ${OpenCV_LIBS} fmt::fmt component device)
+target_link_libraries(usbcamera_detect_test ${OpenCV_LIBS} fmt::fmt yaml-cpp component device auto_aim)
+target_link_libraries(usbcamera_test ${OpenCV_LIBS} fmt::fmt yaml-cpp component device)
+target_link_libraries(handeye_test ${OpenCV_LIBS} fmt::fmt yaml-cpp component device auto_aim)
+target_link_libraries(dm_test ${OpenCV_LIBS} fmt::fmt yaml-cpp component device)
+target_link_libraries(minimum_vision_system ${OpenCV_LIBS} fmt::fmt yaml-cpp component device auto_aim)
+
+add_executable(gimbal_test src/task/gimbal_test.cpp)
+target_link_libraries(gimbal_test ${OpenCV_LIBS} fmt::fmt yaml-cpp auto_aim component device)
+
+add_executable(planner_test src/task/planner_test.cpp)
+target_link_libraries(planner_test ${OpenCV_LIBS} fmt::fmt yaml-cpp auto_aim component device)
+
+add_executable(planner_test_offline src/task/planner_test_offline.cpp)
+target_link_libraries(planner_test_offline ${OpenCV_LIBS} fmt::fmt yaml-cpp auto_aim component device)
\ No newline at end of file
diff --git a/README.md b/README.md
index 60e78e0..721b88f 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,2 @@
-# MOVE_AI
-
-青岛理工大学QUT
-MOVE战队
-RoboMaster比赛
-所有上位机代码仓库。具体请查看分支
-包含步兵/英雄/无人机,
-哨兵,
-雷达,
-等兵种
-支持导航,自瞄,决策等功能。
\ No newline at end of file
+# 通用自瞄
+适用于单一云台的自瞄
\ No newline at end of file
diff --git a/assets/models/best2-sim.onnx b/assets/models/best2-sim.onnx
new file mode 100644
index 0000000..13f2589
Binary files /dev/null and b/assets/models/best2-sim.onnx differ
diff --git a/assets/models/standard_fanblade.jpg b/assets/models/standard_fanblade.jpg
new file mode 100755
index 0000000..d924c5c
Binary files /dev/null and b/assets/models/standard_fanblade.jpg differ
diff --git a/assets/models/tiny_resnet.onnx b/assets/models/tiny_resnet.onnx
new file mode 100644
index 0000000..1c2e6ec
Binary files /dev/null and b/assets/models/tiny_resnet.onnx differ
diff --git a/assets/models/yolo11.bin b/assets/models/yolo11.bin
new file mode 100644
index 0000000..9ce81f1
Binary files /dev/null and b/assets/models/yolo11.bin differ
diff --git a/assets/models/yolo11.xml b/assets/models/yolo11.xml
new file mode 100644
index 0000000..e3e3391
--- /dev/null
+++ b/assets/models/yolo11.xml
@@ -0,0 +1,23449 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 640
+ 640
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 3
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 3
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 640
+ 640
+
+
+ 16
+ 3
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 1
+ 1
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+ 32
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 3
+ 3
+
+
+ 8
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 8
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 160
+ 160
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 8
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 8
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 8
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 160
+ 160
+
+
+ 16
+ 8
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 48
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 160
+ 160
+
+
+ 64
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 160
+ 160
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 160
+ 160
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 32
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 16
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 96
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 80
+ 80
+
+
+ 128
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 1
+ 1
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 32
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 1
+ 1
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 32
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 40
+ 40
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 128
+ 3
+ 3
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 256
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 384
+ 20
+ 20
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 512
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 512
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 512
+ 20
+ 20
+
+
+ 256
+ 512
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 128
+ 400
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 32
+ 400
+
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 32
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 32
+ 400
+
+
+ 1
+ 2
+ 32
+ 400
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 400
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 400
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 64
+ 400
+
+
+ 1
+ 2
+ 400
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 64
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+ 2
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+ 2
+
+
+
+
+
+
+
+
+
+ 2
+
+
+ 2
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 64
+ 400
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 64
+ 400
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+ 128
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 2
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 40
+ 40
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 384
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 384
+ 40
+ 40
+
+
+ 128
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 32
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 32
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 64
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 40
+ 40
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 2
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 80
+ 80
+
+
+ 64
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 32
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 16
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 96
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 80
+ 80
+
+
+ 64
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 38
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 38
+ 64
+ 1
+ 1
+
+
+ 38
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 38
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 38
+ 80
+ 80
+
+
+ 1
+ 38
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 38
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 102
+ 80
+ 80
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 40
+ 40
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 32
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 32
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 64
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 40
+ 40
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 64
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+ 128
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 38
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 38
+ 64
+ 1
+ 1
+
+
+ 38
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 38
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 38
+ 40
+ 40
+
+
+ 1
+ 38
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 38
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 102
+ 40
+ 40
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 384
+ 20
+ 20
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 384
+ 20
+ 20
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 64
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 1
+ 1
+ 3
+ 3
+
+
+ 256
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 256
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 64
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 38
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 38
+ 64
+ 1
+ 1
+
+
+ 38
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 38
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 38
+ 20
+ 20
+
+
+ 1
+ 38
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 38
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 102
+ 20
+ 20
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 102
+ 6400
+
+
+ 1
+ 102
+ 1600
+
+
+ 1
+ 102
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 102
+ 8400
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 8400
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 16
+ 8400
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 4
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 4
+ 8400
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 4
+ 8400
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+ 1
+ 4
+ 8400
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 8400
+
+
+ 1
+ 1
+ 8400
+
+
+
+
+
+
+
+ 1
+ 38
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 64
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 16
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+ 8
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 80
+ 80
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 80
+ 80
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 128
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 16
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+ 8
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 40
+ 40
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 40
+ 40
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 256
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 16
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+ 8
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 20
+ 20
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 20
+ 20
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 6400
+
+
+ 1
+ 8
+ 1600
+
+
+ 1
+ 8
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 8400
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 2
+ 8400
+
+
+ 3
+
+
+ 3
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 2
+ 8400
+
+
+ 1
+ 1
+ 1
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 2
+ 8400
+
+
+ 1
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 640
+ 640
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 2
+ 8400
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 8400
+
+
+ 1
+ 38
+ 8400
+
+
+ 1
+ 8
+ 8400
+
+
+
+
+
+
+
+ 1
+ 50
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/models/yolo11_buff_int8.bin b/assets/models/yolo11_buff_int8.bin
new file mode 100644
index 0000000..14ee67d
Binary files /dev/null and b/assets/models/yolo11_buff_int8.bin differ
diff --git a/assets/models/yolo11_buff_int8.xml b/assets/models/yolo11_buff_int8.xml
new file mode 100644
index 0000000..0a7ad3d
--- /dev/null
+++ b/assets/models/yolo11_buff_int8.xml
@@ -0,0 +1,23068 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 640
+ 640
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 3
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 3
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 640
+ 640
+
+
+ 16
+ 3
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 1
+ 1
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+ 32
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 3
+ 3
+
+
+ 8
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 8
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 160
+ 160
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 8
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 8
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 8
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 160
+ 160
+
+
+ 16
+ 8
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 48
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 160
+ 160
+
+
+ 64
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 160
+ 160
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 160
+ 160
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 32
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 16
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 96
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 80
+ 80
+
+
+ 128
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 1
+ 1
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 32
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 1
+ 1
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 32
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 40
+ 40
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 128
+ 3
+ 3
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 256
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 384
+ 20
+ 20
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 512
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 512
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 512
+ 20
+ 20
+
+
+ 256
+ 512
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 128
+ 400
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 32
+ 400
+
+
+ 1
+ 2
+ 32
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 400
+ 400
+
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 400
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 400
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 64
+ 400
+
+
+ 1
+ 2
+ 400
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 64
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 64
+ 400
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 64
+ 400
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+ 128
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 2
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 40
+ 40
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 384
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 384
+ 40
+ 40
+
+
+ 128
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 32
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 32
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 64
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 40
+ 40
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 2
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 80
+ 80
+
+
+ 64
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 32
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 16
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 96
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 80
+ 80
+
+
+ 64
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 80
+ 80
+
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 1
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 65
+ 80
+ 80
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 40
+ 40
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 64
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 32
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 32
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 40
+ 40
+
+
+ 64
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 40
+ 40
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 64
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+ 128
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 40
+ 40
+
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 1
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 65
+ 40
+ 40
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 384
+ 20
+ 20
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 384
+ 20
+ 20
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 64
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 1
+ 1
+ 3
+ 3
+
+
+ 256
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 256
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 64
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 20
+ 20
+
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 1
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 65
+ 20
+ 20
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 65
+ 6400
+
+
+ 1
+ 65
+ 1600
+
+
+ 1
+ 65
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 65
+ 8400
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 8400
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 16
+ 8400
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 4
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 4
+ 8400
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 4
+ 8400
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+ 1
+ 4
+ 8400
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 8400
+
+
+ 1
+ 1
+ 8400
+
+
+
+
+
+
+
+ 1
+ 1
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 64
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 16
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+ 16
+ 1
+ 1
+
+
+ 12
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 12
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 12
+ 80
+ 80
+
+
+ 1
+ 12
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 12
+ 80
+ 80
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 128
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 16
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+ 16
+ 1
+ 1
+
+
+ 12
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 40
+ 40
+
+
+ 12
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 12
+ 40
+ 40
+
+
+ 1
+ 12
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 12
+ 40
+ 40
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 256
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 16
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+ 16
+ 1
+ 1
+
+
+ 12
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 20
+ 20
+
+
+ 12
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 12
+ 20
+ 20
+
+
+ 1
+ 12
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 12
+ 20
+ 20
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 12
+ 6400
+
+
+ 1
+ 12
+ 1600
+
+
+ 1
+ 12
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 12
+ 8400
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 6
+ 2
+ 8400
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 6
+ 2
+ 8400
+
+
+ 1
+ 1
+ 1
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 6
+ 2
+ 8400
+
+
+ 1
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 6
+ 2
+ 8400
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 8400
+
+
+ 1
+ 1
+ 8400
+
+
+ 1
+ 12
+ 8400
+
+
+
+
+
+
+
+ 1
+ 17
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/models/yolov5.bin b/assets/models/yolov5.bin
new file mode 100644
index 0000000..e5f8427
Binary files /dev/null and b/assets/models/yolov5.bin differ
diff --git a/assets/models/yolov5.xml b/assets/models/yolov5.xml
new file mode 100644
index 0000000..88b2f68
--- /dev/null
+++ b/assets/models/yolov5.xml
@@ -0,0 +1,12795 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 3
+ 3
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 640
+ 640
+
+
+ 8
+ 3
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 320
+ 320
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 8
+ 320
+ 320
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 320
+ 320
+
+
+ 16
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+ 16
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+ 16
+
+
+
+
+
+
+
+
+ 1
+ 16
+
+
+ 4
+ 16
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 4
+
+
+ 1
+ 4
+
+
+
+
+
+
+
+ 1
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 4
+
+
+ 16
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+
+
+
+
+
+
+
+
+ 1
+ 16
+
+
+ 1
+ 16
+
+
+
+
+
+
+
+ 1
+ 16
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 160
+ 160
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 160
+ 160
+
+
+ 72
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 160
+ 160
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 72
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 160
+ 160
+
+
+ 72
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 80
+ 80
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 72
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 80
+ 80
+
+
+ 16
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 88
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 88
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 88
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 88
+ 80
+ 80
+
+
+ 1
+ 88
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 88
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 88
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 88
+ 80
+ 80
+
+
+ 88
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 88
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 88
+ 80
+ 80
+
+
+ 1
+ 88
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 88
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 88
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 88
+ 80
+ 80
+
+
+ 16
+ 88
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 96
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+ 96
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 80
+ 80
+
+
+ 1
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 96
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 96
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 80
+ 80
+
+
+ 96
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 40
+ 40
+
+
+ 1
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 40
+ 40
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 96
+
+
+
+
+
+
+
+
+ 1
+ 96
+
+
+ 24
+ 96
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+
+
+
+
+
+
+
+
+ 1
+ 24
+
+
+ 1
+ 24
+
+
+
+
+
+
+
+ 1
+ 24
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 96
+ 24
+
+
+
+
+
+
+
+
+ 1
+ 24
+
+
+ 96
+ 24
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 96
+
+
+
+
+
+
+
+
+ 1
+ 96
+
+
+ 1
+ 96
+
+
+
+
+
+
+
+ 1
+ 96
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 96
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 40
+ 40
+
+
+ 1
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 96
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 40
+ 40
+
+
+ 24
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 240
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 240
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 240
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+ 240
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 60
+ 240
+
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+ 60
+ 240
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 60
+
+
+
+
+
+
+
+
+ 1
+ 60
+
+
+ 1
+ 60
+
+
+
+
+
+
+
+ 1
+ 60
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 240
+ 60
+
+
+
+
+
+
+
+
+ 1
+ 60
+
+
+ 240
+ 60
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+ 1
+ 240
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+ 24
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 240
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 240
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 240
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+ 240
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 60
+ 240
+
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+ 60
+ 240
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 60
+
+
+
+
+
+
+
+
+ 1
+ 60
+
+
+ 1
+ 60
+
+
+
+
+
+
+
+ 1
+ 60
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 240
+ 60
+
+
+
+
+
+
+
+
+ 1
+ 60
+
+
+ 240
+ 60
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+ 1
+ 240
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 40
+ 40
+
+
+ 24
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 120
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 40
+ 40
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 120
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 40
+ 40
+
+
+ 120
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 40
+ 40
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 40
+ 40
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+ 120
+
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+ 30
+ 120
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 30
+
+
+
+
+
+
+
+
+ 1
+ 30
+
+
+ 1
+ 30
+
+
+
+
+
+
+
+ 1
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 30
+
+
+
+
+
+
+
+
+ 1
+ 30
+
+
+ 120
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+ 1
+ 120
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 40
+ 40
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 120
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 40
+ 40
+
+
+ 24
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 144
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 144
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 144
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 144
+ 40
+ 40
+
+
+ 1
+ 144
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 144
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 144
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+ 1
+ 144
+ 40
+ 40
+
+
+ 144
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 144
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 144
+ 40
+ 40
+
+
+ 1
+ 144
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 144
+ 40
+ 40
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 144
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 36
+ 144
+
+
+
+
+
+
+
+
+ 1
+ 144
+
+
+ 36
+ 144
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 36
+
+
+
+
+
+
+
+
+ 1
+ 36
+
+
+ 1
+ 36
+
+
+
+
+
+
+
+ 1
+ 36
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 144
+ 36
+
+
+
+
+
+
+
+
+ 1
+ 36
+
+
+ 144
+ 36
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 144
+
+
+
+
+
+
+
+
+ 1
+ 144
+
+
+ 1
+ 144
+
+
+
+
+
+
+
+ 1
+ 144
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 144
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 144
+ 40
+ 40
+
+
+ 1
+ 144
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 144
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 144
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 144
+ 40
+ 40
+
+
+ 24
+ 144
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 288
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+ 288
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 288
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 288
+ 40
+ 40
+
+
+ 1
+ 288
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 288
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 288
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+ 1
+ 288
+ 40
+ 40
+
+
+ 288
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 288
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 288
+ 20
+ 20
+
+
+ 1
+ 288
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 288
+ 20
+ 20
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 288
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+ 288
+
+
+
+
+
+
+
+
+ 1
+ 288
+
+
+ 72
+ 288
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+
+
+
+
+
+
+
+
+ 1
+ 72
+
+
+ 1
+ 72
+
+
+
+
+
+
+
+ 1
+ 72
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 288
+ 72
+
+
+
+
+
+
+
+
+ 1
+ 72
+
+
+ 288
+ 72
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 288
+
+
+
+
+
+
+
+
+ 1
+ 288
+
+
+ 1
+ 288
+
+
+
+
+
+
+
+ 1
+ 288
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 288
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 288
+ 20
+ 20
+
+
+ 1
+ 288
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 288
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 48
+ 288
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 288
+ 20
+ 20
+
+
+ 48
+ 288
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 20
+ 20
+
+
+ 1
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 576
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 20
+ 20
+
+
+ 576
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+ 1
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 576
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+ 576
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+ 1
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 144
+ 576
+
+
+
+
+
+
+
+
+ 1
+ 576
+
+
+ 144
+ 576
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 144
+
+
+
+
+
+
+
+
+ 1
+ 144
+
+
+ 1
+ 144
+
+
+
+
+
+
+
+ 1
+ 144
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 576
+ 144
+
+
+
+
+
+
+
+
+ 1
+ 144
+
+
+ 576
+ 144
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 576
+
+
+
+
+
+
+
+
+ 1
+ 576
+
+
+ 1
+ 576
+
+
+
+
+
+
+
+ 1
+ 576
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 576
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+ 1
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 48
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+ 48
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 20
+ 20
+
+
+ 1
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 20
+ 20
+
+
+ 1
+ 48
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 576
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 20
+ 20
+
+
+ 576
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+ 1
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 576
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+ 576
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+ 1
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 144
+ 576
+
+
+
+
+
+
+
+
+ 1
+ 576
+
+
+ 144
+ 576
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 144
+
+
+
+
+
+
+
+
+ 1
+ 144
+
+
+ 1
+ 144
+
+
+
+
+
+
+
+ 1
+ 144
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 576
+ 144
+
+
+
+
+
+
+
+
+ 1
+ 144
+
+
+ 576
+ 144
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 576
+
+
+
+
+
+
+
+
+ 1
+ 576
+
+
+ 1
+ 576
+
+
+
+
+
+
+
+ 1
+ 576
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 576
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+ 1
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 48
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 576
+ 20
+ 20
+
+
+ 48
+ 576
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 20
+ 20
+
+
+ 1
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 20
+ 20
+
+
+ 1
+ 48
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 112
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 20
+ 20
+
+
+ 112
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 40
+ 40
+
+
+ 1
+ 24
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 56
+ 136
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 136
+ 40
+ 40
+
+
+ 56
+ 136
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 56
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 56
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 56
+ 56
+ 3
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 56
+ 56
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 56
+ 136
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 136
+ 40
+ 40
+
+
+ 56
+ 136
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 112
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 40
+ 40
+
+
+ 112
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 40
+ 40
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 112
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 56
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 40
+ 40
+
+
+ 56
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 80
+ 80
+
+
+ 1
+ 16
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 28
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 80
+ 80
+
+
+ 28
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 28
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 28
+ 80
+ 80
+
+
+ 1
+ 28
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 28
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 28
+ 28
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 28
+ 80
+ 80
+
+
+ 28
+ 28
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 28
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 28
+ 80
+ 80
+
+
+ 1
+ 28
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 28
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 28
+ 28
+ 3
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 28
+ 80
+ 80
+
+
+ 28
+ 28
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 28
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 28
+ 80
+ 80
+
+
+ 1
+ 28
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 28
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 28
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 80
+ 80
+
+
+ 28
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 28
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 28
+ 80
+ 80
+
+
+ 1
+ 28
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 28
+ 80
+ 80
+
+
+
+
+
+
+
+
+ 1
+ 28
+ 80
+ 80
+
+
+ 1
+ 28
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 56
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 80
+ 80
+
+
+ 56
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 80
+ 80
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 56
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 66
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 80
+ 80
+
+
+ 66
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 80
+ 80
+
+
+ 1
+ 66
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 80
+ 80
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 22
+ 80
+ 80
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 1
+ 1
+ 22
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 80
+ 80
+ 22
+
+
+ 1
+ 3
+ 1
+ 1
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 80
+ 80
+ 22
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 80
+ 80
+ 22
+
+
+ 1
+ 1
+ 80
+ 80
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 80
+ 80
+ 22
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 56
+ 56
+ 3
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 80
+ 80
+
+
+ 56
+ 56
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 56
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 40
+ 40
+
+
+ 56
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 56
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 56
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 56
+ 56
+ 3
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 56
+ 56
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 56
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 40
+ 40
+
+
+ 56
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 1
+ 56
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+
+
+
+
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+ 1
+ 56
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 112
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 40
+ 40
+
+
+ 112
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 40
+ 40
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 112
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 66
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 40
+ 40
+
+
+ 66
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 40
+ 40
+
+
+ 1
+ 66
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 40
+ 40
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 22
+ 40
+ 40
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 1
+ 1
+ 22
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 40
+ 40
+ 22
+
+
+ 1
+ 3
+ 1
+ 1
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 40
+ 40
+ 22
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 40
+ 40
+ 22
+
+
+ 1
+ 1
+ 40
+ 40
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 40
+ 40
+ 22
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 112
+ 112
+ 3
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 40
+ 40
+
+
+ 112
+ 112
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 112
+ 224
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 224
+ 20
+ 20
+
+
+ 112
+ 224
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 112
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+ 112
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 112
+ 112
+ 3
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+ 112
+ 112
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 112
+ 224
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 224
+ 20
+ 20
+
+
+ 112
+ 224
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+ 1
+ 112
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+ 1
+ 112
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 224
+ 224
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 224
+ 20
+ 20
+
+
+ 224
+ 224
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 224
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 224
+ 20
+ 20
+
+
+ 1
+ 224
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 224
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 66
+ 224
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 224
+ 20
+ 20
+
+
+ 66
+ 224
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 20
+ 20
+
+
+ 1
+ 66
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 20
+ 20
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 22
+ 20
+ 20
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 1
+ 1
+ 22
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 20
+ 20
+ 22
+
+
+ 1
+ 3
+ 1
+ 1
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 20
+ 20
+ 22
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 20
+ 20
+ 22
+
+
+ 1
+ 1
+ 20
+ 20
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 20
+ 20
+ 22
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 19200
+ 22
+
+
+ 1
+ 4800
+ 22
+
+
+ 1
+ 1200
+ 22
+
+
+
+
+
+
+
+ 1
+ 25200
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/models/yolov8.bin b/assets/models/yolov8.bin
new file mode 100644
index 0000000..ee0d394
Binary files /dev/null and b/assets/models/yolov8.bin differ
diff --git a/assets/models/yolov8.xml b/assets/models/yolov8.xml
new file mode 100644
index 0000000..31801c4
--- /dev/null
+++ b/assets/models/yolov8.xml
@@ -0,0 +1,25211 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 416
+ 416
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 3
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 3
+ 3
+ 3
+
+
+ 8
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 416
+ 416
+
+
+ 8
+ 3
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 208
+ 208
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 8
+ 208
+ 208
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 208
+ 208
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 8
+ 1
+ 1
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 208
+ 208
+
+
+ 16
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 208
+ 208
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 208
+ 208
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 208
+ 208
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 1
+ 1
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 208
+ 208
+
+
+ 16
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 208
+ 208
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 208
+ 208
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 208
+ 208
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+ 8
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 208
+ 208
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 208
+ 208
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 208
+ 208
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 208
+ 208
+
+
+ 1
+ 8
+ 208
+ 208
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 208
+ 208
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 8
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 208
+ 208
+
+
+ 64
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 208
+ 208
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 208
+ 208
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 208
+ 208
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 208
+ 208
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 104
+ 104
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 104
+ 104
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 104
+ 104
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 64
+ 1
+ 1
+
+
+ 8
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 104
+ 104
+
+
+ 8
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 104
+ 104
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 104
+ 104
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+ 8
+ 1
+ 1
+
+
+ 72
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 104
+ 104
+
+
+ 72
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 104
+ 104
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 72
+ 104
+ 104
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 104
+ 104
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+ 1
+ 1
+ 3
+ 3
+
+
+ 72
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 104
+ 104
+
+
+ 72
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 104
+ 104
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 72
+ 104
+ 104
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 104
+ 104
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 72
+ 1
+ 1
+
+
+ 8
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 104
+ 104
+
+
+ 8
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 104
+ 104
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 104
+ 104
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 104
+ 104
+
+
+ 1
+ 8
+ 104
+ 104
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 104
+ 104
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+ 8
+ 1
+ 1
+
+
+ 72
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 104
+ 104
+
+
+ 72
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 104
+ 104
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 72
+ 104
+ 104
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 104
+ 104
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+ 1
+ 1
+ 5
+ 5
+
+
+ 72
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 104
+ 104
+
+
+ 72
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 52
+ 52
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 52
+ 52
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 18
+ 72
+
+
+
+
+
+
+
+
+
+
+
+
+ 18
+ 72
+
+
+ 18
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 72
+
+
+ 18
+ 72
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 18
+
+
+ 1
+ 18
+
+
+
+
+
+
+
+ 1
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+ 18
+
+
+ 72
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 18
+
+
+ 72
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+
+
+ 1
+ 72
+
+
+
+
+
+
+
+ 1
+ 72
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 52
+ 52
+
+
+ 1
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 72
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 72
+ 1
+ 1
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 72
+ 52
+ 52
+
+
+ 16
+ 72
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 16
+ 1
+ 1
+
+
+ 120
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+ 120
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 1
+ 1
+ 5
+ 5
+
+
+ 120
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 120
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+ 120
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+ 120
+
+
+ 30
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+ 30
+ 120
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 30
+
+
+ 1
+ 30
+
+
+
+
+
+
+
+ 1
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 30
+
+
+ 120
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 30
+
+
+ 120
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+ 1
+ 120
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 120
+ 1
+ 1
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 16
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 16
+ 1
+ 1
+
+
+ 120
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+ 120
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 1
+ 1
+ 5
+ 5
+
+
+ 120
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 120
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+ 120
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+ 120
+
+
+ 30
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+ 30
+ 120
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 30
+
+
+ 1
+ 30
+
+
+
+
+
+
+
+ 1
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 30
+
+
+ 120
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 30
+
+
+ 120
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+ 1
+ 120
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 1
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 120
+ 1
+ 1
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 120
+ 52
+ 52
+
+
+ 16
+ 120
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 240
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 240
+ 16
+ 1
+ 1
+
+
+ 240
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+ 240
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 52
+ 52
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 240
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 52
+ 52
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 240
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 240
+ 1
+ 1
+ 3
+ 3
+
+
+ 240
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 52
+ 52
+
+
+ 240
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 26
+ 26
+
+
+ 1
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 240
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 240
+ 1
+ 1
+
+
+ 24
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 240
+ 26
+ 26
+
+
+ 24
+ 240
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 200
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 200
+ 24
+ 1
+ 1
+
+
+ 200
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+ 200
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 200
+ 26
+ 26
+
+
+ 1
+ 200
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 200
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 200
+ 26
+ 26
+
+
+ 1
+ 200
+ 1
+ 1
+
+
+ 1
+ 200
+ 1
+ 1
+
+
+ 1
+ 200
+ 1
+ 1
+
+
+ 1
+ 200
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 200
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 200
+ 1
+ 1
+ 3
+ 3
+
+
+ 200
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 200
+ 26
+ 26
+
+
+ 200
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 200
+ 26
+ 26
+
+
+ 1
+ 200
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 200
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 200
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 200
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 200
+ 1
+ 1
+
+
+ 24
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 200
+ 26
+ 26
+
+
+ 24
+ 200
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 184
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 184
+ 24
+ 1
+ 1
+
+
+ 184
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+ 184
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+ 1
+ 184
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+ 1
+ 184
+ 1
+ 1
+
+
+ 1
+ 184
+ 1
+ 1
+
+
+ 1
+ 184
+ 1
+ 1
+
+
+ 1
+ 184
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 184
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 184
+ 1
+ 1
+ 3
+ 3
+
+
+ 184
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+ 184
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+ 1
+ 184
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 184
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 184
+ 1
+ 1
+
+
+ 24
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+ 24
+ 184
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 184
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 184
+ 24
+ 1
+ 1
+
+
+ 184
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+ 184
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+ 1
+ 184
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+ 1
+ 184
+ 1
+ 1
+
+
+ 1
+ 184
+ 1
+ 1
+
+
+ 1
+ 184
+ 1
+ 1
+
+
+ 1
+ 184
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 184
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 184
+ 1
+ 1
+ 3
+ 3
+
+
+ 184
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+ 184
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+ 1
+ 184
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 184
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 24
+ 184
+ 1
+ 1
+
+
+ 24
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 184
+ 26
+ 26
+
+
+ 24
+ 184
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+ 1
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 480
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 480
+ 24
+ 1
+ 1
+
+
+ 480
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 26
+ 26
+
+
+ 480
+ 24
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 480
+ 26
+ 26
+
+
+ 1
+ 480
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 480
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 480
+ 26
+ 26
+
+
+ 1
+ 480
+ 1
+ 1
+
+
+ 1
+ 480
+ 1
+ 1
+
+
+ 1
+ 480
+ 1
+ 1
+
+
+ 1
+ 480
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 480
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 480
+ 1
+ 1
+ 3
+ 3
+
+
+ 480
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 480
+ 26
+ 26
+
+
+ 480
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 480
+ 26
+ 26
+
+
+ 1
+ 480
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 480
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 480
+ 26
+ 26
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 480
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 480
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 480
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 480
+
+
+ 120
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 480
+
+
+ 120
+ 480
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+ 1
+ 120
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 480
+ 120
+
+
+
+
+
+
+
+
+
+
+
+
+ 480
+ 120
+
+
+ 480
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 120
+
+
+ 480
+ 120
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 480
+
+
+ 1
+ 480
+
+
+
+
+
+
+
+ 1
+ 480
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 480
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 480
+ 26
+ 26
+
+
+ 1
+ 480
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 480
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 480
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 480
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 480
+ 1
+ 1
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 480
+ 26
+ 26
+
+
+ 32
+ 480
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 26
+ 26
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 32
+ 1
+ 1
+
+
+ 672
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 26
+ 26
+
+
+ 672
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 1
+ 1
+ 3
+ 3
+
+
+ 672
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 672
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 168
+ 672
+
+
+
+
+
+
+
+
+
+
+
+
+ 168
+ 672
+
+
+ 168
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 672
+
+
+ 168
+ 672
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 168
+
+
+ 1
+ 168
+
+
+
+
+
+
+
+ 1
+ 168
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 168
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 168
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 168
+
+
+ 672
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 168
+
+
+ 672
+ 168
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+
+
+ 1
+ 672
+
+
+
+
+
+
+
+ 1
+ 672
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 672
+ 1
+ 1
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 32
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 26
+ 26
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 26
+ 26
+
+
+ 1
+ 32
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 32
+ 1
+ 1
+
+
+ 672
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 26
+ 26
+
+
+ 672
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 1
+ 1
+ 5
+ 5
+
+
+ 672
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 672
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 168
+ 672
+
+
+
+
+
+
+
+
+
+
+
+
+ 168
+ 672
+
+
+ 168
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 672
+
+
+ 168
+ 672
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 168
+
+
+ 1
+ 168
+
+
+
+
+
+
+
+ 1
+ 168
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 168
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 168
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 168
+
+
+ 672
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 168
+
+
+ 672
+ 168
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+
+
+ 1
+ 672
+
+
+
+
+
+
+
+ 1
+ 672
+
+
+
+
+
+
+
+
+ 1
+ 672
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 40
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 40
+ 672
+ 1
+ 1
+
+
+ 40
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 40
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 40
+ 26
+ 26
+
+
+ 1
+ 40
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 40
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 40
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 40
+ 1
+ 1
+
+
+ 672
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 40
+ 26
+ 26
+
+
+ 672
+ 40
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 1
+ 1
+ 5
+ 5
+
+
+ 672
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 26
+ 26
+
+
+ 672
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 13
+ 13
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 13
+ 13
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 168
+ 672
+
+
+
+
+
+
+
+
+
+
+
+
+ 168
+ 672
+
+
+ 168
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 672
+
+
+ 168
+ 672
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 168
+
+
+ 1
+ 168
+
+
+
+
+
+
+
+ 1
+ 168
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 168
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 168
+
+
+
+
+
+
+
+
+
+
+
+
+ 672
+ 168
+
+
+ 672
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 168
+
+
+ 672
+ 168
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+
+
+ 1
+ 672
+
+
+
+
+
+
+
+ 1
+ 672
+
+
+
+
+
+
+
+
+ 1
+ 672
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 13
+ 13
+
+
+ 1
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 672
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 40
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 40
+ 672
+ 1
+ 1
+
+
+ 40
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 672
+ 13
+ 13
+
+
+ 40
+ 672
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 40
+ 13
+ 13
+
+
+ 1
+ 40
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 40
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 960
+ 40
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 960
+ 40
+ 1
+ 1
+
+
+ 960
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 40
+ 13
+ 13
+
+
+ 960
+ 40
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 960
+ 13
+ 13
+
+
+ 1
+ 960
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 960
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 960
+ 13
+ 13
+
+
+ 1
+ 960
+ 1
+ 1
+
+
+ 1
+ 960
+ 1
+ 1
+
+
+ 1
+ 960
+ 1
+ 1
+
+
+ 1
+ 960
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 960
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+ 960
+ 1
+ 1
+ 5
+ 5
+
+
+ 960
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 960
+ 13
+ 13
+
+
+ 960
+ 1
+ 1
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 960
+ 13
+ 13
+
+
+ 1
+ 960
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 960
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 960
+ 13
+ 13
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 960
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 960
+ 1
+ 1
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 240
+ 960
+
+
+
+
+
+
+
+
+
+
+
+
+ 240
+ 960
+
+
+ 240
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 960
+
+
+ 240
+ 960
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+ 1
+ 240
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 960
+ 240
+
+
+
+
+
+
+
+
+
+
+
+
+ 960
+ 240
+
+
+ 960
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 240
+
+
+ 960
+ 240
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 960
+
+
+ 1
+ 960
+
+
+
+
+
+
+
+ 1
+ 960
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 960
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 960
+ 13
+ 13
+
+
+ 1
+ 960
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 960
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 960
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 40
+ 960
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 40
+ 960
+ 1
+ 1
+
+
+ 40
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 960
+ 13
+ 13
+
+
+ 40
+ 960
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 40
+ 13
+ 13
+
+
+ 1
+ 40
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 40
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 40
+ 13
+ 13
+
+
+ 1
+ 40
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 40
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 40
+ 13
+ 13
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 40
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 40
+ 26
+ 26
+
+
+ 1
+ 40
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 80
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 80
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 80
+ 26
+ 26
+
+
+ 128
+ 80
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 26
+ 26
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 52
+ 52
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 144
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 144
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 144
+ 52
+ 52
+
+
+ 64
+ 144
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 52
+ 52
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 52
+ 52
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+ 32
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 52
+ 52
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 52
+ 52
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 52
+ 52
+
+
+ 1
+ 32
+ 52
+ 52
+
+
+ 1
+ 32
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 96
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 52
+ 52
+
+
+ 64
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ 64
+ 1
+ 1
+
+
+ 2
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 2
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 52
+ 52
+
+
+ 1
+ 2
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 1
+ 2
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 52
+ 52
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 26
+ 26
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 26
+ 26
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+ 64
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 128
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+ 64
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ 64
+ 1
+ 1
+
+
+ 2
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 2
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 26
+ 26
+
+
+ 1
+ 2
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 26
+ 26
+
+
+ 1
+ 2
+ 26
+ 26
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 26
+ 26
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+ 1
+ 40
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 168
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 168
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 168
+ 13
+ 13
+
+
+ 256
+ 168
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 13
+ 13
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 13
+ 13
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+ 128
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+ 1
+ 128
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+ 256
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 384
+ 13
+ 13
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 13
+ 13
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 13
+ 13
+
+
+ 64
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 256
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 13
+ 13
+
+
+ 64
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+ 64
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ 64
+ 1
+ 1
+
+
+ 2
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+ 2
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 13
+ 13
+
+
+ 1
+ 2
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 13
+ 13
+
+
+ 1
+ 2
+ 13
+ 13
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 13
+ 13
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 2704
+
+
+ 1
+ 66
+ 676
+
+
+ 1
+ 66
+ 169
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 66
+ 3549
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 3549
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 16
+ 3549
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 4
+ 3549
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 4
+ 3549
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 4
+ 3549
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 4
+ 3549
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 3549
+
+
+ 2
+
+
+ 2
+
+
+ 2
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3549
+
+
+ 1
+ 2
+ 3549
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3549
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 3549
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 3549
+
+
+ 2
+
+
+ 2
+
+
+ 2
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3549
+
+
+ 1
+ 2
+ 3549
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3549
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3549
+
+
+ 1
+ 2
+ 3549
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3549
+
+
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3549
+
+
+ 1
+ 2
+ 3549
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3549
+
+
+ 1
+ 2
+ 3549
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 3549
+
+
+ 1
+ 1
+ 3549
+
+
+
+
+
+
+
+ 1
+ 2
+ 3549
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 64
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 52
+ 52
+
+
+ 16
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+ 8
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 52
+ 52
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 52
+ 52
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 52
+ 52
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 128
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 26
+ 26
+
+
+ 16
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 26
+ 26
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 26
+ 26
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 26
+ 26
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 26
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+ 8
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 26
+ 26
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 26
+ 26
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 26
+ 26
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 256
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 13
+ 13
+
+
+ 16
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 13
+ 13
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+ 16
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 13
+ 13
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 13
+ 13
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 13
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+ 8
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 13
+ 13
+
+
+ 8
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 13
+ 13
+
+
+ 1
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 13
+ 13
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 2704
+
+
+ 1
+ 8
+ 676
+
+
+ 1
+ 8
+ 169
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8
+ 3549
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 2
+ 3549
+
+
+ 3
+
+
+ 3
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 2
+ 3549
+
+
+ 1
+ 1
+ 1
+ 3549
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 2
+ 3549
+
+
+ 1
+ 1
+ 2
+ 3549
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 2
+ 3549
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 3549
+
+
+ 1
+ 2
+ 3549
+
+
+ 1
+ 8
+ 3549
+
+
+
+
+
+
+
+ 1
+ 14
+ 3549
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/test_demo/demo.avi b/assets/test_demo/demo.avi
new file mode 100644
index 0000000..95f1dbc
Binary files /dev/null and b/assets/test_demo/demo.avi differ
diff --git a/assets/test_demo/demo.txt b/assets/test_demo/demo.txt
new file mode 100644
index 0000000..ba5a849
--- /dev/null
+++ b/assets/test_demo/demo.txt
@@ -0,0 +1,620 @@
+0.752677887 0.5014435722929029 0.02327065116579723 0.0019472255628188646 0.8648751522116124
+25.824433869 0.4044806118882999 -0.019203333238947136 0.007353485765453223 0.9143153683746531
+25.897933452 0.3983196747926323 -0.0436570165419713 0.018327136925283163 0.9160238084416079
+25.937844162 0.4060992801021506 -0.060038428432863424 0.024035605927579317 0.911537740008345
+25.971199735 0.41094740236919536 -0.05302595072734453 0.022424116638938174 0.9098393484722648
+26.004610259 0.40968966344416635 -0.06222787384895668 0.026676178451042067 0.9097089935174283
+26.038064416 0.4052178756282984 -0.06004722598623817 0.025247798677895384 0.9118965690167756
+26.077887404 0.40238001786745814 -0.05878320483250864 0.02484137457076296 0.9132457293412537
+26.111296109 0.40071966107416385 -0.060104792050292295 0.025001993365346215 0.91388515007574
+26.14465991 0.40002642058153615 -0.05785093696523309 0.02402514483049273 0.9143603908442461
+26.178099861 0.39929477459454044 -0.057247371909738026 0.02370218810986068 0.9147265316310269
+26.218006534 0.39592077215767296 -0.05910142357447336 0.024000578101308977 0.916066447456922
+26.258174622 0.3914227776785776 -0.06137418865489941 0.024358413852926662 0.9178388125133461
+26.297970237 0.3855702178436289 -0.06842624749883933 0.02654238434945672 0.9197548355938607
+26.331391866 0.37864028600252797 -0.07377439499650759 0.027719254342318013 0.9221824740242731
+26.364852852 0.36916508135424514 -0.08236062699653302 0.030084141809927266 0.9252182522199894
+26.398257869 0.35781284168321736 -0.09010595648555406 0.031602689105865805 0.9288983566427934
+26.438065898 0.3423988381374929 -0.094062894882146 0.031306837908086714 0.9343099535746594
+26.471630757 0.3284589912585138 -0.100292321321941 0.03340331127965669 0.9385842317772286
+26.511411364 0.30648004432504633 -0.10372794354937309 0.02920252880446784 0.9457577430129557
+26.544782875 0.2877371342097568 -0.10816547583833148 0.03136957635674919 0.9510644148072316
+26.578234048 0.27056379547459847 -0.11476815782525768 0.028758032907769022 0.9554038298390122
+26.618249467 0.24702723299386736 -0.11930861794076049 0.029647629255281208 0.9611784526943998
+26.65819223 0.22474004532143046 -0.12747277314000643 0.02684990433599021 0.9656716247120788
+26.691595323 0.20478718291793538 -0.1354562932082495 0.026679200858173283 0.9690211672530101
+26.731533578 0.18464779929792222 -0.14656507828977644 0.02557516004343661 0.9714781414057131
+26.764973543 0.16962745445697788 -0.15571367025164942 0.024602979225598506 0.9728178005178726
+26.804876967 0.15668079501547813 -0.165082270044186 0.021902446350445876 0.9735087341335167
+26.838271933 0.14948108929914852 -0.17336450566714282 0.023865026107513124 0.973154978739571
+26.878294766 0.14670414846347568 -0.17732779299413426 0.022900647578824766 0.9728865848576116
+26.918471623 0.16793725762402759 -0.1556833711631501 0.024272873455547277 0.9731241406209225
+26.958307164 0.18634764447388283 -0.14828721348713966 0.02716398992035998 0.9708488941987118
+26.991752292 0.19135093840176348 -0.1409333380258021 0.02560205317865002 0.9710134641078398
+27.031645647 0.19548121140962427 -0.13017912492072262 0.024075762752732745 0.9717308521749091
+27.065002019 0.2030810496528304 -0.11954184165675422 0.022601603668929358 0.9715744968229708
+27.098378842 0.21533477553100352 -0.10884752288991607 0.02217154034270757 0.9702018212756423
+27.138566887 0.2309530705457854 -0.10363395684749488 0.023384977600967825 0.9671472612876528
+27.178444982 0.2610574165126007 -0.07534989163557612 0.01975464577855268 0.9621752299266685
+27.211783938 0.28189139816589925 -0.06455159511978166 0.01934054677327865 0.9570769428097602
+27.251917112 0.30344756555078894 -0.05920441836657583 0.018158406704229697 0.9508336784491486
+27.285291209 0.3197638072317074 -0.052305763630237506 0.0190128093844623 0.9458613681481295
+27.325135927 0.34050741054630956 -0.04356369533756827 0.01739493407681777 0.9390709899044084
+27.358476022 0.36074398179533307 -0.043177686734943606 0.017975353795504252 0.9314914672838361
+27.391868412 0.3787823021316463 -0.03624523535416737 0.01568693148279716 0.9246427259685901
+27.42522498 0.3984670274873839 -0.04007924788396457 0.017989448735969783 0.9161299370878566
+27.465429627 0.4195406147954505 -0.03692008972117208 0.01825845120939563 0.9068016367825271
+27.505361927 0.4428245058408616 -0.03847256797862454 0.01988862267960126 0.8955617015191278
+27.538757471 0.46230490758180315 -0.03792234735216942 0.02220157131743785 0.8856315025043535
+27.578597084 0.4838649748930099 -0.04076880357753215 0.02443333342290202 0.8738510187351668
+27.612003127 0.5029620477890874 -0.04332278759451557 0.027400941729415852 0.8627870553915313
+27.645609807 0.5164711925243503 -0.04852694340232439 0.03269867674780466 0.8543028968670572
+27.685514463 0.5346476087719997 -0.052552062589177925 0.03330828442595869 0.8427815691747212
+27.725445945 0.5483503022201482 -0.05677974866673668 0.04052650103918396 0.833334032012335
+27.758780308 0.5604878399036811 -0.058961518326285545 0.04247728364422499 0.824968242449958
+27.798875869 0.571417869922125 -0.06320457473969693 0.046910106558344385 0.8168759034078068
+27.83230702 0.5793812677133586 -0.06757245519538539 0.048605247049575986 0.8107951898482002
+27.87214098 0.5939104023850323 -0.06534585789781365 0.0508035152165781 0.800262054352252
+27.912176896 0.5854053622748845 -0.0647026264982299 0.04940118779555409 0.806643449479651
+27.945738619 0.5484893523181781 -0.06296952524452691 0.04326309904847135 0.8326599387173533
+27.985561072 0.5023457335699482 -0.06007586355282575 0.036143248490428076 0.861819772441438
+28.025565824 0.48265743343532164 -0.05297786338571968 0.02931557823091408 0.873713765951813
+28.058924678 0.47321784897275215 -0.04940209718149981 0.027201154723416898 0.87913844040025
+28.098993169 0.454826580318603 -0.04068404964729429 0.020584409203952665 0.8894120934851888
+28.138865086 0.43209180787629975 -0.03808694033648821 0.018506465746383264 0.9008349267582678
+28.172422693 0.4146567620523134 -0.028721650974283558 0.012880152825570333 0.9094333060278761
+28.212409768 0.4165125396419987 -0.04340323269539244 0.021428768549504835 0.9078404439057637
+28.245832927 0.4084996986948947 -0.04176063927302493 0.019259226597509577 0.9115992142189211
+28.285655953 0.3837377360348871 -0.04162778955717806 0.01723239944012399 0.9223424101107672
+28.319103435 0.34663020129947947 -0.05575000855977064 0.020189405315549035 0.9361259680222915
+28.359132216 0.3215898402058671 -0.06694038194132015 0.02121937972090072 0.9442715170257839
+28.39893612 0.3191246191429412 -0.0856146732825442 0.02549929462302405 0.9434931855341215
+28.432387406 0.311282249380152 -0.10399925402143416 0.03281288350827445 0.9440396342631439
+28.472413896 0.3027637644227617 -0.1442911954492042 0.042430382176946085 0.9411236988497933
+28.512438655 0.2792311437803485 -0.19292151186743026 0.0530538305086665 0.9391467136024387
+28.552487544 0.25399677541556676 -0.2227387876177815 0.054100275930032804 0.9396521860312725
+28.586039756 0.2565817998246983 -0.24347813752778957 0.06245154897650981 0.9332652252040423
+28.625817307 0.29769257489780704 -0.2354296157143852 0.072967502762912 0.9222948392113202
+28.65918369 0.31398004396575024 -0.23344648938751542 0.07823336000621821 0.9169508219997666
+28.692535692 0.31150059834170446 -0.23627797301834827 0.07734464473301211 0.9171466091254031
+28.725869117 0.30290876772937103 -0.22655739560738158 0.07226151040671558 0.922873934533864
+28.765799969 0.30123134447545497 -0.187413394701377 0.05712519180985434 0.9332055556267885
+28.799252042 0.3041879950337558 -0.1657474708904943 0.05170527857763309 0.9366557551939549
+28.83281661 0.31099686973283364 -0.12893354694262157 0.03941615610368397 0.9407993697527565
+28.872692948 0.315227209620526 -0.12035272852321002 0.037414039040739464 0.9406100237263759
+28.912720524 0.3154260116678618 -0.10679714618271541 0.032446845303020014 0.9423629889593582
+28.952760607 0.31613276095486886 -0.1045108304959943 0.03200331651551979 0.9423976610179468
+28.992661348 0.3156462155986657 -0.10589643353602368 0.03231755011857671 0.9423953458591169
+29.032576927 0.314815368087299 -0.10450510154105064 0.031801552430673785 0.9428460261521774
+29.066041179 0.3148639043329818 -0.10515409891927241 0.03220150564769405 0.9427440799404091
+29.105976656 0.3148248942489635 -0.10505843638464234 0.032002530546273285 0.9427745483116193
+29.139375245 0.31452325985513124 -0.10510777300723144 0.032002366662525275 0.942869727794651
+29.172731973 0.3148245305089792 -0.10500818203126688 0.03220250915625518 0.9427734590559551
+29.206294979 0.31525741283153325 -0.10510685476651474 0.032002087084000694 0.9426246226139687
+29.246181549 0.3146354063412599 -0.10531185088281841 0.03210361266228367 0.9428060952253837
+29.279588728 0.31492782510257605 -0.10460924263489824 0.032202845247071926 0.9427832985843075
+29.319473832 0.3292795253786904 -0.05527650227395744 0.01743693655655526 0.9424518320350724
+29.359443762 0.3567154861057565 -0.023190959454469157 0.008381725248960104 0.9338875671373755
+29.392987327 0.360946593189094 -0.04470723120881977 0.014463611798745599 0.9314019670778901
+29.432980661 0.34577297778749766 -0.11129112511418768 0.03910734338753012 0.9308737556704211
+29.472866367 0.3310136170867147 -0.13852117797464425 0.046104784748342106 0.932264027719077
+29.50637431 0.32634270221054634 -0.15144298392210845 0.0499821024659049 0.9317012679865658
+29.546290163 0.32651364207192 -0.17929210883548183 0.05979575993220456 0.9261034760459471
+29.586258229 0.3207882708899325 -0.2109358301925009 0.07033174620624963 0.920681490134361
+29.626251253 0.3173645078894013 -0.22428208807123948 0.07354740778710415 0.9184596305283756
+29.659858131 0.3149299011405167 -0.2271949905143246 0.07391106915404334 0.9185525284431624
+29.699635647 0.3159754663811358 -0.2325000272672274 0.07614490269132208 0.9166816218077525
+29.733141129 0.31843723826828896 -0.22883963567773133 0.07558358435495449 0.91679728850112
+29.773035006 0.32315472577674303 -0.1966484277758075 0.06518853581097142 0.9233909647924237
+29.806553861 0.3255257062845889 -0.18414720918973623 0.0617048727427316 0.925373075346022
+29.846479871 0.324835280905318 -0.15337750844106096 0.0502745022225885 0.9318958389272088
+29.886403411 0.3248880692958557 -0.12357078512198329 0.04067624659138025 0.9367622144689576
+29.926389194 0.3264593571862328 -0.08671084772300566 0.028153929331478582 0.9408043756572922
+29.959840492 0.3283675311496364 -0.05622802944971049 0.01805900866458588 0.9427019918282487
+29.999770493 0.3307567180131652 -0.010821135472014803 0.002527329810063534 0.9436506287394117
+30.033161415 0.3320567726442118 0.0025965095322532357 -0.0018482956263382029 0.9432540175809679
+30.066523885 0.3342815614753687 0.025411818591313442 -0.01012335377226029 0.942076214985748
+30.106499966 0.3382845206792486 0.044224933480299655 -0.0165699225687323 0.9398580616207644
+30.139866396 0.3401183879702809 0.05720737205044044 -0.021252432746559503 0.9384003052268968
+30.179989005 0.34256937750165134 0.06619532394759138 -0.02430110224744672 0.9368424932266702
+30.219842067 0.344623430236308 0.059878104556614964 -0.022311130314846956 0.9365636750327987
+30.253276402 0.34522447628295433 0.05522026732492536 -0.02065964087518999 0.9366664092891513
+30.286641332 0.3451187515838374 0.04860151789103361 -0.018292598243356377 0.9371212945042965
+30.326675126 0.3438457407107739 0.04832093668524092 -0.01830201934721479 0.9376034501646922
+30.366667361 0.3429318533799306 0.03413163782197401 -0.013270694643356435 0.9386461867501932
+30.400078661 0.34099087160867003 0.009880972929028852 -0.004427041687738833 0.9400042516688052
+30.439933789 0.3337466350949278 -0.04479772856893368 0.015465943953540087 0.9414707386082178
+30.473359852 0.327502001625859 -0.04822546446444369 0.01554501461772024 0.9434909093514253
+30.506713728 0.32742515100044156 -0.05396348614326533 0.017189703551363827 0.9431782582033048
+30.540067363 0.32762673246303753 -0.0692522807086646 0.022457088218536425 0.9419981555082719
+30.580183256 0.3211706030541114 -0.13150514868757188 0.04340804157037819 0.936841278728442
+30.620118924 0.3156623157618935 -0.15152403620692897 0.048945734663551704 0.935415460593658
+30.653556381 0.31251469315972596 -0.17233735877100592 0.055033408585554396 0.9325265279178772
+30.693612598 0.30707801890832764 -0.201591008905681 0.06279686470201684 0.9279658987351438
+30.733401342 0.3070144936742045 -0.2180656699052845 0.06916985484325372 0.9237992181549487
+30.766763122 0.307516455225731 -0.2285795236638387 0.07338757315311484 0.9207601724845129
+30.800130476 0.30685308901421826 -0.2363146033564864 0.07590469062529547 0.9188226531512906
+30.833570583 0.31304294798738397 -0.18654854721808672 0.059324835261395314 0.9293461767110238
+30.873680288 0.3179267616358679 -0.1587133597722939 0.051604343820103114 0.9333111139188353
+30.913521915 0.31398354851894233 -0.15394153937504743 0.04853342238545297 0.9356072042400321
+31.080372626 0.31321944996563716 -0.1506093523781129 0.047502949787253404 0.9364581511744019
+31.113758022 0.3088298470777448 -0.0974729465717457 0.028097697739777907 0.9456921643020432
+31.15368512 0.28208488208503557 -0.085771531000141 0.022564467961138535 0.9552812196178643
+31.18702301 0.2616628145118343 -0.08315458740030784 0.01818988565662334 0.9613984679391939
+31.220453011 0.247896361568307 -0.06999324306994446 0.014566461258688601 0.9661449984614866
+31.260330085 0.23110617691853164 -0.07257634513517928 0.013824733687868419 0.9701193152676527
+31.293733821 0.2202888951997949 -0.06696486874124245 0.012200800488341431 0.973056858294296
+31.327167668 0.2112520306738455 -0.06458384143320492 0.011464277138012064 0.9752282180657049
+31.36052945 0.19972929183072463 -0.058442444889792354 0.009600770030694117 0.9780595666087617
+31.393946942 0.195298987116921 -0.06071821612280596 0.008800591361365616 0.9788228406885789
+31.427284711 0.1884055201932333 -0.056530448392185614 0.007963294597824626 0.9804306473710642
+31.467105136 0.1809636017918513 -0.058018052413492005 0.0074003701882794995 0.9817491099775655
+31.507183596 0.17685620474810448 -0.05806968583402605 0.007400621854908224 0.9824942876299052
+31.547212613 0.16466045534051527 -0.059204781976887055 0.006700193527206321 0.9845490519241901
+57.646185138 0.3648277315793616 0.0025002234819031127 -0.001300098824158909 0.9310707733014958
+57.679691503 0.35939410032381164 0.003681914957301948 -0.002094031130928149 0.9331762637295851
+57.71305164 0.3601129890279416 -0.03938227313049235 0.014928919849971368 0.9319575092505827
+57.753067919 0.36876978940305033 -0.07447976382732267 0.028640860117576963 0.926089255058918
+57.793093463 0.3755303499851984 -0.06476356468277647 0.025402052968372942 0.924195527274703
+57.833076037 0.37505547533571193 -0.0693647513044173 0.027802568360908445 0.9239853564260185
+57.872958251 0.371648935723233 -0.0685273769739429 0.02712443229489106 0.9254433166615551
+57.906291651 0.3698817896467579 -0.06704118431847518 0.026201377701737485 0.926286364522019
+57.946298377 0.36883775196533913 -0.06956436196205014 0.026960001241541888 0.9264948303164049
+57.979743529 0.36771210408958105 -0.06789539441821965 0.02590238061688819 0.9270960525216282
+58.01307696 0.3660305216376218 -0.06936753172424923 0.026583477045683517 0.9276330748309578
+58.052974633 0.3643509402540849 -0.06872859753131956 0.02640199542584913 0.9283467600282103
+58.086505113 0.36332175280535794 -0.06870977841227453 0.02625440421377999 0.928755606469408
+58.126570832 0.3621776022579473 -0.06945023327718987 0.026402468538066267 0.9291431316947484
+58.166469941 0.3597280954018862 -0.07164803946981183 0.02704955467844082 0.9299089081250711
+58.199900426 0.35647340016840284 -0.07736889913395652 0.029023119575736042 0.9306440925237048
+58.239864087 0.3514784440798335 -0.08366090281104806 0.03073943108649393 0.9319435841640515
+58.273396205 0.34623189094108586 -0.09170006766039057 0.03309975448491024 0.933069655245244
+58.313314371 0.3374310922974114 -0.10038541388923851 0.03489764152998602 0.9353315889271071
+58.353324331 0.327247779651809 -0.10840353029644155 0.03620402773962069 0.9380015105039321
+58.386708159 0.32084967489258137 -0.11230649023244715 0.036469268088100394 0.9397407785438027
+58.420110256 0.31312522948248706 -0.11724194944659518 0.037205319884909466 0.9417126313922755
+58.459890547 0.2934158767140341 -0.1388722335495908 0.040950048927314096 0.9449575226082564
+58.493474575 0.28391013881347704 -0.1474430651071003 0.04211535504946051 0.946510365764577
+58.533395611 0.2799214687055404 -0.15989369219174132 0.044500901904946585 0.9455673684538147
+58.573331218 0.2763304265699522 -0.1738098073833949 0.047902215360459445 0.9440005423582
+58.613252003 0.274635833710138 -0.1851832836280359 0.05059342615452792 0.9421903287218684
+58.646809776 0.27439578896301897 -0.19183288427053158 0.05277666438157558 0.9408090769165474
+58.68670508 0.2734499045567866 -0.1939459675217642 0.05350264945124146 0.9406102157012908
+58.726659999 0.2703606687750818 -0.19308909508172478 0.05220484193570918 0.9417517531804647
+58.760194601 0.26848646144490124 -0.18647101365306806 0.04989948326164886 0.9437444689417859
+58.800091022 0.2672177509023071 -0.1748348539570433 0.04656774141441302 0.9464982265720799
+58.840027909 0.26672276279028617 -0.15613398075798654 0.041341451714856106 0.9501431640717569
+58.873411026 0.26730627161015935 -0.1377186299679909 0.03640504803532092 0.9530244533038811
+58.913491169 0.267306647262335 -0.11594112896747992 0.0303817542261305 0.9561285269006772
+58.953486966 0.26760993558545765 -0.09298748317700264 0.023696524552685096 0.9587370468864119
+58.986896014 0.2684987185719504 -0.07613944241148507 0.018971515054979834 0.9600788014798616
+59.026930521 0.27147298641603634 -0.0537368583379652 0.013143257657024324 0.9608548394427148
+59.066903569 0.2757755204858268 -0.034311853833894984 0.007947104326678526 0.9605765989862931
+59.100260082 0.2789962725356336 -0.02058850829599111 0.004222067172057051 0.9600621685006462
+59.133635337 0.280729665148298 -0.0076084474944423655 0.0006737538540854326 0.9597564861402046
+59.167015679 0.28310252320476503 0.0024970573964317837 -0.00216577863043965 0.9590839564200719
+59.206883378 0.28586696886309737 0.01334532404459 -0.005048480852492831 0.9581630817769238
+59.240381069 0.2874075173807805 0.022003848343924756 -0.007651018322476242 0.9575250448576805
+59.280263498 0.2883515447825343 0.025640446260136892 -0.008839736495476532 0.9571404354616921
+59.31368658 0.2890182194808034 0.02821762825440461 -0.009516449346823212 0.9568603197205283
+59.347298376 0.2889153881977819 0.026502940620754204 -0.009000426936712078 0.9569453928599765
+59.387020221 0.28713766647345373 0.023147914945962314 -0.008216010472606861 0.9575743478695261
+59.420461592 0.28566612440829653 0.017049436942301356 -0.006449856983485678 0.9581558231365015
+59.460346171 0.2847212276456365 0.007801813220703021 -0.0037008916980609337 0.9585714671525907
+59.493884887 0.28489390344878146 0.0004908958586388112 -0.001553619322662375 0.958557671225875
+59.533705066 0.2830206185816189 -0.019982702000005712 0.0040246109056272066 0.9588971913534396
+59.567245962 0.28142431079927405 -0.03430018739554989 0.008371431959058652 0.9589336648396168
+59.60708867 0.280308255851015 -0.049880761174041555 0.01276013983733152 0.9585282312993145
+59.640467299 0.2787649308114513 -0.06437196433450137 0.016457017644675297 0.958058208110367
+59.673882936 0.2771935994115264 -0.07916682342006238 0.020737205304306502 0.9573224591698588
+59.713885138 0.2746909690270775 -0.09632564400615011 0.02518388503298312 0.9563639546618281
+59.753815901 0.2741171465659534 -0.11080133999916107 0.029125424141915345 0.9548479264686516
+59.787474612 0.27420963270161186 -0.12284048621704814 0.03281320968003316 0.9532274574046325
+59.827247797 0.2746074941695586 -0.13359023495548616 0.0361976740755462 0.951543010936434
+59.860695477 0.2750936394584554 -0.1406197928985947 0.03807247857911732 0.9503157631805864
+59.90054314 0.2747201705490309 -0.14527095340460258 0.03940289304562001 0.9496697268050954
+59.934049841 0.2750193586155686 -0.148949280473019 0.040502850996111006 0.9489667977829562
+59.973959253 0.27412126356538025 -0.15448185688784744 0.042073137352098666 0.9482735575070906
+60.007318902 0.2740216010757454 -0.15461521604839573 0.042205345545121356 0.9482747523358459
+60.047302748 0.27431062504513654 -0.1480072023983457 0.040102043145115986 0.949336281388818
+60.087423516 0.27462680180856897 -0.13146965567843455 0.034409525993149566 0.9518990670680993
+60.120785661 0.27542878501884666 -0.13352188907119297 0.03580374184340854 0.9513301117866041
+60.154181941 0.2742236561334814 -0.13677340081460995 0.0367031662293901 0.9511820545169732
+60.1940437 0.2750566903523599 -0.10277152530977768 0.026483886164914996 0.9555524237065759
+60.227515539 0.27754067726615284 -0.062063430532637034 0.015683429985613236 0.9585788090068819
+60.267432144 0.2774233745832361 -0.0598201423342465 0.014705573070768592 0.9587708630984884
+60.307483302 0.2770237550885866 -0.04626981951180268 0.01089239699100195 0.9596865626894827
+60.347437713 0.27681844922520893 -0.029758710987930707 0.006486096043002889 0.9604394285154105
+60.381027699 0.277412988347121 -0.019566489315750134 0.0035415591196058336 0.960544972268961
+60.420908029 0.2785889332634186 0.01006048009946837 -0.005028237337328633 0.9603445786969375
+60.46097436 0.28091585121888696 0.017085858088799973 -0.007085293787664801 0.9595541446939199
+60.50093872 0.2822986613948781 0.021347961278119 -0.007982704177122624 0.9590557891791012
+60.534317552 0.28345973360606685 0.02364509443060165 -0.008600484591643576 0.9586540150638991
+60.567686078 0.28392580334411344 0.024721410965704366 -0.008800799821867556 0.9584871078724847
+60.601134895 0.28369488034782964 0.026191995964036263 -0.009400105294010322 0.9585107366286056
+60.64098427 0.2845070080118677 0.02567377340725567 -0.00941870582720424 0.958283834639669
+60.681035995 0.2852300783730423 0.012649299246872954 -0.005412466437362554 0.9583603199355323
+60.721056573 0.28443123442982315 0.007414061375186405 -0.004000247986348545 0.9586594299284287
+60.760950423 0.2845019932975103 -0.0008613114356811632 -0.001579706486831008 0.9586737601915314
+60.794346753 0.2848613354630318 -0.024229759872585188 0.005311685742634968 0.9582477363862157
+60.827683646 0.284014202386103 -0.032295726940009144 0.007338011729121775 0.9582479180505772
+60.861059918 0.2845095607832369 -0.045307837181211605 0.01156023760536584 0.9575321773284687
+60.894418265 0.2844159262635979 -0.06201152709322005 0.016353332129045144 0.9565535635412497
+60.927853232 0.28329829541775264 -0.07787573172405092 0.020758259805666403 0.9556393361889619
+60.967822384 0.28230882822833464 -0.09547560242921625 0.026050133702126322 0.954205179916366
+61.007852874 0.28180987820301423 -0.10726356102589757 0.029254292491293066 0.9530067719560443
+61.047793891 0.28092241133537277 -0.12055656628538143 0.033044621526746 0.9515549201823047
+61.081297135 0.28131808585239404 -0.13162044158457847 0.03630638562412605 0.9498515885612542
+61.121126465 0.2827108332999337 -0.14174546260265558 0.03957752898837435 0.9478483147453451
+61.154576236 0.283791753554629 -0.14830510399666721 0.0416675929157472 0.9464310056435885
+61.194722847 0.2854004613278448 -0.15143880308621713 0.04312906788465369 0.9453849740169706
+61.234615585 0.2865944179029341 -0.15324757293495053 0.04403714683332024 0.9446901876886443
+61.268036279 0.2866302970700691 -0.15064630796320014 0.04337631566709277 0.9451281701111915
+61.307955206 0.2860798252793477 -0.14874561154348634 0.04223665641173193 0.9456474720898108
+61.341304937 0.28563435663316866 -0.14678701439683384 0.0414955630347826 0.9461208722798826
+61.374700703 0.28531184809918114 -0.12376644738366559 0.03455950353679075 0.9497813730283127
+61.408128753 0.285867897914429 -0.11584382382246575 0.03246127675785646 0.9506871298883902
+61.441511647 0.28593200766477295 -0.10514477186184161 0.02907645558108238 0.9520199702074295
+61.481396216 0.28582490808609917 -0.0905523414362669 0.024889725185378877 0.9536691758456803
+61.514803789 0.2871992313567452 -0.07691973477045909 0.020965768695799105 0.9545472185564899
+61.554684279 0.28852221790137245 -0.05970025097906658 0.016157145254836726 0.9554735770640252
+61.588075195 0.28921573339151685 -0.05026073817264798 0.013231578080056611 0.9558519985325442
+61.621566899 0.28902458829576755 -0.03861862231306294 0.00967663376576401 0.956493466851743
+61.661394915 0.28920964147309014 -0.028077574915538837 0.006492429401688862 0.9568318982069594
+61.694815738 0.28931478822671375 -0.022769474428963054 0.005223037165444572 0.9569489141173259
+61.734797182 0.2886196224288099 -0.018122548407617643 0.0037215693259306628 0.9572650817354705
+61.774938242 0.2877273086742173 -0.020184227380927657 0.004100389174710778 0.9574908770409997
+61.814938254 0.28860733071930167 -0.020200513099549178 0.004400111764258237 0.95722431380636
+61.84847218 0.28875919295377667 -0.02466856135980777 0.0056226707181293 0.9570673832803606
+61.888382085 0.2868986877286922 -0.035891258963021734 0.008758331470854126 0.9572482708991699
+61.928269187 0.2848074621127248 -0.04726902322872832 0.01215780260011114 0.9573413898938286
+61.968318182 0.28381385518873375 -0.057337360004308904 0.014956490296768757 0.9570467209852649
+62.008424942 0.2834565449505991 -0.07891109639227538 0.021222548942302456 0.9554972681317461
+62.041827025 0.2827147524815781 -0.09533837404096494 0.026079160563548875 0.9540979197906292
+62.081712008 0.2835224224197247 -0.11310352924741736 0.03136085550925628 0.9517558113291231
+62.121640667 0.28516155946180044 -0.13185773876604248 0.03695805643671476 0.9486466801698306
+62.161637419 0.2885637616404501 -0.14642537987815493 0.0419411640547271 0.9452679526743653
+62.195031152 0.2918918358347289 -0.15595855502800993 0.04568280976347906 0.9425439863362987
+62.228512856 0.2947915046390717 -0.16447734235562703 0.049135778232572196 0.9400164083364405
+62.268405621 0.2973761095573238 -0.17183142899332057 0.05231330381434036 0.9377124973672327
+62.308522313 0.29812810348935065 -0.18173747143537178 0.05543336138117255 0.9354241112095116
+62.341934684 0.29801463716053067 -0.18514483088932002 0.056202760430945714 0.9347459105837181
+62.381822543 0.2979245286258951 -0.18514487503268026 0.05616388755648625 0.9347769617543609
+62.421928382 0.2995523883022208 -0.18661466857341408 0.056872414930442684 0.9339212282391112
+62.461770589 0.3007365446583887 -0.18039157304908446 0.05517915728209339 0.9348645204955892
+62.495282167 0.30022041504782776 -0.16600290707915755 0.049898563917465326 0.9379876707871769
+62.535280767 0.2978254459637583 -0.1628123460742277 0.048302961138273384 0.9393928718313593
+62.575271511 0.2927147726873752 -0.15690826899251742 0.045402425878007635 0.9421446155961101
+62.608663599 0.286404822110078 -0.1521919670442699 0.04302991809568021 0.9449647131972545
+62.648664754 0.2792963135003527 -0.14883539420674555 0.040629007611222547 0.9477293276231155
+62.688583807 0.27650900443530846 -0.14507150809035033 0.03900127006501638 0.949197518401677
+62.722013011 0.2757161863938473 -0.1437084366514177 0.03850226034154197 0.9496557511773573
+62.76204976 0.27562033538357833 -0.14227281164287617 0.03830282599851614 0.9499077698970579
+62.801974933 0.275125992387055 -0.14077764179702965 0.03790358092137181 0.9502897781395117
+62.835410443 0.2737120039082373 -0.14101231850801518 0.037403267462409705 0.9506830494590017
+62.875370115 0.27308301603726287 -0.13395448039718916 0.035370276453400545 0.9519615575626577
+62.915414692 0.2658904368289764 -0.12701364460125542 0.03250157604817458 0.9550463115694375
+62.948840307 0.26166074146074464 -0.12881301053463154 0.03180321222827083 0.9559965587737133
+62.98220057 0.2612686416605179 -0.1278545635588067 0.03105491294941914 0.9562570260362844
+63.022028478 0.26644026275902405 -0.12811085776695608 0.03264199356153755 0.9547416900709038
+63.055412647 0.26884135554383154 -0.1278137534498672 0.03280352983689863 0.9541026665976002
+63.095569362 0.27101884188485453 -0.12780888558259929 0.03340232221016288 0.9534662872805177
+63.135472554 0.2700953628187982 -0.12709006175872004 0.03308657714580149 0.9538353577000181
+63.175458795 0.26795909854581584 -0.129350491791601 0.03340080623526233 0.9541230308102929
+63.208911137 0.26435129431231846 -0.13191133229816376 0.03330286099718616 0.954782023844253
+63.248792856 0.2628103336504036 -0.13040512750385322 0.03262339091024838 0.9554375676164218
+63.282240414 0.26311020327320933 -0.13050506091658615 0.03275020240941291 0.9553370474606495
+63.315635148 0.26339183339590566 -0.13045815523136886 0.03287699510500992 0.9552614903924668
+63.355570487 0.26351772633217535 -0.13035070600370108 0.03282317673298574 0.9552432886035959
+63.389101183 0.25931271446282833 -0.14020103785137325 0.03480109946876105 0.954929038504476
+63.428970599 0.2551229596991654 -0.1395125553823347 0.03401113070096952 0.9561860516204315
+63.46898607 0.2560003571369712 -0.13890487248862282 0.0341925765899839 0.956033535630838
+63.502432967 0.2572087388153544 -0.13940473635637793 0.034301165401892125 0.9556324681646682
+63.536008704 0.2577122609524792 -0.13840658484991508 0.03420162718112064 0.9556454659145871
+63.575632014 0.25821791987023207 -0.1386262079074321 0.03450239440558873 0.9554663076840424
+63.60921073 0.25822738085573405 -0.13841467664769014 0.03420362674386562 0.955505159055915
+63.649086326 0.25810946063986767 -0.13840429321403241 0.03430125726442255 0.9555350237946283
+63.682468557 0.2581284147957332 -0.1385494421287691 0.034403787171535145 0.9555051820838569
+63.715828042 0.2580193803659286 -0.13833647818762831 0.034228658435329226 0.9555717749598635
+63.755707572 0.2578230534211806 -0.13858943437308835 0.034303067231755226 0.9555854443131813
+63.789079711 0.2569187840801675 -0.14606903584460204 0.036091826850644285 0.9546486029889636
+63.822464671 0.24362501333806216 -0.17087707394123441 0.040672210528031806 0.953831038375285
+63.855833243 0.23758004409366493 -0.16754055393694606 0.03816990524571669 0.9560486095217577
+63.895896852 0.23794496569337004 -0.17022896998692733 0.03940256580395416 0.9554327443030388
+63.929355883 0.23881305941020078 -0.17830975080753264 0.04149134794591114 0.9536521501405671
+63.9692235 0.23912270819126671 -0.17639606135460537 0.040795027248123984 0.9539604424281342
+64.009199932 0.2403130344044474 -0.1769099918860005 0.04130198195602294 0.9535442551621433
+64.042571409 0.2409098335335081 -0.17726412159570387 0.041701702193222445 0.9533104695407204
+64.082558493 0.24111473617741602 -0.1762107694502725 0.04160254261709045 0.9534582723830295
+64.115950647 0.24021800141042882 -0.1773132874690634 0.041803132635120414 0.9534714510603781
+64.155900702 0.24082688018823045 -0.1763196801378116 0.04170465491631732 0.9535064267917729
+64.18924529 0.2409076773069191 -0.1766128860660676 0.041901335322374056 0.9534231262079821
+64.222754713 0.2404164794523016 -0.1765327440663529 0.041823510363253796 0.9535653625531181
+64.262702332 0.24062498750884803 -0.17609446986537078 0.0417043307527804 0.9535990257260457
+64.30275806 0.24092503341152474 -0.17671836199176597 0.041904354088596454 0.9533990633092841
+64.342809314 0.24083320204607145 -0.1759146992861333 0.04170348470853757 0.953579680325913
+64.382700693 0.2405170352223008 -0.17641249485743807 0.04170295371629915 0.9535675388127394
+64.416184431 0.24056521230446204 -0.17590893625023213 0.04170211848570028 0.9536484457545273
+64.456125522 0.24061449264735138 -0.17631061950842913 0.041802517841476663 0.9535574344939715
+64.496032895 0.24062297337195407 -0.17611681467498388 0.04180399121757141 0.9535910436831182
+64.529717853 0.24070870538774838 -0.1763063762353969 0.041801511779010724 0.9535344851982471
+64.569622489 0.24071819416869888 -0.17611331114710377 0.041703152043351656 0.9535720737010984
+64.609475668 0.24070890132552572 -0.17630651974943992 0.04178206820719111 0.9535352613788483
+64.643018115 0.240713953388724 -0.17621021432111827 0.04170241735068463 0.9535552744335203
+237.224652599 -0.7398448860850116 0.02880199027778505 0.02600172727781124 0.6716575764989666
+237.26459653 -0.7372147911859329 0.029190583961903285 0.025722260357686447 0.6745373427666818
+237.304577638 -0.719774213481204 0.024585925767784924 0.021717065753797272 0.6934327529881326
+237.338274005 -0.7065618911623412 0.02311168683405692 0.021108277492017914 0.7069586865652762
+237.377909861 -0.7029157775106044 0.0202262565466694 0.017676291691649994 0.7107656836010039
+237.411334506 -0.7065108557314751 0.01991394273749358 0.019157448950281628 0.707162525709574
+237.444759512 -0.7066496268974564 0.021287525981304834 0.020379923502217845 0.7069496479674665
+237.484615802 -0.7085189490191697 0.02103443639616331 0.020916670756841563 0.7050680422843719
+237.518174235 -0.7032733386680614 0.019396886854743087 0.02049211851203453 0.7103593773421388
+237.558096176 -0.7011389792290881 0.022573860527453183 0.025281284609096007 0.7122186527148762
+237.591439633 -0.7116380918435294 0.020814186798997172 0.02342727837692802 0.7018469623023575
+237.624809877 -0.7142359766518366 0.0244222614330849 0.02459588541984571 0.6990461824680148
+237.664758513 -0.6883823330947716 0.02078155641383355 0.023101642546811355 0.7246821403261273
+237.698193782 -0.6418943843669256 0.018006441479894 0.02266905587123676 0.7662463580920589
+237.731617528 -0.6067771801183071 0.01863711239024718 0.023073335359475672 0.7943184077716052
+237.771560356 -0.5912876062541214 0.02099286459940562 0.022800858396953828 0.8058649931486939
+237.811430199 -0.6152911676118697 0.029743209425535877 0.027543034522966206 0.787256947763027
+237.844900693 -0.6516273881691241 0.02733493544917675 0.02600113227053243 0.757600481396709
+237.885046453 -0.6636923427193527 0.026877123905247095 0.027106730051557944 0.747031003113118
+237.924951961 -0.6568099397047276 0.02603639084756669 0.026168119409953988 0.7531520689630026
+237.965042646 -0.6534747112605533 0.02540290429448739 0.025666812022707472 0.7560864427808057
+237.998432626 -0.6509603119699333 0.023112637992068807 0.02398122870212651 0.75838076114508
+238.038373687 -0.6518610896148515 0.024282998066971213 0.026792872097090355 0.7574758067792048
+238.071807186 -0.6523312880969664 0.023697992628947867 0.02406036089311443 0.7571812165847778
+238.111745652 -0.6541333862571794 0.023704463170307794 0.026628799095168607 0.7555385618671443
+238.151660619 -0.6551582775796915 0.026902393019224084 0.025929784086878592 0.7545671201860434
+238.185055706 -0.6539363742338972 0.027039839756743497 0.028388807721200768 0.7555330178859974
+238.224994003 -0.652245341533551 0.02883335334408795 0.02866763586874644 0.7569166525030437
+238.258337377 -0.6492631197767772 0.027507326320962183 0.024420982651544156 0.7596738536390019
+238.291777781 -0.6463246800306472 0.030203130788683277 0.028002902717984494 0.7619501403065756
+238.331816336 -0.6417429834184132 0.02973726885534526 0.02591589327909385 0.7659046967800928
+238.371776423 -0.6364593181664243 0.02849356837761892 0.027223983453827823 0.7703028674522419
+238.411753748 -0.6290274181709601 0.0316022530027864 0.02614681523754289 0.776300295534697
+238.445094107 -0.621693604302577 0.031118363054238585 0.026102653773446564 0.7822067254352133
+238.478469514 -0.617013808729699 0.03326661036518229 0.025589466936078956 0.7858323432218917
+238.518569694 -0.6131338818246268 0.03307181434644744 0.026436454278204645 0.78884359155646
+238.558465278 -0.6292927738169665 0.030655855388338288 0.021713493844222557 0.776259845372176
+238.591893193 -0.6378941040430138 0.03199957415778331 0.021558830862241703 0.769156912530034
+238.631944176 -0.6271538701270035 0.03323997536894822 0.026351955926561813 0.7777394818581849
+238.665330098 -0.5905127439272005 0.03290102473176915 0.023453149952717144 0.8060162353131998
+238.70531927 -0.5733654448877479 0.03278302238490831 0.025601998148518296 0.8182431654115963
+238.858595665 -0.6130995875387844 0.03594102126302643 0.022020851374104526 0.7888803590248035
+238.891960809 -0.5880713019710265 0.03769197803191883 0.02311304540425028 0.8075996816011534
+238.925379419 -0.5734855512032803 0.03682319432298265 0.022278843954877052 0.818084364862791
+238.965553319 -0.5569114281884976 0.03934392474727085 0.02327021473008288 0.8293130975964054
+239.005490219 -0.5481361669675943 0.04184904788369592 0.025048255195668417 0.8349658583229344
+239.04536653 -0.5485901390509745 0.040902715418226786 0.023647850247542943 0.8347554171049852
+239.078977707 -0.5491597841097845 0.040132500891461004 0.0229317141831777 0.8344381644995109
+239.119176823 -0.5473186385746069 0.04160296761048178 0.022751179345660618 0.8355799691191871
+239.158778348 -0.5445705381193571 0.04157381085158515 0.022324953055749167 0.837386496030793
+239.192218698 -0.550261828806127 0.04060233999774576 0.022601435837753075 0.8336981137340519
+239.225675996 -0.5547888547499716 0.039830711121631945 0.020129149871999628 0.8307933909355507
+239.259023645 -0.5568821236861582 0.04090318897651194 0.02436319252774728 0.8292259428528524
+239.298827899 -0.5666330578628691 0.03909509744202021 0.020062966517381382 0.8227976838005171
+239.332263476 -0.5756114966686485 0.040498957890201776 0.02240038010407117 0.816412556422229
+239.372266675 -0.5810681018589907 0.034107145619721294 0.01710974908846781 0.8129599129759072
+239.405604515 -0.5936616049119721 0.04081131010694034 0.021719302649958704 0.8033857154026927
+239.438948668 -0.627638922925641 0.04232908794896426 0.020738562164078395 0.7770762786120272
+239.472315909 -0.6432891548836509 0.040580441231301535 0.020878436195524163 0.7642619851206658
+239.505813017 -0.6415426694839114 0.040304059466855356 0.021763165689755417 0.7657185844950543
+239.54560886 -0.6325430527964304 0.036403340116676834 0.019860130466871854 0.7734142863984094
+239.578950703 -0.6249371039304736 0.038236719767479194 0.02133236741719445 0.7794462774898561
+239.612357077 -0.6262389018208373 0.038079984561546563 0.021600614098840124 0.7784010316620714
+239.64572434 -0.6294433047169053 0.03891086160143383 0.020487595873406907 0.7758010888184054
+239.679065633 -0.6327580022048975 0.03972190072611971 0.02002299569503784 0.7730708640815328
+239.712583156 -0.635157093496259 0.04406319601429506 0.02342248780517333 0.7707692835105762
+239.752536358 -0.636784906242236 0.04345734208913995 0.020565576239353314 0.7695410968067642
+239.792381657 -0.639159534914996 0.04638397560371163 0.022496762458775955 0.7673444542142165
+239.825895897 -0.6423973545820866 0.04518489070093774 0.023649082539650847 0.7646729270566037
+239.865988228 -0.6435476610183528 0.046117123960465585 0.023415442678233086 0.7636565562604728
+239.905810086 -0.6479926071669341 0.04708001288789257 0.025347004697747352 0.7597674531041243
+239.939230309 -0.6538293515860074 0.04695267676296676 0.02326001572880971 0.7548255406500957
+239.972745715 -0.6557733073619862 0.04713364913710568 0.023501531331391216 0.7531184943258411
+240.012586389 -0.6582987223720739 0.04786685633500892 0.02444960263871173 0.7508353835020748
+240.05252711 -0.6700262578599798 0.04300530392524151 0.017322349472025912 0.7408881790265104
+240.085969655 -0.7001708375552325 0.044196381582831165 0.019186952256127054 0.7123477654596175
+240.119389433 -0.7210171826308943 0.043655057963665735 0.02040226519295533 0.6912396153579402
+240.159243469 -0.7292553754727438 0.04315211551348799 0.022799589687022344 0.682498843208486
+240.199351733 -0.7328958141178934 0.03984653537153811 0.020058966915709527 0.6788767318988252
+240.239255958 -0.7392580145346286 0.040533371904498364 0.01993244109385431 0.6719057459944888
+240.272685278 -0.7440371721386948 0.04237320511099688 0.02124227062326568 0.6664547725864403
+240.306045977 -0.7491917310420214 0.040609613752215425 0.017808660763861464 0.6608672037640793
+240.346166128 -0.7535554430214993 0.040696543331009145 0.01900139803239348 0.6558482541917708
+240.386025549 -0.7563236059040115 0.04090972361520709 0.01872382837338613 0.652648769183797
+240.419548684 -0.7572022343054041 0.03799379700621332 0.02113207278048279 0.6517320640047987
+240.459425203 -0.7588321903106341 0.03810428629021577 0.01760080560694561 0.6499322902862001
+240.492855212 -0.7606906238959252 0.03776501398651325 0.01996377356278154 0.6477075159210062
+240.532733447 -0.7616749154204283 0.03730218337940114 0.017870713111560747 0.6466378491453291
+240.566139425 -0.7619988154362971 0.03600061610258555 0.019400489625791807 0.646285836078893
+240.599512374 -0.7639172030025358 0.0369748529559444 0.016244060771824553 0.6440492975660405
+240.63955173 -0.7619946257186881 0.03763024234044501 0.018282317981459534 0.6462305409731581
+240.673226409 -0.7627946315747083 0.03747640716029538 0.018868154977860513 0.645278127379886
+240.712977483 -0.7874763771384581 0.036703365723037104 0.019842236049353017 0.6149309750387045
+240.752841427 -0.7932514643598876 0.03650291347851922 0.019138810554269938 0.6074976193608018
+240.786276718 -0.7873101904571339 0.039632257426235176 0.022001393176875588 0.6148885158074824
+240.826387453 -0.7807397286608538 0.03861306972099767 0.019150943750093352 0.6233680680711665
+240.866407073 -0.7780167852440415 0.04018876600093528 0.01977046881212255 0.6266449341762831
+240.90626368 -0.7770544034990937 0.040793166763709254 0.02110658808902222 0.6277554328616332
+240.939623332 -0.773756269311581 0.03873000636236827 0.022850093583271003 0.6318853499895617
+240.972990291 -0.7705633609395449 0.040243112752171024 0.021782805146814233 0.6357185761431742
+241.006524855 -0.7649289126254382 0.0406568845388112 0.024278660844678453 0.6423716393154758
+241.046515904 -0.7585653724527895 0.041864354220823456 0.02236362999526692 0.6498660012761625
+241.086410399 -0.7590491325849261 0.0423037432165785 0.025020245235346746 0.6491754731660002
+241.126376736 -0.7608761501913889 0.04051535304488624 0.02207799609793322 0.6472546271181681
+241.159723766 -0.763111740906569 0.042180996459945566 0.024841424643631663 0.6444099146117063
+241.193190873 -0.7657056982338764 0.0412532437792336 0.02205006662221007 0.6414879173700928
+241.226680258 -0.7800509523526011 0.04082885668824386 0.021754262779086094 0.6240034200597536
+241.266542382 -0.7878570149977546 0.04050294899629278 0.02490181308660963 0.6140201419712802
+241.306530322 -0.7937301074622842 0.040448216200342994 0.023779360466155745 0.6064577481819666
+241.34648746 -0.7953611626425902 0.04038263266062048 0.0270381090412026 0.6041844127405975
+241.379869979 -0.7979080359031728 0.04169295130797545 0.025582584389363262 0.6007911412698537
+241.419866053 -0.8020346459463255 0.04031729865444801 0.027801714424672327 0.5952663326663196
+241.453324024 -0.8021744889231099 0.040203733268556315 0.02767496999175672 0.595091459515404
+241.486664985 -0.8021993865822173 0.04015406314749203 0.027802583829647017 0.5950553013899271
+241.519999899 -0.8006753898767827 0.040994413663027834 0.027608897116518285 0.5970562175323998
+241.553356735 -0.800629081395388 0.04167112845056958 0.02740393024429167 0.5970809121758955
+241.593333504 -0.8000552981777835 0.039282366786158714 0.02970205294485021 0.5979014998878972
+241.626691213 -0.799600529840944 0.04018235251939279 0.025221509036599372 0.5986553655535093
+241.660145009 -0.8006425422975403 0.04079847331279591 0.02910947405960326 0.5970424126966609
+241.700003673 -0.8004875900298837 0.04099529348393601 0.026387724774763914 0.5973631157859731
+242.720558703 -0.794450343530368 0.021729453520980112 0.03624393879652909 0.6058571278896314
+242.760454466 -0.7950640377780425 0.024836050594316345 0.034944504321129055 0.6050084528671501
+242.794103122 -0.7819008218387371 0.02060918070083504 0.03545406344966234 0.6220525507251421
+242.83403055 -0.7629413999181803 0.028900595538859982 0.04050008098162014 0.6445501681862077
+242.873829245 -0.7580740197433834 0.02470217157341355 0.03871078036053453 0.6505498126919601
+242.907301163 -0.758829264307354 0.02860248727435542 0.03957688868944677 0.6494564767820422
+242.947372815 -0.7623713427443437 0.02649413019336018 0.03832578769088851 0.6454604022133013
+242.987461621 -0.7637815838681922 0.02730291638025618 0.03640388850700824 0.6438687752970303
+243.027253869 -0.7616177267712572 0.027439704419571852 0.036416624517971244 0.6464203975338854
+243.060659886 -0.7604374493482504 0.030908341136354635 0.03497066186737446 0.6477318989253837
+243.09401031 -0.7735665648355493 0.033803728624669155 0.0376081341625404 0.6316943136869367
+243.127388229 -0.791929356078706 0.031169605853374218 0.03485865020635539 0.6088195341457948
+243.16074622 -0.7959355246960755 0.030774438423373705 0.034264996897322 0.6036269414581621
+243.194248473 -0.7929810467862657 0.03296087825419788 0.035888063432670286 0.6072945634908344
+243.233985182 -0.78504977820596 0.034002198937717595 0.03440189434575279 0.617541258436711
+243.267587731 -0.7785228240679044 0.03312143077675334 0.033703783679774224 0.6258348329985337
+243.307450961 -0.7743803674115186 0.03242764746757066 0.037178671653781824 0.6307941348977342
+243.340870149 -0.7748086221488291 0.028920749638342725 0.03282099712563151 0.6306805621167253
+243.374236749 -0.7759793421386333 0.03359608267896157 0.03408935798259871 0.6289398059234736
+243.407665296 -0.7772879387144771 0.032521657399209696 0.03450307063968944 0.6273558322399183
+243.447583812 -0.7788086853502265 0.03432244926460159 0.03554459571356544 0.6253123881829706
+243.487506729 -0.7818954694066684 0.03255672619385175 0.0353467846351223 0.6215546149107273
+243.520864347 -0.784278968627682 0.032986754940516415 0.03357024721393656 0.6186205718118247
+243.554311235 -0.7868957125355791 0.03698578020564404 0.036168606278630576 0.6149138326428871
+243.594197731 -0.7902765231685532 0.035827896450185366 0.03318934555182752 0.6108009873161794
+243.627636256 -0.7934598347217816 0.035382648985657204 0.03566265088442944 0.606545739549736
+243.661027148 -0.8052147827536443 0.038174259153005104 0.03720337355739193 0.5905825840380581
+243.700991524 -0.8291901340181825 0.037995973170304405 0.03515571618560939 0.5565645544671588
+243.734370962 -0.83509730954713 0.04003248448780763 0.036922347441520044 0.5473998758058738
+243.774402322 -0.8198314283616239 0.03764953561266079 0.032976020427303285 0.5704134672458818
+243.814480121 -0.8054633799247986 0.038357166197690716 0.03364830924751279 0.5904449700744229
+243.847913394 -0.8028464662978672 0.03550362042066799 0.03260220003156211 0.5942340793350336
+243.887739277 -0.8105031136087074 0.04011207707689189 0.03300265080081505 0.5834265584829745
+243.92769101 -0.8185163084845994 0.037888173152325906 0.032675454248351755 0.5723004925470424
+243.961154419 -0.823418853455404 0.03692683561043423 0.03360259745697052 0.5652332846092247
+244.001043379 -0.8268167768205759 0.034092419986228 0.032927749161793134 0.5604707733706146
+244.03450406 -0.8301858796962555 0.03593063620207311 0.034086782132382455 0.5552823478366015
+244.074515133 -0.8322518736899639 0.03527525947168676 0.03269428096774672 0.5523074857366608
+244.114529925 -0.8349697708900148 0.03588213317955448 0.03596343772328037 0.5479457868854224
+244.154597694 -0.834974971113073 0.035574076353461645 0.034544866154355945 0.5480492084919919
+244.188142254 -0.8341544866192296 0.03522830925146127 0.03421536706050674 0.5493401199049707
+244.2278879 -0.8339667080706517 0.037112152092703826 0.03520268466225661 0.5494387945799042
+244.261326426 -0.8338501520547195 0.03582483636170743 0.03121369300777566 0.549942006385032
+244.294858025 -0.8336788367480741 0.03572444280238121 0.03482435768593056 0.5499914776217899
+244.33459512 -0.8333759764707798 0.032271374510706746 0.031734460715658185 0.5508502194169032
+244.374535448 -0.8338381907472637 0.03687101017793684 0.034501580212018 0.5496944980829462
+244.407988351 -0.8334485181807082 0.03500440691503399 0.030701787266795948 0.5506320543680081
+244.441348514 -0.8343814765829702 0.03518358394791308 0.03570219247145967 0.5489034709386829
+244.474893758 -0.8336025385320821 0.0354563778747961 0.03449439015292214 0.5501452445207959
+244.514606905 -0.8334164674511001 0.03513605823197383 0.033270832259868106 0.5505229340490589
+261.742808571 -0.492390337246879 0.02761474303904702 0.02918992189195911 0.8694464504572628
+261.776378882 -0.48682071379739567 0.029633345065584637 0.031439369275732446 0.8724328189250805
+261.816359221 -0.46278316432593464 0.042966379369456555 0.039929856322520406 0.8845288235181586
+261.856255245 -0.4364826657557189 0.039018122632218266 0.03889695019679967 0.8980242178618716
+261.889617012 -0.40534723562500025 0.05057737482168146 0.040945473304809334 0.9118437453550706
+261.92301596 -0.4110476949285202 0.05790648721927345 0.04770811563288436 0.9085210877765215
+261.963055751 -0.4528477920897629 0.053507990588702134 0.04520407847818043 0.888832022055644
+262.00313968 -0.4702518066407381 0.06310344281097734 0.05529647924120107 0.8785348560188441
+262.036483884 -0.4761414437583875 0.060736790013897105 0.05157378623604043 0.8757513987700879
+262.076405694 -0.4812953535919647 0.06598484871490432 0.05747814962520306 0.8721794796178821
+262.109740578 -0.4876601820802172 0.0667707860672644 0.058342405950877044 0.8685190686503734
+262.143299317 -0.4919022542838608 0.07434590779148013 0.0632902792169759 0.8651584818874252
+262.183013211 -0.4984287966872071 0.07269072338000834 0.06320437753256815 0.8615625340206912
+262.216442071 -0.5067808238927949 0.08285415137576507 0.0707274172226619 0.8551643225645895
+262.256639628 -0.5185293751509472 0.0817992261845819 0.07073329780268191 0.8481939485065483
+262.29649362 -0.5277778670740825 0.0909772739298654 0.0791509258262726 0.8407786805074605
+262.329980071 -0.5379426006928065 0.09243346559147012 0.08101851306186507 0.8339723096961043
+262.369948234 -0.5494691869768229 0.0989374779731067 0.08267584488145745 0.8255057193554068
+262.409808927 -0.5576234483276423 0.1040292906370292 0.08986680595659953 0.8186317571117704
+262.449800633 -0.5633853831281898 0.10419232251821237 0.0906687360471637 0.8145674007160939
+262.489861551 -0.5671783877908197 0.10166763029185129 0.090148851798643 0.8123087798942176
+262.529911177 -0.5756197916112045 0.10696082555957338 0.09720520317847695 0.8048430814612989
+262.56997375 -0.5687882709979508 0.09596812028204671 0.08556701867675583 0.8123720256012412
+262.609853522 -0.5615109406583646 0.08894432496118791 0.08335492231888024 0.8184414013864222
+262.643276813 -0.5621995622183242 0.09236672514071978 0.08203435753785487 0.8177226941400458
+262.68331509 -0.5652046223756785 0.09149095540931225 0.0792894395324198 0.8160185811010021
+262.716713959 -0.5792666486301181 0.07541814343364919 0.07346740403770038 0.8083098378529203
+262.756684576 -0.6327026201780289 0.07314176725312356 0.07318043642833083 0.7674518226098013
+262.796721622 -0.6867117743077357 0.07253510126562135 0.07413523648881502 0.7194925745428198
+262.836624835 -0.7026505013220113 0.07255152169512319 0.07050692745189623 0.7043062706471819
+262.869991225 -0.6961192155330221 0.07078602036596023 0.07135737268391958 0.7108554722656977
+262.903445924 -0.6896244783031741 0.06977794592203947 0.0636563069737576 0.7179811917943524
+262.936843485 -0.6974285771125298 0.06741535042046969 0.061791339797198495 0.7107955969760537
+262.976781499 -0.7175640009150057 0.07108412266598935 0.05977200750756993 0.6902725977569812
+263.01015257 -0.7339481096858896 0.0708928757550175 0.05636305072004498 0.6731400886659645
+263.050089341 -0.7488010480670951 0.07039084133393367 0.04925384282377272 0.6572033009936971
+263.083433029 -0.7650276565384505 0.06608428793880212 0.046159723792380945 0.6389325719653987
+263.123580477 -0.759769112365214 0.07120439637288271 0.051619252283097564 0.6442175739815563
+263.163652675 -0.7395908309264311 0.08969193491507335 0.03875318628266474 0.6659271357841506
+263.203570002 -0.7138426882345714 0.08041083482311241 0.03470125541199424 0.6948082735330102
+263.243520895 -0.6905059060909539 0.0680043831659756 0.033929833028546276 0.719323129027825
+263.276978085 -0.6735392545108225 0.07094116690038248 0.05053340002649777 0.7340017704022106
+263.310351264 -0.6535198118300644 0.08169482521562137 0.048827371442678846 0.7509019236069282
+263.350348329 -0.6285031016449124 0.06540252568789343 0.033638237266481574 0.7743221744532267
+263.390215901 -0.597597759975782 0.08041849222986115 0.045151379258440816 0.7964741906241932
+263.423631479 -0.5855794838506132 0.06666940243972289 0.03496655077367687 0.8071116398606649
+263.463657246 -0.5845601318882496 0.07226772360141404 0.034338932523008195 0.8073956069024912
+263.497184693 -0.589325291486152 0.06999637263091353 0.035476477527406215 0.8040756358549386
+263.537050353 -0.5931609242298242 0.07129197916553609 0.03660375961357539 0.8010853490456764
+263.577229306 -0.590704120917637 0.0705189697772078 0.036731944054572675 0.8029610704875143
+263.617137181 -0.5877951213932916 0.06688175186599517 0.03978050132459503 0.8052584915714612
+263.650505531 -0.5885396442081441 0.06680449997128976 0.03910127750133417 0.80475420848648
+263.690427283 -0.5860902186568708 0.06565280929277087 0.040128839421852636 0.8065839326898123
+263.730486075 -0.5916245608673145 0.06052850817983245 0.03809646185305764 0.8030350791032479
+263.764034955 -0.5954060180692134 0.06401254344918918 0.04038745934692126 0.7998518119349546
+263.803941131 -0.6009381353312887 0.06158764547490287 0.038086154078189126 0.7960086458682116
+263.843968779 -0.601188718705783 0.06170522943653155 0.03720362711233978 0.7958520461057882
+263.883795881 -0.6041257681638235 0.06243057055249998 0.03910166782851432 0.793476867762374
+263.917149503 -0.6057301358239046 0.0590029354690612 0.03650181601052091 0.7926394347928458
+263.950528031 -0.6080634013365945 0.06048437618307217 0.03908286242362899 0.7906156272535295
+263.98395776 -0.6115813643241973 0.0615029372596799 0.03869753532337942 0.7878376255800946
+264.02402125 -0.6096917676270661 0.06497343686839953 0.04135971642311708 0.7888876820224101
+264.057500051 -0.6052202428728259 0.06308817907674807 0.03760298037333147 0.7926628256357054
+264.097336955 -0.5926158386131634 0.06392423657699592 0.04070258960181896 0.80191237613755
+264.137350425 -0.5713310415499188 0.06501045153289282 0.03998309797578019 0.8171632848025134
+264.177556814 -0.5624531659050787 0.06614190727716705 0.0404084276423265 0.8231882185992262
+264.217318908 -0.5494980844410502 0.06670474225761372 0.03930034106594068 0.8319001236615261
+264.250654226 -0.5335587415490124 0.06444960489227361 0.040048110162840045 0.8423523411365634
+264.284025954 -0.5079092288151696 0.06365611557014426 0.035546367802650525 0.8583196199382481
+264.317373401 -0.48606852198966877 0.0629840680658517 0.03542041845945029 0.8709281216362305
+264.350790037 -0.4737681769746858 0.06021818663254122 0.030406992407089835 0.8780620133552792
+264.390799451 -0.46115125378317784 0.059743582610039564 0.029793664094503413 0.8848065116458765
+264.424157809 -0.45145793664761047 0.056941380067110955 0.026838732954425747 0.8900691507334337
+264.464123518 -0.4375945786764074 0.05598087255134386 0.02476207947184981 0.8970863760205243
+264.497628602 -0.4232633740128462 0.0557021561900418 0.02447444228530421 0.9039614967961107
+264.537516814 -0.40976446304231784 0.051697068436898794 0.020471949480633984 0.9104951384972542
+264.570953282 -0.394404762834615 0.05649619527227564 0.022199131234126868 0.9169298018635768
+347.143468116 0.4730519346282629 -0.06221664456394384 -0.021076123747344584 -0.8785822404826131
+347.18332169 0.4648592034940948 -0.06187319382945125 -0.013535347229064071 -0.8831163135100425
+347.216678041 0.44476200771752367 -0.0750702575895775 -0.02079571159351462 -0.8922548690233253
+347.250059703 0.4365460120904825 -0.04296919106067979 -0.015423656303356275 -0.8985228649142565
+347.28996064 0.43028404268218046 -0.06387543895312994 -0.04280942086964046 -0.899412544051077
+347.323446715 0.44809170396511877 -0.04104020887525186 -0.05126545982605537 -0.8915724192245604
+347.356899921 0.48925795075881234 -0.04803711142677635 -0.059733227690227084 -0.8687640848094301
+347.396893155 0.5239674490283242 -0.03998553782005044 -0.053927633452822386 -0.84908838142691
+347.43697453 0.5315155721034144 -0.021464538394438206 -0.058758469653814725 -0.8447354097272327
+347.470330691 0.5037041385344577 -0.030576215470486272 -0.06966944538685836 -0.8605192643109448
+347.510236723 0.4545578437293535 -0.029488655136588736 -0.0791907512372356 -0.8866997298075816
+347.543585399 0.43450533757488047 -0.034308086723568595 -0.08974978294096142 -0.8955294764921797
+347.583513418 0.393449902051833 -0.014749737676544522 -0.08293897946586651 -0.9154784243765862
+347.616963521 0.38354208486947444 -0.02777757660563286 -0.077284434012173 -0.919864659409912
+347.65041836 0.38698802213408134 -0.03715615252394913 -0.08295334299492432 -0.9175938284122966
+347.690161084 0.3983786712713217 -0.007501916893747665 -0.07418855541829539 -0.9141849997478422
+347.723539363 0.40259613132462235 -0.021110313238303816 -0.07665253807862202 -0.9119183615453379
+347.756932275 0.40113316061560916 -0.013092739112825628 -0.07180545208523943 -0.9131071923317052
+347.796937718 0.3819278328053421 -0.022587278562296493 -0.060477766673134876 -0.9219345883054795
+349.31776045 0.40910432265814306 0.01678086795843859 -0.005840281520681834 -0.9123146095315708
+349.357902582 0.40562481581795595 0.02008156672452735 -0.004100331383478491 -0.9138098416810159
+349.3977756 0.37812767583828616 0.020411226141690005 -0.002022521124874527 -0.9255262027737672
+349.431331935 0.3660248648532596 0.01859780583343839 -0.004765823635339921 -0.930407011394697
+349.470994107 0.3639449660241751 0.01633510706619165 -0.004409753837888614 -0.9312667609519237
+349.504374961 0.36648487325138274 0.008994882729107818 -0.006562673605771192 -0.9303573835240689
+349.537824176 0.36488204611016994 0.00864716930228317 -0.007275381984313243 -0.9309851705083685
+349.577759027 0.3635893202800476 0.004373257049036545 -0.008436823042478997 -0.9315108699408859
+349.61780063 0.3554795000826525 0.005240242412714433 -0.005117332223630488 -0.9346553791592689
+349.657798937 0.3473621577382386 0.0036648960411413793 -0.005554370365892558 -0.9377074431176715
+349.691153707 0.34494037906991837 0.004945084104685389 -0.002184370522349425 -0.9386090291253968
diff --git a/build.sh b/build.sh
new file mode 100644
index 0000000..3c62b6e
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,3 @@
+conda deactivate
+cmake -B build
+make -C build/ -j $(nproc)
\ No newline at end of file
diff --git a/calibration/calibrate_camera.cpp b/calibration/calibrate_camera.cpp
new file mode 100644
index 0000000..9f4c055
--- /dev/null
+++ b/calibration/calibrate_camera.cpp
@@ -0,0 +1,130 @@
+#include
+#include
+
+#include
+#include
+
+#include "src/component/img_tools.hpp"
+
+const std::string keys =
+ "{help h usage ? | | 输出命令行参数说明}"
+ "{config-path c | configs/calibration.yaml | yaml配置文件路径 }"
+ "{@input-folder | assets/img_with_q | 输入文件夹路径 }";
+
+std::vector centers_3d(const cv::Size & pattern_size, const float center_distance)
+{
+ std::vector centers_3d;
+
+ for (int i = 0; i < pattern_size.height; i++)
+ for (int j = 0; j < pattern_size.width; j++)
+ centers_3d.push_back({j * center_distance, i * center_distance, 0});
+
+ return centers_3d;
+}
+
+void load(
+ const std::string & input_folder, const std::string & config_path, cv::Size & img_size,
+ std::vector> & obj_points,
+ std::vector> & img_points)
+{
+ // 读取yaml参数
+ auto yaml = YAML::LoadFile(config_path);
+ auto pattern_cols = yaml["pattern_cols"].as();
+ auto pattern_rows = yaml["pattern_rows"].as();
+ auto center_distance_mm = yaml["center_distance_mm"].as();
+ cv::Size pattern_size(pattern_cols, pattern_rows);
+
+ for (int i = 1; true; i++) {
+ // 读取图片
+ auto img_path = fmt::format("{}/{}.jpg", input_folder, i);
+ auto img = cv::imread(img_path);
+ if (img.empty()) break;
+
+ // 设置图片尺寸
+ img_size = img.size();
+
+ // 识别标定板
+ std::vector centers_2d;
+ auto success = cv::findCirclesGrid(img, pattern_size, centers_2d, cv::CALIB_CB_SYMMETRIC_GRID);
+
+ // 显示识别结果
+ auto drawing = img.clone();
+ cv::drawChessboardCorners(drawing, pattern_size, centers_2d, success);
+ cv::resize(drawing, drawing, {}, 0.5, 0.5); // 缩小图片尺寸便于显示完全
+ cv::imshow("Press any to continue", drawing);
+ cv::waitKey(0);
+
+ // 输出识别结果
+ fmt::print("[{}] {}\n", success ? "success" : "failure", img_path);
+ if (!success) continue;
+
+ // 记录所需的数据
+ img_points.emplace_back(centers_2d);
+ obj_points.emplace_back(centers_3d(pattern_size, center_distance_mm));
+ }
+}
+
+void print_yaml(const cv::Mat & camera_matrix, const cv::Mat & distort_coeffs, double error)
+{
+ YAML::Emitter result;
+ std::vector camera_matrix_data(
+ camera_matrix.begin(), camera_matrix.end());
+ std::vector distort_coeffs_data(
+ distort_coeffs.begin(), distort_coeffs.end());
+
+ result << YAML::BeginMap;
+ result << YAML::Comment(fmt::format("重投影误差: {:.4f}px", error));
+ result << YAML::Key << "camera_matrix";
+ result << YAML::Value << YAML::Flow << camera_matrix_data;
+ result << YAML::Key << "distort_coeffs";
+ result << YAML::Value << YAML::Flow << distort_coeffs_data;
+ result << YAML::Newline;
+ result << YAML::EndMap;
+
+ fmt::print("\n{}\n", result.c_str());
+}
+
+int main(int argc, char * argv[])
+{
+ // 读取命令行参数
+ cv::CommandLineParser cli(argc, argv, keys);
+ if (cli.has("help")) {
+ cli.printMessage();
+ return 0;
+ }
+ auto input_folder = cli.get(0);
+ auto config_path = cli.get("config-path");
+
+ // 从输入文件夹中加载标定所需的数据
+ cv::Size img_size;
+ std::vector> obj_points;
+ std::vector> img_points;
+ load(input_folder, config_path, img_size, obj_points, img_points);
+
+ // 相机标定
+ cv::Mat camera_matrix, distort_coeffs;
+ std::vector rvecs, tvecs;
+ auto criteria = cv::TermCriteria(
+ cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 100,
+ DBL_EPSILON); // 默认迭代次数(30)有时会导致结果发散,故设为100
+ cv::calibrateCamera(
+ obj_points, img_points, img_size, camera_matrix, distort_coeffs, rvecs, tvecs, cv::CALIB_FIX_K3,
+ criteria); // 由于视场角较小,不需要考虑k3
+
+ // 重投影误差
+ double error_sum = 0;
+ size_t total_points = 0;
+ for (size_t i = 0; i < obj_points.size(); i++) {
+ std::vector reprojected_points;
+ cv::projectPoints(
+ obj_points[i], rvecs[i], tvecs[i], camera_matrix, distort_coeffs, reprojected_points);
+
+ total_points += reprojected_points.size();
+ for (size_t j = 0; j < reprojected_points.size(); j++)
+ error_sum += cv::norm(img_points[i][j] - reprojected_points[j]);
+ }
+ auto error = error_sum / total_points;
+
+ // 输出yaml
+ print_yaml(camera_matrix, distort_coeffs, error);
+}
diff --git a/calibration/calibrate_handeye.cpp b/calibration/calibrate_handeye.cpp
new file mode 100644
index 0000000..8436aba
--- /dev/null
+++ b/calibration/calibrate_handeye.cpp
@@ -0,0 +1,168 @@
+#include
+#include
+
+#include // 必须在opencv2/core/eigen.hpp上面
+#include
+#include
+#include
+
+#include "src/component/img_tools.hpp"
+#include "src/component/math_tools.hpp"
+
+const std::string keys =
+ "{help h usage ? | | 输出命令行参数说明}"
+ "{config-path c | configs/calibration.yaml | yaml配置文件路径 }"
+ "{@input-folder | assets/img_with_q | 输入文件夹路径 }";
+
+std::vector centers_3d(const cv::Size & pattern_size, const float center_distance)
+{
+ std::vector centers_3d;
+
+ for (int i = 0; i < pattern_size.height; i++)
+ for (int j = 0; j < pattern_size.width; j++)
+ centers_3d.push_back({j * center_distance, i * center_distance, 0});
+
+ return centers_3d;
+}
+
+Eigen::Quaterniond read_q(const std::string & q_path)
+{
+ std::ifstream q_file(q_path);
+ double w, x, y, z;
+ q_file >> w >> x >> y >> z;
+ return {w, x, y, z};
+}
+
+void load(
+ const std::string & input_folder, const std::string & config_path,
+ std::vector & R_gimbal2imubody_data, std::vector & R_gimbal2world_list,
+ std::vector & t_gimbal2world_list, std::vector & rvecs,
+ std::vector & tvecs)
+{
+ // 读取yaml参数
+ auto yaml = YAML::LoadFile(config_path);
+ auto pattern_cols = yaml["pattern_cols"].as();
+ auto pattern_rows = yaml["pattern_rows"].as();
+ auto center_distance_mm = yaml["center_distance_mm"].as();
+ R_gimbal2imubody_data = yaml["R_gimbal2imubody"].as>();
+ auto camera_matrix_data = yaml["camera_matrix"].as>();
+ auto distort_coeffs_data = yaml["distort_coeffs"].as>();
+
+ cv::Size pattern_size(pattern_cols, pattern_rows);
+ Eigen::Matrix R_gimbal2imubody(R_gimbal2imubody_data.data());
+ cv::Matx33d camera_matrix(camera_matrix_data.data());
+ cv::Mat distort_coeffs(distort_coeffs_data);
+
+ for (int i = 1; true; i++) {
+ // 读取图片和对应四元数
+ auto img_path = fmt::format("{}/{}.jpg", input_folder, i);
+ auto q_path = fmt::format("{}/{}.txt", input_folder, i);
+ auto img = cv::imread(img_path);
+ Eigen::Quaterniond q = read_q(q_path);
+ if (img.empty()) break;
+
+ // 计算云台的欧拉角
+ Eigen::Matrix3d R_imubody2imuabs = q.toRotationMatrix();
+ Eigen::Matrix3d R_gimbal2world =
+ R_gimbal2imubody.transpose() * R_imubody2imuabs * R_gimbal2imubody;
+ Eigen::Vector3d ypr = tools::eulers(R_gimbal2world, 2, 1, 0) * 57.3; // degree
+
+ // 在图片上显示云台的欧拉角,用来检验R_gimbal2imubody是否正确
+ auto drawing = img.clone();
+ tools::draw_text(drawing, fmt::format("yaw {:.2f}", ypr[0]), {40, 40}, {0, 0, 255});
+ tools::draw_text(drawing, fmt::format("pitch {:.2f}", ypr[1]), {40, 80}, {0, 0, 255});
+ tools::draw_text(drawing, fmt::format("roll {:.2f}", ypr[2]), {40, 120}, {0, 0, 255});
+
+ // 识别标定板
+ std::vector centers_2d;
+ auto success = cv::findCirclesGrid(img, pattern_size, centers_2d); // 默认是对称圆点图案
+
+ // 显示识别结果
+ cv::drawChessboardCorners(drawing, pattern_size, centers_2d, success);
+ cv::resize(drawing, drawing, {}, 0.5, 0.5); // 显示时缩小图片尺寸
+ cv::imshow("Press any to continue", drawing);
+ cv::waitKey(0);
+
+ // 输出识别结果
+ fmt::print("[{}] {}\n", success ? "success" : "failure", img_path);
+ if (!success) continue;
+
+ // 计算所需的数据
+ cv::Mat t_gimbal2world = (cv::Mat_(3, 1) << 0, 0, 0);
+ cv::Mat R_gimbal2world_cv;
+ cv::eigen2cv(R_gimbal2world, R_gimbal2world_cv);
+ cv::Mat rvec, tvec;
+ auto centers_3d_ = centers_3d(pattern_size, center_distance_mm);
+ cv::solvePnP(
+ centers_3d_, centers_2d, camera_matrix, distort_coeffs, rvec, tvec, false, cv::SOLVEPNP_IPPE);
+
+ // 记录所需的数据
+ R_gimbal2world_list.emplace_back(R_gimbal2world_cv);
+ t_gimbal2world_list.emplace_back(t_gimbal2world);
+ rvecs.emplace_back(rvec);
+ tvecs.emplace_back(tvec);
+ }
+}
+
+void print_yaml(
+ const std::vector & R_gimbal2imubody_data, const cv::Mat & R_camera2gimbal,
+ const cv::Mat & t_camera2gimbal, const Eigen::Vector3d & ypr)
+{
+ YAML::Emitter result;
+ std::vector R_camera2gimbal_data(
+ R_camera2gimbal.begin(), R_camera2gimbal.end());
+ std::vector t_camera2gimbal_data(
+ t_camera2gimbal.begin(), t_camera2gimbal.end());
+
+ result << YAML::BeginMap;
+ result << YAML::Key << "R_gimbal2imubody";
+ result << YAML::Value << YAML::Flow << R_gimbal2imubody_data;
+ result << YAML::Newline;
+ result << YAML::Newline;
+ result << YAML::Comment(fmt::format(
+ "相机同理想情况的偏角: yaw{:.2f} pitch{:.2f} roll{:.2f} degree", ypr[0], ypr[1], ypr[2]));
+ result << YAML::Key << "R_camera2gimbal";
+ result << YAML::Value << YAML::Flow << R_camera2gimbal_data;
+ result << YAML::Key << "t_camera2gimbal";
+ result << YAML::Value << YAML::Flow << t_camera2gimbal_data;
+ result << YAML::Newline;
+ result << YAML::EndMap;
+
+ fmt::print("\n{}\n", result.c_str());
+}
+
+int main(int argc, char * argv[])
+{
+ // 读取命令行参数
+ cv::CommandLineParser cli(argc, argv, keys);
+ if (cli.has("help")) {
+ cli.printMessage();
+ return 0;
+ }
+ auto input_folder = cli.get(0);
+ auto config_path = cli.get("config-path");
+
+ // 从输入文件夹中加载标定所需的数据
+ std::vector R_gimbal2imubody_data;
+ std::vector R_gimbal2world_list, t_gimbal2world_list;
+ std::vector rvecs, tvecs;
+ load(
+ input_folder, config_path, R_gimbal2imubody_data, R_gimbal2world_list, t_gimbal2world_list,
+ rvecs, tvecs);
+
+ // 手眼标定
+ cv::Mat R_camera2gimbal, t_camera2gimbal;
+ cv::calibrateHandEye(
+ R_gimbal2world_list, t_gimbal2world_list, rvecs, tvecs, R_camera2gimbal, t_camera2gimbal);
+ t_camera2gimbal /= 1e3; // mm to m
+
+ // 计算相机同理想情况的偏角
+ Eigen::Matrix3d R_camera2gimbal_eigen;
+ cv::cv2eigen(R_camera2gimbal, R_camera2gimbal_eigen);
+ Eigen::Matrix3d R_gimbal2ideal{{0, -1, 0}, {0, 0, -1}, {1, 0, 0}};
+ Eigen::Matrix3d R_camera2ideal = R_gimbal2ideal * R_camera2gimbal_eigen;
+ Eigen::Vector3d ypr = tools::eulers(R_camera2ideal, 1, 0, 2) * 57.3; // degree
+
+ // 输出yaml
+ print_yaml(R_gimbal2imubody_data, R_camera2gimbal, t_camera2gimbal, ypr);
+}
diff --git a/calibration/calibrate_robotworld_handeye.cpp b/calibration/calibrate_robotworld_handeye.cpp
new file mode 100644
index 0000000..86d1b48
--- /dev/null
+++ b/calibration/calibrate_robotworld_handeye.cpp
@@ -0,0 +1,204 @@
+#include
+#include
+
+#include // 必须在opencv2/core/eigen.hpp上面
+#include
+#include
+#include
+
+#include "src/component/img_tools.hpp"
+#include "src/component/math_tools.hpp"
+
+const std::string keys =
+ "{help h usage ? | | 输出命令行参数说明}"
+ "{config-path c | configs/calibration.yaml | yaml配置文件路径 }"
+ "{@input-folder | assets/img_with_q | 输入文件夹路径 }";
+
+std::vector centers_3d(const cv::Size & pattern_size, const float center_distance)
+{
+ std::vector centers_3d;
+
+ for (int i = 0; i < pattern_size.height; i++) {
+ for (int j = 0; j < pattern_size.width; j++) {
+ float x = 0;
+ float y = (-j + 0.5 * pattern_size.width) * center_distance;
+ float z = (-i + 0.5 * pattern_size.height) * center_distance;
+ centers_3d.push_back({x, y, z});
+ }
+ }
+
+ return centers_3d;
+}
+
+Eigen::Quaterniond read_q(const std::string & q_path)
+{
+ std::ifstream q_file(q_path);
+ double w, x, y, z;
+ q_file >> w >> x >> y >> z;
+ return {w, x, y, z};
+}
+
+void load(
+ const std::string & input_folder, const std::string & config_path,
+ std::vector & R_gimbal2imubody_data, std::vector & R_world2gimbal_list,
+ std::vector & t_world2gimbal_list, std::vector & rvecs,
+ std::vector & tvecs)
+{
+ // 读取yaml参数
+ auto yaml = YAML::LoadFile(config_path);
+ auto pattern_cols = yaml["pattern_cols"].as();
+ auto pattern_rows = yaml["pattern_rows"].as();
+ auto center_distance_mm = yaml["center_distance_mm"].as();
+ R_gimbal2imubody_data = yaml["R_gimbal2imubody"].as>();
+ auto camera_matrix_data = yaml["camera_matrix"].as>();
+ auto distort_coeffs_data = yaml["distort_coeffs"].as>();
+
+ cv::Size pattern_size(pattern_cols, pattern_rows);
+ Eigen::Matrix R_gimbal2imubody(R_gimbal2imubody_data.data());
+ cv::Matx33d camera_matrix(camera_matrix_data.data());
+ cv::Mat distort_coeffs(distort_coeffs_data);
+
+ for (int i = 1; true; i++) {
+ // 读取图片和对应四元数
+ auto img_path = fmt::format("{}/{}.jpg", input_folder, i);
+ auto q_path = fmt::format("{}/{}.txt", input_folder, i);
+ auto img = cv::imread(img_path);
+ Eigen::Quaterniond q = read_q(q_path);
+ if (img.empty()) break;
+
+ // 计算云台的欧拉角
+ Eigen::Matrix3d R_imubody2imuabs = q.toRotationMatrix();
+ Eigen::Matrix3d R_gimbal2world =
+ R_gimbal2imubody.transpose() * R_imubody2imuabs * R_gimbal2imubody;
+ Eigen::Vector3d ypr = tools::eulers(R_gimbal2world, 2, 1, 0) * 57.3; // degree
+
+ // 在图片上显示云台的欧拉角,用来检验R_gimbal2imubody是否正确
+ auto drawing = img.clone();
+ tools::draw_text(drawing, fmt::format("yaw {:.2f}", ypr[0]), {40, 40}, {0, 0, 255});
+ tools::draw_text(drawing, fmt::format("pitch {:.2f}", ypr[1]), {40, 80}, {0, 0, 255});
+ tools::draw_text(drawing, fmt::format("roll {:.2f}", ypr[2]), {40, 120}, {0, 0, 255});
+
+ // 识别标定板
+ std::vector centers_2d;
+ auto success = cv::findCirclesGrid(img, pattern_size, centers_2d); // 默认是对称圆点图案
+
+ // 显示识别结果
+ cv::drawChessboardCorners(drawing, pattern_size, centers_2d, success);
+ cv::resize(drawing, drawing, {}, 0.5, 0.5); // 显示时缩小图片尺寸
+ cv::imshow("Press any to continue", drawing);
+ cv::waitKey(0);
+
+ // 输出识别结果
+ fmt::print("[{}] {}\n", success ? "success" : "failure", img_path);
+ if (!success) continue;
+
+ // 计算所需的数据
+ Eigen::Matrix3d R_world2gimbal = R_gimbal2world.transpose();
+ cv::Mat t_world2gimbal = (cv::Mat_(3, 1) << 0, 0, 0);
+ cv::Mat R_world2gimbal_cv;
+ cv::eigen2cv(R_world2gimbal, R_world2gimbal_cv);
+ cv::Mat rvec, tvec;
+ auto centers_3d_ = centers_3d(pattern_size, center_distance_mm);
+ cv::solvePnP(
+ centers_3d_, centers_2d, camera_matrix, distort_coeffs, rvec, tvec, false, cv::SOLVEPNP_IPPE);
+
+ // 记录所需的数据
+ R_world2gimbal_list.emplace_back(R_world2gimbal_cv);
+ t_world2gimbal_list.emplace_back(t_world2gimbal);
+ rvecs.emplace_back(rvec);
+ tvecs.emplace_back(tvec);
+ }
+}
+
+void print_yaml(
+ const std::vector & R_gimbal2imubody_data, const cv::Mat & R_camera2gimbal,
+ const cv::Mat & t_camera2gimbal, const Eigen::Vector3d & camera_ypr, double distance,
+ const Eigen::Vector3d & board_ypr)
+{
+ YAML::Emitter result;
+ std::vector R_camera2gimbal_data(
+ R_camera2gimbal.begin(), R_camera2gimbal.end());
+ std::vector t_camera2gimbal_data(
+ t_camera2gimbal.begin(), t_camera2gimbal.end());
+
+ result << YAML::BeginMap;
+ result << YAML::Key << "R_gimbal2imubody";
+ result << YAML::Value << YAML::Flow << R_gimbal2imubody_data;
+ result << YAML::Newline;
+ result << YAML::Newline;
+ result << YAML::Comment(fmt::format(
+ "相机同理想情况的偏角: yaw{:.2f} pitch{:.2f} roll{:.2f} degree", camera_ypr[0], camera_ypr[1],
+ camera_ypr[2]));
+ result << YAML::Newline;
+ result << YAML::Comment(fmt::format("标定板到世界坐标系原点的水平距离: {:.2f} m", distance));
+ result << YAML::Newline;
+ result << YAML::Comment(fmt::format(
+ "标定板同竖直摆放时的偏角: yaw{:.2f} pitch{:.2f} roll{:.2f} degree", board_ypr[0], board_ypr[1],
+ board_ypr[2]));
+ result << YAML::Key << "R_camera2gimbal";
+ result << YAML::Value << YAML::Flow << R_camera2gimbal_data;
+ result << YAML::Key << "t_camera2gimbal";
+ result << YAML::Value << YAML::Flow << t_camera2gimbal_data;
+ result << YAML::Newline;
+ result << YAML::EndMap;
+
+ fmt::print("\n{}\n", result.c_str());
+}
+
+int main(int argc, char * argv[])
+{
+ // 读取命令行参数
+ cv::CommandLineParser cli(argc, argv, keys);
+ if (cli.has("help")) {
+ cli.printMessage();
+ return 0;
+ }
+ auto input_folder = cli.get(0);
+ auto config_path = cli.get("config-path");
+
+ // 从输入文件夹中加载标定所需的数据
+ std::vector R_gimbal2imubody_data;
+ std::vector R_world2gimbal_list, t_world2gimbal_list;
+ std::vector rvecs, tvecs;
+ load(
+ input_folder, config_path, R_gimbal2imubody_data, R_world2gimbal_list, t_world2gimbal_list,
+ rvecs, tvecs);
+
+ // 手眼标定
+ cv::Mat R_gimbal2camera, t_gimbal2camera;
+ cv::Mat R_world2board, t_world2board;
+ cv::calibrateRobotWorldHandEye(
+ rvecs, tvecs, R_world2gimbal_list, t_world2gimbal_list, R_world2board, t_world2board,
+ R_gimbal2camera, t_gimbal2camera);
+ t_gimbal2camera /= 1e3; // mm to m
+ t_world2board /= 1e3; // mm to m
+
+ // 计算所需的数据
+ cv::Mat R_camera2gimbal, t_camera2gimbal;
+ cv::Mat R_board2world, t_board2world;
+ cv::transpose(R_gimbal2camera, R_camera2gimbal);
+ cv::transpose(R_world2board, R_board2world);
+ t_camera2gimbal = -R_camera2gimbal * t_gimbal2camera;
+ t_board2world = -R_board2world * t_world2board;
+
+ // 计算相机同理想情况的偏角
+ Eigen::Matrix3d R_camera2gimbal_eigen;
+ cv::cv2eigen(R_camera2gimbal, R_camera2gimbal_eigen);
+ Eigen::Matrix3d R_gimbal2ideal{{0, -1, 0}, {0, 0, -1}, {1, 0, 0}};
+ Eigen::Matrix3d R_camera2ideal = R_gimbal2ideal * R_camera2gimbal_eigen;
+ Eigen::Vector3d camera_ypr = tools::eulers(R_camera2ideal, 1, 0, 2) * 57.3; // degree
+
+ // 计算标定板到世界坐标系原点的水平距离
+ auto x = t_board2world.at(0);
+ auto y = t_board2world.at(1);
+ auto distance = std::sqrt(x * x + y * y);
+
+ // 计算标定板同竖直摆放时的偏角
+ Eigen::Matrix3d R_board2world_eigen;
+ cv::cv2eigen(R_board2world, R_board2world_eigen);
+ Eigen::Vector3d board_ypr = tools::eulers(R_board2world_eigen, 2, 1, 0) * 57.3; // degree
+
+ // 输出yaml
+ print_yaml(
+ R_gimbal2imubody_data, R_camera2gimbal, t_camera2gimbal, camera_ypr, distance, board_ypr);
+}
diff --git a/calibration/capture.cpp b/calibration/capture.cpp
new file mode 100644
index 0000000..a07174f
--- /dev/null
+++ b/calibration/capture.cpp
@@ -0,0 +1,93 @@
+#include
+
+#include
+#include
+#include
+
+#include "src/device/camera.hpp"
+#include "src/device/cboard.hpp"
+#include "src/component/img_tools.hpp"
+#include "src/component/logger.hpp"
+#include "src/component/math_tools.hpp"
+
+const std::string keys =
+ "{help h usage ? | | 输出命令行参数说明}"
+ "{@config-path c | configs/calibration.yaml | yaml配置文件路径 }"
+ "{output-folder o | assets/img_with_q | 输出文件夹路径 }";
+
+void write_q(const std::string q_path, const Eigen::Quaterniond & q)
+{
+ std::ofstream q_file(q_path);
+ Eigen::Vector4d xyzw = q.coeffs();
+ // 输出顺序为wxyz
+ q_file << fmt::format("{} {} {} {}", xyzw[3], xyzw[0], xyzw[1], xyzw[2]);
+ q_file.close();
+}
+
+void capture_loop(
+ const std::string & config_path, const std::string & can, const std::string & output_folder)
+{
+ io::CBoard cboard(config_path);
+ io::Camera camera(config_path);
+ cv::Mat img;
+ std::chrono::steady_clock::time_point timestamp;
+
+ int count = 0;
+ while (true) {
+ camera.read(img, timestamp);
+ Eigen::Quaterniond q = cboard.imu_at(timestamp);
+
+ // 在图像上显示欧拉角,用来判断imuabs系的xyz正方向,同时判断imu是否存在零漂
+ auto img_with_ypr = img.clone();
+ Eigen::Vector3d zyx = tools::eulers(q, 2, 1, 0) * 57.3; // degree
+ tools::draw_text(img_with_ypr, fmt::format("Z {:.2f}", zyx[0]), {40, 40}, {0, 0, 255});
+ tools::draw_text(img_with_ypr, fmt::format("Y {:.2f}", zyx[1]), {40, 80}, {0, 0, 255});
+ tools::draw_text(img_with_ypr, fmt::format("X {:.2f}", zyx[2]), {40, 120}, {0, 0, 255});
+
+ std::vector centers_2d;
+ auto success = cv::findCirclesGrid(img, cv::Size(10, 7), centers_2d); // 默认是对称圆点图案
+ cv::drawChessboardCorners(img_with_ypr, cv::Size(10, 7), centers_2d, success); // 显示识别结果
+ cv::resize(img_with_ypr, img_with_ypr, {}, 0.5, 0.5); // 显示时缩小图片尺寸
+
+ // 按“s”保存图片和对应四元数,按“q”退出程序
+ cv::imshow("Press s to save, q to quit", img_with_ypr);
+ auto key = cv::waitKey(1);
+ if (key == 'q')
+ break;
+ else if (key != 's')
+ continue;
+
+ // 保存图片和四元数
+ count++;
+ auto img_path = fmt::format("{}/{}.jpg", output_folder, count);
+ auto q_path = fmt::format("{}/{}.txt", output_folder, count);
+ cv::imwrite(img_path, img);
+ write_q(q_path, q);
+ tools::logger()->info("[{}] Saved in {}", count, output_folder);
+ }
+
+ // 离开该作用域时,camera和cboard会自动关闭
+}
+
+int main(int argc, char * argv[])
+{
+ // 读取命令行参数
+ cv::CommandLineParser cli(argc, argv, keys);
+ if (cli.has("help")) {
+ cli.printMessage();
+ return 0;
+ }
+ auto config_path = cli.get(0);
+ auto output_folder = cli.get("output-folder");
+
+ // 新建输出文件夹
+ std::filesystem::create_directory(output_folder);
+
+ tools::logger()->info("默认标定板尺寸为10列7行");
+ // 主循环,保存图片和对应四元数
+ capture_loop(config_path, "can0", output_folder);
+
+ tools::logger()->warn("注意四元数输出顺序为wxyz");
+
+ return 0;
+}
diff --git a/calibration/split_video.cpp b/calibration/split_video.cpp
new file mode 100644
index 0000000..76d769e
--- /dev/null
+++ b/calibration/split_video.cpp
@@ -0,0 +1,89 @@
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#include "src/component/exiter.hpp"
+#include "src/component/img_tools.hpp"
+#include "src/component/logger.hpp"
+#include "src/component/math_tools.hpp"
+
+// 定义命令行参数
+const std::string keys =
+ "{help h usage ? | | 输出命令行参数说明 }"
+ "{start-index s | | 视频起始帧下标 }"
+ "{end-index e | | 视频结束帧下标 }"
+ "{output-path p | records/Big/2024-05-14_11-6-26 | avi和txt文件的路径}"
+ "{@input-path | | avi和txt文件的路径}";
+
+int main(int argc, char * argv[])
+{
+ // 读取命令行参数
+ cv::CommandLineParser cli(argc, argv, keys);
+ if (cli.has("help")) {
+ cli.printMessage();
+ return 0;
+ }
+ auto input_path = cli.get(0);
+ auto output_path = cli.get("output-path");
+ auto start_index = cli.get("start-index");
+ std::cout << start_index << std::endl;
+ auto end_index = cli.get("end-index");
+
+ // 初始化绘图器和退出器
+ tools::Exiter exiter;
+
+ // 构造视频和文本文件路径
+ auto video_path = fmt::format("{}.avi", input_path);
+ auto text_path = fmt::format("{}.txt", input_path);
+ cv::VideoCapture video(video_path);
+ std::ifstream text(text_path);
+
+ // 设置视频起始帧
+ video.set(cv::CAP_PROP_POS_FRAMES, start_index);
+ for (int i = 0; i < start_index; i++) {
+ double t, w, x, y, z;
+ text >> t >> w >> x >> y >> z;
+ }
+ // 获取原始视频的参数
+ int frameWidth = video.get(cv::CAP_PROP_FRAME_WIDTH);
+ int frameHeight = video.get(cv::CAP_PROP_FRAME_HEIGHT);
+ double fps = video.get(cv::CAP_PROP_FPS);
+ int fourcc = static_cast(video.get(cv::CAP_PROP_FOURCC));
+
+ // 创建输出文件
+ auto outvideo_path = fmt::format("{}.avi", output_path);
+ auto outtext_path = fmt::format("{}.txt", output_path);
+ cv::VideoWriter outvideo(outvideo_path, fourcc, fps, cv::Size(frameWidth, frameHeight));
+ std::ofstream outtext(outtext_path);
+
+ std::string line;
+ cv::Mat img;
+
+ // 循环处理视频帧
+ for (int frame_count = start_index; !exiter.exit(); frame_count++) {
+ if (end_index > 0 && frame_count > end_index) break;
+
+ video.read(img);
+ if (img.empty()) break;
+
+ outvideo.write(img);
+
+ getline(text, line);
+ outtext << line << std::endl;
+
+ cv::resize(img, img, cv::Size(img.size().width * 0.8, img.size().height * 0.8));
+ cv::imshow("result", img);
+
+ int key = cv::waitKey(1);
+ if (key == 'q') break;
+ }
+ cv::destroyAllWindows();
+ text.close(); // 关闭文件
+ outtext.close();
+
+ return 0;
+}
diff --git a/configs/ascento.yaml b/configs/ascento.yaml
new file mode 100644
index 0000000..1af1349
--- /dev/null
+++ b/configs/ascento.yaml
@@ -0,0 +1,85 @@
+# enemy_color: "red"
+enemy_color: "blue"
+
+#####-----神经网络参数-----#####
+yolo_name: yolov5
+classify_model: assets/models/tiny_resnet.onnx
+yolo11_model_path: assets/models/yolo11.xml
+yolov8_model_path: assets/models/yolov8.xml
+yolov5_model_path: assets/models/yolov5.xml
+device: GPU
+min_confidence: 0.8
+use_traditional: false
+
+#####-----ROI-----#####
+roi:
+ x: 500
+ y: 400
+ width: 500
+ height: 500
+
+use_roi: false
+
+#####-----传统方法参数-----#####
+threshold: 150
+max_angle_error: 45 # degree
+min_lightbar_ratio: 1.5
+max_lightbar_ratio: 20
+min_lightbar_length: 8
+min_armor_ratio: 1
+max_armor_ratio: 5
+max_side_ratio: 1.5
+max_rectangular_error: 25 # degree
+min_confidence: 0.8
+
+#####-----tracker参数-----#####
+min_detect_count: 5
+max_temp_lost_count: 15
+outpost_max_temp_lost_count: 75
+
+#####-----aimer参数-----#####
+yaw_offset: 1.5 # degree
+pitch_offset: -0.5 # degree
+comming_angle: 60 # degree
+leaving_angle: 20 # degree
+decision_speed: 7 # rad/s
+high_speed_delay_time: 0.050 # s
+low_speed_delay_time: 0.015 # s
+
+#####-----shooter参数-----#####
+first_tolerance: 100 # 近距离射击容差,degree
+second_tolerance: 100 # 远距离射击容差,degree
+judge_distance: 2 #距离判断阈值
+auto_fire: true # 是否由自瞄控制射击
+
+camera_name: "hikrobot"
+exposure_ms: 2
+gain: 16
+vid_pid: "2bdf:0001"
+
+R_gimbal2imubody: [1, 0, 0, 0, 1, 0, 0, 0, 1]
+
+# 重投影误差: 0.1488px
+camera_matrix: [1775.1300101814929, 0, 710.22041588791421, 0, 1777.9427175568535, 599.38373307949621, 0, 0, 1]
+distort_coeffs: [-0.081907189655237952, 0.14019999270205855, -0.0012264127665053185, 0.0014292255962000792, 0]
+
+# 相机同理想情况的偏角: yaw1.81 pitch0.16 roll-0.00 degree
+R_camera2gimbal: [-0.03152275773856239, 0.0027095830669845509, 0.99949936163269204, -0.99950303430107212, -9.8404785402239625e-05, -0.031522606799691932, 1.2942398579498703e-05, -0.99999632423129503, 0.0027113384873522772]
+t_camera2gimbal: [0.13895789074180098, 0.066620637390426771, 0.028079650211170731]
+
+
+#####-----cboard参数-----#####
+quaternion_canid: 0x100
+bullet_speed_canid: 0x101
+send_canid: 0xff
+can_interface: "can0"
+
+#####-----gimbal参数-----#####
+com_port: "/dev/gimbal"
+
+#####-----buff_detector参数-----#####
+model: "assets/yolo11_buff_int8.xml"
+
+#####-----buff_aimer参数-----#####
+fire_gap_time: 0.520 # s
+predict_time: 0.100 # s
diff --git a/configs/calibration.yaml b/configs/calibration.yaml
new file mode 100644
index 0000000..b080281
--- /dev/null
+++ b/configs/calibration.yaml
@@ -0,0 +1,16 @@
+pattern_cols: 10
+pattern_rows: 7
+center_distance_mm: 40
+
+R_gimbal2imubody: [1, 0, 0, 0, 1, 0, 0, 0, 1]
+
+camera_name: "hikrobot"
+exposure_ms: 3
+gain: 10.0
+vid_pid: "2bdf:0001"
+
+#####-----cboard参数-----#####
+quaternion_canid: 0x01
+bullet_speed_canid: 0x110
+send_canid: 0xff
+can_interface: "can0"
\ No newline at end of file
diff --git a/configs/camera.yaml b/configs/camera.yaml
new file mode 100644
index 0000000..e1c9cdd
--- /dev/null
+++ b/configs/camera.yaml
@@ -0,0 +1,9 @@
+camera_name: "mindvision"
+exposure_ms: 2
+gamma: 0.5
+vid_pid: "f622:d13a"
+
+# camera_name: "hikrobot"
+# exposure_ms: 3
+# gain: 10.0
+# vid_pid: "2bdf:0001"
\ No newline at end of file
diff --git a/configs/demo.yaml b/configs/demo.yaml
new file mode 100644
index 0000000..ec93654
--- /dev/null
+++ b/configs/demo.yaml
@@ -0,0 +1,121 @@
+# enemy_color: "red"
+enemy_color: "blue"
+
+#####-----神经网络参数-----#####
+yolo_name: yolov5
+classify_model: assets/models/tiny_resnet.onnx
+yolo11_model_path: assets/models/yolo11.xml
+yolov8_model_path: assets/models/yolov8.xml
+yolov5_model_path: assets/models/yolov5.xml
+device: CPU
+min_confidence: 0.8
+use_traditional: true
+
+#####-----ROI-----#####
+roi:
+ x: 420
+ y: 50
+ width: 600
+ height: 600
+
+use_roi: false
+
+#####-----传统方法参数-----#####
+threshold: 150
+max_angle_error: 45 # degree
+min_lightbar_ratio: 1.5
+max_lightbar_ratio: 20
+min_lightbar_length: 8
+min_armor_ratio: 1
+max_armor_ratio: 5
+max_side_ratio: 1.5
+max_rectangular_error: 25 # degree
+min_confidence: 0.8
+
+#####-----tracker参数-----#####
+min_detect_count: 5
+max_temp_lost_count: 15
+outpost_max_temp_lost_count: 75
+
+#####-----aimer参数-----#####
+yaw_offset: -1 # degree -2.5
+pitch_offset: -1.4 # degree 2
+comming_angle: 60 # degree
+leaving_angle: 20 # degree
+decision_speed: 8 # rad/s
+high_speed_delay_time: 0.030 # s
+low_speed_delay_time: 0.015 # s
+
+#####-----shooter参数-----#####
+first_tolerance: 3 # 近距离射击容差,degree
+second_tolerance: 2 # 远距离射击容差,degree
+judge_distance: 2 #距离判断阈值
+auto_fire: true # 是否由自瞄控制射击
+
+camera_name: "hikrobot"
+exposure_ms: 2
+gain: 16
+vid_pid: "2bdf:0001"
+
+# -1 0 0
+# 0 -1 0
+# 0 0 1
+R_gimbal2imubody: [-1, 0, 0, 0, -1, 0, 0, 0, 1]
+
+# 重投影误差: 0.2697px
+camera_matrix: [1818.3669452465165, 0, 751.06226574703498, 0, 1822.494494078506, 530.43671556112133, 0, 0, 1]
+distort_coeffs: [-0.077944626599568856, 0.15447826031486889, -0.0025714394278524674, 0.00083016311301273629, 0]
+
+# 相机同理想情况的偏角: yaw0.46 pitch0.61 roll-1.53 degree
+R_camera2gimbal: [-0.0083195760046954614, 0.010498791137270739, 0.99991027599468041, -0.99960756138647755, -0.026835747568381807, -0.0080352891314148939, 0.026748978935305992, -0.99958472279097077, 0.010717933047771133]
+t_camera2gimbal: [0.094969301833534511, 0.095006290298006682, 0.050987066291756609]
+
+#####-----cboard参数-----#####
+quaternion_canid: 0x100
+bullet_speed_canid: 0x101
+send_canid: 0xff
+can_interface: "can0"
+
+#####-----gimbal参数-----#####
+com_port: "/dev/gimbal"
+
+#####-----planner-----#####
+fire_thresh: 0.003
+
+max_yaw_acc: 50
+Q_yaw: [9e6, 0]
+R_yaw: [1]
+
+max_pitch_acc: 100
+Q_pitch: [9e6,0]
+R_pitch: [1]
+
+#####-----buff_detector参数-----#####
+detect:
+ contrast: 1
+ brightness:
+ blue: -120
+ red: -100
+ brightness_threshold:
+ blue: 120
+ red: 40
+ morphology_size:
+ blue: 3
+ red: 3
+ dilate_size: 2
+ # canny_low_threshold: 100
+ # canny_high_threshold: 180
+ # approx_epsilon: 1.0
+ R_contours_min_area: 200
+ R_contours_max_area: 600
+ fanblades_head_contours_min_area: 3000
+ fanblades_head_contours_max_area: 8000
+ fanblades_body_contours_min_area: 1000
+ fanblades_body_contours_max_area: 4000
+ standard_fanblade_path: ./assets/standard_fanblade.jpg
+
+#####-----buff_aimer参数-----#####
+aim_time: 0.150 # s
+wait_time: 0.300 # s
+command_fire_gap: 0.080 # s
+predict_time: 0.150 # s
\ No newline at end of file
diff --git a/configs/example.yaml b/configs/example.yaml
new file mode 100644
index 0000000..8d8fea5
--- /dev/null
+++ b/configs/example.yaml
@@ -0,0 +1,83 @@
+# enemy_color: "red"
+enemy_color: "blue"
+
+
+#####-----神经网络参数-----#####
+yolo_name: yolov5
+classify_model: assets/models/tiny_resnet.onnx
+yolo11_model_path: assets/models/yolo11.xml
+yolov8_model_path: assets/models/yolov8.xml
+yolov5_model_path: assets/models/yolov5.xml
+device: CPU
+min_confidence: 0.8
+use_traditional: true
+
+#####-----ROI-----#####
+roi:
+ x: 420
+ y: 50
+ width: 600
+ height: 600
+
+#####-----USB相机参数-----#####
+image_width: 1920
+image_height: 1080
+fov_h: 87.7
+fov_v: 56.7
+usb_frame_rate: 60
+usb_exposure: 250 #1-80000______250
+usb_gamma: 160
+usb_gain: 10 #0-96
+
+#####-----工业相机参数-----#####
+camera_name: "mindvision"
+exposure_ms: 2
+gamma: 0.5
+vid_pid: "f622:d13a"
+
+#####-----传统方法参数-----#####
+threshold: 150
+max_angle_error: 45 # degree
+min_lightbar_ratio: 1.5
+max_lightbar_ratio: 20
+min_lightbar_length: 8
+min_armor_ratio: 1
+max_armor_ratio: 5
+max_side_ratio: 1.5
+max_rectangular_error: 25 # degree
+min_confidence: 0.8
+
+#####-----cboard参数-----#####
+quaternion_canid: 0x01
+bullet_speed_canid: 0x101
+send_canid: 0xff
+can_interface: "can0"
+
+#####-----tracker参数-----#####
+min_detect_count: 5
+max_temp_lost_count: 15
+
+#####-----aimer参数-----#####
+yaw_offset: -2.5 # degree -2.5
+pitch_offset: 3 # degree 2
+comming_angle: 60 # degree
+leaving_angle: 20 # degree
+
+#####-----shooter参数-----#####
+first_tolerance: 3 # 近距离射击容差,degree
+second_tolerance: 2 # 远距离射击容差,degree
+judge_distance: 2 #距离判断阈值
+auto_fire: true # 是否由自瞄控制射击
+
+#####-----工业相机标定参数-----#####
+R_gimbal2imubody: [1, 0, 0, 0, 1, 0, 0, 0, 1]
+
+# 重投影误差: 0.1944px
+camera_matrix: [1295.4665175006589, 0, 655.71498478800618, 0, 1297.2591156991834, 506.21320670125334, 0, 0, 1]
+distort_coeffs: [-0.48599095566724387, 0.23999516531343185, -0.00029018466701866776, -0.00083639963030895752, 0]
+
+# 相机同理想情况的偏角: yaw-2.64 pitch-3.20 roll-0.77 degree
+# 标定板到世界坐标系原点的水平距离: 1.45 m
+# 标定板同竖直摆放时的偏角: yaw90.85 pitch8.54 roll-0.32 degree
+R_camera2gimbal: [0.046736929626455238, -0.055211941324114208, 0.99738021884550865, -0.99881598162461238, -0.016078770676278314, 0.0459141370909011, 0.013501639172863072, -0.99834518813322415, -0.055898041744621867]
+t_camera2gimbal: [0.27420934670256336, 0.0098763306562371159, 0.043798385984197351]
diff --git a/configs/mvs.yaml b/configs/mvs.yaml
new file mode 100644
index 0000000..76dd5b8
--- /dev/null
+++ b/configs/mvs.yaml
@@ -0,0 +1,124 @@
+# enemy_color: "red"
+enemy_color: "blue"
+
+
+#####-----神经网络参数-----#####
+yolo_name: yolov5
+classify_model: assets/models/tiny_resnet.onnx
+yolo11_model_path: assets/models/yolo11.xml
+yolov8_model_path: assets/models/yolov8.xml
+yolov5_model_path: assets/models/yolov5.xml
+device: GPU
+min_confidence: 0.8
+use_traditional: true
+
+#####-----ROI-----#####
+roi:
+ x: 420
+ y: 50
+ width: 600
+ height: 600
+
+use_roi: false
+
+#####-----USB相机参数-----#####
+image_width: 640
+image_height: 360
+new_image_width: 1280
+new_image_height: 720
+fov_h: 57.7 #87.7
+fov_v: 56.7
+new_fov_h: 37 #67
+new_fov_v: 40.9
+usb_frame_rate: 60
+usb_exposure: 305 #1-80000______250
+new_usb_exposure: 320
+usb_gamma: 160
+usb_gain: 10 #0-96
+
+#####-----工业相机参数-----#####
+camera_name: "hikrobot"
+exposure_ms: 2
+gain: 16
+vid_pid: "2bdf:0001"
+
+#####-----传统方法参数-----#####
+threshold: 150
+max_angle_error: 45 # degree
+min_lightbar_ratio: 1.5
+max_lightbar_ratio: 20
+min_lightbar_length: 8
+min_armor_ratio: 1
+max_armor_ratio: 5
+max_side_ratio: 1.5
+max_rectangular_error: 25 # degree
+min_confidence: 0.8
+
+#####-----cboard参数-----#####
+quaternion_canid: 0x01
+bullet_speed_canid: 0x110
+send_canid: 0xff
+can_interface: "can0"
+
+#####-----tracker参数-----#####
+min_detect_count: 5
+max_temp_lost_count: 15
+outpost_max_temp_lost_count: 75
+
+#####-----aimer参数-----#####
+yaw_offset: -2.5 # degree -2.5
+pitch_offset: 0 # degree 2
+comming_angle: 70 # degree
+leaving_angle: 30 # degree
+decision_speed: 7 # rad/s
+high_speed_delay_time: 0.066 # s
+low_speed_delay_time: 0.015 # s
+
+#####-----shooter参数-----#####
+first_tolerance: 3 # 近距离射击容差,degree
+second_tolerance: 2 # 远距离射击容差,degree
+judge_distance: 2 #距离判断阈值
+auto_fire: true # 是否由自瞄控制射击
+
+#####-----decider参数-----#####
+mode: 1
+
+#####-----工业相机标定参数-----#####
+R_gimbal2imubody: [1, 0, 0, 0, 1, 0, 0, 0, 1]
+
+# 重投影误差: 0.1322px
+camera_matrix: [1776.9477196851155, 0, 756.31235265560952, 0, 1776.0591253569607, 566.16539069551641, 0, 0, 1]
+distort_coeffs: [-0.08382326954462313, 0.097449270330296239, -0.0012558283068959985, 0.0037372210254148081, 0]
+
+R_camera2gimbal: [0, 0, 1, -1, 0, 0, 0, -1, 0]
+t_camera2gimbal: [0.1, 0, 0.05]
+
+
+#####-----buff_detector参数-----#####
+detect:
+ contrast: 1
+ brightness:
+ blue: -120
+ red: -100
+ brightness_threshold:
+ blue: 120
+ red: 80
+ morphology_size:
+ blue: 3
+ red: 2
+ dilate_size: 1
+ # canny_low_threshold: 100
+ # canny_high_threshold: 180
+ # approx_epsilon: 1.0
+ R_contours_min_area: 1
+ R_contours_max_area: 600
+ fanblades_head_contours_min_area: 300
+ fanblades_head_contours_max_area: 8000
+ fanblades_body_contours_min_area: 1000
+ fanblades_body_contours_max_area: 4000
+ standard_fanblade_path: ./assets/standard_fanblade.jpg
+
+#####-----buff_aimer参数-----#####
+aim_time: 0.200 # s
+wait_time: 0.050 # s
+predict_time: 0.300 # s
diff --git a/configs/sentry.yaml b/configs/sentry.yaml
new file mode 100644
index 0000000..cb75fdc
--- /dev/null
+++ b/configs/sentry.yaml
@@ -0,0 +1,96 @@
+# enemy_color: "red"
+enemy_color: "blue"
+
+
+#####-----神经网络参数-----#####
+yolo_name: yolov5
+classify_model: assets/models/tiny_resnet.onnx
+yolo11_model_path: assets/models/yolo11.xml
+yolov8_model_path: assets/models/yolov8.xml
+yolov5_model_path: assets/models/yolov5.xml
+device: GPU
+min_confidence: 0.8
+use_traditional: true
+
+#####-----ROI-----#####
+roi:
+ x: 420
+ y: 50
+ width: 600
+ height: 600
+
+use_roi: false
+
+#####-----USB相机参数-----#####
+image_width: 1280
+image_height: 720
+fov_h: 57.7 #87.7
+fov_v: 56.7
+new_fov_h: 27 #67
+new_fov_v: 40.9
+usb_frame_rate: 120
+usb_exposure: 500 #1-80000______250
+usb_gamma: 160
+usb_gain: 10 #0-96
+
+#####-----工业相机参数-----#####
+camera_name: "hikrobot"
+exposure_ms: 0.8
+gain: 16.9
+vid_pid: "2bdf:0001"
+
+#####-----传统方法参数-----#####
+threshold: 150
+max_angle_error: 45 # degree
+min_lightbar_ratio: 1.5
+max_lightbar_ratio: 20
+min_lightbar_length: 8
+min_armor_ratio: 1
+max_armor_ratio: 5
+max_side_ratio: 1.5
+max_rectangular_error: 25 # degree
+min_confidence: 0.8
+
+#####-----cboard参数-----#####
+quaternion_canid: 0x01
+bullet_speed_canid: 0x110
+send_canid: 0xff
+can_interface: "can0"
+
+#####-----tracker参数-----#####
+min_detect_count: 5
+max_temp_lost_count: 25
+outpost_max_temp_lost_count: 75
+
+#####-----aimer参数-----#####
+yaw_offset: -0.8 # degree -2.5
+pitch_offset: -1 # degree 2
+comming_angle: 60 # degree
+leaving_angle: 20 # degree
+left_yaw_offset: -1
+right_yaw_offset: -0.6
+decision_speed: 10 # rad/s
+high_speed_delay_time: 0.026 # s
+low_speed_delay_time: 0.010 # s
+
+#####-----shooter参数-----#####
+first_tolerance: 5 # 近距离射击容差,degree
+second_tolerance: 2 # 远距离射击容差,degree
+judge_distance: 3 #距离判断阈值
+auto_fire: true # 是否由自瞄控制射击
+
+#####-----decider参数-----#####
+mode: 1
+
+#####-----工业相机标定参数-----#####
+R_gimbal2imubody: [1, 0, 0, 0, 1, 0, 0, 0, 1]
+
+# 重投影误差: 0.1833px
+camera_matrix: [2414.9359264386621, 0, 717.26243105567414, 0, 2418.0489262208148, 582.68540529942845, 0, 0, 1]
+distort_coeffs: [-0.0209453389287673, 0.15028138841073832, -0.0006517722113234505, -0.0016861906197686788, 0]
+
+# 相机同理想情况的偏角: yaw-1.11 pitch0.01 roll-0.06 degree
+# 标定板到世界坐标系原点的水平距离: 1.20 m
+# 标定板同竖直摆放时的偏角: yaw123.89 pitch14.05 roll-0.86 degree
+R_camera2gimbal: [0.01928451708725664, 0.00012696140743255463, 0.99981402834802846, -0.99981344688553653, -0.0010834913551969569, 0.019284643459122196, 0.0010857382619952124, -0.99999940496346484, 0.00010604311483339372]
+t_camera2gimbal: [0.13089617453251859, 0.0038468007459533785, 0.094139945222010288]
diff --git a/configs/standard3.yaml b/configs/standard3.yaml
new file mode 100644
index 0000000..4e69384
--- /dev/null
+++ b/configs/standard3.yaml
@@ -0,0 +1,103 @@
+enemy_color: "red"
+# enemy_color: "blue"
+
+#####-----神经网络参数-----#####
+yolo_name: yolov5
+classify_model: assets/models/tiny_resnet.onnx
+yolo11_model_path: assets/models/yolo11.xml
+yolov8_model_path: assets/models/yolov8.xml
+yolov5_model_path: assets/models/yolov5.xml
+device: GPU
+min_confidence: 0.8
+use_traditional: true
+
+#####-----ROI-----#####
+roi:
+ x: 420
+ y: 50
+ width: 600
+ height: 600
+
+use_roi: false
+
+#####-----传统方法参数-----#####
+threshold: 150
+max_angle_error: 45 # degree
+min_lightbar_ratio: 1.5
+max_lightbar_ratio: 20
+min_lightbar_length: 8
+min_armor_ratio: 1
+max_armor_ratio: 5
+max_side_ratio: 1.5
+max_rectangular_error: 25 # degree
+
+#####-----tracker参数-----#####
+min_detect_count: 5
+max_temp_lost_count: 15
+outpost_max_temp_lost_count: 75
+
+#####-----aimer参数-----#####
+yaw_offset: 2 # degree -2.5
+pitch_offset: 6.5 # degree 2
+comming_angle: 55 # degree
+leaving_angle: 20 # degree
+decision_speed: 7 # rad/s
+high_speed_delay_time: 0.0 # s
+low_speed_delay_time: 0.0 # s planner use this value
+
+#####-----shooter参数-----#####
+first_tolerance: 3 # 近距离射击容差,degree
+second_tolerance: 2 # 远距离射击容差,degree
+judge_distance: 2 #距离判断阈值
+auto_fire: true # 是否由自瞄控制射击
+
+camera_name: "hikrobot"
+exposure_ms: 2.5
+gain: 16.9
+vid_pid: "2bdf:0001"
+
+# 1 0 0
+# 0 1 0
+# 0 0 1
+R_gimbal2imubody: [1, 0, 0, 0, 1, 0, 0, 0, 1]
+
+# 重投影误差: 0.1820px
+camera_matrix: [1785.4881526822305, 0, 672.4806478241826, 0, 1785.026019470562, 559.89603224794314, 0, 0, 1]
+distort_coeffs: [-0.076005079619881746, 0.11182817466388446, 0.0005362204787722057, -0.0027546300984895122, 0]
+
+# 相机同理想情况的偏角: yaw1.44 pitch-7.28 roll0.96 degree
+# 标定板到世界坐标系原点的水平距离: 1.13 m
+# 标定板同竖直摆放时的偏角: yaw7.61 pitch13.92 roll-0.46 degree
+R_camera2gimbal: [-0.027182119030230909, -0.12616154330853446, 0.99163723074269183, -0.99949106557517331, 0.019998323121329122, -0.024853106601381177, -0.016695575474690555, -0.99180811252093692, -0.12664093215554434]
+t_camera2gimbal: [0.13160669975045827, 0.10377721766577375, 0.024908271912914642]
+
+#####-----cboard参数-----#####
+quaternion_canid: 0x100
+bullet_speed_canid: 0x101
+send_canid: 0xff
+can_interface: "can0"
+
+#####-----gimbal参数-----#####
+com_port: "/dev/gimbal"
+yaw_kp: 0
+yaw_kd: 0
+pitch_kp: 0
+pitch_kd: 0
+
+#####-----planner-----#####
+fire_thresh: 0.0035
+
+max_yaw_acc: 50
+Q_yaw: [9e6, 0]
+R_yaw: [1]
+
+max_pitch_acc: 100
+Q_pitch: [9e6, 0]
+R_pitch: [1]
+
+#####-----buff_detector参数-----#####
+model: "assets/yolo11_buff_int8.xml"
+
+#####-----buff_aimer参数-----#####
+fire_gap_time: 0.700 # s
+predict_time: 0.120 # s
\ No newline at end of file
diff --git a/configs/standard4.yaml b/configs/standard4.yaml
new file mode 100644
index 0000000..88a6d50
--- /dev/null
+++ b/configs/standard4.yaml
@@ -0,0 +1,99 @@
+enemy_color: "red"
+# enemy_color: "blue"
+
+#####-----神经网络参数-----#####
+yolo_name: yolov5
+classify_model: assets/models/tiny_resnet.onnx
+yolo11_model_path: assets/models/yolo11.xml
+yolov8_model_path: assets/models/yolov8.xml
+yolov5_model_path: assets/models/yolov5.xml
+device: GPU
+min_confidence: 0.8
+use_traditional: true
+
+#####-----ROI-----#####
+roi:
+ x: 420
+ y: 50
+ width: 600
+ height: 600
+
+use_roi: false
+
+#####-----传统方法参数-----#####
+threshold: 150
+max_angle_error: 45 # degree
+min_lightbar_ratio: 1.5
+max_lightbar_ratio: 20
+min_lightbar_length: 8
+min_armor_ratio: 1
+max_armor_ratio: 5
+max_side_ratio: 1.5
+max_rectangular_error: 25 # degree
+min_confidence: 0.8
+
+#####-----tracker参数-----#####
+min_detect_count: 5
+max_temp_lost_count: 15
+outpost_max_temp_lost_count: 75
+
+#####-----aimer参数-----#####
+yaw_offset: -2 # degree -2.5
+pitch_offset: 0 # degree 2
+comming_angle: 60 # degree
+leaving_angle: 20 # degree
+decision_speed: 8 # rad/s
+high_speed_delay_time: 0.015 # s
+low_speed_delay_time: 0.015 # s
+
+#####-----shooter参数-----#####
+first_tolerance: 3 # 近距离射击容差,degree
+second_tolerance: 2 # 远距离射击容差,degree
+judge_distance: 2 #距离判断阈值
+auto_fire: true # 是否由自瞄控制射击
+
+camera_name: "hikrobot"
+exposure_ms: 2
+gain: 16
+vid_pid: "2bdf:0001"
+
+# 1 0 0
+# 0 1 0
+# 0 0 1
+
+R_gimbal2imubody: [1, 0, 0, 0, 1, 0, 0, 0, 1]
+
+# 重投影误差: 0.3145px
+camera_matrix: [1851.7070167840545, 0, 721.12585328714192, 0, 1851.8175594364079, 571.69879709276688, 0, 0, 1]
+distort_coeffs: [-0.093662536083526302, 0.18945726820633155, -0.00040424349861928674, -0.0040568403852123142, 0]
+
+# 相机同理想情况的偏角: yaw-1.61 pitch-0.82 roll-0.61 degree
+R_camera2gimbal: [0.02823004230930648, -0.014076983590428133, 0.99950232778328707, -0.99954530259354468, -0.010995644138609872, 0.028076393521179785, 0.010594940981141165, -0.99984045444409364, -0.014380990321749998]
+t_camera2gimbal: [0.045517325957791413, 0.10544338092767802, 0.034649710880185793]
+
+#####-----cboard参数-----#####
+quaternion_canid: 0x100
+bullet_speed_canid: 0x101
+send_canid: 0xff
+can_interface: "can0"
+
+#####-----gimbal参数-----#####
+com_port: "/dev/gimbal"
+
+#####-----planner-----#####
+fire_thresh: 0.003
+
+max_yaw_acc: 50
+Q_yaw: [9e6, 0]
+R_yaw: [1]
+
+max_pitch_acc: 100
+Q_pitch: [9e6,0]
+R_pitch: [1]
+
+#####-----buff_detector参数-----#####
+model: "assets/yolo11_buff_int8.xml"
+
+#####-----buff_aimer参数-----#####
+fire_gap_time: 0.520 # s
+predict_time: 0.100 # s
\ No newline at end of file
diff --git a/configs/uav.yaml b/configs/uav.yaml
new file mode 100644
index 0000000..f9bdd31
--- /dev/null
+++ b/configs/uav.yaml
@@ -0,0 +1,105 @@
+enemy_color: "red"
+# enemy_color: "blue"
+
+
+#####-----神经网络参数-----#####
+yolo_name: yolov5
+classify_model: assets/models/tiny_resnet.onnx
+yolo11_model_path: assets/models/yolo11.xml
+yolov8_model_path: assets/models/yolov8.xml
+yolov5_model_path: assets/models/yolov5.xml
+device: CPU
+min_confidence: 0.8
+use_traditional: true
+
+#####-----ROI-----#####
+roi:
+ x: 420
+ y: 50
+ width: 600
+ height: 600
+
+use_roi: false
+
+#####-----工业相机参数-----#####
+camera_name: "mindvision"
+exposure_ms: 8
+gamma: 0.6
+vid_pid: "f622:d13a"
+
+#####-----USB相机参数-----#####
+image_width: 640
+image_height: 360
+new_image_width: 1280
+new_image_height: 720
+fov_h: 87.7
+fov_v: 56.7
+new_fov_h: 67
+new_fov_v: 40.9
+usb_frame_rate: 100
+usb_exposure: 315 #1-80000______250
+usb_gamma: 160
+usb_gain: 10 #0-96
+
+
+#####-----传统方法参数-----#####
+threshold: 150
+max_angle_error: 45 # degree
+min_lightbar_ratio: 1.5
+max_lightbar_ratio: 20
+min_lightbar_length: 8
+min_armor_ratio: 1
+max_armor_ratio: 5
+max_side_ratio: 1.5
+max_rectangular_error: 25 # degree
+min_confidence: 0.8
+
+#####-----cboard参数-----#####
+quaternion_canid: 0x001
+bullet_speed_canid: 0x110
+send_canid: 0xff
+can_interface: "can0"
+
+#####-----tracker参数-----#####
+min_detect_count: 5
+max_temp_lost_count: 15
+outpost_max_temp_lost_count: 150
+
+#####-----aimer参数-----#####
+yaw_offset: 0 # degree -2.5
+pitch_offset: 1.5 # degree 2
+comming_angle: 70 # degree
+leaving_angle: 30 # degree
+min_spin_speed: 2 # rad/s
+decision_speed: 12 # rad/s
+high_speed_delay_time: 0.005 # s
+low_speed_delay_time: 0.005 # s
+
+#####-----decider参数-----#####
+mode: 1
+
+#####-----shooter参数-----#####
+first_tolerance: 2 # 近距离射击容差,degree
+second_tolerance: 0.8 # 远距离射击容差,degree
+judge_distance: 0.5 #距离判断阈值
+auto_fire: true # 是否由自瞄控制射击
+
+#####-----工业相机标定参数-----#####
+R_gimbal2imubody: [1, 0, 0, 0, 1, 0, 0, 0, 1]
+
+# 重投影误差: 0.1032px
+camera_matrix: [2924.6190997571712, 0, 647.0245571651617, 0, 2927.4258594148396, 388.18625585771758, 0, 0, 1]
+distort_coeffs: [-0.58886594170687334, 0.32512251112647716, 0.012447953238733123, -0.0032411418907421475, 0]
+# 相机同理想情况的偏角: yaw0.02 pitch1.94 roll1.40 degree
+# 标定板到世界坐标系原点的水平距离: 4.12 m
+# 标定板同竖直摆放时的偏角: yaw-87.29 pitch7.65 roll-0.51 degree
+R_camera2gimbal: [0.00046423063676173171, 0.033770528223625203, 0.99942950522456209, -0.99970300483287733, 0.024367462669785803, -0.00035901413901253575, -0.02436568525675643, -0.99913251282626891, 0.03377181066266309]
+t_camera2gimbal: [-0.034955523715399906, -0.000074403211899371, 0.001248173910106823]
+
+
+#####-----buff_detector参数-----#####
+model: "assets/yolo11_buff_int8.xml"
+
+#####-----buff_aimer参数-----#####
+fire_gap_time: 0.600 # s
+predict_time: 0.090 # s
\ No newline at end of file
diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..407d664
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,351 @@
+# 同济大学SuperPower战队25赛季自瞄算法开源
+
+## 本项目亮点
+- 无ROS依赖*,新同学无需学习ROS相关知识就能上手自瞄。
+- 完整工作流,包含开发、编译、调试、部署全流程。
+- 模块化架构,包含各模块的功能说明、代码实现、以及独立的测试程序。
+- 我们提出了“轨迹视角下的自瞄理论”,并据此设计了“自瞄轨迹规划算法”。相比传统自瞄决策算法,该算法实现更简洁、调试更方便、效果更好,击杀时间仅需10s(300HP,14rad/s,2m)。该理论也为后续自瞄技术的改进提供了方向。
+
+*为实现哨兵“追击”功能,本项目预留了与导航通信的ROS接口。
+
+
+## 1 功能介绍
+自瞄的定义和意义。我们对自瞄的定义为“针对移动装甲板目标的自动瞄准和自动火控软件”。当操作手切换成自瞄模式后,自瞄会接管云台的控制权,通过对敌方运动轨迹的预测和弹道解算,控制云台进行追踪;同时,自瞄还会接管发射机构的控制权,判断开火时机。自瞄的意义在于提高我方作战能力,实现短击杀时间、高命中率的作战效果。
+
+自瞄的模块组成。经过多年的发展,大部份参赛队伍都具备了自瞄的能力。通过和一些队伍的交流,目前各队的自瞄类似于如图1.1所示的模块划分。装甲板识别器和目标状态估计器作为“感知模块”,提供敌方运动信息。决策器根据上述信息,进行瞄准位置的计算和开火判断,并最终交由控制器进行执行。
+
+图1.1 自瞄模块划分
+
+自瞄是分布式软件。识别器、估计器、决策器由于算法较为复杂,一般运行在算力较高的小电脑上;出于对实时性和稳定性的考量,控制器一般运行在嵌入式单片机上。模块划分解耦了视觉组和电控组的职责,明确了分工,提高了开发效率。
+
+本项目包含了本队自瞄相关的视觉组部分的全部代码,包括但不限于:多线程相机驱动程序、电控通信协议和具体实现、图像-四元数对齐算法、相机内参标定和手眼标定程序、装甲板识别算法(含传统、神经网络多种实现)、装甲板位姿解算、坐标变换和yaw优化算法、基于拓展卡尔曼的整车估计器、瞄准位置和开火决策逻辑、以及各模块独立测试程序等。
+
+本项目建立在往年[sp_vision_23](https://github.com/TongjiSuperPower/sp_vision_23)、[sp_vision_24](https://github.com/TongjiSuperPower/sp_vision_24)项目的基础之上。其中,sp_vision_23完全基于Python开发,跑通了自瞄从识别到射击的完整流程,因其运行效率不佳(在导航运行时,帧率仅60FPS),sp_vision_24采用C++重写(帧率约100FPS),并且具备参数文件加载、日志记录、离线检测与重启、类似rosbag(时间戳+视频+四元数)录制等辅助功能,以及各个模块的独立测试程序,实现“赛前问题排查、赛后问题重现”的能力,保证了自瞄的可靠性和稳定性。
+
+本项目在上述基础上改进了识别器和决策器。其中,识别器由传统的图像处理方案更换为其它战队开源的基于神经网络的四点检测模型[1,2],以期提高识别器的召回能力。而决策器则由基于经验主义的分段决策逻辑改为基于轨迹优化的规划器,简化代码的同时,实现了更优的云台控制效果和开火决策逻辑,其思路会在后文详细介绍。
+
+
+## 2 效果展示
+轨迹跟随效果。本项目创新性采用“自瞄轨迹规划算法”,降低控制难度的同时,提升轨迹跟随效果。如图2.1所示,跟随单块装甲板时,稳态误差小于0.01rad,装甲板切换时,具备提前减速的能力。
+
+图2.1 轨迹跟随效果(5rad/s,3m)
+
+调试场景演示。本项目容易上手,对新人友好。如视频2.1所示,我们通过无线局域网或插网线方式,使用NoMachine远程桌面软件连接机器人搭载的小电脑,配合PlotJuggler曲线图绘制软件,显示调试时常用的数据信息,如云台yaw关节执行情况、开火决策、击打目标的角速度等。
+
+https://github.com/user-attachments/assets/606c2907-2f11-4392-b3fe-7ee4b7b6fd29
+
+视频2.1 调试场景演示
+
+量化指标统计。如图2.2所示,在25赛季国赛赛场上,搭载本算法的3、4号步兵的最高命中率为39.6%,发挥正常时,命中率不低于30%。除了命中率,我们还统计了击杀时间,面对2m处300血的敌方步兵,7rad/s转速下耗时约8s,14rad/s转速下耗时约10s。
+
+图2.2 国赛MVP结算数据
+
+
+## 3 详细信息
+### 3.1 项目环境
+操作系统:Ubuntu 22.04\
+运算平台:NUC12WSKI7(i7-1260P,16GB)\
+相机型号:海康MV-CS016-10UC\
+镜头型号:海康官方6mm镜头\
+下位机型号:RoboMaster开发板C型(STM32F407)\
+IMU型号:使用C板内置BMI088作为IMU\
+通信方式:USB2CAN(旧)、MicroUSB虚拟串口(新)\
+辅助工具:NoMachine(远程桌面)、PlotJuggler(绘制曲线图)
+
+### 3.2 编译方式
+1. 安装依赖项:
+ - [MindVision SDK](https://mindvision.com.cn/category/software/sdk-installation-package/)或[HikRobot SDK](https://www.hikrobotics.com/cn2/source/support/software/MVS_STD_GML_V2.1.2_231116.zip)
+ - [OpenVINO](https://docs.openvino.ai/2024/get-started/install-openvino/install-openvino-archive-linux.html)
+ - [Ceres](http://ceres-solver.org/installation.html)
+ - 其余:
+ ```bash
+ sudo apt install -y \
+ git \
+ g++ \
+ cmake \
+ can-utils \
+ libopencv-dev \
+ libfmt-dev \
+ libeigen3-dev \
+ libspdlog-dev \
+ libyaml-cpp-dev \
+ libusb-1.0-0-dev \
+ nlohmann-json3-dev \
+ openssh-server \
+ screen
+ ```
+
+2. 编译:
+ ```bash
+ cmake -B build
+ make -C build/ -j`nproc`
+ ```
+
+3. 运行demo:
+ ```bash
+ ./build/auto_aim_test
+ ```
+
+4. 注册自启:
+ 1. 确保已安装`screen`:
+ ```
+ sudo apt install screen
+ ```
+ 2. 创建`.desktop`文件:
+ ```
+ mkdir ~/.config/autostart/
+ touch ~/.config/autostart/sp_vision.desktop
+ ```
+ 3. 在该文件中写入:
+ ```
+ [Desktop Entry]
+ Type=Application
+ Exec=/home/rm/Desktop/sp_vision_25/autostart.sh
+ Name=sp_vision
+ ```
+ 注: [Exec](https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html)必须为绝对路径.
+ 4. 确保`autostart.sh`有可执行权限:
+ ```
+ chmod +x autostart.sh
+ ```
+
+5. USB2CAN设置(可选)
+ 1. 创建`.rules`文件:
+ ```
+ sudo touch /etc/udev/rules.d/99-can-up.rules
+ ```
+ 2. 在该文件中写入:
+ ```
+ ACTION=="add", KERNEL=="can0", RUN+="/sbin/ip link set can0 up type can bitrate 1000000"
+ ACTION=="add", KERNEL=="can1", RUN+="/sbin/ip link set can1 up type can bitrate 1000000"
+
+6. 使用GPU推理(可选)
+ ```
+ mkdir neo
+ cd neo
+
+ wget https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.13463.18/intel-igc-core_1.0.13463.18_amd64.deb
+ wget https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.13463.18/intel-igc-opencl_1.0.13463.18_amd64.deb
+ wget https://github.com/intel/compute-runtime/releases/download/23.09.25812.14/intel-level-zero-gpu-dbgsym_1.3.25812.14_amd64.ddeb
+ wget https://github.com/intel/compute-runtime/releases/download/23.09.25812.14/intel-level-zero-gpu_1.3.25812.14_amd64.deb
+ wget https://github.com/intel/compute-runtime/releases/download/23.09.25812.14/intel-opencl-icd-dbgsym_23.09.25812.14_amd64.ddeb
+ wget https://github.com/intel/compute-runtime/releases/download/23.09.25812.14/intel-opencl-icd_23.09.25812.14_amd64.deb
+ wget https://github.com/intel/compute-runtime/releases/download/23.09.25812.14/libigdgmm12_22.3.0_amd64.deb
+ wget https://github.com/intel/compute-runtime/releases/download/23.09.25812.14/ww09.sum
+
+ sha256sum -c ww09.sum
+ sudo dpkg -i *.deb
+ ```
+ 注:如果使用 GPU 异步推理(async-infer),最高显示分辨率限制为 1920×1080 (24Hz)
+
+7. 串口设置
+ 1. 授予权限
+ ```
+ sudo usermod -a -G dialout $USER
+ ```
+ 2. 获取端口 ID(serial, idVendor, idProduct)
+ ```
+ udevadm info -a -n /dev/ttyACM0 | grep -E '({serial}|{idVendor}|{idProduct})'
+ ```
+ 将 /dev/ttyACM0 替换为实际设备名。
+ 3. 创建 udev 规则文件
+ ```
+ sudo touch /etc/udev/rules.d/99-usb-serial.rules
+ ```
+ 然后在文件中写入如下内容(用真实 ID 替换示例,SYMLINK 是规则应用后固定的串口名):
+ ```
+ SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="1234", ATTRS{serial}=="A1234567", SYMLINK+="gimbal"
+ ```
+ 4. 重新加载 udev 规则
+ ```
+ sudo udevadm control --reload-rules
+ sudo udevadm trigger
+ ```
+ 5. 检查结果
+ ```
+ ls -l /dev/gimbal
+ # Expected output (example):
+ # lrwxrwxrwx 1 root root 7 Jul 21 10:00 /dev/gimbal -> ttyACM0
+ ```
+
+### 3.3 数据流图
+视觉相关模块如图3.1所示。其中,相机线程产生图像、时间戳,通过下位机线程获取对应的云台姿态四元数;图像经过识别器,获得装甲板的四个顶点像素坐标,以及其图案类别;估计器根据装甲板信息,获得目标单位的运动状态;决策器则根据当前的目标运动状态信息,预测目标的运动轨迹,从而判断最佳瞄准位置和最佳开火时机,形成指令发送给下位机;最后控制器和执行机构则根据该指令进行执行,从而完成一个完整的自瞄流程。
+
+图3.1 数据流图
+
+### 3.4 软件架构
+各兵种需要实现的功能往往有多个,但是每个功能不能作为独立的程序。例如步兵需要自瞄和打符,显然,这两个功能都需要从相机获取图像,但是相机只能被一个程序打开,这会导致另一个程序无法正常工作(相机被占用)。
+
+为了解决这个问题,我们提出了视觉框架(sp_vision):自瞄、打符等功能,被拆解为该框架下的一个个功能组,每个功能组包含多个类或函数(如识别器、解算器、预测器等等);而运行的程序(main函数)只有一个,它负责从相机获取图像,再根据电控发来的信号(自瞄档or打符档),选择对应的功能组执行,不同兵种的执行逻辑各不相同,即不同的main函数。此外,为了方便大家合作开发,视觉框架还提供了许多常用的工具函数,减少因重复造轮子所导致的出错概率和时间成本。本框架的组成如图3.2所示。
+
+图3.2 软件架构
+
+### 3.5 文件结构
+```
+sp_vision_25
+├── assets // 包含demo素材、网络权重等
+│ └── ...
+├── calibration // 标定相关程序
+│ ├── calibrate_camera.cpp // 相机内参标定程序
+│ ├── calibrate_handeye.cpp // 手眼标定程序
+│ ├── calibrate_robotworld_handeye.cpp // 手眼标定程序(同时计算标定板位置)
+│ └── capture.cpp // 相机标定数据采集程序
+├── CMakeLists.txt // CMake配置文件
+├── configs // 每台机器人的YAML配置文件
+│ └── ...
+├── io // 硬件抽象层,见3.4软件架构
+│ └── ...
+├── src // 应用层,见3.4软件架构
+│ └── ...
+├── tasks // 功能层,见3.4软件架构
+│ ├── auto_aim // 自瞄相关算法实现
+│ │ └── ...
+│ ├── auto_buff // 打符相关算法实现
+│ │ └── ...
+│ └── omniperception // 全向感知相关算法实现
+│ │ └── ...
+├── tests
+│ ├── auto_aim_test.cpp // 自瞄录制视频测试程序
+│ ├── auto_buff_test.cpp // 打符录制视频测试程序
+│ ├── camera_detect_test.cpp // 识别器测试程序(工业相机)
+│ ├── camera_test.cpp // 相机测试程序
+│ ├── camera_thread_test.cpp // 相机线程测试程序
+│ ├── cboard_test.cpp // C板测试程序
+│ ├── detector_video_test.cpp // 识别器测试程序(视频)
+│ ├── dm_test.cpp // 达妙IMU测试程序
+│ ├── fire_test.cpp // 开火测试程序
+│ ├── gimbal_response_test.cpp // 云台响应测试程序
+│ ├── gimbal_test.cpp // 云台通信测试程序
+│ ├── handeye_test.cpp // 手眼标定测试程序
+│ ├── minimum_vision_system.cpp // 最小视觉系统测试程序
+│ ├── multi_usbcamera_test.cpp // 多USB摄像头测试程序
+│ ├── planner_test_offline.cpp // 规划器测试程序(离线)
+│ ├── planner_test.cpp // 规划器测试程序(实车)
+│ ├── publish_test.cpp // ROS发送测试程序
+│ ├── subscribe_test.cpp // ROS接收测试程序
+│ ├── topic_loop_test.cpp // ROS话题循环测试程序
+│ ├── usbcamera_detect_test.cpp // 识别器测试程序(USB相机)
+│ ├── usbcamera_test.cpp // USB相机测试程序
+│ └── ...
+└── tools // 工具层,见3.4软件架构
+ ├── crc.hpp // CRC校验
+ ├── exiter.hpp // 退出检测
+ ├── extended_kalman_filter.hpp // 扩展卡尔曼滤波器
+ ├── img_tools.hpp // 图像处理工具
+ ├── logger.hpp // 日志记录器
+ ├── math_tools.hpp // 数学工具
+ ├── plotter.hpp // 曲线图绘制工具
+ ├── recorder.hpp // 视频录制器
+ ├── thread_safe_queue.hpp // 线程安全队列
+ ├── trajectory.hpp // 弹道解算
+ ├── yaml.hpp // YAML配置文件解析器
+ └── ...
+```
+
+
+## 4 轨迹视角下的自瞄理论
+### 4.1 引言
+在自瞄的研发和测试过程中,我们发现决策器和控制器是目前的短板。
+
+决策器实现繁琐。不同兵种、不同敌方移动状态(平移、低速小陀螺、高速小陀螺)需要不同的“自瞄行为”,例如:英雄只瞄准旋转中心位置,根据时间误差判断是否开火;平移和低速时,步兵的瞄准位置则持续跟随敌方装甲板移动,同时依据位置误差判断是否开火,而高速时则退化为类似英雄的情况。不同的自瞄行为需要不同的代码实现,而且需要设计不同的判断条件,这一方面提高了代码维护的成本,另一方面也引入额外参数,增大了调试的负担。
+
+控制调参困难。传统控制指标的输入一般为阶跃或斜坡函数,而自瞄控制器的输入更类似于三角波,且周期和幅值随敌方运动状态变化而变化,我们无法找到合适的理论将二者联系起来,因此调参过程中更依赖于经验猜测而不是理论指导。此外,我们无法判断云台的控制效果上限在哪里,甚至对于其影响因素都缺乏充分的认识。这导致电控调参十分“坐牢”,调试一台机器人需要消耗大量时间和资源,并且调试后的机器人表现效果参差不齐。
+
+因此,我们希望能够找到一个“理论”,统一不同决策逻辑、精简代码,同时提高我们对于自瞄以及控制的认识,指导我们更加高效、可靠地调试自瞄,最终提高整体的自瞄效果。
+
+### 4.2 前置概念
+命中率。命中率越高,意味着所发射的子弹中命中装甲板的数量越多,造成的伤害越高,是用来衡量自瞄效果最常见的指标。然而,“不谈射频的命中率是没有意义的”[3],因为如果自瞄只在最有把握的时候射击,只要时间足够长,早晚能打死对面,所以除了命中率还需要考虑击杀时间。
+
+击杀时间。击杀时间衡量了打死敌方单位所需的时间,是衡量自瞄好坏的“金标准”:一方面,装甲板击打检测和发射机构射频均存在上限,杜绝了依靠超高射频刷击杀时间的可行性;另一方面,该指标便于测量,仅需要秒表和靶机即可,比赛时也可以通过回放视频来快速估算。在测量该指标时,需要控制敌方血量、距离和运动状态等变量,这样才能保证时间的可比较性。
+
+目标运动状态。目标运动状态由估计器计算得出,用于决策器预测目标在一段时间后的位置。目前主流的估计算法为基于扩展卡尔曼滤波的整车估计器[3,4],其定义的目标运动状态包括目标旋转中心位置、速度、yaw旋转角度、yaw旋转角速度、各装甲板半径和高度差,根据这些信息,决策器可以计算出每个装甲板的位置,并在其中选择击打目标。为了方便后续的论述,这里有两点假设:假设一,估计器是完美的,无需考虑估计导致的误差;假设二,目标处于匀速运动状态,从而无需考虑预测时因目标变速导致的误差。上述两点假设简化了自瞄使用场景的复杂性,帮助我们专注于决策器的改进。
+
+目标轨迹和云台轨迹。已知目标运动状态,根据匀速运动公式,可以计算任意时刻t下目标各装甲板位置,选择距离云台最近的装甲板,计算其相对于云台的方位角yaw,得到函数yaw_target(t),记为目标轨迹。由于pitch计算方式类似,这里的“轨迹”只讨论yaw。云台轨迹同理,代表对应时刻云台相对于初始位置所呈的夹角yaw,记为yaw_gimbal(t)。
+
+射击轨迹。子弹出膛后需经过子弹飞行时间t_fly后到达装甲板,将目标轨迹提前t_fly可获得射击轨迹,即:
+```math
+yaw_{shoot}(t) = yaw_{target}(t + t_{fly})
+```
+如果t时刻云台角度yaw_gimbal和对应的射击角度yaw_shoot满足一定的误差范围(半个装甲板),则此时从枪管射出的子弹会命中装甲板。更进一步,如果云台轨迹和射击轨迹重合,则任意时刻从枪管射出的子弹均会命中装甲板,“子弹发射如水流一样”[3]。如图4.1所示,射击轨迹的瞄准位置是14ms后目标轨迹的位置。
+
+图4.1 轨迹示意图
+
+### 4.3 什么是好自瞄
+在轨迹视角下,“云台轨迹”和“射击轨迹”重合度越高,击杀时间越短。击杀时间反映了DPS(Damage Per Second),公式如下:
+```math
+击杀时间 = \frac{血量}{DPS}
+```
+```math
+DPS = 单位时间射击窗口占比 \times 射频 \times 单发子弹伤害
+```
+不难看出,重合度越高,单位时间射击窗口占比越高,DPS越高,击杀时间越短,自瞄效果越好。
+
+轨迹重合度和云台控制能力息息相关。云台最大加速度的高低决定了云台控制能力的好坏,云台能产生的瞬时加速度越大,跟随轨迹变化的能力越强,轨迹重合度越高。云台最大加速度计算公式如下:
+```math
+云台最大加速度 = \frac{云台电机最大扭矩}{云台惯量}
+```
+其中,云台电机最大扭矩一般由电机厂家给出,云台惯量通过系统辨识[5]得出。除了云台最大加速度,控制算法的设计也会影响最终的云台控制效果,为了尽可能降低控制难度,我们采取了多种措施:
+1. 我们提出了“自瞄轨迹规划器”,根据云台最大加速度优化射击轨迹,使其更容易被云台跟随。
+2. 我们计算了轨迹对应的速度和加速度,作为前馈量一并发送给电控,提高云台的响应。
+3. 我们采用了计算力矩控制算法[6],其结合PID控制和动力学模型,相比双环PID调参更加简便。
+
+除了击杀时间,命中率也可以在轨迹视角下进行分析。我们可以将云台轨迹划分为“重合射击轨迹段”和“偏离射击轨迹段”,二者的比例决定了理论命中率上限:
+```math
+命中率 \le 重合度 = \frac{重合射击轨迹段}{(重合射击轨迹段 + 偏离射击轨迹段)}
+```
+云台在移动过程中,不可避免地会出现偏离射击轨迹的情况,当该情况发生时,应停止开火,减少弹丸的浪费,保证命中率。在自瞄轨迹规划器中,我们将上述情况作为开火决策的依据,在保证击杀时间的同时提高命中率。
+
+击杀时间越短、命中率越高,自瞄效果越好。前者依赖良好的瞄准位置决策,后者则依赖良好的开火决策。我们从轨迹视角出发,用自瞄轨迹规划器替代传统自瞄决策器:通过考虑云台控制的能力,使得决策后的瞄准位置的更具可行性;通过考虑射击轨迹和规划后轨迹的偏差,结合开火延迟时间,使得开火决策更加简洁清晰,无需额外的分段参数,调试时更加方便。
+
+### 4.4 轨迹规划器
+轨迹突变问题和提前减速策略。小陀螺时装甲板会发生切换,导致目标轨迹和射击轨迹突变,不连续点处的瞬时速度和加速度未定义,强行让控制算法跟随这样的轨迹会有明显的超调或滞后现象。针对轨迹突变问题,轨迹规划器采取“提前减速策略”:若未来一段时间后装甲板会发生切换,则提前减速向下一个装甲板过渡,使规划后轨迹的加速度小于云台最大加速度,如图4.2所示。
+
+图4.2 提前减速策略示意图
+
+该策略的实现方式不止一种,我们尝试了两种方案:
+1. 隐式搜索,以规划后轨迹加速度序列为变量,构造代价函数(重合度尽可能高)和约束条件(不超过云台最大加速度),将该问题转换为二次规划问题,调用第三方库TinyMPC[7]求解。该库针对MPC问题的求解进行了加速优化,实测求解耗时小于1ms。这里MPC并非闭环控制器,而是作为求解器寻找可行轨迹解,其输入不包含云台的实际状态。我们也尝试过使用MPC直接作为闭环控制器,通过下位机转发MPC求解后的力矩指令给电机,当自身小陀螺时,控制效果不如下位机方案。
+2. 显式搜索,以过渡时间为变量,确定切换点前后的起点和终点,使用五次多项式生成过渡段轨迹,调整时间长度,直到满足加速度限制。该方案确定性高,“跟随段”不会参与优化,和射击轨迹重合,在高转速下更加稳定。同时实现更加轻量,无需依赖第三方库和QR矩阵等额外参数。
+
+由于时间有限,方案二仅进行了仿真验证,未上车测试,国赛上场采用了方案一。
+
+开火延迟问题和提前开火决策。从开火命令发送到子弹出膛(摩擦轮掉速)存在时间延迟t_fire,仅考虑当前位置误差进行开火判断并不严谨。轨迹规划器会生成一段时间内的轨迹序列,通过查询t_fire时刻射击轨迹和对应规划后轨迹的误差,判断经过t_fire时间后子弹是否应该出膛,从而实现更加精细的开火决策。该方案的前提是开火延迟无波动,对机械和电控的要求较高。
+
+预测时间偏移量。射击轨迹提前于目标轨迹的时间称为预测时间,预测时间除了子弹飞行时间外,还需考虑各个环节引入的时间延迟,包括:
+- 图像传输延迟:图像时间戳对应接收完成的时刻,需要图像传输至小电脑的时间。
+- 图像处理延迟:神经网络推理耗时无法忽略,需要考虑图像开始处理到形成决策命令的时间。
+- 下位机通信延迟:向下位机传输决策命令所需的时间。
+- 下位机控制延迟:控制云台到目标位置所需的时间。
+
+这里不需要考虑开火延迟,因为在射击轨迹上任意时间发射均会命中[3]。在实际代码实现中,除了图像处理延迟可以直接计算外,我们把其余延迟时间的总和作为一个调试参数[8],通过拍摄慢动作视频、比较击杀时间等方式进行调整,约15ms。
+
+
+## 5 未来优化方向
+将轨迹规划器部署到更多兵种上。由于时间有限,国赛中仅步兵使用了轨迹规划器。我们非常期待其在英雄(射频低)、哨兵(惯量大)、无人机(射频高)上的表现。
+
+边跑边打。目前的自瞄并没有考虑自身的移动,无法边跑边打。在本赛季,步兵经常需要从狗洞冲下去杀对面静止的英雄,而此时自瞄会认为对面在移动,导致前几发打不准,限制了操作手的发挥。我们计划引入轮式里程计信息,改善在该场景下的表现。
+
+
+## 参考文献
+[1] Alan Day.【RM2024赛季-识别模型】深圳大学-RobotPilots[EB/OL]. RoboMaster论坛. https://bbs.robomaster.com/article/54091, 2025.
+
+[2] gaoxin.【RM2024-识别训练网络及推理代码开源】北京科技大学Reborn[EB/OL]. RoboMaster论坛. https://bbs.robomaster.com/article/9655, 2024.
+
+[3] 方俊杰. Linear Modelled Top Detector[EB/OL]. GitHub. https://github.com/julyfun/rm.cv.fans, 2023.
+
+[4] 陈君. rm_vision[EB/OL]. GitHub. https://github.com/chenjunnn/rm_vision, 2023.
+
+[5] 桂凯. 系统辨识心得分享[EB/OL]. 知乎. https://www.zhihu.com/question/57405191/answer/153098166, 2017.
+
+[6] Lynch K M, Park F C. Modern Robotics: Mechanics, Planning, and Control[M]. Cambridge: Cambridge University Press, 2017.
+
+[7] Nguyen K, Schoedel S, Alavilli A, et al. TinyMPC: Model-predictive control on resource-constrained microcontrollers[C]//2024 IEEE International Conference on Robotics and Automation (ICRA). IEEE, 2024: 1-7.
+
+[8] 王洪玺, 计泽贤, 张兰勇. 基于卡尔曼滤波的目标识别跟踪与射击系统设计[J]. Journal of Ordnance Equipment Engineering, 2022, 43(11).
+
+
+## 项目成员
+王骁扬、杨佳轩、奚睿豪、俞选涛、吴圳楠、杨瑞灵、程翔宇
+
+
+## Star History
+[](https://www.star-history.com/#TongjiSuperPower/sp_vision_25&Date)
diff --git a/src/component/CMakeLists.txt b/src/component/CMakeLists.txt
new file mode 100644
index 0000000..eda2653
--- /dev/null
+++ b/src/component/CMakeLists.txt
@@ -0,0 +1,16 @@
+cmake_minimum_required(VERSION 3.16)
+
+add_library(component OBJECT
+ exiter.cpp
+ extended_kalman_filter.cpp
+ ransac_sine_fitter.cpp
+ img_tools.cpp
+ math_tools.cpp
+ plotter.cpp
+ trajectory.cpp
+ recorder.cpp
+ logger.cpp
+ pid.cpp
+ crc.cpp
+)
+target_link_libraries(component fmt::fmt spdlog::spdlog)
\ No newline at end of file
diff --git a/src/component/crc.cpp b/src/component/crc.cpp
new file mode 100644
index 0000000..bbea7ef
--- /dev/null
+++ b/src/component/crc.cpp
@@ -0,0 +1,91 @@
+#include "crc.hpp"
+
+constexpr uint8_t CRC8_INIT = 0xff;
+const uint8_t CRC8_TABLE[256] = {
+ 0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83, 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
+ 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e, 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
+ 0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0, 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
+ 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d, 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
+ 0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5, 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
+ 0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58, 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
+ 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6, 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
+ 0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b, 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
+ 0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f, 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
+ 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92, 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
+ 0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c, 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
+ 0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1, 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
+ 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49, 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
+ 0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4, 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
+ 0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a, 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
+ 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7, 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35,
+};
+
+constexpr uint16_t CRC16_INIT = 0xffff;
+const uint16_t CRC16_TABLE[256] = {
+ 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3,
+ 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
+ 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399,
+ 0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
+ 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50,
+ 0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
+ 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e,
+ 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
+ 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5,
+ 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
+ 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693,
+ 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
+ 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a,
+ 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
+ 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710,
+ 0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
+ 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df,
+ 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
+ 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595,
+ 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
+ 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c,
+ 0x3de3, 0x2c6a, 0x1ef1, 0x0f78};
+
+namespace tools
+{
+uint8_t get_crc8(const uint8_t * data, uint16_t len)
+{
+ uint8_t crc8 = CRC8_INIT;
+ uint8_t byte;
+ uint8_t i;
+
+ while (len--) {
+ byte = *data++;
+ i = crc8 ^ byte;
+ crc8 = CRC8_TABLE[i];
+ }
+
+ return crc8;
+}
+
+bool check_crc8(const uint8_t * data, uint16_t len)
+{
+ return get_crc8(data, len - 1) == data[len - 1];
+}
+
+uint16_t get_crc16(const uint8_t * data, uint32_t len)
+{
+ uint16_t crc16 = CRC16_INIT;
+ uint8_t byte;
+ uint8_t i;
+
+ while (len--) {
+ byte = *data++;
+ i = (crc16 ^ byte) & 0x00ff;
+ crc16 = (crc16 >> 8) ^ CRC16_TABLE[i];
+ }
+
+ return crc16;
+}
+
+bool check_crc16(const uint8_t * data, uint32_t len)
+{
+ uint16_t crc16 = (data[len - 1] << 8) | data[len - 2];
+ return get_crc16(data, len - 2) == crc16;
+}
+
+} // namespace tools
\ No newline at end of file
diff --git a/src/component/crc.hpp b/src/component/crc.hpp
new file mode 100644
index 0000000..2d71cf8
--- /dev/null
+++ b/src/component/crc.hpp
@@ -0,0 +1,22 @@
+#ifndef TOOLS__CRC_HPP
+#define TOOLS__CRC_HPP
+
+#include
+
+namespace tools
+{
+// len不包括crc8
+uint8_t get_crc8(const uint8_t * data, uint16_t len);
+
+// len包括crc8
+bool check_crc8(const uint8_t * data, uint16_t len);
+
+// len不包括crc16
+uint16_t get_crc16(const uint8_t * data, uint32_t len);
+
+// len包括crc16
+bool check_crc16(const uint8_t * data, uint32_t len);
+
+} // namespace tools
+
+#endif // TOOLS__CRC_HPP
diff --git a/src/component/exiter.cpp b/src/component/exiter.cpp
new file mode 100644
index 0000000..a4d1d5d
--- /dev/null
+++ b/src/component/exiter.cpp
@@ -0,0 +1,20 @@
+#include "exiter.hpp"
+
+#include
+#include
+
+namespace tools
+{
+bool exit_ = false;
+bool exiter_inited_ = false;
+
+Exiter::Exiter()
+{
+ if (exiter_inited_) throw std::runtime_error("Multiple Exiter instances!");
+ std::signal(SIGINT, [](int) { exit_ = true; });
+ exiter_inited_ = true;
+}
+
+bool Exiter::exit() const { return exit_; }
+
+} // namespace tools
\ No newline at end of file
diff --git a/src/component/exiter.hpp b/src/component/exiter.hpp
new file mode 100644
index 0000000..1b0de77
--- /dev/null
+++ b/src/component/exiter.hpp
@@ -0,0 +1,16 @@
+#ifndef TOOLS__EXITER_HPP
+#define TOOLS__EXITER_HPP
+
+namespace tools
+{
+class Exiter
+{
+public:
+ Exiter();
+
+ bool exit() const;
+};
+
+} // namespace tools
+
+#endif // TOOLS__EXITER_HPP
\ No newline at end of file
diff --git a/src/component/extended_kalman_filter.cpp b/src/component/extended_kalman_filter.cpp
new file mode 100644
index 0000000..b73f40f
--- /dev/null
+++ b/src/component/extended_kalman_filter.cpp
@@ -0,0 +1,94 @@
+#include "extended_kalman_filter.hpp"
+
+#include
+
+namespace tools
+{
+ExtendedKalmanFilter::ExtendedKalmanFilter(
+ const Eigen::VectorXd & x0, const Eigen::MatrixXd & P0,
+ std::function x_add)
+: x(x0), P(P0), I(Eigen::MatrixXd::Identity(x0.rows(), x0.rows())), x_add(x_add)
+{
+ data["residual_yaw"] = 0.0;
+ data["residual_pitch"] = 0.0;
+ data["residual_distance"] = 0.0;
+ data["residual_angle"] = 0.0;
+ data["nis"] = 0.0;
+ data["nees"] = 0.0;
+ data["nis_fail"] = 0.0;
+ data["nees_fail"] = 0.0;
+ data["recent_nis_failures"] = 0.0;
+}
+
+Eigen::VectorXd ExtendedKalmanFilter::predict(const Eigen::MatrixXd & F, const Eigen::MatrixXd & Q)
+{
+ return predict(F, Q, [&](const Eigen::VectorXd & x) { return F * x; });
+}
+
+Eigen::VectorXd ExtendedKalmanFilter::predict(
+ const Eigen::MatrixXd & F, const Eigen::MatrixXd & Q,
+ std::function f)
+{
+ P = F * P * F.transpose() + Q;
+ x = f(x);
+ return x;
+}
+
+Eigen::VectorXd ExtendedKalmanFilter::update(
+ const Eigen::VectorXd & z, const Eigen::MatrixXd & H, const Eigen::MatrixXd & R,
+ std::function z_subtract)
+{
+ return update(z, H, R, [&](const Eigen::VectorXd & x) { return H * x; }, z_subtract);
+}
+
+Eigen::VectorXd ExtendedKalmanFilter::update(
+ const Eigen::VectorXd & z, const Eigen::MatrixXd & H, const Eigen::MatrixXd & R,
+ std::function h,
+ std::function z_subtract)
+{
+ Eigen::VectorXd x_prior = x;
+ Eigen::MatrixXd K = P * H.transpose() * (H * P * H.transpose() + R).inverse();
+
+ // Stable Compution of the Posterior Covariance
+ // https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/07-Kalman-Filter-Math.ipynb
+ P = (I - K * H) * P * (I - K * H).transpose() + K * R * K.transpose();
+
+ x = x_add(x, K * z_subtract(z, h(x)));
+
+ /// 卡方检验
+ Eigen::VectorXd residual = z_subtract(z, h(x));
+ // 新增检验
+ Eigen::MatrixXd S = H * P * H.transpose() + R;
+ double nis = residual.transpose() * S.inverse() * residual;
+ double nees = (x - x_prior).transpose() * P.inverse() * (x - x_prior);
+
+ // 卡方检验阈值(自由度=4,取置信水平95%)
+ constexpr double nis_threshold = 0.711;
+ constexpr double nees_threshold = 0.711;
+
+ if (nis > nis_threshold) nis_count_++, data["nis_fail"] = 1;
+ if (nees > nees_threshold) nees_count_++, data["nees_fail"] = 1;
+ total_count_++;
+ last_nis = nis;
+
+ recent_nis_failures.push_back(nis > nis_threshold ? 1 : 0);
+
+ if (recent_nis_failures.size() > window_size) {
+ recent_nis_failures.pop_front();
+ }
+
+ int recent_failures = std::accumulate(recent_nis_failures.begin(), recent_nis_failures.end(), 0);
+ double recent_rate = static_cast(recent_failures) / recent_nis_failures.size();
+
+ data["residual_yaw"] = residual[0];
+ data["residual_pitch"] = residual[1];
+ data["residual_distance"] = residual[2];
+ data["residual_angle"] = residual[3];
+ data["nis"] = nis;
+ data["nees"] = nees;
+ data["recent_nis_failures"] = recent_rate;
+
+ return x;
+}
+
+} // namespace tools
\ No newline at end of file
diff --git a/src/component/extended_kalman_filter.hpp b/src/component/extended_kalman_filter.hpp
new file mode 100644
index 0000000..2fed923
--- /dev/null
+++ b/src/component/extended_kalman_filter.hpp
@@ -0,0 +1,57 @@
+#ifndef TOOLS__EXTENDED_KALMAN_FILTER_HPP
+#define TOOLS__EXTENDED_KALMAN_FILTER_HPP
+
+#include
+#include
+#include
+#include