├── tests ├── test_PacketDriver.cpp ├── test_PacketWriter.cpp ├── test_PacketDecoder.cpp ├── test_PacketBundler.cpp └── test_PacketBundleDecoder.cpp ├── PacketDriver.h ├── PacketBundler.h ├── LICENSE ├── CMakeLists.txt ├── PacketBundleDecoder.h ├── README.md ├── PacketBundler.cpp ├── scripts └── rosbag_to_pcap.py ├── PacketDecoder.h ├── PacketDriver.cpp ├── PacketFileSender.cxx ├── PacketFileReader.h ├── PacketFileWriter.h ├── PacketDecoder.cpp ├── PacketBundleDecoder.cpp ├── 16db.xml └── 32db.xml /tests/test_PacketDriver.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "PacketDriver.h" 5 | #include 6 | 7 | using namespace std; 8 | 9 | int main() 10 | { 11 | PacketDriver driver(DATA_PORT); 12 | 13 | std::string* data = new std::string(); 14 | unsigned int* dataLength = new unsigned int(); 15 | while (true) { 16 | driver.GetPacket(data, dataLength); 17 | std::cout << "Length of packet: " << (*data).length() << std::endl; 18 | } 19 | 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /tests/test_PacketWriter.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "PacketDriver.h" 5 | #include "PacketFileWriter.h" 6 | #include 7 | 8 | using namespace std; 9 | 10 | int main() 11 | { 12 | PacketDriver driver; 13 | driver.InitPacketDriver(DATA_PORT); 14 | vtkPacketFileWriter writer; 15 | if (!writer.Open("./test.pcap")) { 16 | std::cerr << "Could not open pcap file to write" << std::endl; 17 | } 18 | 19 | std::string* data = new std::string(); 20 | unsigned int* dataLength = new unsigned int(); 21 | while (true) { 22 | driver.GetPacket(data, dataLength); 23 | std::cout << "Length of packet: " << (*data).length() << std::endl; 24 | writer.WritePacket(reinterpret_cast(data->c_str()), data->length()); 25 | } 26 | 27 | return 0; 28 | } 29 | -------------------------------------------------------------------------------- /tests/test_PacketDecoder.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "PacketDriver.h" 5 | #include "PacketDecoder.h" 6 | #include 7 | #include 8 | 9 | using namespace std; 10 | 11 | int main() 12 | { 13 | PacketDriver driver; 14 | driver.InitPacketDriver(DATA_PORT); 15 | PacketDecoder decoder; 16 | decoder.SetCorrectionsFile("../32db.xml"); 17 | 18 | std::string* data = new std::string(); 19 | unsigned int* dataLength = new unsigned int(); 20 | std::deque frames; 21 | PacketDecoder::HDLFrame latest_frame; 22 | while (true) { 23 | driver.GetPacket(data, dataLength); 24 | decoder.DecodePacket(data, dataLength); 25 | frames = decoder.GetFrames(); 26 | if (decoder.GetLatestFrame(&latest_frame)) { 27 | std::cout << "Number of points: " << latest_frame.x.size() << std::endl; 28 | } 29 | } 30 | 31 | return 0; 32 | } 33 | -------------------------------------------------------------------------------- /PacketDriver.h: -------------------------------------------------------------------------------- 1 | // Velodyne HDL Packet Driver 2 | // Nick Rypkema (rypkema@mit.edu), MIT 2017 3 | // shared library to read a Velodyne HDL packet streaming over UDP 4 | 5 | #ifndef PACKET_DRIVER_H_INCLUDED 6 | #define PACKET_DRIVER_H_INCLUDED 7 | 8 | #include 9 | 10 | static unsigned int DATA_PORT = 2368; 11 | 12 | class PacketDriver 13 | { 14 | public: 15 | PacketDriver(); 16 | PacketDriver(unsigned int port); 17 | virtual ~PacketDriver(); 18 | void InitPacketDriver(unsigned int port); 19 | bool GetPacket(std::string* data, unsigned int* data_length); 20 | 21 | protected: 22 | void GetPacketCallback(const boost::system::error_code& error, std::size_t num_bytes, std::string* data, unsigned int* data_length); 23 | 24 | private: 25 | unsigned int _port; 26 | char _rx_buffer[1500]; 27 | boost::asio::io_service _io_service; 28 | boost::shared_ptr _socket; 29 | }; 30 | 31 | #endif // PACKET_DRIVER_H_INCLUDED 32 | -------------------------------------------------------------------------------- /tests/test_PacketBundler.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "PacketDriver.h" 5 | #include "PacketBundler.h" 6 | #include 7 | #include 8 | 9 | using namespace std; 10 | 11 | int main() 12 | { 13 | PacketDriver driver; 14 | driver.InitPacketDriver(DATA_PORT); 15 | PacketBundler bundler; 16 | 17 | std::string* data = new std::string(); 18 | unsigned int* dataLength = new unsigned int(); 19 | std::deque bundles; 20 | std::string latest_bundle; 21 | unsigned int latest_bundle_length; 22 | while (true) { 23 | driver.GetPacket(data, dataLength); 24 | bundler.BundlePacket(data, dataLength); 25 | bundles = bundler.GetBundles(); 26 | if (bundler.GetLatestBundle(&latest_bundle, &latest_bundle_length)) { 27 | std::cout << "Bundle length: " << latest_bundle_length << std::endl; 28 | std::cout << "Bundle number of packets: " << (latest_bundle_length/1206) << std::endl; 29 | } 30 | } 31 | 32 | return 0; 33 | } 34 | -------------------------------------------------------------------------------- /PacketBundler.h: -------------------------------------------------------------------------------- 1 | // Velodyne HDL Packet Bundler 2 | // Nick Rypkema (rypkema@mit.edu), MIT 2017 3 | // shared library to bundle velodyne packets into enough for a single frame 4 | 5 | #ifndef PACKET_BUNDLER_H_INCLUDED 6 | #define PACKET_BUNDLER_H_INCLUDED 7 | 8 | #include 9 | #include 10 | #include "PacketDecoder.h" 11 | 12 | class PacketBundler 13 | { 14 | public: 15 | PacketBundler(); 16 | virtual ~PacketBundler(); 17 | void SetMaxNumberOfBundles(unsigned int max_num_of_bundles); 18 | void BundlePacket(std::string* data, unsigned int* data_length); 19 | std::deque GetBundles(); 20 | void ClearBundles(); 21 | bool GetLatestBundle(std::string* bundle, unsigned int* bundle_length); 22 | 23 | protected: 24 | void UnloadData(); 25 | void BundleHDLPacket(unsigned char *data, unsigned int data_length); 26 | void SplitBundle(); 27 | 28 | private: 29 | unsigned int _last_azimuth; 30 | unsigned int _max_num_of_bundles; 31 | std::string* _bundle; 32 | std::deque _bundles; 33 | }; 34 | 35 | #endif // PACKET_BUNDLER_H_INCLUDED 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Nick R. Rypkema 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /tests/test_PacketBundleDecoder.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "PacketDriver.h" 5 | #include "PacketBundler.h" 6 | #include "PacketBundleDecoder.h" 7 | #include 8 | #include 9 | 10 | using namespace std; 11 | 12 | int main() 13 | { 14 | PacketDriver driver; 15 | driver.InitPacketDriver(DATA_PORT); 16 | PacketBundler bundler; 17 | PacketBundleDecoder bundleDecoder; 18 | 19 | std::string* data = new std::string(); 20 | unsigned int* dataLength = new unsigned int(); 21 | std::deque bundles; 22 | std::string latest_bundle; 23 | unsigned int latest_bundle_length; 24 | PacketBundleDecoder::HDLFrame latest_frame; 25 | while (true) { 26 | driver.GetPacket(data, dataLength); 27 | bundler.BundlePacket(data, dataLength); 28 | bundles = bundler.GetBundles(); 29 | if (bundler.GetLatestBundle(&latest_bundle, &latest_bundle_length)) { 30 | std::cout << "Bundle length: " << latest_bundle_length << std::endl; 31 | std::cout << "Bundle number of packets: " << (latest_bundle_length/1206) << std::endl; 32 | bundleDecoder.DecodeBundle(&latest_bundle, &latest_bundle_length); 33 | if (bundleDecoder.GetLatestFrame(&latest_frame)) { 34 | std::cout << "Number of points: " << latest_frame.x.size() << std::endl; 35 | } 36 | } 37 | } 38 | 39 | return 0; 40 | } 41 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.8.7) 2 | 3 | # VelodyneHDL Driver 4 | project(VelodyneHDL) 5 | 6 | include_directories(${CMAKE_CURRENT_SOURCE_DIR}) 7 | 8 | add_library(PacketDriver SHARED PacketDriver.cpp) 9 | target_link_libraries(PacketDriver 10 | boost_system 11 | ) 12 | 13 | add_library(PacketDecoder SHARED PacketDecoder.cpp) 14 | target_link_libraries(PacketDecoder 15 | ) 16 | 17 | add_library(PacketBundler SHARED PacketBundler.cpp) 18 | target_link_libraries(PacketBundler 19 | ) 20 | 21 | add_library(PacketBundleDecoder SHARED PacketBundleDecoder.cpp) 22 | target_link_libraries(PacketBundleDecoder 23 | ) 24 | 25 | add_executable(test_PacketDriver tests/test_PacketDriver.cpp) 26 | target_link_libraries(test_PacketDriver 27 | PacketDriver 28 | pcap 29 | ) 30 | 31 | add_executable(test_PacketDecoder tests/test_PacketDecoder.cpp) 32 | target_link_libraries(test_PacketDecoder 33 | PacketDriver 34 | PacketDecoder 35 | pcap 36 | ) 37 | 38 | add_executable(test_PacketWriter tests/test_PacketWriter.cpp) 39 | target_link_libraries(test_PacketWriter 40 | PacketDriver 41 | pcap 42 | ) 43 | 44 | add_executable(test_PacketBundler tests/test_PacketBundler.cpp) 45 | target_link_libraries(test_PacketBundler 46 | PacketDriver 47 | PacketBundler 48 | ) 49 | 50 | add_executable(test_PacketBundleDecoder tests/test_PacketBundleDecoder.cpp) 51 | target_link_libraries(test_PacketBundleDecoder 52 | PacketDriver 53 | PacketBundler 54 | PacketBundleDecoder 55 | ) 56 | 57 | add_executable(PacketFileSender PacketFileSender.cxx) 58 | target_link_libraries(PacketFileSender 59 | boost_system 60 | boost_thread 61 | pcap 62 | ) 63 | -------------------------------------------------------------------------------- /PacketBundleDecoder.h: -------------------------------------------------------------------------------- 1 | // Velodyne HDL Packet Bundle Decoder 2 | // Nick Rypkema (rypkema@mit.edu), MIT 2017 3 | // shared library to decode a bundle of velodyne packets 4 | 5 | #ifndef PACKET_BUNDLE_DECODER_H_INCLUDED 6 | #define PACKET_BUNDLE_DECODER_H_INCLUDED 7 | 8 | #include 9 | #include 10 | #include 11 | #include "PacketDecoder.h" 12 | 13 | class PacketBundleDecoder 14 | { 15 | public: 16 | struct HDLFrame 17 | { 18 | std::vector x; 19 | std::vector y; 20 | std::vector z; 21 | std::vector intensity; 22 | std::vector laser_id; 23 | std::vector azimuth; 24 | std::vector distance; 25 | std::vector ms_from_top_of_hour; 26 | }; 27 | 28 | public: 29 | PacketBundleDecoder(); 30 | virtual ~PacketBundleDecoder(); 31 | void SetMaxNumberOfFrames(unsigned int max_num_of_frames); 32 | void DecodeBundle(std::string* bundle, unsigned int* bundle_length); 33 | void SetCorrectionsFile(const std::string& corrections_file); 34 | std::deque GetFrames(); 35 | void ClearFrames(); 36 | bool GetLatestFrame(HDLFrame* frame); 37 | 38 | protected: 39 | void UnloadData(); 40 | void InitTables(); 41 | void LoadCorrectionsFile(const std::string& correctionsFile); 42 | void LoadHDL32Corrections(); 43 | void SetCorrectionsCommon(); 44 | void ProcessHDLPacket(unsigned char *data, unsigned int data_length); 45 | void PushFiringData(unsigned char laserId, unsigned short azimuth, unsigned int timestamp, HDLLaserReturn laserReturn, HDLLaserCorrection correction); 46 | 47 | private: 48 | std::string _corrections_file; 49 | unsigned int _max_num_of_frames; 50 | HDLFrame* _frame; 51 | std::deque _frames; 52 | }; 53 | 54 | #endif // PACKET_BUNDLE_DECODER_H_INCLUDED 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VelodyneHDL 2 | 3 | ### A minimal driver for Velodyne HDL-32E/64E VLP-16 lidars 4 | Most Velodyne lidar drivers are needlessly complex, or specifically written for a particular middleware (e.g. ROS). This repo contains minimal, lightweight code to build shared libraries to interface to and decode packets from the Velodyne HDL (and VLP-16) family of lidars. 5 | 6 | #### Contains 7 | - PacketDriver: builds to PacketDriver.so, a library to read (via boost::asio) Velodyne packets streamed to UDP port 2368. 8 | - PacketDecoder: builds to PacketDecoder.so, a library to decode (convert to x, y, z, intensity, etc.) Velodyne packets. 9 | - PacketFileSender: builds to PacketFileSender, an executable to stream packets from a pcap file to UDP port 2368 (slightly modified code from VTK) 10 | - PacketFileReader: a header file to read packets from a pcap file (code from VTK) 11 | - PacketFileWriter: a header file to write packets to a pcap file (code from VTK) 12 | - PacketBundler: builds to PacketBundler.so, a library to bundle streamed Velodyne packets into enough for a frame (a full 360 degree sweep) - useful if your middleware cannot handle the rate of Velodyne packet streaming (~1.8kHz) 13 | - PacketBundleDecoder: bulds to PacketBundleDecoder.so, a library to decode a bundle of Velodyne packets 14 | 15 | #### Example Usage 16 | Under the tests directory you can find example code on how to use the PacketDriver and PacketDecoder libraries, as well as the PacketFileWriter header. 17 | 18 | #### Dependencies 19 | 20 | ###### PCAP Library: 21 | > sudo apt-get install libpcap-dev 22 | 23 | ###### Boost Libraries: 24 | > sudo apt-get install libboost-all-dev 25 | 26 | #### Build 27 | 28 | ###### Building: 29 | > mkdir build 30 | > cd build 31 | > cmake .. 32 | > make 33 | 34 | ###### Add To .bashrc: 35 | > export PATH="PATH:/..../path/to/build 36 | > export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/..../path/to/build" 37 | > export LIBRARY_PATH="$LIBRARY_PATH:/..../path/to/build" 38 | > export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/..../path/to/source" 39 | 40 | #### Usage 41 | 42 | ###### Streaming PCAP File: 43 | > PacketFileSender pcap_file.pcap 44 | 45 | ###### Interfacing to Velodyne: 46 | > test_PacketDriver 47 | 48 | ###### Interfacing to Velodyne and Decoding Packets: 49 | > test_PacketDecoder 50 | 51 | ###### Interfacing to Velodyne and Writing Packets to pcap File: 52 | > test_PacketWriter 53 | 54 | ###### Interfacing to Velodyne and Bundling Packets: 55 | > test_PacketBundler 56 | 57 | ###### Interfacing to Velodyne, Bundling Packets and Decoding Packet Bundles: 58 | > test_PacketBundleDecoder 59 | -------------------------------------------------------------------------------- /PacketBundler.cpp: -------------------------------------------------------------------------------- 1 | // Velodyne HDL Packet Bundler 2 | // Nick Rypkema (rypkema@mit.edu), MIT 2017 3 | // shared library to bundle velodyne packets into enough for a single frame 4 | 5 | #include 6 | #include 7 | #include 8 | 9 | #include "PacketBundler.h" 10 | 11 | PacketBundler::PacketBundler() 12 | { 13 | _max_num_of_bundles = 10; 14 | UnloadData(); 15 | } 16 | 17 | PacketBundler::~PacketBundler() 18 | { 19 | 20 | } 21 | 22 | void PacketBundler::SetMaxNumberOfBundles(unsigned int max_num_of_bundles) 23 | { 24 | 25 | if (max_num_of_bundles <= 0) { 26 | return; 27 | } else { 28 | _max_num_of_bundles = max_num_of_bundles; 29 | } 30 | while (_bundles.size() >= _max_num_of_bundles) { 31 | _bundles.pop_front(); 32 | } 33 | } 34 | 35 | void PacketBundler::BundlePacket(std::string* data, unsigned int* data_length) 36 | { 37 | const unsigned char* data_char = reinterpret_cast(data->c_str()); 38 | BundleHDLPacket(const_cast(data_char), *data_length); 39 | } 40 | 41 | void PacketBundler::BundleHDLPacket(unsigned char *data, unsigned int data_length) 42 | { 43 | if (data_length != 1206) { 44 | std::cout << "PacketBundler: Warning, data packet is not 1206 bytes" << std::endl; 45 | return; 46 | } 47 | 48 | HDLDataPacket* dataPacket = reinterpret_cast(data); 49 | 50 | for (int i = 0; i < HDL_FIRING_PER_PKT; ++i) { 51 | HDLFiringData firingData = dataPacket->firingData[i]; 52 | 53 | if (firingData.rotationalPosition < _last_azimuth) { 54 | SplitBundle(); 55 | } 56 | 57 | _last_azimuth = firingData.rotationalPosition; 58 | } 59 | 60 | _bundle->append(reinterpret_cast(data), (size_t)data_length); 61 | } 62 | 63 | void PacketBundler::SplitBundle() 64 | { 65 | if (_bundles.size() == _max_num_of_bundles-1) { 66 | _bundles.pop_front(); 67 | } 68 | _bundles.push_back(*_bundle); 69 | delete _bundle; 70 | _bundle = new std::string(); 71 | } 72 | 73 | void PacketBundler::UnloadData() 74 | { 75 | _last_azimuth = 0; 76 | _bundle = new std::string(); 77 | _bundles.clear(); 78 | } 79 | 80 | std::deque PacketBundler::GetBundles() 81 | { 82 | return _bundles; 83 | } 84 | 85 | void PacketBundler::ClearBundles() 86 | { 87 | _bundles.clear(); 88 | } 89 | 90 | bool PacketBundler::GetLatestBundle(std::string* bundle, unsigned int* bundle_length) 91 | { 92 | if (_bundles.size()) { 93 | *bundle = _bundles.back(); 94 | *bundle_length = bundle->size(); 95 | _bundles.clear(); 96 | return(true); 97 | } 98 | return(false); 99 | } 100 | -------------------------------------------------------------------------------- /scripts/rosbag_to_pcap.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from __future__ import print_function 3 | import sys 4 | import rospy 5 | from velodyne_msgs.msg import VelodyneScan 6 | import signal 7 | import binascii 8 | 9 | ''' 10 | Script to convert ROS bag Velodyne data to .pcap format. Usage: 11 | Terminal 1: > roscore 12 | Terminal 2: > python3 rosbag_to_pcap.py velodyne_packets outfile.pcap 13 | Terminal 3: > rosbag play infile.bag 14 | Use ctrl+c to end conversion when desired. 15 | ''' 16 | 17 | #Global header for pcap 2.4 18 | #pcap format: https://wiki.wireshark.org/Development/LibpcapFileFormat 19 | #pcap global heaeder = 0x + d4c3b2a1 (magic_number) + 0200 (version_major) + 0400 (version_minor) + 00000000 (thiszone) + 00000000 (sigfigs) + ffff0000 (snaplen) + 01000000 (network) 20 | global_header = 'd4c3b2a1020004000000000000000000ffff000001000000' # 24 bytes = 48 characters (once at file start) 21 | #pcap packet header = 0x + ffffffff (ts_sec) + ffffffff (ts_nsec) + 00000000 (incl_len) + 00000000 (orig_len) 22 | packet_header = 'f540e051872a0100e0040000e0040000' # 16 bytes = 32 characters (once at start of every packet) 23 | # Velodyne UDP header 24 | udp_header = 'ffffffffffff60768820118c0800450004d200004000ff11b4a9c0a801c9ffffffff0940094004be0000' # 42 bytes = 84 characters (once at start of every packet) 25 | 26 | bitout = None 27 | total_packets = 0 28 | 29 | def init(filename): 30 | global global_header 31 | global bitout 32 | 33 | bitout = open(filename, 'wb') 34 | bytes = binascii.a2b_hex(global_header) 35 | bitout.write(bytes) 36 | 37 | def signal_handler(sig, frame): 38 | global global_header 39 | global bitout 40 | 41 | bitout.close() 42 | sys.exit(0) 43 | 44 | signal.signal(signal.SIGINT, signal_handler) 45 | 46 | def callback(ros_data): 47 | global packet_header 48 | global udp_header 49 | global bitout 50 | global total_packets 51 | 52 | udp_packets = '' 53 | 54 | num_packets = len(ros_data.packets) 55 | for i in range(0, num_packets): # keep adding packet header, udp header and data 56 | packet_secs = ros_data.packets[i].stamp.secs 57 | hex_secs = format(packet_secs, '08x') 58 | packet_nsecs = ros_data.packets[i].stamp.nsecs 59 | hex_nsecs = format(packet_nsecs, '08x') 60 | hexdata = binascii.hexlify(ros_data.packets[i].data) 61 | new_data = hex_secs + hex_nsecs + packet_header[16:] 62 | new_data += udp_header 63 | new_data += hexdata.decode('ascii') 64 | udp_packets += new_data 65 | 66 | total_packets += 1 67 | print('Wrote ' + str(total_packets) + ' packets.') 68 | 69 | bytes = binascii.a2b_hex(udp_packets) 70 | bitout.write(bytes) 71 | 72 | def listener(topic): 73 | print('Subscribing to ' + str(topic) + '.') 74 | rospy.init_node('bag_to_pcap', anonymous=True) 75 | rospy.Subscriber(topic, VelodyneScan, callback) 76 | rospy.spin() 77 | 78 | if __name__ == '__main__': 79 | if len(sys.argv) < 3: 80 | print('python rosbag_to_pcap.py subscribing_topic outfilename.pcap') 81 | topic = sys.argv[1] 82 | filename = sys.argv[2] 83 | init(filename) 84 | listener(topic) 85 | -------------------------------------------------------------------------------- /PacketDecoder.h: -------------------------------------------------------------------------------- 1 | // Velodyne HDL Packet Decoder 2 | // Nick Rypkema (rypkema@mit.edu), MIT 2017 3 | // shared library to decode a Velodyne packet 4 | 5 | #ifndef PACKET_DECODER_H_INCLUDED 6 | #define PACKET_DECODER_H_INCLUDED 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | namespace 13 | { 14 | #define HDL_Grabber_toRadians(x) ((x) * M_PI / 180.0) 15 | 16 | const int HDL_NUM_ROT_ANGLES = 36001; 17 | const int HDL_LASER_PER_FIRING = 32; 18 | const int HDL_MAX_NUM_LASERS = 64; 19 | const int HDL_FIRING_PER_PKT = 12; 20 | 21 | enum HDLBlock 22 | { 23 | BLOCK_0_TO_31 = 0xeeff, 24 | BLOCK_32_TO_63 = 0xddff 25 | }; 26 | 27 | #pragma pack(push, 1) 28 | typedef struct HDLLaserReturn 29 | { 30 | unsigned short distance; 31 | unsigned char intensity; 32 | } HDLLaserReturn; 33 | #pragma pack(pop) 34 | 35 | struct HDLFiringData 36 | { 37 | unsigned short blockIdentifier; 38 | unsigned short rotationalPosition; 39 | HDLLaserReturn laserReturns[HDL_LASER_PER_FIRING]; 40 | }; 41 | 42 | struct HDLDataPacket 43 | { 44 | HDLFiringData firingData[HDL_FIRING_PER_PKT]; 45 | unsigned int gpsTimestamp; 46 | unsigned char blank1; 47 | unsigned char blank2; 48 | }; 49 | 50 | struct HDLLaserCorrection 51 | { 52 | double azimuthCorrection; 53 | double verticalCorrection; 54 | double distanceCorrection; 55 | double verticalOffsetCorrection; 56 | double horizontalOffsetCorrection; 57 | double sinVertCorrection; 58 | double cosVertCorrection; 59 | double sinVertOffsetCorrection; 60 | double cosVertOffsetCorrection; 61 | }; 62 | 63 | struct HDLRGB 64 | { 65 | uint8_t r; 66 | uint8_t g; 67 | uint8_t b; 68 | }; 69 | 70 | double *cos_lookup_table_; 71 | double *sin_lookup_table_; 72 | HDLLaserCorrection laser_corrections_[HDL_MAX_NUM_LASERS]; 73 | } 74 | 75 | class PacketDecoder 76 | { 77 | public: 78 | struct HDLFrame 79 | { 80 | std::vector x; 81 | std::vector y; 82 | std::vector z; 83 | std::vector intensity; 84 | std::vector laser_id; 85 | std::vector azimuth; 86 | std::vector distance; 87 | std::vector ms_from_top_of_hour; 88 | }; 89 | 90 | public: 91 | PacketDecoder(); 92 | virtual ~PacketDecoder(); 93 | void SetMaxNumberOfFrames(unsigned int max_num_of_frames); 94 | void DecodePacket(std::string* data, unsigned int* data_length); 95 | void SetCorrectionsFile(const std::string& corrections_file); 96 | std::deque GetFrames(); 97 | void ClearFrames(); 98 | bool GetLatestFrame(HDLFrame* frame); 99 | 100 | protected: 101 | void UnloadData(); 102 | void InitTables(); 103 | void LoadCorrectionsFile(const std::string& correctionsFile); 104 | void LoadHDL32Corrections(); 105 | void SetCorrectionsCommon(); 106 | void ProcessHDLPacket(unsigned char *data, unsigned int data_length); 107 | void SplitFrame(); 108 | void PushFiringData(unsigned char laserId, unsigned short azimuth, unsigned int timestamp, HDLLaserReturn laserReturn, HDLLaserCorrection correction); 109 | 110 | private: 111 | std::string _corrections_file; 112 | unsigned int _last_azimuth; 113 | unsigned int _max_num_of_frames; 114 | HDLFrame* _frame; 115 | std::deque _frames; 116 | }; 117 | 118 | #endif // PACKET_DECODER_H_INCLUDED 119 | -------------------------------------------------------------------------------- /PacketDriver.cpp: -------------------------------------------------------------------------------- 1 | // Velodyne HDL Packet Driver 2 | // Nick Rypkema (rypkema@mit.edu), MIT 2017 3 | // shared library to read a Velodyne HDL packet streaming over UDP 4 | 5 | #include 6 | 7 | #include "PacketDriver.h" 8 | #include 9 | 10 | using boost::asio::ip::udp; 11 | 12 | PacketDriver::PacketDriver() 13 | { 14 | 15 | } 16 | 17 | PacketDriver::PacketDriver(unsigned int port) : _port(port) 18 | { 19 | boost::asio::ip::udp::endpoint destination_endpoint(boost::asio::ip::address_v4::any(), _port); 20 | 21 | try { 22 | _socket = boost::shared_ptr(new boost::asio::ip::udp::socket(_io_service)); 23 | _socket->open(destination_endpoint.protocol()); 24 | _socket->bind(destination_endpoint); 25 | } catch(std::exception & e) { 26 | std::cout << "PacketDriver: Error binding to socket - " << e.what() << ". Trying once more..." << std::endl; 27 | try { 28 | destination_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::address_v4::any(), _port); 29 | _socket = boost::shared_ptr(new boost::asio::ip::udp::socket(_io_service)); 30 | _socket->open(destination_endpoint.protocol()); 31 | _socket->bind(destination_endpoint); 32 | } catch(std::exception & e) { 33 | std::cout << "PacketDriver: Error binding to socket - " << e.what() << ". Failed!" << std::endl; 34 | return; 35 | } 36 | } 37 | 38 | std::cout << "PacketDriver: Success binding to Velodyne socket!" << std::endl; 39 | return; 40 | } 41 | 42 | PacketDriver::~PacketDriver() 43 | { 44 | _socket->close(); 45 | _io_service.stop(); 46 | } 47 | 48 | void PacketDriver::InitPacketDriver(unsigned int port) 49 | { 50 | _port = port; 51 | 52 | boost::asio::ip::udp::endpoint destination_endpoint(boost::asio::ip::address_v4::any(), _port); 53 | 54 | try { 55 | _socket = boost::shared_ptr(new boost::asio::ip::udp::socket(_io_service)); 56 | _socket->open(destination_endpoint.protocol()); 57 | _socket->bind(destination_endpoint); 58 | } catch(std::exception & e) { 59 | std::cout << "PacketDriver: Error binding to socket - " << e.what() << ". Trying once more..." << std::endl; 60 | try { 61 | destination_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::address_v4::any(), _port); 62 | _socket = boost::shared_ptr(new boost::asio::ip::udp::socket(_io_service)); 63 | _socket->open(destination_endpoint.protocol()); 64 | _socket->bind(destination_endpoint); 65 | } catch(std::exception & e) { 66 | std::cout << "PacketDriver: Error binding to socket - " << e.what() << ". Failed!" << std::endl; 67 | return; 68 | } 69 | } 70 | 71 | std::cout << "PacketDriver: Success binding to Velodyne socket!" << std::endl; 72 | return; 73 | } 74 | 75 | bool PacketDriver::GetPacket(std::string* data, unsigned int* data_length) 76 | { 77 | try { 78 | _socket->async_receive(boost::asio::buffer(_rx_buffer, 1500), 79 | boost::bind(&PacketDriver::GetPacketCallback, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, data, data_length)); 80 | _io_service.reset(); 81 | _io_service.run(); 82 | return (true); 83 | } catch(std::exception & e) { 84 | std::cout << "PacketDriver: Error receiving packet - " << e.what() << "." << std::endl; 85 | return(false); 86 | } 87 | } 88 | 89 | void PacketDriver::GetPacketCallback(const boost::system::error_code& error, std::size_t num_bytes, std::string* data, unsigned int* data_length) 90 | { 91 | (*data).assign(_rx_buffer, num_bytes); 92 | *data_length = (unsigned int) num_bytes; 93 | return; 94 | } 95 | 96 | -------------------------------------------------------------------------------- /PacketFileSender.cxx: -------------------------------------------------------------------------------- 1 | // Copyright 2013 Velodyne Acoustics, Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | /*========================================================================= 15 | 16 | Program: Visualization Toolkit 17 | Module: PacketFileSender.cxx 18 | 19 | Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 20 | All rights reserved. 21 | See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 22 | 23 | This software is distributed WITHOUT ANY WARRANTY; without even 24 | the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 25 | PURPOSE. See the above copyright notice for more information. 26 | 27 | =========================================================================*/ 28 | // .NAME PacketFileSender - 29 | // .SECTION Description 30 | // This program reads a pcap file and sends the packets using UDP. 31 | 32 | #include "PacketDriver.h" 33 | #include "PacketDecoder.h" 34 | #include "PacketFileReader.h" 35 | 36 | #include 37 | #include 38 | #include 39 | 40 | #include 41 | #include 42 | 43 | 44 | int main(int argc, char* argv[]) 45 | { 46 | 47 | if (argc != 2) { 48 | std::cout << "Usage: " << argv[0] << " " << std::endl; 49 | return 1; 50 | } 51 | 52 | std::string filename = argv[1]; 53 | 54 | vtkPacketFileReader packetReader; 55 | packetReader.Open(filename); 56 | if (!packetReader.IsOpen()) 57 | { 58 | std::cout << "Failed to open packet file: " << filename << std::endl; 59 | return 1; 60 | } 61 | 62 | 63 | try 64 | { 65 | 66 | std::string destinationIp = "127.0.0.1"; 67 | int dataPort = 2368; 68 | 69 | boost::asio::io_service ioService; 70 | boost::asio::ip::udp::endpoint destinationEndpoint(boost::asio::ip::address_v4::from_string(destinationIp), dataPort); 71 | boost::asio::ip::udp::socket socket(ioService); 72 | socket.open(destinationEndpoint.protocol()); 73 | //socket.connect(destinationEndpoint); 74 | 75 | static unsigned long packetCounter = 0; 76 | double systemTime = 0; 77 | double prevSystemTime = 0; 78 | double packetTime = 0; 79 | double prevPacketTime = 0; 80 | int microsec_sleep = 450; 81 | 82 | while (packetReader.IsOpen()) 83 | { 84 | 85 | const unsigned char* data = 0; 86 | unsigned int dataLength = 0; 87 | double timeSinceStart = 0; 88 | if (!packetReader.NextPacket(data, dataLength, timeSinceStart)) 89 | { 90 | printf("end of packet file\n"); 91 | break; 92 | } 93 | 94 | if (dataLength != 1206) 95 | { 96 | continue; 97 | } 98 | 99 | size_t bytesSent = socket.send_to(boost::asio::buffer(data, dataLength), destinationEndpoint); 100 | 101 | if ((++packetCounter % 500) == 0) 102 | { 103 | printf("total sent packets: %lu\n", packetCounter); 104 | } 105 | 106 | unsigned char* data2 = const_cast(data); 107 | HDLDataPacket* dataPacket = reinterpret_cast(data2); 108 | packetTime = (dataPacket->gpsTimestamp*1e-6); 109 | 110 | timespec tp; 111 | clock_gettime(CLOCK_REALTIME,&tp); 112 | long long timestamp_s = (tp).tv_sec*1e9; 113 | long long timestamp = (tp).tv_nsec + timestamp_s; 114 | systemTime = ((double)timestamp)*1e-9; 115 | 116 | if (prevPacketTime != 0 && prevSystemTime != 0) { 117 | double packetDiff = packetTime-prevPacketTime; 118 | double systemDiff = systemTime-prevSystemTime; 119 | microsec_sleep = microsec_sleep - (systemDiff-packetDiff)*1e6; 120 | //std::cout << packetDiff << ", " << systemDiff << ", " << microsec_sleep << std::endl; 121 | } 122 | 123 | prevSystemTime = systemTime; 124 | prevPacketTime = packetTime; 125 | 126 | boost::this_thread::sleep(boost::posix_time::microseconds(microsec_sleep)); 127 | } 128 | 129 | } 130 | catch( std::exception & e ) 131 | { 132 | std::cout << "Caught Exception: " << e.what() << std::endl; 133 | return 1; 134 | } 135 | 136 | return 0; 137 | } 138 | -------------------------------------------------------------------------------- /PacketFileReader.h: -------------------------------------------------------------------------------- 1 | // Copyright 2013 Velodyne Acoustics, Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | /*========================================================================= 15 | 16 | Program: Visualization Toolkit 17 | Module: vtkPacketFileReader.h 18 | 19 | Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 20 | All rights reserved. 21 | See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 22 | 23 | This software is distributed WITHOUT ANY WARRANTY; without even 24 | the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 25 | PURPOSE. See the above copyright notice for more information. 26 | 27 | =========================================================================*/ 28 | // .NAME vtkPacketFileReader - 29 | // .SECTION Description 30 | // 31 | 32 | #ifndef __vtkPacketFileReader_h 33 | #define __vtkPacketFileReader_h 34 | 35 | #include 36 | #include 37 | 38 | // Some versions of libpcap do not have PCAP_NETMASK_UNKNOWN 39 | #if !defined(PCAP_NETMASK_UNKNOWN) 40 | #define PCAP_NETMASK_UNKNOWN 0xffffffff 41 | #endif 42 | 43 | class vtkPacketFileReader 44 | { 45 | public: 46 | 47 | vtkPacketFileReader() 48 | { 49 | this->PCAPFile = 0; 50 | } 51 | 52 | ~vtkPacketFileReader() 53 | { 54 | this->Close(); 55 | } 56 | 57 | bool Open(const std::string& filename) 58 | { 59 | char errbuff[PCAP_ERRBUF_SIZE]; 60 | pcap_t *pcapFile = pcap_open_offline(filename.c_str (), errbuff); 61 | if (!pcapFile) 62 | { 63 | this->LastError = errbuff; 64 | return false; 65 | } 66 | 67 | struct bpf_program filter; 68 | 69 | if (pcap_compile(pcapFile, &filter, "udp", 0, PCAP_NETMASK_UNKNOWN) == -1) 70 | { 71 | this->LastError = pcap_geterr(pcapFile); 72 | return false; 73 | } 74 | 75 | if (pcap_setfilter(pcapFile, &filter) == -1) 76 | { 77 | this->LastError = pcap_geterr(pcapFile); 78 | return false; 79 | } 80 | 81 | this->FileName = filename; 82 | this->PCAPFile = pcapFile; 83 | this->StartTime.tv_sec = this->StartTime.tv_usec = 0; 84 | return true; 85 | } 86 | 87 | bool IsOpen() 88 | { 89 | return (this->PCAPFile != 0); 90 | } 91 | 92 | void Close() 93 | { 94 | if (this->PCAPFile) 95 | { 96 | pcap_close(this->PCAPFile); 97 | this->PCAPFile = 0; 98 | this->FileName.clear(); 99 | } 100 | } 101 | 102 | const std::string& GetLastError() 103 | { 104 | return this->LastError; 105 | } 106 | 107 | const std::string& GetFileName() 108 | { 109 | return this->FileName; 110 | } 111 | 112 | void GetFilePosition(fpos_t* position) 113 | { 114 | #ifdef _MSC_VER 115 | pcap_fgetpos(this->PCAPFile, position); 116 | #else 117 | FILE* f = pcap_file(this->PCAPFile); 118 | fgetpos(f, position); 119 | #endif 120 | } 121 | 122 | void SetFilePosition(fpos_t* position) 123 | { 124 | #ifdef _MSC_VER 125 | pcap_fsetpos(this->PCAPFile, position); 126 | #else 127 | FILE* f = pcap_file(this->PCAPFile); 128 | fsetpos(f, position); 129 | #endif 130 | } 131 | 132 | bool NextPacket(const unsigned char*& data, unsigned int& dataLength, double& timeSinceStart, pcap_pkthdr** headerReference=NULL) 133 | { 134 | if (!this->PCAPFile) 135 | { 136 | return false; 137 | } 138 | 139 | struct pcap_pkthdr *header; 140 | int returnValue = pcap_next_ex(this->PCAPFile, &header, &data); 141 | if (returnValue < 0) 142 | { 143 | this->Close(); 144 | return false; 145 | } 146 | 147 | if (headerReference != NULL) 148 | { 149 | *headerReference = header; 150 | dataLength = header->len; 151 | timeSinceStart = GetElapsedTime(header->ts, this->StartTime); 152 | return true; 153 | } 154 | 155 | // The ethernet header is 42 bytes long; unnecessary 156 | const unsigned int bytesToSkip = 42; 157 | dataLength = header->len - bytesToSkip; 158 | data = data + bytesToSkip; 159 | timeSinceStart = GetElapsedTime(header->ts, this->StartTime); 160 | return true; 161 | } 162 | 163 | protected: 164 | 165 | double GetElapsedTime(const struct timeval& end, const struct timeval& start) 166 | { 167 | return (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) / 1000000.00; 168 | } 169 | 170 | pcap_t* PCAPFile; 171 | std::string FileName; 172 | std::string LastError; 173 | struct timeval StartTime; 174 | }; 175 | 176 | #endif 177 | -------------------------------------------------------------------------------- /PacketFileWriter.h: -------------------------------------------------------------------------------- 1 | // Copyright 2013 Velodyne Acoustics, Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | /*========================================================================= 15 | 16 | Program: Visualization Toolkit 17 | Module: vtkPacketFileWriter.h 18 | 19 | Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 20 | All rights reserved. 21 | See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 22 | 23 | This software is distributed WITHOUT ANY WARRANTY; without even 24 | the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 25 | PURPOSE. See the above copyright notice for more information. 26 | 27 | =========================================================================*/ 28 | // .NAME vtkPacketFileWriter - 29 | // .SECTION Description 30 | // 31 | 32 | #ifndef __vtkPacketFileWriter_h 33 | #define __vtkPacketFileWriter_h 34 | 35 | #include 36 | #include 37 | #ifdef _MSC_VER 38 | typedef __int32 int32_t; 39 | typedef unsigned __int32 uint32_t; 40 | typedef __int64 int64_t; 41 | typedef unsigned __int64 uint64_t; 42 | #else 43 | # include 44 | #endif 45 | 46 | 47 | #ifdef _MSC_VER 48 | 49 | #include 50 | 51 | namespace { 52 | int gettimeofday(struct timeval * tp, void *) 53 | { 54 | FILETIME ft; 55 | ::GetSystemTimeAsFileTime( &ft ); 56 | long long t = (static_cast(ft.dwHighDateTime) << 32) | ft.dwLowDateTime; 57 | t -= 116444736000000000LL; 58 | t /= 10; // microseconds 59 | tp->tv_sec = static_cast( t / 1000000UL); 60 | tp->tv_usec = static_cast( t % 1000000UL); 61 | return 0; 62 | } 63 | } 64 | 65 | #endif 66 | 67 | class vtkPacketFileWriter 68 | { 69 | public: 70 | 71 | vtkPacketFileWriter() 72 | { 73 | this->PCAPFile = 0; 74 | this->PCAPDump = 0; 75 | 76 | this->PacketHeader.caplen = 1248; 77 | this->PacketHeader.len = 1248; 78 | 79 | // note these values are little endian, pcap wants the packet header and 80 | //data to be in the platform's native byte order, so assuming little endian. 81 | unsigned short packetHeader[21] = { 82 | 0xffff, 0xffff, 0xffff, 0x7660, 83 | 0x0088, 0x0000, 0x0008, 0x0045, 84 | 0xd204, 0x0000, 0x0040, 0x11ff, 85 | 0xaab4, 0xa8c0, 0xc801, 0xffff, // checksum 0xa9b4 //source ip 0xa8c0, 0xc801 is 192.168.1.200 86 | 0xffff, 0x4009, 0x4009, 0xbe04, 0x0000}; 87 | 88 | memcpy(this->PacketBuffer, packetHeader, 42); 89 | } 90 | 91 | ~vtkPacketFileWriter() 92 | { 93 | this->Close(); 94 | } 95 | 96 | bool Open(const std::string& filename) 97 | { 98 | this->PCAPFile = pcap_open_dead(DLT_EN10MB, 65535); 99 | this->PCAPDump = pcap_dump_open(this->PCAPFile, filename.c_str()); 100 | 101 | if (!this->PCAPDump) 102 | { 103 | this->LastError = pcap_geterr(this->PCAPFile); 104 | pcap_close(this->PCAPFile); 105 | this->PCAPFile = 0; 106 | return false; 107 | } 108 | 109 | this->FileName = filename; 110 | return true; 111 | } 112 | 113 | bool IsOpen() 114 | { 115 | return (this->PCAPFile != 0); 116 | } 117 | 118 | void Close() 119 | { 120 | if (this->PCAPFile) 121 | { 122 | pcap_dump_close(this->PCAPDump); 123 | pcap_close(this->PCAPFile); 124 | this->PCAPFile = 0; 125 | this->PCAPDump = 0; 126 | this->FileName.clear(); 127 | } 128 | } 129 | 130 | const std::string& GetLastError() 131 | { 132 | return this->LastError; 133 | } 134 | 135 | const std::string& GetFileName() 136 | { 137 | return this->FileName; 138 | } 139 | 140 | bool WritePacket(const unsigned char* data, unsigned int dataLength) 141 | { 142 | if (!this->PCAPFile) 143 | { 144 | return false; 145 | } 146 | 147 | if (dataLength != 1206) 148 | { 149 | return false; 150 | } 151 | 152 | struct timeval currentTime; 153 | gettimeofday(¤tTime, NULL); 154 | this->PacketHeader.ts = currentTime; 155 | 156 | memcpy(this->PacketBuffer + 42, data, dataLength); 157 | 158 | pcap_dump((u_char *)this->PCAPDump, &this->PacketHeader, this->PacketBuffer); 159 | return true; 160 | } 161 | 162 | bool WritePacket(pcap_pkthdr* packetHeader, unsigned char* packetData) 163 | { 164 | pcap_dump((u_char *)this->PCAPDump, packetHeader, packetData); 165 | return true; 166 | } 167 | 168 | protected: 169 | 170 | 171 | 172 | pcap_t* PCAPFile; 173 | pcap_dumper_t* PCAPDump; 174 | struct pcap_pkthdr PacketHeader; 175 | unsigned char PacketBuffer[1248]; 176 | 177 | std::string FileName; 178 | std::string LastError; 179 | }; 180 | 181 | #endif 182 | -------------------------------------------------------------------------------- /PacketDecoder.cpp: -------------------------------------------------------------------------------- 1 | // Velodyne HDL Packet Decoder 2 | // Nick Rypkema (rypkema@mit.edu), MIT 2017 3 | // shared library to decode a Velodyne packet - largely repurposed from vtkVelodyneHDLReader 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include "PacketDecoder.h" 13 | 14 | PacketDecoder::PacketDecoder() 15 | { 16 | _max_num_of_frames = 10; 17 | UnloadData(); 18 | InitTables(); 19 | LoadHDL32Corrections(); 20 | } 21 | 22 | PacketDecoder::~PacketDecoder() 23 | { 24 | 25 | } 26 | 27 | void PacketDecoder::SetMaxNumberOfFrames(unsigned int max_num_of_frames) 28 | { 29 | 30 | if (max_num_of_frames <= 0) { 31 | return; 32 | } else { 33 | _max_num_of_frames = max_num_of_frames; 34 | } 35 | while (_frames.size() >= _max_num_of_frames) { 36 | _frames.pop_front(); 37 | } 38 | } 39 | 40 | void PacketDecoder::DecodePacket(std::string* data, unsigned int* data_length) 41 | { 42 | const unsigned char* data_char = reinterpret_cast(data->c_str()); 43 | ProcessHDLPacket(const_cast(data_char), *data_length); 44 | } 45 | 46 | void PacketDecoder::ProcessHDLPacket(unsigned char *data, unsigned int data_length) 47 | { 48 | if (data_length != 1206) { 49 | std::cout << "PacketDecoder: Warning, data packet is not 1206 bytes" << std::endl; 50 | return; 51 | } 52 | 53 | HDLDataPacket* dataPacket = reinterpret_cast(data); 54 | 55 | for (int i = 0; i < HDL_FIRING_PER_PKT; ++i) { 56 | HDLFiringData firingData = dataPacket->firingData[i]; 57 | int offset = (firingData.blockIdentifier == BLOCK_0_TO_31) ? 0 : 32; 58 | 59 | if (firingData.rotationalPosition < _last_azimuth) { 60 | SplitFrame(); 61 | } 62 | 63 | _last_azimuth = firingData.rotationalPosition; 64 | 65 | for (int j = 0; j < HDL_LASER_PER_FIRING; j++) { 66 | unsigned char laserId = static_cast(j + offset); 67 | if (firingData.laserReturns[j].distance != 0.0) { 68 | PushFiringData(laserId, firingData.rotationalPosition, dataPacket->gpsTimestamp, firingData.laserReturns[j], laser_corrections_[j + offset]); 69 | } 70 | } 71 | } 72 | } 73 | 74 | void PacketDecoder::SplitFrame() 75 | { 76 | if (_frames.size() == _max_num_of_frames-1) { 77 | _frames.pop_front(); 78 | } 79 | _frames.push_back(*_frame); 80 | delete _frame; 81 | _frame = new HDLFrame(); 82 | } 83 | 84 | void PacketDecoder::PushFiringData(unsigned char laserId, unsigned short azimuth, unsigned int timestamp, HDLLaserReturn laserReturn, HDLLaserCorrection correction) 85 | { 86 | double cosAzimuth, sinAzimuth; 87 | if (correction.azimuthCorrection == 0) { 88 | cosAzimuth = cos_lookup_table_[azimuth]; 89 | sinAzimuth = sin_lookup_table_[azimuth]; 90 | } else { 91 | double azimuthInRadians = HDL_Grabber_toRadians((static_cast (azimuth) / 100.0) - correction.azimuthCorrection); 92 | cosAzimuth = std::cos(azimuthInRadians); 93 | sinAzimuth = std::sin(azimuthInRadians); 94 | } 95 | 96 | double distanceM = laserReturn.distance * 0.002 + correction.distanceCorrection; 97 | double xyDistance = distanceM * correction.cosVertCorrection - correction.sinVertOffsetCorrection; 98 | 99 | double x = (xyDistance * sinAzimuth - correction.horizontalOffsetCorrection * cosAzimuth); 100 | double y = (xyDistance * cosAzimuth + correction.horizontalOffsetCorrection * sinAzimuth); 101 | double z = (distanceM * correction.sinVertCorrection + correction.cosVertOffsetCorrection); 102 | unsigned char intensity = laserReturn.intensity; 103 | 104 | _frame->x.push_back(x); 105 | _frame->y.push_back(y); 106 | _frame->z.push_back(z); 107 | _frame->intensity.push_back(intensity); 108 | _frame->laser_id.push_back(laserId); 109 | _frame->azimuth.push_back(azimuth); 110 | _frame->distance.push_back(distanceM); 111 | _frame->ms_from_top_of_hour.push_back(timestamp); 112 | } 113 | 114 | void PacketDecoder::SetCorrectionsFile(const std::string& corrections_file) 115 | { 116 | if (corrections_file == _corrections_file) { 117 | return; 118 | } 119 | 120 | if (corrections_file.length()) { 121 | LoadCorrectionsFile(corrections_file); 122 | } else { 123 | LoadHDL32Corrections(); 124 | } 125 | 126 | _corrections_file = corrections_file; 127 | UnloadData(); 128 | } 129 | 130 | void PacketDecoder::UnloadData() 131 | { 132 | _last_azimuth = 0; 133 | _frame = new HDLFrame(); 134 | _frames.clear(); 135 | } 136 | 137 | void PacketDecoder::InitTables() 138 | { 139 | if (cos_lookup_table_ == NULL && sin_lookup_table_ == NULL) { 140 | cos_lookup_table_ = static_cast (malloc (HDL_NUM_ROT_ANGLES * sizeof (*cos_lookup_table_))); 141 | sin_lookup_table_ = static_cast (malloc (HDL_NUM_ROT_ANGLES * sizeof (*sin_lookup_table_))); 142 | for (unsigned int i = 0; i < HDL_NUM_ROT_ANGLES; i++) { 143 | double rad = HDL_Grabber_toRadians(i / 100.0); 144 | cos_lookup_table_[i] = std::cos(rad); 145 | sin_lookup_table_[i] = std::sin(rad); 146 | } 147 | } 148 | } 149 | 150 | void PacketDecoder::LoadCorrectionsFile(const std::string& correctionsFile) 151 | { 152 | 153 | boost::property_tree::ptree pt; 154 | try { 155 | read_xml(correctionsFile, pt, boost::property_tree::xml_parser::trim_whitespace); 156 | } catch (boost::exception const&) { 157 | std::cout << "PacketDecoder: Error reading calibration file - " << correctionsFile << std::endl; 158 | return; 159 | } 160 | 161 | BOOST_FOREACH (boost::property_tree::ptree::value_type &v, pt.get_child("boost_serialization.DB.points_")) { 162 | if (v.first == "item") { 163 | boost::property_tree::ptree points = v.second; 164 | BOOST_FOREACH (boost::property_tree::ptree::value_type &px, points) { 165 | if (px.first == "px") { 166 | boost::property_tree::ptree calibrationData = px.second; 167 | int index = -1; 168 | double azimuth = 0; 169 | double vertCorrection = 0; 170 | double distCorrection = 0; 171 | double vertOffsetCorrection = 0; 172 | double horizOffsetCorrection = 0; 173 | 174 | BOOST_FOREACH (boost::property_tree::ptree::value_type &item, calibrationData) { 175 | if (item.first == "id_") 176 | index = atoi(item.second.data().c_str()); 177 | if (item.first == "rotCorrection_") 178 | azimuth = atof(item.second.data().c_str()); 179 | if (item.first == "vertCorrection_") 180 | vertCorrection = atof(item.second.data().c_str()); 181 | if (item.first == "distCorrection_") 182 | distCorrection = atof(item.second.data().c_str()); 183 | if (item.first == "vertOffsetCorrection_") 184 | vertOffsetCorrection = atof(item.second.data().c_str()); 185 | if (item.first == "horizOffsetCorrection_") 186 | horizOffsetCorrection = atof(item.second.data().c_str()); 187 | } 188 | if (index != -1) { 189 | laser_corrections_[index].azimuthCorrection = azimuth; 190 | laser_corrections_[index].verticalCorrection = vertCorrection; 191 | laser_corrections_[index].distanceCorrection = distCorrection / 100.0; 192 | laser_corrections_[index].verticalOffsetCorrection = vertOffsetCorrection / 100.0; 193 | laser_corrections_[index].horizontalOffsetCorrection = horizOffsetCorrection / 100.0; 194 | 195 | laser_corrections_[index].cosVertCorrection = std::cos (HDL_Grabber_toRadians(laser_corrections_[index].verticalCorrection)); 196 | laser_corrections_[index].sinVertCorrection = std::sin (HDL_Grabber_toRadians(laser_corrections_[index].verticalCorrection)); 197 | } 198 | } 199 | } 200 | } 201 | } 202 | 203 | SetCorrectionsCommon(); 204 | } 205 | 206 | void PacketDecoder::LoadHDL32Corrections() 207 | { 208 | double hdl32VerticalCorrections[] = { 209 | -30.67, -9.3299999, -29.33, -8, -28, 210 | -6.6700001, -26.67, -5.3299999, -25.33, -4, -24, -2.6700001, -22.67, 211 | -1.33, -21.33, 0, -20, 1.33, -18.67, 2.6700001, -17.33, 4, -16, 5.3299999, 212 | -14.67, 6.6700001, -13.33, 8, -12, 9.3299999, -10.67, 10.67 }; 213 | 214 | for (int i = 0; i < HDL_LASER_PER_FIRING; i++) { 215 | laser_corrections_[i].azimuthCorrection = 0.0; 216 | laser_corrections_[i].distanceCorrection = 0.0; 217 | laser_corrections_[i].horizontalOffsetCorrection = 0.0; 218 | laser_corrections_[i].verticalOffsetCorrection = 0.0; 219 | laser_corrections_[i].verticalCorrection = hdl32VerticalCorrections[i]; 220 | laser_corrections_[i].sinVertCorrection = std::sin(HDL_Grabber_toRadians(hdl32VerticalCorrections[i])); 221 | laser_corrections_[i].cosVertCorrection = std::cos(HDL_Grabber_toRadians(hdl32VerticalCorrections[i])); 222 | } 223 | 224 | for (int i = HDL_LASER_PER_FIRING; i < HDL_MAX_NUM_LASERS; i++) { 225 | laser_corrections_[i].azimuthCorrection = 0.0; 226 | laser_corrections_[i].distanceCorrection = 0.0; 227 | laser_corrections_[i].horizontalOffsetCorrection = 0.0; 228 | laser_corrections_[i].verticalOffsetCorrection = 0.0; 229 | laser_corrections_[i].verticalCorrection = 0.0; 230 | laser_corrections_[i].sinVertCorrection = 0.0; 231 | laser_corrections_[i].cosVertCorrection = 1.0; 232 | } 233 | 234 | SetCorrectionsCommon(); 235 | } 236 | 237 | void PacketDecoder::SetCorrectionsCommon() 238 | { 239 | for (int i = 0; i < HDL_MAX_NUM_LASERS; i++) { 240 | HDLLaserCorrection correction = laser_corrections_[i]; 241 | laser_corrections_[i].sinVertOffsetCorrection = correction.verticalOffsetCorrection 242 | * correction.sinVertCorrection; 243 | laser_corrections_[i].cosVertOffsetCorrection = correction.verticalOffsetCorrection 244 | * correction.cosVertCorrection; 245 | } 246 | } 247 | 248 | std::deque PacketDecoder::GetFrames() 249 | { 250 | return _frames; 251 | } 252 | 253 | void PacketDecoder::ClearFrames() 254 | { 255 | _frames.clear(); 256 | } 257 | 258 | bool PacketDecoder::GetLatestFrame(PacketDecoder::HDLFrame* frame) 259 | { 260 | if (_frames.size()) { 261 | *frame = _frames.back(); 262 | _frames.clear(); 263 | return(true); 264 | } 265 | return(false); 266 | } 267 | -------------------------------------------------------------------------------- /PacketBundleDecoder.cpp: -------------------------------------------------------------------------------- 1 | // Velodyne HDL Packet Bundle Decoder 2 | // Nick Rypkema (rypkema@mit.edu), MIT 2017 3 | // shared library to decode a bundle of velodyne packets 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include "PacketBundleDecoder.h" 13 | 14 | PacketBundleDecoder::PacketBundleDecoder() 15 | { 16 | _max_num_of_frames = 10; 17 | UnloadData(); 18 | InitTables(); 19 | LoadHDL32Corrections(); 20 | } 21 | 22 | PacketBundleDecoder::~PacketBundleDecoder() 23 | { 24 | 25 | } 26 | 27 | void PacketBundleDecoder::SetMaxNumberOfFrames(unsigned int max_num_of_frames) 28 | { 29 | 30 | if (max_num_of_frames <= 0) { 31 | return; 32 | } else { 33 | _max_num_of_frames = max_num_of_frames; 34 | } 35 | while (_frames.size() >= _max_num_of_frames) { 36 | _frames.pop_front(); 37 | } 38 | } 39 | 40 | void PacketBundleDecoder::DecodeBundle(std::string* bundle, unsigned int* bundle_length) 41 | { 42 | unsigned int num_packets = *bundle_length/1206; 43 | 44 | for (int i = 0; i < num_packets; i++) { 45 | std::string data = bundle->substr(i*1206, 1206); 46 | const unsigned char* data_char = reinterpret_cast(data.c_str()); 47 | ProcessHDLPacket(const_cast(data_char), 1206); 48 | } 49 | 50 | if (_frames.size() == _max_num_of_frames-1) { 51 | _frames.pop_front(); 52 | } 53 | _frames.push_back(*_frame); 54 | delete _frame; 55 | _frame = new HDLFrame(); 56 | } 57 | 58 | void PacketBundleDecoder::ProcessHDLPacket(unsigned char *data, unsigned int data_length) 59 | { 60 | if (data_length != 1206) { 61 | std::cout << "PacketDecoder: Warning, data packet is not 1206 bytes" << std::endl; 62 | return; 63 | } 64 | 65 | HDLDataPacket* dataPacket = reinterpret_cast(data); 66 | 67 | for (int i = 0; i < HDL_FIRING_PER_PKT; ++i) { 68 | HDLFiringData firingData = dataPacket->firingData[i]; 69 | int offset = (firingData.blockIdentifier == BLOCK_0_TO_31) ? 0 : 32; 70 | 71 | for (int j = 0; j < HDL_LASER_PER_FIRING; j++) { 72 | unsigned char laserId = static_cast(j + offset); 73 | if (firingData.laserReturns[j].distance != 0.0) { 74 | PushFiringData(laserId, firingData.rotationalPosition, dataPacket->gpsTimestamp, firingData.laserReturns[j], laser_corrections_[j + offset]); 75 | } 76 | } 77 | } 78 | } 79 | 80 | void PacketBundleDecoder::PushFiringData(unsigned char laserId, unsigned short azimuth, unsigned int timestamp, HDLLaserReturn laserReturn, HDLLaserCorrection correction) 81 | { 82 | double cosAzimuth, sinAzimuth; 83 | if (correction.azimuthCorrection == 0) { 84 | cosAzimuth = cos_lookup_table_[azimuth]; 85 | sinAzimuth = sin_lookup_table_[azimuth]; 86 | } else { 87 | double azimuthInRadians = HDL_Grabber_toRadians((static_cast (azimuth) / 100.0) - correction.azimuthCorrection); 88 | cosAzimuth = std::cos(azimuthInRadians); 89 | sinAzimuth = std::sin(azimuthInRadians); 90 | } 91 | 92 | double distanceM = laserReturn.distance * 0.002 + correction.distanceCorrection; 93 | double xyDistance = distanceM * correction.cosVertCorrection - correction.sinVertOffsetCorrection; 94 | 95 | double x = (xyDistance * sinAzimuth - correction.horizontalOffsetCorrection * cosAzimuth); 96 | double y = (xyDistance * cosAzimuth + correction.horizontalOffsetCorrection * sinAzimuth); 97 | double z = (distanceM * correction.sinVertCorrection + correction.cosVertOffsetCorrection); 98 | unsigned char intensity = laserReturn.intensity; 99 | 100 | _frame->x.push_back(x); 101 | _frame->y.push_back(y); 102 | _frame->z.push_back(z); 103 | _frame->intensity.push_back(intensity); 104 | _frame->laser_id.push_back(laserId); 105 | _frame->azimuth.push_back(azimuth); 106 | _frame->distance.push_back(distanceM); 107 | _frame->ms_from_top_of_hour.push_back(timestamp); 108 | } 109 | 110 | void PacketBundleDecoder::SetCorrectionsFile(const std::string& corrections_file) 111 | { 112 | if (corrections_file == _corrections_file) { 113 | return; 114 | } 115 | 116 | if (corrections_file.length()) { 117 | LoadCorrectionsFile(corrections_file); 118 | } else { 119 | LoadHDL32Corrections(); 120 | } 121 | 122 | _corrections_file = corrections_file; 123 | UnloadData(); 124 | } 125 | 126 | void PacketBundleDecoder::UnloadData() 127 | { 128 | _frame = new HDLFrame(); 129 | _frames.clear(); 130 | } 131 | 132 | void PacketBundleDecoder::InitTables() 133 | { 134 | if (cos_lookup_table_ == NULL && sin_lookup_table_ == NULL) { 135 | cos_lookup_table_ = static_cast (malloc (HDL_NUM_ROT_ANGLES * sizeof (*cos_lookup_table_))); 136 | sin_lookup_table_ = static_cast (malloc (HDL_NUM_ROT_ANGLES * sizeof (*sin_lookup_table_))); 137 | for (unsigned int i = 0; i < HDL_NUM_ROT_ANGLES; i++) { 138 | double rad = HDL_Grabber_toRadians(i / 100.0); 139 | cos_lookup_table_[i] = std::cos(rad); 140 | sin_lookup_table_[i] = std::sin(rad); 141 | } 142 | } 143 | } 144 | 145 | void PacketBundleDecoder::LoadCorrectionsFile(const std::string& correctionsFile) 146 | { 147 | 148 | boost::property_tree::ptree pt; 149 | try { 150 | read_xml(correctionsFile, pt, boost::property_tree::xml_parser::trim_whitespace); 151 | } catch (boost::exception const&) { 152 | std::cout << "PacketDecoder: Error reading calibration file - " << correctionsFile << std::endl; 153 | return; 154 | } 155 | 156 | BOOST_FOREACH (boost::property_tree::ptree::value_type &v, pt.get_child("boost_serialization.DB.points_")) { 157 | if (v.first == "item") { 158 | boost::property_tree::ptree points = v.second; 159 | BOOST_FOREACH (boost::property_tree::ptree::value_type &px, points) { 160 | if (px.first == "px") { 161 | boost::property_tree::ptree calibrationData = px.second; 162 | int index = -1; 163 | double azimuth = 0; 164 | double vertCorrection = 0; 165 | double distCorrection = 0; 166 | double vertOffsetCorrection = 0; 167 | double horizOffsetCorrection = 0; 168 | 169 | BOOST_FOREACH (boost::property_tree::ptree::value_type &item, calibrationData) { 170 | if (item.first == "id_") 171 | index = atoi(item.second.data().c_str()); 172 | if (item.first == "rotCorrection_") 173 | azimuth = atof(item.second.data().c_str()); 174 | if (item.first == "vertCorrection_") 175 | vertCorrection = atof(item.second.data().c_str()); 176 | if (item.first == "distCorrection_") 177 | distCorrection = atof(item.second.data().c_str()); 178 | if (item.first == "vertOffsetCorrection_") 179 | vertOffsetCorrection = atof(item.second.data().c_str()); 180 | if (item.first == "horizOffsetCorrection_") 181 | horizOffsetCorrection = atof(item.second.data().c_str()); 182 | } 183 | if (index != -1) { 184 | laser_corrections_[index].azimuthCorrection = azimuth; 185 | laser_corrections_[index].verticalCorrection = vertCorrection; 186 | laser_corrections_[index].distanceCorrection = distCorrection / 100.0; 187 | laser_corrections_[index].verticalOffsetCorrection = vertOffsetCorrection / 100.0; 188 | laser_corrections_[index].horizontalOffsetCorrection = horizOffsetCorrection / 100.0; 189 | 190 | laser_corrections_[index].cosVertCorrection = std::cos (HDL_Grabber_toRadians(laser_corrections_[index].verticalCorrection)); 191 | laser_corrections_[index].sinVertCorrection = std::sin (HDL_Grabber_toRadians(laser_corrections_[index].verticalCorrection)); 192 | } 193 | } 194 | } 195 | } 196 | } 197 | 198 | SetCorrectionsCommon(); 199 | } 200 | 201 | void PacketBundleDecoder::LoadHDL32Corrections() 202 | { 203 | double hdl32VerticalCorrections[] = { 204 | -30.67, -9.3299999, -29.33, -8, -28, 205 | -6.6700001, -26.67, -5.3299999, -25.33, -4, -24, -2.6700001, -22.67, 206 | -1.33, -21.33, 0, -20, 1.33, -18.67, 2.6700001, -17.33, 4, -16, 5.3299999, 207 | -14.67, 6.6700001, -13.33, 8, -12, 9.3299999, -10.67, 10.67 }; 208 | 209 | for (int i = 0; i < HDL_LASER_PER_FIRING; i++) { 210 | laser_corrections_[i].azimuthCorrection = 0.0; 211 | laser_corrections_[i].distanceCorrection = 0.0; 212 | laser_corrections_[i].horizontalOffsetCorrection = 0.0; 213 | laser_corrections_[i].verticalOffsetCorrection = 0.0; 214 | laser_corrections_[i].verticalCorrection = hdl32VerticalCorrections[i]; 215 | laser_corrections_[i].sinVertCorrection = std::sin(HDL_Grabber_toRadians(hdl32VerticalCorrections[i])); 216 | laser_corrections_[i].cosVertCorrection = std::cos(HDL_Grabber_toRadians(hdl32VerticalCorrections[i])); 217 | } 218 | 219 | for (int i = HDL_LASER_PER_FIRING; i < HDL_MAX_NUM_LASERS; i++) { 220 | laser_corrections_[i].azimuthCorrection = 0.0; 221 | laser_corrections_[i].distanceCorrection = 0.0; 222 | laser_corrections_[i].horizontalOffsetCorrection = 0.0; 223 | laser_corrections_[i].verticalOffsetCorrection = 0.0; 224 | laser_corrections_[i].verticalCorrection = 0.0; 225 | laser_corrections_[i].sinVertCorrection = 0.0; 226 | laser_corrections_[i].cosVertCorrection = 1.0; 227 | } 228 | 229 | SetCorrectionsCommon(); 230 | } 231 | 232 | void PacketBundleDecoder::SetCorrectionsCommon() 233 | { 234 | for (int i = 0; i < HDL_MAX_NUM_LASERS; i++) { 235 | HDLLaserCorrection correction = laser_corrections_[i]; 236 | laser_corrections_[i].sinVertOffsetCorrection = correction.verticalOffsetCorrection 237 | * correction.sinVertCorrection; 238 | laser_corrections_[i].cosVertOffsetCorrection = correction.verticalOffsetCorrection 239 | * correction.cosVertCorrection; 240 | } 241 | } 242 | 243 | std::deque PacketBundleDecoder::GetFrames() 244 | { 245 | return _frames; 246 | } 247 | 248 | void PacketBundleDecoder::ClearFrames() 249 | { 250 | _frames.clear(); 251 | } 252 | 253 | bool PacketBundleDecoder::GetLatestFrame(PacketBundleDecoder::HDLFrame* frame) 254 | { 255 | if (_frames.size()) { 256 | *frame = _frames.back(); 257 | _frames.clear(); 258 | return(true); 259 | } 260 | return(false); 261 | } 262 | -------------------------------------------------------------------------------- /16db.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0.2 6 | 7 | 8 | 3 9 | 0 10 | 0 11 | 0 12 | 13 | 14 | 15 | 16 | 3 17 | 0 18 | 0 19 | 0 20 | 21 | 22 | 23 | 64 24 | 0 25 | 26 | 27 | 3 28 | 0.84018773 29 | 0.39438292 30 | 0.78309923 31 | 32 | 33 | 34 | 35 | 3 36 | 0.840177 37 | 0.77233541 38 | 0.39436942 39 | 40 | 41 | 42 | 43 | 3 44 | 0.08879225 45 | 0.8096742 46 | 0.71766233 47 | 48 | 49 | 50 | 51 | 3 52 | 0.70946825 53 | 0.40906385 54 | 0.82345313 55 | 56 | 57 | 58 | 59 | 3 60 | 0.5796597 61 | 0.9642939 62 | 0.064805068 63 | 64 | 65 | 66 | 67 | 3 68 | 0.32542917 69 | 0.69379723 70 | 1 71 | 72 | 73 | 74 | 75 | 3 76 | 0.96250856 77 | 0.7900511 78 | 0.13542382 79 | 80 | 81 | 82 | 83 | 3 84 | 0.91102463 85 | 0.34070343 86 | 0.050705731 87 | 88 | 89 | 90 | 91 | 3 92 | 0.35276073 93 | 0.78958958 94 | 0.90582585 95 | 96 | 97 | 98 | 99 | 3 100 | 0.21438926 101 | 0.69950408 102 | 0.20341802 103 | 104 | 105 | 106 | 107 | 3 108 | 0.085374229 109 | 0.94720376 110 | 0.88781565 111 | 112 | 113 | 114 | 115 | 3 116 | 0.98643476 117 | 0.97503626 118 | 0.034851607 119 | 120 | 121 | 122 | 123 | 3 124 | 0.7856003 125 | 0.44017774 126 | 0.11511882 127 | 128 | 129 | 130 | 131 | 3 132 | 0.63264316 133 | 0.34141558 134 | 0.9041099 135 | 136 | 137 | 138 | 139 | 3 140 | 0.94122225 141 | 0.072755016 142 | 0.85761809 143 | 144 | 145 | 146 | 147 | 3 148 | 0.95754939 149 | 0.9211719 150 | 0.21469444 151 | 152 | 153 | 154 | 155 | 3 156 | 0.94947737 157 | 0.55008775 158 | 0.44551766 159 | 160 | 161 | 162 | 163 | 3 164 | 0.89275962 165 | 0.85084307 166 | 0.01608301 167 | 168 | 169 | 170 | 171 | 3 172 | 0.91799802 173 | 0.49231708 174 | 0.78014803 175 | 176 | 177 | 178 | 179 | 3 180 | 0.55109483 181 | 0.75539786 182 | 0.21551843 183 | 184 | 185 | 186 | 187 | 3 188 | 0.14881226 189 | 0.7401194 190 | 0.53116983 191 | 192 | 193 | 194 | 195 | 3 196 | 0.93394369 197 | 0.39975587 198 | 0.67215991 199 | 200 | 201 | 202 | 203 | 3 204 | 0.86502695 205 | 0.56639397 206 | 0.63385367 207 | 208 | 209 | 210 | 211 | 3 212 | 0.50551611 213 | 0.94326693 214 | 0.48421454 215 | 216 | 217 | 218 | 219 | 3 220 | 0.087714233 221 | 0.89877903 222 | 0.2479341 223 | 224 | 225 | 226 | 227 | 3 228 | 0.93935621 229 | 0.80573922 230 | 0.04233218 231 | 232 | 233 | 234 | 235 | 3 236 | 0.09033341 237 | 0.87373161 238 | 0.9662928 239 | 240 | 241 | 242 | 243 | 3 244 | 0.13539331 245 | 0.65983063 246 | 0.28789195 247 | 248 | 249 | 250 | 251 | 3 252 | 0.96635383 253 | 0.28834975 254 | 0.057038225 255 | 256 | 257 | 258 | 259 | 3 260 | 0.600824 261 | 0.96617073 262 | 0.10191501 263 | 264 | 265 | 266 | 267 | 3 268 | 0.90740824 269 | 0.95980775 270 | 0.95391774 271 | 272 | 273 | 274 | 275 | 3 276 | 0.59211904 277 | 0.78711683 278 | 0.86269605 279 | 280 | 281 | 282 | 283 | 3 284 | 0.028625926 285 | 0.98828107 286 | 0.30778974 287 | 288 | 289 | 290 | 291 | 3 292 | 0.59491873 293 | 0.35182726 294 | 0.87454033 295 | 296 | 297 | 298 | 299 | 3 300 | 0.7464866 301 | 0.51860839 302 | 0.8450141 303 | 304 | 305 | 306 | 307 | 3 308 | 0.32484931 309 | 0.38410011 310 | 0.86562908 311 | 312 | 313 | 314 | 315 | 3 316 | 0.96064699 317 | 0.052674145 318 | 0.67904174 319 | 320 | 321 | 322 | 323 | 3 324 | 0.31248951 325 | 0.92227054 326 | 0.48648813 327 | 328 | 329 | 330 | 331 | 3 332 | 0.054489966 333 | 0.95574886 334 | 0.28729686 335 | 336 | 337 | 338 | 339 | 3 340 | 0.95848018 341 | 0.93113601 342 | 0.10840009 343 | 344 | 345 | 346 | 347 | 3 348 | 0.95097274 349 | 0.94096285 350 | 0.32806897 351 | 352 | 353 | 354 | 355 | 3 356 | 0.9619745 357 | 0.034027617 358 | 0.78579384 359 | 360 | 361 | 362 | 363 | 3 364 | 0.94944686 365 | 0.82970929 366 | 0.037186235 367 | 368 | 369 | 370 | 371 | 3 372 | 0.97222859 373 | 0.62723738 374 | 0.065781645 375 | 376 | 377 | 378 | 379 | 3 380 | 0.92346072 381 | 0.96305794 382 | 0.93403524 383 | 384 | 385 | 386 | 387 | 3 388 | 0.98861676 389 | 0 390 | 0.76792556 391 | 392 | 393 | 394 | 395 | 3 396 | 0.26213473 397 | 0.95156789 398 | 0.94323641 399 | 400 | 401 | 402 | 403 | 3 404 | 0.41365683 405 | 0.97004652 406 | 0.078889146 407 | 408 | 409 | 410 | 411 | 3 412 | 0.85752654 413 | 0.1990692 414 | 0.22206454 415 | 416 | 417 | 418 | 419 | 3 420 | 0.053299762 421 | 0.93763638 422 | 0.99444574 423 | 424 | 425 | 426 | 427 | 3 428 | 0.8943212 429 | 0.62864298 430 | 0.10409617 431 | 432 | 433 | 434 | 435 | 3 436 | 0.76058036 437 | 0.048754983 438 | 0.91462308 439 | 440 | 441 | 442 | 443 | 3 444 | 0.83480585 445 | 0.70650798 446 | 0.51032275 447 | 448 | 449 | 450 | 451 | 3 452 | 0.89080644 453 | 0.12384222 454 | 0.26840618 455 | 456 | 457 | 458 | 459 | 3 460 | 0.32953385 461 | 0.81698328 462 | 0.51252002 463 | 464 | 465 | 466 | 467 | 3 468 | 0.39465934 469 | 0.75048447 470 | 0.75953305 471 | 472 | 473 | 474 | 475 | 3 476 | 0.92498666 477 | 0.94149691 478 | 0.12957962 479 | 480 | 481 | 482 | 483 | 3 484 | 0.91115069 485 | 0.52652103 486 | 0.73026121 487 | 488 | 489 | 490 | 491 | 3 492 | 0.76655 493 | 0.93766737 494 | 0.031084489 495 | 496 | 497 | 498 | 499 | 3 500 | 0.12669764 501 | 0.85318863 502 | 0.33537352 503 | 504 | 505 | 506 | 507 | 3 508 | 0.9853164 509 | 0.26496059 510 | 0.13821837 511 | 512 | 513 | 514 | 515 | 3 516 | 0.84317338 517 | 0.17844476 518 | 0.94212615 519 | 520 | 521 | 522 | 523 | 3 524 | 0.69955063 525 | 0.59048992 526 | 0.74391818 527 | 528 | 529 | 530 | 531 | 3 532 | 0.67139697 533 | 0.87832457 534 | 0.69022661 535 | 536 | 537 | 538 | 539 | 64 540 | 1 541 | 1 542 | 1 543 | 1 544 | 1 545 | 1 546 | 1 547 | 1 548 | 1 549 | 1 550 | 1 551 | 1 552 | 1 553 | 1 554 | 1 555 | 1 556 | 0 557 | 0 558 | 0 559 | 0 560 | 0 561 | 0 562 | 0 563 | 0 564 | 0 565 | 0 566 | 0 567 | 0 568 | 0 569 | 0 570 | 0 571 | 0 572 | 0 573 | 0 574 | 0 575 | 0 576 | 0 577 | 0 578 | 0 579 | 0 580 | 0 581 | 0 582 | 0 583 | 0 584 | 0 585 | 0 586 | 0 587 | 0 588 | 0 589 | 0 590 | 0 591 | 0 592 | 0 593 | 0 594 | 0 595 | 0 596 | 0 597 | 0 598 | 0 599 | 0 600 | 0 601 | 0 602 | 0 603 | 0 604 | 605 | 606 | 64 607 | 1 608 | 1 609 | 1 610 | 1 611 | 1 612 | 1 613 | 1 614 | 1 615 | 1 616 | 1 617 | 1 618 | 1 619 | 1 620 | 1 621 | 1 622 | 1 623 | 1 624 | 1 625 | 1 626 | 1 627 | 1 628 | 1 629 | 1 630 | 1 631 | 1 632 | 1 633 | 1 634 | 1 635 | 1 636 | 1 637 | 1 638 | 1 639 | 1 640 | 1 641 | 1 642 | 1 643 | 1 644 | 1 645 | 1 646 | 1 647 | 1 648 | 1 649 | 1 650 | 1 651 | 1 652 | 1 653 | 1 654 | 1 655 | 1 656 | 1 657 | 1 658 | 1 659 | 1 660 | 1 661 | 1 662 | 1 663 | 1 664 | 1 665 | 1 666 | 1 667 | 1 668 | 1 669 | 1 670 | 1 671 | 672 | 673 | 64 674 | 0 675 | 0 676 | 0 677 | 0 678 | 0 679 | 0 680 | 0 681 | 0 682 | 0 683 | 0 684 | 0 685 | 0 686 | 0 687 | 0 688 | 0 689 | 0 690 | 0 691 | 0 692 | 0 693 | 0 694 | 0 695 | 0 696 | 0 697 | 0 698 | 0 699 | 0 700 | 0 701 | 0 702 | 0 703 | 0 704 | 0 705 | 0 706 | 0 707 | 0 708 | 0 709 | 0 710 | 0 711 | 0 712 | 0 713 | 0 714 | 0 715 | 0 716 | 0 717 | 0 718 | 0 719 | 0 720 | 0 721 | 0 722 | 0 723 | 0 724 | 0 725 | 0 726 | 0 727 | 0 728 | 0 729 | 0 730 | 0 731 | 0 732 | 0 733 | 0 734 | 0 735 | 0 736 | 0 737 | 0 738 | 0 739 | 740 | 741 | 64 742 | 0 743 | 255 744 | 255 745 | 255 746 | 255 747 | 255 748 | 255 749 | 255 750 | 255 751 | 255 752 | 255 753 | 255 754 | 255 755 | 255 756 | 255 757 | 255 758 | 255 759 | 255 760 | 255 761 | 255 762 | 255 763 | 255 764 | 255 765 | 255 766 | 255 767 | 255 768 | 255 769 | 255 770 | 255 771 | 255 772 | 255 773 | 255 774 | 255 775 | 255 776 | 255 777 | 255 778 | 255 779 | 255 780 | 255 781 | 255 782 | 255 783 | 255 784 | 255 785 | 255 786 | 255 787 | 255 788 | 255 789 | 255 790 | 255 791 | 255 792 | 255 793 | 255 794 | 255 795 | 255 796 | 255 797 | 255 798 | 255 799 | 255 800 | 255 801 | 255 802 | 255 803 | 255 804 | 255 805 | 255 806 | 255 807 | 808 | 809 | 64 810 | 1 811 | 812 | 813 | 0 814 | 0 815 | -15 816 | 0 817 | 0 818 | 0 819 | 0 820 | 0 821 | 0 822 | 0 823 | 824 | 825 | 826 | 827 | 1 828 | 0 829 | 1 830 | 0 831 | 0 832 | 0 833 | 0 834 | 0 835 | 0 836 | 0 837 | 838 | 839 | 840 | 841 | 2 842 | 0 843 | -13 844 | 0 845 | 0 846 | 0 847 | 0 848 | 0 849 | 0 850 | 0 851 | 852 | 853 | 854 | 855 | 3 856 | 0 857 | 3 858 | 0 859 | 0 860 | 0 861 | 0 862 | 0 863 | 0 864 | 0 865 | 866 | 867 | 868 | 869 | 4 870 | 0 871 | -11 872 | 0 873 | 0 874 | 0 875 | 0 876 | 0 877 | 0 878 | 0 879 | 880 | 881 | 882 | 883 | 5 884 | 0 885 | 5 886 | 0 887 | 0 888 | 0 889 | 0 890 | 0 891 | 0 892 | 0 893 | 894 | 895 | 896 | 897 | 6 898 | 0 899 | -9 900 | 0 901 | 0 902 | 0 903 | 0 904 | 0 905 | 0 906 | 0 907 | 908 | 909 | 910 | 911 | 7 912 | 0 913 | 7 914 | 0 915 | 0 916 | 0 917 | 0 918 | 0 919 | 0 920 | 0 921 | 922 | 923 | 924 | 925 | 8 926 | 0 927 | -7 928 | 0 929 | 0 930 | 0 931 | 0 932 | 0 933 | 0 934 | 0 935 | 936 | 937 | 938 | 939 | 9 940 | 0 941 | 9 942 | 0 943 | 0 944 | 0 945 | 0 946 | 0 947 | 0 948 | 0 949 | 950 | 951 | 952 | 953 | 10 954 | 0 955 | -5 956 | 0 957 | 0 958 | 0 959 | 0 960 | 0 961 | 0 962 | 0 963 | 964 | 965 | 966 | 967 | 11 968 | 0 969 | 11 970 | 0 971 | 0 972 | 0 973 | 0 974 | 0 975 | 0 976 | 0 977 | 978 | 979 | 980 | 981 | 12 982 | 0 983 | -3 984 | 0 985 | 0 986 | 0 987 | 0 988 | 0 989 | 0 990 | 0 991 | 992 | 993 | 994 | 995 | 13 996 | 0 997 | 13 998 | 0 999 | 0 1000 | 0 1001 | 0 1002 | 0 1003 | 0 1004 | 0 1005 | 1006 | 1007 | 1008 | 1009 | 14 1010 | 0 1011 | -1 1012 | 0 1013 | 0 1014 | 0 1015 | 0 1016 | 0 1017 | 0 1018 | 0 1019 | 1020 | 1021 | 1022 | 1023 | 15 1024 | 0 1025 | 15 1026 | 0 1027 | 0 1028 | 0 1029 | 0 1030 | 0 1031 | 0 1032 | 0 1033 | 1034 | 1035 | 1036 | 1037 | 16 1038 | 0 1039 | -15 1040 | 0 1041 | 0 1042 | 0 1043 | 0 1044 | 0 1045 | 0 1046 | 0 1047 | 1048 | 1049 | 1050 | 1051 | 17 1052 | 0 1053 | 1 1054 | 0 1055 | 0 1056 | 0 1057 | 0 1058 | 0 1059 | 0 1060 | 0 1061 | 1062 | 1063 | 1064 | 1065 | 18 1066 | 0 1067 | -13 1068 | 0 1069 | 0 1070 | 0 1071 | 0 1072 | 0 1073 | 0 1074 | 0 1075 | 1076 | 1077 | 1078 | 1079 | 19 1080 | 0 1081 | 3 1082 | 0 1083 | 0 1084 | 0 1085 | 0 1086 | 0 1087 | 0 1088 | 0 1089 | 1090 | 1091 | 1092 | 1093 | 20 1094 | 0 1095 | -11 1096 | 0 1097 | 0 1098 | 0 1099 | 0 1100 | 0 1101 | 0 1102 | 0 1103 | 1104 | 1105 | 1106 | 1107 | 21 1108 | 0 1109 | 5 1110 | 0 1111 | 0 1112 | 0 1113 | 0 1114 | 0 1115 | 0 1116 | 0 1117 | 1118 | 1119 | 1120 | 1121 | 22 1122 | 0 1123 | -9 1124 | 0 1125 | 0 1126 | 0 1127 | 0 1128 | 0 1129 | 0 1130 | 0 1131 | 1132 | 1133 | 1134 | 1135 | 23 1136 | 0 1137 | 7 1138 | 0 1139 | 0 1140 | 0 1141 | 0 1142 | 0 1143 | 0 1144 | 0 1145 | 1146 | 1147 | 1148 | 1149 | 24 1150 | 0 1151 | -7 1152 | 0 1153 | 0 1154 | 0 1155 | 0 1156 | 0 1157 | 0 1158 | 0 1159 | 1160 | 1161 | 1162 | 1163 | 25 1164 | 0 1165 | 9 1166 | 0 1167 | 0 1168 | 0 1169 | 0 1170 | 0 1171 | 0 1172 | 0 1173 | 1174 | 1175 | 1176 | 1177 | 26 1178 | 0 1179 | -5 1180 | 0 1181 | 0 1182 | 0 1183 | 0 1184 | 0 1185 | 0 1186 | 0 1187 | 1188 | 1189 | 1190 | 1191 | 27 1192 | 0 1193 | 11 1194 | 0 1195 | 0 1196 | 0 1197 | 0 1198 | 0 1199 | 0 1200 | 0 1201 | 1202 | 1203 | 1204 | 1205 | 28 1206 | 0 1207 | -3 1208 | 0 1209 | 0 1210 | 0 1211 | 0 1212 | 0 1213 | 0 1214 | 0 1215 | 1216 | 1217 | 1218 | 1219 | 29 1220 | 0 1221 | 13 1222 | 0 1223 | 0 1224 | 0 1225 | 0 1226 | 0 1227 | 0 1228 | 0 1229 | 1230 | 1231 | 1232 | 1233 | 30 1234 | 0 1235 | -1 1236 | 0 1237 | 0 1238 | 0 1239 | 0 1240 | 0 1241 | 0 1242 | 0 1243 | 1244 | 1245 | 1246 | 1247 | 31 1248 | 0 1249 | 15 1250 | 0 1251 | 0 1252 | 0 1253 | 0 1254 | 0 1255 | 0 1256 | 0 1257 | 1258 | 1259 | 1260 | 1261 | 32 1262 | 0 1263 | 0 1264 | 0 1265 | 0 1266 | 0 1267 | 0 1268 | 0 1269 | 0 1270 | 0 1271 | 1272 | 1273 | 1274 | 1275 | 33 1276 | 0 1277 | 0 1278 | 0 1279 | 0 1280 | 0 1281 | 0 1282 | 0 1283 | 0 1284 | 0 1285 | 1286 | 1287 | 1288 | 1289 | 34 1290 | 0 1291 | 0 1292 | 0 1293 | 0 1294 | 0 1295 | 0 1296 | 0 1297 | 0 1298 | 0 1299 | 1300 | 1301 | 1302 | 1303 | 35 1304 | 0 1305 | 0 1306 | 0 1307 | 0 1308 | 0 1309 | 0 1310 | 0 1311 | 0 1312 | 0 1313 | 1314 | 1315 | 1316 | 1317 | 36 1318 | 0 1319 | 0 1320 | 0 1321 | 0 1322 | 0 1323 | 0 1324 | 0 1325 | 0 1326 | 0 1327 | 1328 | 1329 | 1330 | 1331 | 37 1332 | 0 1333 | 0 1334 | 0 1335 | 0 1336 | 0 1337 | 0 1338 | 0 1339 | 0 1340 | 0 1341 | 1342 | 1343 | 1344 | 1345 | 38 1346 | 0 1347 | 0 1348 | 0 1349 | 0 1350 | 0 1351 | 0 1352 | 0 1353 | 0 1354 | 0 1355 | 1356 | 1357 | 1358 | 1359 | 39 1360 | 0 1361 | 0 1362 | 0 1363 | 0 1364 | 0 1365 | 0 1366 | 0 1367 | 0 1368 | 0 1369 | 1370 | 1371 | 1372 | 1373 | 40 1374 | 0 1375 | 0 1376 | 0 1377 | 0 1378 | 0 1379 | 0 1380 | 0 1381 | 0 1382 | 0 1383 | 1384 | 1385 | 1386 | 1387 | 41 1388 | 0 1389 | 0 1390 | 0 1391 | 0 1392 | 0 1393 | 0 1394 | 0 1395 | 0 1396 | 0 1397 | 1398 | 1399 | 1400 | 1401 | 42 1402 | 0 1403 | 0 1404 | 0 1405 | 0 1406 | 0 1407 | 0 1408 | 0 1409 | 0 1410 | 0 1411 | 1412 | 1413 | 1414 | 1415 | 43 1416 | 0 1417 | 0 1418 | 0 1419 | 0 1420 | 0 1421 | 0 1422 | 0 1423 | 0 1424 | 0 1425 | 1426 | 1427 | 1428 | 1429 | 44 1430 | 0 1431 | 0 1432 | 0 1433 | 0 1434 | 0 1435 | 0 1436 | 0 1437 | 0 1438 | 0 1439 | 1440 | 1441 | 1442 | 1443 | 45 1444 | 0 1445 | 0 1446 | 0 1447 | 0 1448 | 0 1449 | 0 1450 | 0 1451 | 0 1452 | 0 1453 | 1454 | 1455 | 1456 | 1457 | 46 1458 | 0 1459 | 0 1460 | 0 1461 | 0 1462 | 0 1463 | 0 1464 | 0 1465 | 0 1466 | 0 1467 | 1468 | 1469 | 1470 | 1471 | 47 1472 | 0 1473 | 0 1474 | 0 1475 | 0 1476 | 0 1477 | 0 1478 | 0 1479 | 0 1480 | 0 1481 | 1482 | 1483 | 1484 | 1485 | 48 1486 | 0 1487 | 0 1488 | 0 1489 | 0 1490 | 0 1491 | 0 1492 | 0 1493 | 0 1494 | 0 1495 | 1496 | 1497 | 1498 | 1499 | 49 1500 | 0 1501 | 0 1502 | 0 1503 | 0 1504 | 0 1505 | 0 1506 | 0 1507 | 0 1508 | 0 1509 | 1510 | 1511 | 1512 | 1513 | 50 1514 | 0 1515 | 0 1516 | 0 1517 | 0 1518 | 0 1519 | 0 1520 | 0 1521 | 0 1522 | 0 1523 | 1524 | 1525 | 1526 | 1527 | 51 1528 | 0 1529 | 0 1530 | 0 1531 | 0 1532 | 0 1533 | 0 1534 | 0 1535 | 0 1536 | 0 1537 | 1538 | 1539 | 1540 | 1541 | 52 1542 | 0 1543 | 0 1544 | 0 1545 | 0 1546 | 0 1547 | 0 1548 | 0 1549 | 0 1550 | 0 1551 | 1552 | 1553 | 1554 | 1555 | 53 1556 | 0 1557 | 0 1558 | 0 1559 | 0 1560 | 0 1561 | 0 1562 | 0 1563 | 0 1564 | 0 1565 | 1566 | 1567 | 1568 | 1569 | 54 1570 | 0 1571 | 0 1572 | 0 1573 | 0 1574 | 0 1575 | 0 1576 | 0 1577 | 0 1578 | 0 1579 | 1580 | 1581 | 1582 | 1583 | 55 1584 | 0 1585 | 0 1586 | 0 1587 | 0 1588 | 0 1589 | 0 1590 | 0 1591 | 0 1592 | 0 1593 | 1594 | 1595 | 1596 | 1597 | 56 1598 | 0 1599 | 0 1600 | 0 1601 | 0 1602 | 0 1603 | 0 1604 | 0 1605 | 0 1606 | 0 1607 | 1608 | 1609 | 1610 | 1611 | 57 1612 | 0 1613 | 0 1614 | 0 1615 | 0 1616 | 0 1617 | 0 1618 | 0 1619 | 0 1620 | 0 1621 | 1622 | 1623 | 1624 | 1625 | 58 1626 | 0 1627 | 0 1628 | 0 1629 | 0 1630 | 0 1631 | 0 1632 | 0 1633 | 0 1634 | 0 1635 | 1636 | 1637 | 1638 | 1639 | 59 1640 | 0 1641 | 0 1642 | 0 1643 | 0 1644 | 0 1645 | 0 1646 | 0 1647 | 0 1648 | 0 1649 | 1650 | 1651 | 1652 | 1653 | 60 1654 | 0 1655 | 0 1656 | 0 1657 | 0 1658 | 0 1659 | 0 1660 | 0 1661 | 0 1662 | 0 1663 | 1664 | 1665 | 1666 | 1667 | 61 1668 | 0 1669 | 0 1670 | 0 1671 | 0 1672 | 0 1673 | 0 1674 | 0 1675 | 0 1676 | 0 1677 | 1678 | 1679 | 1680 | 1681 | 62 1682 | 0 1683 | 0 1684 | 0 1685 | 0 1686 | 0 1687 | 0 1688 | 0 1689 | 0 1690 | 0 1691 | 1692 | 1693 | 1694 | 1695 | 63 1696 | 0 1697 | 0 1698 | 0 1699 | 0 1700 | 0 1701 | 0 1702 | 0 1703 | 0 1704 | 0 1705 | 1706 | 1707 | 1708 | 1709 | 1710 | -------------------------------------------------------------------------------- /32db.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0.2 6 | 7 | 8 | 3 9 | 0 10 | 0 11 | 0 12 | 13 | 14 | 15 | 16 | 3 17 | 0 18 | 0 19 | 0 20 | 21 | 22 | 23 | 64 24 | 0 25 | 26 | 27 | 3 28 | 0.84018773 29 | 0.39438292 30 | 0.78309923 31 | 32 | 33 | 34 | 35 | 3 36 | 0.840177 37 | 0.77233541 38 | 0.39436942 39 | 40 | 41 | 42 | 43 | 3 44 | 0.08879225 45 | 0.8096742 46 | 0.71766233 47 | 48 | 49 | 50 | 51 | 3 52 | 0.70946825 53 | 0.40906385 54 | 0.82345313 55 | 56 | 57 | 58 | 59 | 3 60 | 0.5796597 61 | 0.9642939 62 | 0.064805068 63 | 64 | 65 | 66 | 67 | 3 68 | 0.32542917 69 | 0.69379723 70 | 1 71 | 72 | 73 | 74 | 75 | 3 76 | 0.96250856 77 | 0.7900511 78 | 0.13542382 79 | 80 | 81 | 82 | 83 | 3 84 | 0.91102463 85 | 0.34070343 86 | 0.050705731 87 | 88 | 89 | 90 | 91 | 3 92 | 0.35276073 93 | 0.78958958 94 | 0.90582585 95 | 96 | 97 | 98 | 99 | 3 100 | 0.21438926 101 | 0.69950408 102 | 0.20341802 103 | 104 | 105 | 106 | 107 | 3 108 | 0.085374229 109 | 0.94720376 110 | 0.88781565 111 | 112 | 113 | 114 | 115 | 3 116 | 0.98643476 117 | 0.97503626 118 | 0.034851607 119 | 120 | 121 | 122 | 123 | 3 124 | 0.7856003 125 | 0.44017774 126 | 0.11511882 127 | 128 | 129 | 130 | 131 | 3 132 | 0.63264316 133 | 0.34141558 134 | 0.9041099 135 | 136 | 137 | 138 | 139 | 3 140 | 0.94122225 141 | 0.072755016 142 | 0.85761809 143 | 144 | 145 | 146 | 147 | 3 148 | 0.95754939 149 | 0.9211719 150 | 0.21469444 151 | 152 | 153 | 154 | 155 | 3 156 | 0.94947737 157 | 0.55008775 158 | 0.44551766 159 | 160 | 161 | 162 | 163 | 3 164 | 0.89275962 165 | 0.85084307 166 | 0.01608301 167 | 168 | 169 | 170 | 171 | 3 172 | 0.91799802 173 | 0.49231708 174 | 0.78014803 175 | 176 | 177 | 178 | 179 | 3 180 | 0.55109483 181 | 0.75539786 182 | 0.21551843 183 | 184 | 185 | 186 | 187 | 3 188 | 0.14881226 189 | 0.7401194 190 | 0.53116983 191 | 192 | 193 | 194 | 195 | 3 196 | 0.93394369 197 | 0.39975587 198 | 0.67215991 199 | 200 | 201 | 202 | 203 | 3 204 | 0.86502695 205 | 0.56639397 206 | 0.63385367 207 | 208 | 209 | 210 | 211 | 3 212 | 0.50551611 213 | 0.94326693 214 | 0.48421454 215 | 216 | 217 | 218 | 219 | 3 220 | 0.087714233 221 | 0.89877903 222 | 0.2479341 223 | 224 | 225 | 226 | 227 | 3 228 | 0.93935621 229 | 0.80573922 230 | 0.04233218 231 | 232 | 233 | 234 | 235 | 3 236 | 0.09033341 237 | 0.87373161 238 | 0.9662928 239 | 240 | 241 | 242 | 243 | 3 244 | 0.13539331 245 | 0.65983063 246 | 0.28789195 247 | 248 | 249 | 250 | 251 | 3 252 | 0.96635383 253 | 0.28834975 254 | 0.057038225 255 | 256 | 257 | 258 | 259 | 3 260 | 0.600824 261 | 0.96617073 262 | 0.10191501 263 | 264 | 265 | 266 | 267 | 3 268 | 0.90740824 269 | 0.95980775 270 | 0.95391774 271 | 272 | 273 | 274 | 275 | 3 276 | 0.59211904 277 | 0.78711683 278 | 0.86269605 279 | 280 | 281 | 282 | 283 | 3 284 | 0.028625926 285 | 0.98828107 286 | 0.30778974 287 | 288 | 289 | 290 | 291 | 3 292 | 0.59491873 293 | 0.35182726 294 | 0.87454033 295 | 296 | 297 | 298 | 299 | 3 300 | 0.7464866 301 | 0.51860839 302 | 0.8450141 303 | 304 | 305 | 306 | 307 | 3 308 | 0.32484931 309 | 0.38410011 310 | 0.86562908 311 | 312 | 313 | 314 | 315 | 3 316 | 0.96064699 317 | 0.052674145 318 | 0.67904174 319 | 320 | 321 | 322 | 323 | 3 324 | 0.31248951 325 | 0.92227054 326 | 0.48648813 327 | 328 | 329 | 330 | 331 | 3 332 | 0.054489966 333 | 0.95574886 334 | 0.28729686 335 | 336 | 337 | 338 | 339 | 3 340 | 0.95848018 341 | 0.93113601 342 | 0.10840009 343 | 344 | 345 | 346 | 347 | 3 348 | 0.95097274 349 | 0.94096285 350 | 0.32806897 351 | 352 | 353 | 354 | 355 | 3 356 | 0.9619745 357 | 0.034027617 358 | 0.78579384 359 | 360 | 361 | 362 | 363 | 3 364 | 0.94944686 365 | 0.82970929 366 | 0.037186235 367 | 368 | 369 | 370 | 371 | 3 372 | 0.97222859 373 | 0.62723738 374 | 0.065781645 375 | 376 | 377 | 378 | 379 | 3 380 | 0.92346072 381 | 0.96305794 382 | 0.93403524 383 | 384 | 385 | 386 | 387 | 3 388 | 0.98861676 389 | 0 390 | 0.76792556 391 | 392 | 393 | 394 | 395 | 3 396 | 0.26213473 397 | 0.95156789 398 | 0.94323641 399 | 400 | 401 | 402 | 403 | 3 404 | 0.41365683 405 | 0.97004652 406 | 0.078889146 407 | 408 | 409 | 410 | 411 | 3 412 | 0.85752654 413 | 0.1990692 414 | 0.22206454 415 | 416 | 417 | 418 | 419 | 3 420 | 0.053299762 421 | 0.93763638 422 | 0.99444574 423 | 424 | 425 | 426 | 427 | 3 428 | 0.8943212 429 | 0.62864298 430 | 0.10409617 431 | 432 | 433 | 434 | 435 | 3 436 | 0.76058036 437 | 0.048754983 438 | 0.91462308 439 | 440 | 441 | 442 | 443 | 3 444 | 0.83480585 445 | 0.70650798 446 | 0.51032275 447 | 448 | 449 | 450 | 451 | 3 452 | 0.89080644 453 | 0.12384222 454 | 0.26840618 455 | 456 | 457 | 458 | 459 | 3 460 | 0.32953385 461 | 0.81698328 462 | 0.51252002 463 | 464 | 465 | 466 | 467 | 3 468 | 0.39465934 469 | 0.75048447 470 | 0.75953305 471 | 472 | 473 | 474 | 475 | 3 476 | 0.92498666 477 | 0.94149691 478 | 0.12957962 479 | 480 | 481 | 482 | 483 | 3 484 | 0.91115069 485 | 0.52652103 486 | 0.73026121 487 | 488 | 489 | 490 | 491 | 3 492 | 0.76655 493 | 0.93766737 494 | 0.031084489 495 | 496 | 497 | 498 | 499 | 3 500 | 0.12669764 501 | 0.85318863 502 | 0.33537352 503 | 504 | 505 | 506 | 507 | 3 508 | 0.9853164 509 | 0.26496059 510 | 0.13821837 511 | 512 | 513 | 514 | 515 | 3 516 | 0.84317338 517 | 0.17844476 518 | 0.94212615 519 | 520 | 521 | 522 | 523 | 3 524 | 0.69955063 525 | 0.59048992 526 | 0.74391818 527 | 528 | 529 | 530 | 531 | 3 532 | 0.67139697 533 | 0.87832457 534 | 0.69022661 535 | 536 | 537 | 538 | 539 | 64 540 | 1 541 | 1 542 | 1 543 | 1 544 | 1 545 | 1 546 | 1 547 | 1 548 | 1 549 | 1 550 | 1 551 | 1 552 | 1 553 | 1 554 | 1 555 | 1 556 | 1 557 | 1 558 | 1 559 | 1 560 | 1 561 | 1 562 | 1 563 | 1 564 | 1 565 | 1 566 | 1 567 | 1 568 | 1 569 | 1 570 | 1 571 | 1 572 | 0 573 | 0 574 | 0 575 | 0 576 | 0 577 | 0 578 | 0 579 | 0 580 | 0 581 | 0 582 | 0 583 | 0 584 | 0 585 | 0 586 | 0 587 | 0 588 | 0 589 | 0 590 | 0 591 | 0 592 | 0 593 | 0 594 | 0 595 | 0 596 | 0 597 | 0 598 | 0 599 | 0 600 | 0 601 | 0 602 | 0 603 | 0 604 | 605 | 606 | 64 607 | 0 608 | 0 609 | 0 610 | 0 611 | 0 612 | 0 613 | 0 614 | 0 615 | 0 616 | 0 617 | 0 618 | 0 619 | 0 620 | 0 621 | 0 622 | 0 623 | 0 624 | 0 625 | 0 626 | 0 627 | 0 628 | 0 629 | 0 630 | 0 631 | 0 632 | 0 633 | 0 634 | 0 635 | 0 636 | 0 637 | 0 638 | 0 639 | 0 640 | 0 641 | 0 642 | 0 643 | 0 644 | 0 645 | 0 646 | 0 647 | 0 648 | 0 649 | 0 650 | 0 651 | 0 652 | 0 653 | 0 654 | 0 655 | 0 656 | 0 657 | 0 658 | 0 659 | 0 660 | 0 661 | 0 662 | 0 663 | 0 664 | 0 665 | 0 666 | 0 667 | 0 668 | 0 669 | 0 670 | 0 671 | 672 | 673 | 64 674 | 0 675 | 0 676 | 0 677 | 0 678 | 0 679 | 0 680 | 0 681 | 0 682 | 0 683 | 0 684 | 0 685 | 0 686 | 0 687 | 0 688 | 0 689 | 0 690 | 0 691 | 0 692 | 0 693 | 0 694 | 0 695 | 0 696 | 0 697 | 0 698 | 0 699 | 0 700 | 0 701 | 0 702 | 0 703 | 0 704 | 0 705 | 0 706 | 0 707 | 0 708 | 0 709 | 0 710 | 0 711 | 0 712 | 0 713 | 0 714 | 0 715 | 0 716 | 0 717 | 0 718 | 0 719 | 0 720 | 0 721 | 0 722 | 0 723 | 0 724 | 0 725 | 0 726 | 0 727 | 0 728 | 0 729 | 0 730 | 0 731 | 0 732 | 0 733 | 0 734 | 0 735 | 0 736 | 0 737 | 0 738 | 0 739 | 740 | 741 | 64 742 | 0 743 | 255 744 | 255 745 | 255 746 | 255 747 | 255 748 | 255 749 | 255 750 | 255 751 | 255 752 | 255 753 | 255 754 | 255 755 | 255 756 | 255 757 | 255 758 | 255 759 | 255 760 | 255 761 | 255 762 | 255 763 | 255 764 | 255 765 | 255 766 | 255 767 | 255 768 | 255 769 | 255 770 | 255 771 | 255 772 | 255 773 | 255 774 | 255 775 | 255 776 | 255 777 | 255 778 | 255 779 | 255 780 | 255 781 | 255 782 | 255 783 | 255 784 | 255 785 | 255 786 | 255 787 | 255 788 | 255 789 | 255 790 | 255 791 | 255 792 | 255 793 | 255 794 | 255 795 | 255 796 | 255 797 | 255 798 | 255 799 | 255 800 | 255 801 | 255 802 | 255 803 | 255 804 | 255 805 | 255 806 | 255 807 | 808 | 809 | 64 810 | 1 811 | 812 | 813 | 0 814 | 0 815 | -30.67 816 | 0 817 | 0 818 | 0 819 | 0 820 | 0 821 | 0 822 | 0 823 | 824 | 825 | 826 | 827 | 1 828 | 0 829 | -9.3299999 830 | 0 831 | 0 832 | 0 833 | 0 834 | 0 835 | 0 836 | 0 837 | 838 | 839 | 840 | 841 | 2 842 | 0 843 | -29.33 844 | 0 845 | 0 846 | 0 847 | 0 848 | 0 849 | 0 850 | 0 851 | 852 | 853 | 854 | 855 | 3 856 | 0 857 | -8 858 | 0 859 | 0 860 | 0 861 | 0 862 | 0 863 | 0 864 | 0 865 | 866 | 867 | 868 | 869 | 4 870 | 0 871 | -28 872 | 0 873 | 0 874 | 0 875 | 0 876 | 0 877 | 0 878 | 0 879 | 880 | 881 | 882 | 883 | 5 884 | 0 885 | -6.6700001 886 | 0 887 | 0 888 | 0 889 | 0 890 | 0 891 | 0 892 | 0 893 | 894 | 895 | 896 | 897 | 6 898 | 0 899 | -26.67 900 | 0 901 | 0 902 | 0 903 | 0 904 | 0 905 | 0 906 | 0 907 | 908 | 909 | 910 | 911 | 7 912 | 0 913 | -5.3299999 914 | 0 915 | 0 916 | 0 917 | 0 918 | 0 919 | 0 920 | 0 921 | 922 | 923 | 924 | 925 | 8 926 | 0 927 | -25.33 928 | 0 929 | 0 930 | 0 931 | 0 932 | 0 933 | 0 934 | 0 935 | 936 | 937 | 938 | 939 | 9 940 | 0 941 | -4 942 | 0 943 | 0 944 | 0 945 | 0 946 | 0 947 | 0 948 | 0 949 | 950 | 951 | 952 | 953 | 10 954 | 0 955 | -24 956 | 0 957 | 0 958 | 0 959 | 0 960 | 0 961 | 0 962 | 0 963 | 964 | 965 | 966 | 967 | 11 968 | 0 969 | -2.6700001 970 | 0 971 | 0 972 | 0 973 | 0 974 | 0 975 | 0 976 | 0 977 | 978 | 979 | 980 | 981 | 12 982 | 0 983 | -22.67 984 | 0 985 | 0 986 | 0 987 | 0 988 | 0 989 | 0 990 | 0 991 | 992 | 993 | 994 | 995 | 13 996 | 0 997 | -1.33 998 | 0 999 | 0 1000 | 0 1001 | 0 1002 | 0 1003 | 0 1004 | 0 1005 | 1006 | 1007 | 1008 | 1009 | 14 1010 | 0 1011 | -21.33 1012 | 0 1013 | 0 1014 | 0 1015 | 0 1016 | 0 1017 | 0 1018 | 0 1019 | 1020 | 1021 | 1022 | 1023 | 15 1024 | 0 1025 | 0 1026 | 0 1027 | 0 1028 | 0 1029 | 0 1030 | 0 1031 | 0 1032 | 0 1033 | 1034 | 1035 | 1036 | 1037 | 16 1038 | 0 1039 | -20 1040 | 0 1041 | 0 1042 | 0 1043 | 0 1044 | 0 1045 | 0 1046 | 0 1047 | 1048 | 1049 | 1050 | 1051 | 17 1052 | 0 1053 | 1.33 1054 | 0 1055 | 0 1056 | 0 1057 | 0 1058 | 0 1059 | 0 1060 | 0 1061 | 1062 | 1063 | 1064 | 1065 | 18 1066 | 0 1067 | -18.67 1068 | 0 1069 | 0 1070 | 0 1071 | 0 1072 | 0 1073 | 0 1074 | 0 1075 | 1076 | 1077 | 1078 | 1079 | 19 1080 | 0 1081 | 2.6700001 1082 | 0 1083 | 0 1084 | 0 1085 | 0 1086 | 0 1087 | 0 1088 | 0 1089 | 1090 | 1091 | 1092 | 1093 | 20 1094 | 0 1095 | -17.33 1096 | 0 1097 | 0 1098 | 0 1099 | 0 1100 | 0 1101 | 0 1102 | 0 1103 | 1104 | 1105 | 1106 | 1107 | 21 1108 | 0 1109 | 4 1110 | 0 1111 | 0 1112 | 0 1113 | 0 1114 | 0 1115 | 0 1116 | 0 1117 | 1118 | 1119 | 1120 | 1121 | 22 1122 | 0 1123 | -16 1124 | 0 1125 | 0 1126 | 0 1127 | 0 1128 | 0 1129 | 0 1130 | 0 1131 | 1132 | 1133 | 1134 | 1135 | 23 1136 | 0 1137 | 5.3299999 1138 | 0 1139 | 0 1140 | 0 1141 | 0 1142 | 0 1143 | 0 1144 | 0 1145 | 1146 | 1147 | 1148 | 1149 | 24 1150 | 0 1151 | -14.67 1152 | 0 1153 | 0 1154 | 0 1155 | 0 1156 | 0 1157 | 0 1158 | 0 1159 | 1160 | 1161 | 1162 | 1163 | 25 1164 | 0 1165 | 6.6700001 1166 | 0 1167 | 0 1168 | 0 1169 | 0 1170 | 0 1171 | 0 1172 | 0 1173 | 1174 | 1175 | 1176 | 1177 | 26 1178 | 0 1179 | -13.33 1180 | 0 1181 | 0 1182 | 0 1183 | 0 1184 | 0 1185 | 0 1186 | 0 1187 | 1188 | 1189 | 1190 | 1191 | 27 1192 | 0 1193 | 8 1194 | 0 1195 | 0 1196 | 0 1197 | 0 1198 | 0 1199 | 0 1200 | 0 1201 | 1202 | 1203 | 1204 | 1205 | 28 1206 | 0 1207 | -12 1208 | 0 1209 | 0 1210 | 0 1211 | 0 1212 | 0 1213 | 0 1214 | 0 1215 | 1216 | 1217 | 1218 | 1219 | 29 1220 | 0 1221 | 9.3299999 1222 | 0 1223 | 0 1224 | 0 1225 | 0 1226 | 0 1227 | 0 1228 | 0 1229 | 1230 | 1231 | 1232 | 1233 | 30 1234 | 0 1235 | -10.67 1236 | 0 1237 | 0 1238 | 0 1239 | 0 1240 | 0 1241 | 0 1242 | 0 1243 | 1244 | 1245 | 1246 | 1247 | 31 1248 | 0 1249 | 10.67 1250 | 0 1251 | 0 1252 | 0 1253 | 0 1254 | 0 1255 | 0 1256 | 0 1257 | 1258 | 1259 | 1260 | 1261 | 32 1262 | 0 1263 | 0 1264 | 0 1265 | 0 1266 | 0 1267 | 0 1268 | 0 1269 | 0 1270 | 0 1271 | 1272 | 1273 | 1274 | 1275 | 33 1276 | 0 1277 | 0 1278 | 0 1279 | 0 1280 | 0 1281 | 0 1282 | 0 1283 | 0 1284 | 0 1285 | 1286 | 1287 | 1288 | 1289 | 34 1290 | 0 1291 | 0 1292 | 0 1293 | 0 1294 | 0 1295 | 0 1296 | 0 1297 | 0 1298 | 0 1299 | 1300 | 1301 | 1302 | 1303 | 35 1304 | 0 1305 | 0 1306 | 0 1307 | 0 1308 | 0 1309 | 0 1310 | 0 1311 | 0 1312 | 0 1313 | 1314 | 1315 | 1316 | 1317 | 36 1318 | 0 1319 | 0 1320 | 0 1321 | 0 1322 | 0 1323 | 0 1324 | 0 1325 | 0 1326 | 0 1327 | 1328 | 1329 | 1330 | 1331 | 37 1332 | 0 1333 | 0 1334 | 0 1335 | 0 1336 | 0 1337 | 0 1338 | 0 1339 | 0 1340 | 0 1341 | 1342 | 1343 | 1344 | 1345 | 38 1346 | 0 1347 | 0 1348 | 0 1349 | 0 1350 | 0 1351 | 0 1352 | 0 1353 | 0 1354 | 0 1355 | 1356 | 1357 | 1358 | 1359 | 39 1360 | 0 1361 | 0 1362 | 0 1363 | 0 1364 | 0 1365 | 0 1366 | 0 1367 | 0 1368 | 0 1369 | 1370 | 1371 | 1372 | 1373 | 40 1374 | 0 1375 | 0 1376 | 0 1377 | 0 1378 | 0 1379 | 0 1380 | 0 1381 | 0 1382 | 0 1383 | 1384 | 1385 | 1386 | 1387 | 41 1388 | 0 1389 | 0 1390 | 0 1391 | 0 1392 | 0 1393 | 0 1394 | 0 1395 | 0 1396 | 0 1397 | 1398 | 1399 | 1400 | 1401 | 42 1402 | 0 1403 | 0 1404 | 0 1405 | 0 1406 | 0 1407 | 0 1408 | 0 1409 | 0 1410 | 0 1411 | 1412 | 1413 | 1414 | 1415 | 43 1416 | 0 1417 | 0 1418 | 0 1419 | 0 1420 | 0 1421 | 0 1422 | 0 1423 | 0 1424 | 0 1425 | 1426 | 1427 | 1428 | 1429 | 44 1430 | 0 1431 | 0 1432 | 0 1433 | 0 1434 | 0 1435 | 0 1436 | 0 1437 | 0 1438 | 0 1439 | 1440 | 1441 | 1442 | 1443 | 45 1444 | 0 1445 | 0 1446 | 0 1447 | 0 1448 | 0 1449 | 0 1450 | 0 1451 | 0 1452 | 0 1453 | 1454 | 1455 | 1456 | 1457 | 46 1458 | 0 1459 | 0 1460 | 0 1461 | 0 1462 | 0 1463 | 0 1464 | 0 1465 | 0 1466 | 0 1467 | 1468 | 1469 | 1470 | 1471 | 47 1472 | 0 1473 | 0 1474 | 0 1475 | 0 1476 | 0 1477 | 0 1478 | 0 1479 | 0 1480 | 0 1481 | 1482 | 1483 | 1484 | 1485 | 48 1486 | 0 1487 | 0 1488 | 0 1489 | 0 1490 | 0 1491 | 0 1492 | 0 1493 | 0 1494 | 0 1495 | 1496 | 1497 | 1498 | 1499 | 49 1500 | 0 1501 | 0 1502 | 0 1503 | 0 1504 | 0 1505 | 0 1506 | 0 1507 | 0 1508 | 0 1509 | 1510 | 1511 | 1512 | 1513 | 50 1514 | 0 1515 | 0 1516 | 0 1517 | 0 1518 | 0 1519 | 0 1520 | 0 1521 | 0 1522 | 0 1523 | 1524 | 1525 | 1526 | 1527 | 51 1528 | 0 1529 | 0 1530 | 0 1531 | 0 1532 | 0 1533 | 0 1534 | 0 1535 | 0 1536 | 0 1537 | 1538 | 1539 | 1540 | 1541 | 52 1542 | 0 1543 | 0 1544 | 0 1545 | 0 1546 | 0 1547 | 0 1548 | 0 1549 | 0 1550 | 0 1551 | 1552 | 1553 | 1554 | 1555 | 53 1556 | 0 1557 | 0 1558 | 0 1559 | 0 1560 | 0 1561 | 0 1562 | 0 1563 | 0 1564 | 0 1565 | 1566 | 1567 | 1568 | 1569 | 54 1570 | 0 1571 | 0 1572 | 0 1573 | 0 1574 | 0 1575 | 0 1576 | 0 1577 | 0 1578 | 0 1579 | 1580 | 1581 | 1582 | 1583 | 55 1584 | 0 1585 | 0 1586 | 0 1587 | 0 1588 | 0 1589 | 0 1590 | 0 1591 | 0 1592 | 0 1593 | 1594 | 1595 | 1596 | 1597 | 56 1598 | 0 1599 | 0 1600 | 0 1601 | 0 1602 | 0 1603 | 0 1604 | 0 1605 | 0 1606 | 0 1607 | 1608 | 1609 | 1610 | 1611 | 57 1612 | 0 1613 | 0 1614 | 0 1615 | 0 1616 | 0 1617 | 0 1618 | 0 1619 | 0 1620 | 0 1621 | 1622 | 1623 | 1624 | 1625 | 58 1626 | 0 1627 | 0 1628 | 0 1629 | 0 1630 | 0 1631 | 0 1632 | 0 1633 | 0 1634 | 0 1635 | 1636 | 1637 | 1638 | 1639 | 59 1640 | 0 1641 | 0 1642 | 0 1643 | 0 1644 | 0 1645 | 0 1646 | 0 1647 | 0 1648 | 0 1649 | 1650 | 1651 | 1652 | 1653 | 60 1654 | 0 1655 | 0 1656 | 0 1657 | 0 1658 | 0 1659 | 0 1660 | 0 1661 | 0 1662 | 0 1663 | 1664 | 1665 | 1666 | 1667 | 61 1668 | 0 1669 | 0 1670 | 0 1671 | 0 1672 | 0 1673 | 0 1674 | 0 1675 | 0 1676 | 0 1677 | 1678 | 1679 | 1680 | 1681 | 62 1682 | 0 1683 | 0 1684 | 0 1685 | 0 1686 | 0 1687 | 0 1688 | 0 1689 | 0 1690 | 0 1691 | 1692 | 1693 | 1694 | 1695 | 63 1696 | 0 1697 | 0 1698 | 0 1699 | 0 1700 | 0 1701 | 0 1702 | 0 1703 | 0 1704 | 0 1705 | 1706 | 1707 | 1708 | 1709 | 1710 | --------------------------------------------------------------------------------