├── CMakeLists.txt ├── Makefile ├── README ├── data └── last_mag_calibration ├── launch └── calibrator.launch ├── nodes ├── calibrate_imu.py └── plot_calibration_data.py └── package.xml /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.4.6) 2 | project(calibrate_imu) 3 | 4 | find_package(catkin REQUIRED COMPONENTS 5 | rospy 6 | sensor_msgs 7 | geometry_msgs 8 | std_msgs 9 | ) 10 | 11 | 12 | catkin_package( 13 | # INCLUDE_DIRS include 14 | # LIBRARIES atu_sonar 15 | # CATKIN_DEPENDS rospy sensor_msgs std_msgs 16 | # DEPENDS system_lib 17 | ) 18 | 19 | include_directories( 20 | ${catkin_INCLUDE_DIRS} 21 | ) 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | include $(shell rospack find mk)/cmake.mk -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | This ROS node will read messages published to the /imu/data and /imu/mag topics. For the moment it only performs magnetometer calibration. 2 | 3 | * To run the node 4 | 5 | rosrun calibrate_imu calibrate_imu.py 6 | 7 | * To start collecting samples from the IMU 8 | 9 | rosservice call /start_sampling 10 | 11 | * To calibrate the magnetometer using the current data samples 12 | 13 | rosservice call /calibrate_mag 14 | 15 | This will store the calibration parameters in a file called "mag_calibration_d_m_y_H_M_S", where d_m_y_H_M_S is the time the file was created. For an example on how to read the file you can look at the plot_calibration_data.py script 16 | 17 | * To visualize the raw data from the magnetometer and the calibrated data 18 | 19 | ./plot_calibration_data.py mag_calibration_d_m_y_H_M_S 20 | 21 | If you have any questions or comments, please shoot me at email at gamboa at cim dot mcgill dot ca 22 | -------------------------------------------------------------------------------- /data/last_mag_calibration: -------------------------------------------------------------------------------- 1 | cnumpy.core.multiarray 2 | _reconstruct 3 | p0 4 | (cnumpy.matrixlib.defmatrix 5 | matrix 6 | p1 7 | (I0 8 | tp2 9 | S'b' 10 | p3 11 | tp4 12 | Rp5 13 | (I1 14 | (I3 15 | I1 16 | tp6 17 | cnumpy 18 | dtype 19 | p7 20 | (S'f8' 21 | p8 22 | I0 23 | I1 24 | tp9 25 | Rp10 26 | (I3 27 | S'<' 28 | p11 29 | NNNI-1 30 | I-1 31 | I0 32 | tp12 33 | bI00 34 | S'x,\xec+!\x03\xe1\xbf\x80u\xa99R\xd0\xd3\xbfP\xbf,S\xa6\xbe\xe6?' 35 | p13 36 | tp14 37 | b.cnumpy.core.multiarray 38 | _reconstruct 39 | p0 40 | (cnumpy 41 | ndarray 42 | p1 43 | (I0 44 | tp2 45 | S'b' 46 | p3 47 | tp4 48 | Rp5 49 | (I1 50 | (I3 51 | I3 52 | tp6 53 | cnumpy 54 | dtype 55 | p7 56 | (S'f8' 57 | p8 58 | I0 59 | I1 60 | tp9 61 | Rp10 62 | (I3 63 | S'<' 64 | p11 65 | NNNI-1 66 | I-1 67 | I0 68 | tp12 69 | bI00 70 | S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?' 71 | p13 72 | tp14 73 | b.cnumpy.core.multiarray 74 | _reconstruct 75 | p0 76 | (cnumpy.matrixlib.defmatrix 77 | matrix 78 | p1 79 | (I0 80 | tp2 81 | S'b' 82 | p3 83 | tp4 84 | Rp5 85 | (I1 86 | (I485 87 | I3 88 | tp6 89 | cnumpy 90 | dtype 91 | p7 92 | (S'f8' 93 | p8 94 | I0 95 | I1 96 | tp9 97 | Rp10 98 | (I3 99 | S'<' 100 | p11 101 | NNNI-1 102 | I-1 103 | I0 104 | tp12 105 | bI00 106 | S'5\xad\x1cs\x01\xdc\xce\xbf\xf9\xe2g0\x01P\xd9\xbf/R\x9f\x19\x01k\xe7?#\x02Ww\x016\xcf\xbfp\r\x852\x01}\xd9\xbf/R\x9f\x19\x01k\xe7?\xff\xab\xcb\x7f\x01\xea\xcf\xbf^b\xbf6\x01\xd7\xd9\xbf/R\x9f\x19\x01k\xe7?\xee* \xc4\x00O\xd0\xbf^b\xbf6\x01\xd7\xd9\xbf\xf3\xbc\x90\x18\x81T\xe7?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\xc4\xe1\x16=\x01^\xda\xbf\xf3\xbc\x90\x18\x81T\xe7?w\x00\x03\xc2\x00"\xd0\xbf\xff?2C\x01\xe0\xda\xbf\xb8\'\x82\x17\x01>\xe7?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\xed\x94lG\x01:\xdb\xbf\x05hV\x14\x81\xfa\xe6?w\x00\x03\xc2\x00"\xd0\xbfd\xbf\x89I\x01g\xdb\xbf\xca\xd2G\x13\x01\xe4\xe6?w\x00\x03\xc2\x00"\xd0\xbf\x8er\xdfS\x01C\xdc\xbf\xe7\xb8H\x11\x81\xb9\xe6?\xb2^\x1e\xc8\x00\xa4\xd0\xbf|\xc7\x19X\x01\x9d\xdc\xbf\x8e=9\x12\x81\xcd\xe6?\xee* \xc4\x00O\xd0\xbfj\x1cT\\\x01\xf7\xdc\xbf\xac#:\x10\x01\xa3\xe6?\xb2^\x1e\xc8\x00\xa4\xd0\xbf\xe1Fq^\x01$\xdd\xbfp\x8e+\x0f\x81\x8c\xe6?\xee* \xc4\x00O\xd0\xbf\xcf\x9b\xabb\x01~\xdd\xbf\xbe\xce\xff\x0b\x01I\xe6?eU=\xc6\x00|\xd0\xbf\xe1Fq^\x01$\xdd\xbf\xbe\xce\xff\x0b\x01I\xe6?)\x89;\xca\x00\xd1\xd0\xbf\xcf\x9b\xabb\x01~\xdd\xbf\xbe\xce\xff\x0b\x01I\xe6?\x8e\x08\x93\xd0\x00X\xd1\xbfG\xc6\xc8d\x01\xab\xdd\xbfG\xa4\xe2\t\x01\x1c\xe6?\xa0\xb3X\xcc\x00\xfe\xd0\xbf\x94\xcf\xa9f\x01\xd3\xdd\xbf\xed_\xc6\x05\x81\xc4\xe5?\xa0\xb3X\xcc\x00\xfe\xd0\xbf\x94\xcf\xa9f\x01\xd3\xdd\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?|]\xcd\xd4\x00\xb2\xd1\xbfXq\x8e`\x01Q\xdd\xbf\xed_\xc6\x05\x81\xc4\xe5?|]\xcd\xd4\x00\xb2\xd1\xbf\xcf\x9b\xabb\x01~\xdd\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xf4\x87\xea\xd6\x00\xdf\xd1\xbf\xe1Fq^\x01$\xdd\xbfv5\xa9\x03\x81\x97\xe5?k\xb2\x07\xd9\x00\x0c\xd2\xbfj\x1cT\\\x01\xf7\xdc\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\x1d;@\xe1\x00\xbb\xd2\xbf|\xc7\x19X\x01\x9d\xdc\xbf\xed_\xc6\x05\x81\xc4\xe5?/\xe6\x05\xdd\x00a\xd2\xbf\x8er\xdfS\x01C\xdc\xbf)\xf5\xd4\x06\x01\xdb\xe5?\x1d;@\xe1\x00\xbb\xd2\xbfAi\xfeQ\x01\x1b\xdc\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\x94e]\xe3\x00\xe8\xd2\xbf\xca>\xe1O\x01\xee\xdb\xbf\xb2\xca\xb7\x04\x01\xae\xe5?/\xe6\x05\xdd\x00a\xd2\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbf;\xa0\x9a\x02\x01\x81\xe5?\xa6\x10#\xdf\x00\x8e\xd2\xbfd\xbf\x89I\x01g\xdb\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xa6\x10#\xdf\x00\x8e\xd2\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbfv5\xa9\x03\x81\x97\xe5?\x1d;@\xe1\x00\xbb\xd2\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbf;\xa0\x9a\x02\x01\x81\xe5?\x0b\x90z\xe5\x00\x15\xd3\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbf\xff\n\x8c\x01\x81j\xe5?\x1d;@\xe1\x00\xbb\xd2\xbfAi\xfeQ\x01\x1b\xdc\xbf\xff\n\x8c\x01\x81j\xe5?/\xe6\x05\xdd\x00a\xd2\xbf\x8er\xdfS\x01C\xdc\xbf\xff\n\x8c\x01\x81j\xe5?/\xe6\x05\xdd\x00a\xd2\xbf|\xc7\x19X\x01\x9d\xdc\xbf;\xa0\x9a\x02\x01\x81\xe5?\xa6\x10#\xdf\x00\x8e\xd2\xbf\xf3\xf16Z\x01\xca\xdc\xbf\xff\n\x8c\x01\x81j\xe5?k\xb2\x07\xd9\x00\x0c\xd2\xbfj\x1cT\\\x01\xf7\xdc\xbf\x1d\xf1\x8c\xff\x00@\xe5?\xb8\xbb\xe8\xda\x004\xd2\xbfG\xc6\xc8d\x01\xab\xdd\xbfk1a\xfc\x80\xfc\xe4?k\xb2\x07\xd9\x00\x0c\xd2\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf\xa6\xc6o\xfd\x00\x13\xe5?k\xb2\x07\xd9\x00\x0c\xd2\xbf\xe7\xa3;q\x01\xb4\xde\xbfk1a\xfc\x80\xfc\xe4?\xf4\x87\xea\xd6\x00\xdf\xd1\xbf\xd5\xf8uu\x01\x0e\xdf\xbf/\x9cR\xfb\x00\xe6\xe4?\xb8\xbb\xe8\xda\x004\xd2\xbf#\x02Ww\x016\xdf\xbf\xa6\xc6o\xfd\x00\x13\xe5?k\xb2\x07\xd9\x00\x0c\xd2\xbf\x9a,ty\x01c\xdf\xbf/\x9cR\xfb\x00\xe6\xe4?\xf4\x87\xea\xd6\x00\xdf\xd1\xbf#\x02Ww\x016\xdf\xbf\xf3\x06D\xfa\x80\xcf\xe4?\xf4\x87\xea\xd6\x00\xdf\xd1\xbf\xd5\xf8uu\x01\x0e\xdf\xbf/\x9cR\xfb\x00\xe6\xe4?\x8e\x08\x93\xd0\x00X\xd1\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf/\x9cR\xfb\x00\xe6\xe4?\x053\xb0\xd2\x00\x85\xd1\xbfXq\x8e`\x01Q\xdd\xbf\x1d\xf1\x8c\xff\x00@\xe5?\x053\xb0\xd2\x00\x85\xd1\xbf\xf3\xf16Z\x01\xca\xdc\xbf\xe2[~\xfe\x80)\xe5?\x8e\x08\x93\xd0\x00X\xd1\xbf\xed\x94lG\x01:\xdb\xbf;\xa0\x9a\x02\x01\x81\xe5?\x053\xb0\xd2\x00\x85\xd1\xbf\xb26QA\x01\xb8\xda\xbfv5\xa9\x03\x81\x97\xe5?eU=\xc6\x00|\xd0\xbf\xf9\xe2g0\x01P\xd9\xbf\xb2\xca\xb7\x04\x01\xae\xe5?eU=\xc6\x00|\xd0\xbfY\x05\xf5#\x01G\xd8\xbfe\x8a\xe3\x07\x81\xf1\xe5?eU=\xc6\x00|\xd0\xbf\xca\xd2G\x13\x01\xe4\xd6\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xee* \xc4\x00O\xd0\xbf\xdc}\r\x0f\x01\x8a\xd6\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xee* \xc4\x00O\xd0\xbf\xa0\x1f\xf2\x08\x01\x08\xd6\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xff\xab\xcb\x7f\x01\xea\xcf\xbf)\xf5\xd4\x06\x01\xdb\xd5\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\xb2\xca\xb7\x04\x01\xae\xd5\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\x11W\x91{\x01\x90\xcf\xbf\xb2\xca\xb7\x04\x01\xae\xd5\xbfG\xa4\xe2\t\x01\x1c\xe6?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\xa0\x1f\xf2\x08\x01\x08\xd6\xbfG\xa4\xe2\t\x01\x1c\xe6?\xee* \xc4\x00O\xd0\xbf\xa0\x1f\xf2\x08\x01\x08\xd6\xbf\x829\xf1\n\x812\xe6?\xee* \xc4\x00O\xd0\xbf)\xf5\xd4\x06\x01\xdb\xd5\xbfG\xa4\xe2\t\x01\x1c\xe6?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\x8et,\r\x01b\xd6\xbf\xbe\xce\xff\x0b\x01I\xe6?\xff\xab\xcb\x7f\x01\xea\xcf\xbf)\xf5\xd4\x06\x01\xdb\xd5\xbf\xbe\xce\xff\x0b\x01I\xe6?\x11W\x91{\x01\x90\xcf\xbf)\xf5\xd4\x06\x01\xdb\xd5\xbf\xbe\xce\xff\x0b\x01I\xe6?#\x02Ww\x016\xcf\xbf\xc4u}\x00\x01T\xd5\xbf\x829\xf1\n\x812\xe6?#\x02Ww\x016\xcf\xbf\x88\x17b\xfa\x00\xd2\xd4\xbf\x829\xf1\n\x812\xe6?5\xad\x1cs\x01\xdc\xce\xbf\x9a\xc2\'\xf6\x00x\xd4\xbfp\x8e+\x0f\x81\x8c\xe6?GX\xe2n\x01\x82\xce\xbf\xacm\xed\xf1\x00\x1e\xd4\xbf5\xf9\x1c\x0e\x01v\xe6?GX\xe2n\x01\x82\xce\xbf5C\xd0\xef\x00\xf1\xd3\xbf\xac#:\x10\x01\xa3\xe6?\xacE k\x012\xce\xbf\xbe\x18\xb3\xed\x00\xc4\xd3\xbfp\x8e+\x0f\x81\x8c\xe6?GX\xe2n\x01\x82\xce\xbf\xf9\xe4\xb4\xe9\x00o\xd3\xbfp\x8e+\x0f\x81\x8c\xe6?#\x02Ww\x016\xcf\xbf\xf9\xe4\xb4\xe9\x00o\xd3\xbf\xe7\xb8H\x11\x81\xb9\xe6?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\x0b\x90z\xe5\x00\x15\xd3\xbf\xe7\xb8H\x11\x81\xb9\xe6?#\x02Ww\x016\xcf\xbf\xa6\x10#\xdf\x00\x8e\xd2\xbf\xca\xd2G\x13\x01\xe4\xe6?\x11W\x91{\x01\x90\xcf\xbf\x94e]\xe3\x00\xe8\xd2\xbf\xe7\xb8H\x11\x81\xb9\xe6?5\xad\x1cs\x01\xdc\xce\xbf/\xe6\x05\xdd\x00a\xd2\xbf\xe7\xb8H\x11\x81\xb9\xe6?GX\xe2n\x01\x82\xce\xbf/\xe6\x05\xdd\x00a\xd2\xbf\x8e=9\x12\x81\xcd\xe6?GX\xe2n\x01\x82\xce\xbf\xf4\x87\xea\xd6\x00\xdf\xd1\xbf\x8e=9\x12\x81\xcd\xe6?5\xad\x1cs\x01\xdc\xce\xbf\x17\xdeu\xce\x00+\xd1\xbf\xca\xd2G\x13\x01\xe4\xe6?GX\xe2n\x01\x82\xce\xbf\xee* \xc4\x00O\xd0\xbf\xca\xd2G\x13\x01\xe4\xe6?5\xad\x1cs\x01\xdc\xce\xbfGX\xe2n\x01\x82\xce\xbf|\x92s\x16\x81\'\xe7?5\xad\x1cs\x01\xdc\xce\xbf\xe1Fq^\x01$\xcd\xbfA\xfdd\x15\x01\x11\xe7?5\xad\x1cs\x01\xdc\xce\xbf\xa0\x8b\x8bE\x01\x12\xcb\xbf|\x92s\x16\x81\'\xe7?\xacE k\x012\xce\xbf\xc4\xe1\x16=\x01^\xca\xbf|\x92s\x16\x81\'\xe7?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\x0b\x8e-,\x01\xf6\xc8\xbf\xf3\xbc\x90\x18\x81T\xe7?\x11W\x91{\x01\x90\xcf\xbf\xb8\'\x82\x17\x01>\xc7\xbf\xb8\'\x82\x17\x01>\xe7?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\xca\xd2G\x13\x01\xe4\xc6\xbf\xf3\xbc\x90\x18\x81T\xe7?eU=\xc6\x00|\xd0\xbf\xca\xd2G\x13\x01\xe4\xc6\xbf\xf3\xbc\x90\x18\x81T\xe7?\xee* \xc4\x00O\xd0\xbf\xdc}\r\x0f\x01\x8a\xc6\xbfj\xe7\xad\x1a\x81\x81\xe7?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\xed(\xd3\n\x010\xc6\xbfj\xe7\xad\x1a\x81\x81\xe7?eU=\xc6\x00|\xd0\xbf\xed(\xd3\n\x010\xc6\xbfj\xe7\xad\x1a\x81\x81\xe7?\xb2^\x1e\xc8\x00\xa4\xd0\xbfe\xc1\xd6\x02\x01\x86\xc5\xbf\x11l\x9e\x1b\x81\x95\xe7?\xa0\xb3X\xcc\x00\xfe\xd0\xbf\x88\x17b\xfa\x00\xd2\xc4\xbfM\x01\xad\x1c\x01\xac\xe7?\x17\xdeu\xce\x00+\xd1\xbf\x9a\xc2\'\xf6\x00x\xc4\xbfM\x01\xad\x1c\x01\xac\xe7?\x17\xdeu\xce\x00+\xd1\xbf\xd0\xc3x\xe9\x00j\xc3\xbfM\x01\xad\x1c\x01\xac\xe7?\x8e\x08\x93\xd0\x00X\xd1\xbfG\\|\xe1\x00\xc0\xc2\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?\x053\xb0\xd2\x00\x85\xd1\xbfY\x07B\xdd\x00f\xc2\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?\xf4\x87\xea\xd6\x00\xdf\xd1\xbf|]\xcd\xd4\x00\xb2\xc1\xbf\xff\xc0\xd8\x1f\x81\xef\xe7?k\xb2\x07\xd9\x00\x0c\xd2\xbf\x8e\x08\x93\xd0\x00X\xc1\xbfv\xeb\xf5!\x81\x1c\xe8?/\xe6\x05\xdd\x00a\xd2\xbf\xc4\t\xe4\xc3\x00J\xc0\xbf\xc4+\xca\x1e\x01\xd9\xe7?\xa6\x10#\xdf\x00\x8e\xd2\xbf\xc4\t\xe4\xc3\x00J\xc0\xbf\xff\xc0\xd8\x1f\x81\xef\xe7?\xa6\x10#\xdf\x00\x8e\xd2\xbfvD\xcfw\x01@\xbf\xbf;V\xe7 \x01\x06\xe8?\xa6\x10#\xdf\x00\x8e\xd2\xbf\x9a\x9aZo\x01\x8c\xbe\xbf;V\xe7 \x01\x06\xe8?\x1d;@\xe1\x00\xbb\xd2\xbf\x9a\x9aZo\x01\x8c\xbe\xbf;V\xe7 \x01\x06\xe8?\x0b\x90z\xe5\x00\x15\xd3\xbf\x05\x9d\xfcU\x01p\xbc\xbf;V\xe7 \x01\x06\xe8?\x82\xba\x97\xe7\x00B\xd3\xbfMI\x13E\x01\x08\xbb\xbf\xb2\x80\x04#\x013\xe8?\xf9\xe4\xb4\xe9\x00o\xd3\xbfMI\x13E\x01\x08\xbb\xbfv\xeb\xf5!\x81\x1c\xe8?\x82\xba\x97\xe7\x00B\xd3\xbf;z\x1a5\x01\xb4\xb9\xbfv\xeb\xf5!\x81\x1c\xe8?\xacm\xed\xf1\x00\x1e\xd4\xbf\xca\xd2G\x13\x01\xe4\xb6\xbfv\xeb\xf5!\x81\x1c\xe8?\x9a\xc2\'\xf6\x00x\xd4\xbf\xed(\xd3\n\x010\xb6\xbfY\x05\xf5#\x01G\xe8?\xd6 C\xfc\x00\xfa\xd4\xbf\x11\x7f^\x02\x01|\xb5\xbfY\x05\xf5#\x01G\xe8?\xc4u}\x00\x01T\xd5\xbf5\xd5\xe9\xf9\x00\xc8\xb4\xbfY\x05\xf5#\x01G\xe8?)\xf5\xd4\x06\x01\xdb\xd5\xbf\xca\xd2G\x13\x01\xe4\xb6\xbf\x94\x9a\x03%\x81]\xe8?\xb2\xca\xb7\x04\x01\xae\xd5\xbf\x11\x7f^\x02\x01|\xb5\xbf\x94\x9a\x03%\x81]\xe8?;\xa0\x9a\x02\x01\x81\xd5\xbf\xff\xafe\xf2\x00(\xb4\xbfY\x05\xf5#\x01G\xe8?\xb2\xca\xb7\x04\x01\xae\xd5\xbf\xff\xafe\xf2\x00(\xb4\xbf\xd0/\x12&\x01t\xe8?\xa0\x1f\xf2\x08\x01\x08\xd6\xbfG\\|\xe1\x00\xc0\xb2\xbf\x0b\xc5 \'\x81\x8a\xe8?\xca\xd2G\x13\x01\xe4\xd6\xbfG\\|\xe1\x00\xc0\xb2\xbfGZ/(\x01\xa1\xe8?A\xfdd\x15\x01\x11\xd7\xbf\xaciS\x7f\x01\xe0\xaf\xbf\xd0/\x12&\x01t\xe8?A\xfdd\x15\x01\x11\xd7\xbf;\xc2\x80]\x01\x10\xad\xbf\x94\x9a\x03%\x81]\xe8?\xa6|\xbc\x1b\x01\x98\xd7\xbf\x17$\x8f=\x01h\xaa\xbf\x0b\xc5 \'\x81\x8a\xe8?Y\x05\xf5#\x01G\xd8\xbf|\x81\x00\xe9\x00`\xa3\xbfGZ/(\x01\xa1\xe8?\xbe\x84L*\x01\xce\xd8\xbf|\x81\x00\xe9\x00`\xa3\xbfGZ/(\x01\xa1\xe8?\xe77\xa24\x01\xaa\xd9\xbf\xc4-\x17\xd8\x00\xf8\xa1\xbfGZ/(\x01\xa1\xe8?M\xb7\xf9:\x011\xda\xbf|\x81\x00\xe9\x00`\xa3\xbf\x0b\xc5 \'\x81\x8a\xe8?\xb26QA\x01\xb8\xda\xbf5\xd5\xe9\xf9\x00\xc8\xa4\xbf\x82\xef=)\x81\xb7\xe8?\xff?2C\x01\xe0\xda\xbf|\x81\x00\xe9\x00`\xa3\xbf\xbe\x84L*\x01\xce\xe8?vjOE\x01\r\xdb\xbf|\x81\x00\xe9\x00`\xa3\xbf\x82\xef=)\x81\xb7\xe8?\xed\x94lG\x01:\xdb\xbf\xed(\xd3\n\x010\xa6\xbfGZ/(\x01\xa1\xe8?d\xbf\x89I\x01g\xdb\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\x82\xef=)\x81\xb7\xe8?Ai\xfeQ\x01\x1b\xdc\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\x82\xef=)\x81\xb7\xe8?\x8er\xdfS\x01C\xdc\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\xbe\x84L*\x01\xce\xe8?\xf3\xf16Z\x01\xca\xdc\xbf\xd0wxN\x01\xd0\x9b\xbf\xf9\x19[+\x81\xe4\xe8?j\x1cT\\\x01\xf7\xdc\xbf\xd0wxN\x01\xd0\x9b\xbf\xf9\x19[+\x81\xe4\xe8?\xcf\x9b\xabb\x01~\xdd\xbf^\xd0\xa5,\x01\x00\x99\xbf\x82\xef=)\x81\xb7\xe8?\x0b\xfa\xc6h\x01\x00\xde\xbf\xed(\xd3\n\x010\x96\xbf\xbe\x84L*\x01\xce\xe8?\xd5\xf8uu\x01\x0e\xdf\xbf\xd0wxN\x01\xd0\x9b\xbf\xbe\x84L*\x01\xce\xe8?\x11W\x91{\x01\x90\xdf\xbfA\x1fKp\x01\xa0\x9e\xbf\xf9\x19[+\x81\xe4\xe8?\xff\xab\xcb\x7f\x01\xea\xdf\xbfA\x1fKp\x01\xa0\x9e\xbf\x82\xef=)\x81\xb7\xe8?\xff\xab\xcb\x7f\x01\xea\xdf\xbfA\x1fKp\x01\xa0\x9e\xbf\xbe\x84L*\x01\xce\xe8?\xff\xab\xcb\x7f\x01\xea\xdf\xbfA\x1fKp\x01\xa0\x9e\xbf\xf9\x19[+\x81\xe4\xe8?w\x00\x03\xc2\x00"\xe0\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\xbe\x84L*\x01\xce\xe8?\x94\xaf\x10\xc5\x00c\xe0\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\xbe\x84L*\x01\xce\xe8?\x0b\xda-\xc7\x00\x90\xe0\xbf|\x81\x00\xe9\x00`\xa3\xbf\xbe\x84L*\x01\xce\xe8?\x82\x04K\xc9\x00\xbd\xe0\xbf5\xd5\xe9\xf9\x00\xc8\xa4\xbf\x82\xef=)\x81\xb7\xe8?5\xc4v\xcc\x80\x00\xe1\xbf\xa6|\xbc\x1b\x01\x98\xa7\xbf\xf9\x19[+\x81\xe4\xe8?\x8e\x08\x93\xd0\x00X\xe1\xbf\xd0wxN\x01\xd0\xab\xbf\xbe\x84L*\x01\xce\xe8?\x053\xb0\xd2\x00\x85\xe1\xbf\xf3\x15jn\x01x\xae\xbf\xbe\x84L*\x01\xce\xe8?|]\xcd\xd4\x00\xb2\xe1\xbf\xaciS\x7f\x01\xe0\xaf\xbf\x82\xef=)\x81\xb7\xe8?\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf\xb2^\x1e\xc8\x00\xa4\xb0\xbf\xbe\x84L*\x01\xce\xe8?\x117\xf8\xd9\x00 \xe2\xbf\xaciS\x7f\x01\xe0\xaf\xbf\xf9\x19[+\x81\xe4\xe8?M\xcc\x06\xdb\x806\xe2\xbf;\xc2\x80]\x01\x10\xad\xbf\x82\xef=)\x81\xb7\xe8?\x88a\x15\xdc\x00M\xe2\xbf^\xd0\xa5,\x01\x00\xa9\xbf\x82\xef=)\x81\xb7\xe8?\x88a\x15\xdc\x00M\xe2\xbf\xc4-\x17\xd8\x00\xf8\xa1\xbf\x0b\xc5 \'\x81\x8a\xe8?\xc4\xf6#\xdd\x80c\xe2\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\xd0/\x12&\x01t\xe8?\xc4\xf6#\xdd\x80c\xe2\xbf|\x81\x00\xe9\x00`\x93\xbf\x0b\xc5 \'\x81\x8a\xe8?Y\xd0N\xe2\x80\xd1\xe2\xbf\xed(\xd3\n\x010\x96\xbf\xd0/\x12&\x01t\xe8?\x0b\x90z\xe5\x00\x15\xe3\xbf5e\xb6J\x01\x80\x8b\xbf\x94\x9a\x03%\x81]\xe8?\xee\xa9y\xe7\x80?\xe3\xbf|\x81\x00\xe9\x00`\x93\xbf\x94\x9a\x03%\x81]\xe8?\xa0i\xa5\xea\x00\x83\xe3\xbf\xed(\xd3\n\x010\x96\xbf\xd0/\x12&\x01t\xe8?\xdc\xfe\xb3\xeb\x80\x99\xe3\xbf\xd0wxN\x01\xd0\x9b\xbf\xd0/\x12&\x01t\xe8?\x8e\xbe\xdf\xee\x00\xdd\xe3\xbfA\x1fKp\x01\xa0\x9e\xbfY\x05\xf5#\x01G\xe8?5C\xd0\xef\x00\xf1\xe3\xbf|\x81\x00\xe9\x00`\xa3\xbf\xd0/\x12&\x01t\xe8?5C\xd0\xef\x00\xf1\xe3\xbf\xed(\xd3\n\x010\xa6\xbfY\x05\xf5#\x01G\xe8?5C\xd0\xef\x00\xf1\xe3\xbf\xc4-\x17\xd8\x00\xf8\xa1\xbf\x94\x9a\x03%\x81]\xe8?q\xd8\xde\xf0\x80\x07\xe4\xbf5\xd5\xe9\xf9\x00\xc8\xa4\xbfY\x05\xf5#\x01G\xe8?#\x98\n\xf4\x00K\xe4\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\xd0/\x12&\x01t\xe8?\x9a\xc2\'\xf6\x00x\xe4\xbfA\x1fKp\x01\xa0\x9e\xbfY\x05\xf5#\x01G\xe8?\xf3\x06D\xfa\x80\xcf\xe4\xbf\xc4-\x17\xd8\x00\xf8\xa1\xbf\xb2\x80\x04#\x013\xe8?\xa6\xc6o\xfd\x00\x13\xe5\xbf5\xd5\xe9\xf9\x00\xc8\xa4\xbfv\xeb\xf5!\x81\x1c\xe8?Y\x86\x9b\x00\x81V\xe5\xbf5\xd5\xe9\xf9\x00\xc8\xa4\xbf\xb2\x80\x04#\x013\xe8?\xe2[~\xfe\x80)\xe5\xbf;\xc2\x80]\x01\x10\xad\xbf\x94\x9a\x03%\x81]\xe8?;\xa0\x9a\x02\x01\x81\xe5\xbfG\\|\xe1\x00\xc0\xb2\xbf\x94\x9a\x03%\x81]\xe8?;\xa0\x9a\x02\x01\x81\xe5\xbf\xed(\xd3\n\x010\xb6\xbf\xb2\x80\x04#\x013\xe8?)\xf5\xd4\x06\x01\xdb\xe5\xbfp\x9f\x9e<\x01T\xba\xbf\xd0/\x12&\x01t\xe8?e\x8a\xe3\x07\x81\xf1\xe5\xbf\x05\x9d\xfcU\x01p\xbc\xbfY\x05\xf5#\x01G\xe8?G\xa4\xe2\t\x01\x1c\xe6\xbf\x9a\x9aZo\x01\x8c\xbe\xbfY\x05\xf5#\x01G\xe8?G\xa4\xe2\t\x01\x1c\xe6\xbf\xaciS\x7f\x01\xe0\xbf\xbf\x94\x9a\x03%\x81]\xe8?e\x8a\xe3\x07\x81\xf1\xe5\xbf\x9a\x9aZo\x01\x8c\xbe\xbf\xb2\x80\x04#\x013\xe8?\x829\xf1\n\x812\xe6\xbf\xaciS\x7f\x01\xe0\xbf\xbfY\x05\xf5#\x01G\xe8?\xf9c\x0e\r\x81_\xe6\xbf\xbe\xf0\xe5f\x01\xd8\xbd\xbf\x94\x9a\x03%\x81]\xe8?\xac#:\x10\x01\xa3\xe6\xbf\xaciS\x7f\x01\xe0\xbf\xbf;V\xe7 \x01\x06\xe8?\xe7\xb8H\x11\x81\xb9\xe6\xbf\xa0\xb3X\xcc\x00\xfe\xc0\xbf\xb2\x80\x04#\x013\xe8?A\xfdd\x15\x01\x11\xe7\xbf\xa0\xb3X\xcc\x00\xfe\xc0\xbfv\xeb\xf5!\x81\x1c\xe8?|\x92s\x16\x81\'\xe7\xbfk\xb2\x07\xd9\x00\x0c\xc2\xbfv\xeb\xf5!\x81\x1c\xe8?\xca\xd2G\x13\x01\xe4\xe6\xbf\xd0\xc3x\xe9\x00j\xc3\xbf;V\xe7 \x01\x06\xe8?\xb8\'\x82\x17\x01>\xe7\xbfvl\x9c\xfe\x00,\xc5\xbf\xff\xc0\xd8\x1f\x81\xef\xe7?\xf3\xbc\x90\x18\x81T\xe7\xbf\xed(\xd3\n\x010\xc6\xbf;V\xe7 \x01\x06\xe8?/R\x9f\x19\x01k\xe7\xbf\xca\xd2G\x13\x01\xe4\xc6\xbfv\xeb\xf5!\x81\x1c\xe8?M\x01\xad\x1c\x01\xac\xe7\xbf\xb8\'\x82\x17\x01>\xc7\xbf;V\xe7 \x01\x06\xe8?\x88\x96\xbb\x1d\x81\xc2\xe7\xbf\x94\xd1\xf6\x1f\x01\xf2\xc7\xbf\xff\xc0\xd8\x1f\x81\xef\xe7?M\x01\xad\x1c\x01\xac\xe7\xbf\x82&1$\x01L\xc8\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?\x11l\x9e\x1b\x81\x95\xe7\xbf\x82&1$\x01L\xc8\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?\x11l\x9e\x1b\x81\x95\xe7\xbf\x82&1$\x01L\xc8\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?M\x01\xad\x1c\x01\xac\xe7\xbf\x82&1$\x01L\xc8\xbf\xc4+\xca\x1e\x01\xd9\xe7?\xc4+\xca\x1e\x01\xd9\xe7\xbf\x0b\x8e-,\x01\xf6\xc8\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?\xff\xc0\xd8\x1f\x81\xef\xe7\xbf\xe77\xa24\x01\xaa\xc9\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?Y\x05\xf5#\x01G\xe8\xbf\xc4\xe1\x16=\x01^\xca\xbfM\x01\xad\x1c\x01\xac\xe7?v\xeb\xf5!\x81\x1c\xe8\xbf\x8e\xe0\xc5I\x01l\xcb\xbf\x11l\x9e\x1b\x81\x95\xe7?;V\xe7 \x01\x06\xe8\xbf\x05\x9d\xfcU\x01p\xcc\xbf\x11l\x9e\x1b\x81\x95\xe7?Y\x05\xf5#\x01G\xe8\xbf\xcf\x9b\xabb\x01~\xcd\xbfj\xe7\xad\x1a\x81\x81\xe7?Y\x05\xf5#\x01G\xe8\xbfGX\xe2n\x01\x82\xce\xbfj\xe7\xad\x1a\x81\x81\xe7?\x94\x9a\x03%\x81]\xe8\xbf#\x02Ww\x016\xcf\xbf/R\x9f\x19\x01k\xe7?\xd0/\x12&\x01t\xe8\xbfw\x00\x03\xc2\x00"\xd0\xbf\xb8\'\x82\x17\x01>\xe7?\x82\xef=)\x81\xb7\xe8\xbf)\x89;\xca\x00\xd1\xd0\xbf\xb8\'\x82\x17\x01>\xe7?\xbe\x84L*\x01\xce\xe8\xbf\x053\xb0\xd2\x00\x85\xd1\xbf|\x92s\x16\x81\'\xe7?\xf9\x19[+\x81\xe4\xe8\xbf/\xe6\x05\xdd\x00a\xd2\xbfA\xfdd\x15\x01\x11\xe7?\x82\xef=)\x81\xb7\xe8\xbf\xa6\x10#\xdf\x00\x8e\xd2\xbfA\xfdd\x15\x01\x11\xe7?GZ/(\x01\xa1\xe8\xbf\xf9\xe4\xb4\xe9\x00o\xd3\xbfA\xfdd\x15\x01\x11\xe7?\x82\xef=)\x81\xb7\xe8\xbfG\xee\x95\xeb\x00\x97\xd3\xbf\x05hV\x14\x81\xfa\xe6?\x82\xef=)\x81\xb7\xe8\xbf\xacm\xed\xf1\x00\x1e\xd4\xbf\x05hV\x14\x81\xfa\xe6?\x82\xef=)\x81\xb7\xe8\xbf\xbe\x18\xb3\xed\x00\xc4\xd3\xbf\x05hV\x14\x81\xfa\xe6?\xbe\x84L*\x01\xce\xe8\xbf\xbe\x18\xb3\xed\x00\xc4\xd3\xbf\xca\xd2G\x13\x01\xe4\xe6?\x82\xef=)\x81\xb7\xe8\xbf\xacm\xed\xf1\x00\x1e\xd4\xbf\x8e=9\x12\x81\xcd\xe6?\xf9\x19[+\x81\xe4\xe8\xbf\xbe\x18\xb3\xed\x00\xc4\xd3\xbf\x8e=9\x12\x81\xcd\xe6?\xbe\x84L*\x01\xce\xe8\xbf5C\xd0\xef\x00\xf1\xd3\xbf\x8e=9\x12\x81\xcd\xe6?\xa0\x9eK,\x81\xf8\xe8\xbf\xbe\x18\xb3\xed\x00\xc4\xd3\xbf\x8e=9\x12\x81\xcd\xe6?\xdc3Z-\x01\x0f\xe9\xbf\x11\xedD\xf8\x00\xa5\xd4\xbf\xe7\xb8H\x11\x81\xb9\xe6?\x8e\xf3\x850\x81R\xe9\xbf\x11\xedD\xf8\x00\xa5\xd4\xbf\xe7\xb8H\x11\x81\xb9\xe6?\x8e\xf3\x850\x81R\xe9\xbf\xd6 C\xfc\x00\xfa\xd4\xbfp\x8e+\x0f\x81\x8c\xe6?\xa0\x9eK,\x81\xf8\xe8\xbfMK`\xfe\x00\'\xd5\xbf\xac#:\x10\x01\xa3\xe6?\xdc3Z-\x01\x0f\xe9\xbf\xc4u}\x00\x01T\xd5\xbf\xac#:\x10\x01\xa3\xe6?\x17\xc9h.\x81%\xe9\xbfMK`\xfe\x00\'\xd5\xbf\xe7\xb8H\x11\x81\xb9\xe6?\x17\xc9h.\x81%\xe9\xbfMK`\xfe\x00\'\xd5\xbf\xe7\xb8H\x11\x81\xb9\xe6?\xa0\x9eK,\x81\xf8\xe8\xbfMK`\xfe\x00\'\xd5\xbfp\x8e+\x0f\x81\x8c\xe6?\xdc3Z-\x01\x0f\xe9\xbf\x88\x17b\xfa\x00\xd2\xd4\xbf\x8e=9\x12\x81\xcd\xe6?\xbe\x84L*\x01\xce\xe8\xbf\xc4u}\x00\x01T\xd5\xbfp\x8e+\x0f\x81\x8c\xe6?\xbe\x84L*\x01\xce\xe8\xbf\xc4u}\x00\x01T\xd5\xbf\xe7\xb8H\x11\x81\xb9\xe6?\x82\xef=)\x81\xb7\xe8\xbf\xb2\xca\xb7\x04\x01\xae\xd5\xbfp\x8e+\x0f\x81\x8c\xe6?\xf9\x19[+\x81\xe4\xe8\xbf\xa0\x1f\xf2\x08\x01\x08\xd6\xbfp\x8e+\x0f\x81\x8c\xe6?\xf9\x19[+\x81\xe4\xe8\xbfA\xfdd\x15\x01\x11\xd7\xbf\xf9c\x0e\r\x81_\xe6?\xa0\x9eK,\x81\xf8\xe8\xbf\xb8\'\x82\x17\x01>\xd7\xbfp\x8e+\x0f\x81\x8c\xe6?\xf9\x19[+\x81\xe4\xe8\xbf/R\x9f\x19\x01k\xd7\xbf5\xf9\x1c\x0e\x01v\xe6?\xf9\x19[+\x81\xe4\xe8\xbf\xd0/\x12&\x01t\xd8\xbfp\x8e+\x0f\x81\x8c\xe6?GZ/(\x01\xa1\xe8\xbf\xd0/\x12&\x01t\xd8\xbf\xf9c\x0e\r\x81_\xe6?\x0b\xc5 \'\x81\x8a\xe8\xbf\xbe\x84L*\x01\xce\xd8\xbf5\xf9\x1c\x0e\x01v\xe6?\xbe\x84L*\x01\xce\xe8\xbfGZ/(\x01\xa1\xd8\xbf\xf9c\x0e\r\x81_\xe6?\x82\xef=)\x81\xb7\xe8\xbfY\x05\xf5#\x01G\xd8\xbf\x829\xf1\n\x812\xe6?GZ/(\x01\xa1\xe8\xbf\xbe\x84L*\x01\xce\xd8\xbfG\xa4\xe2\t\x01\x1c\xe6?\x82\xef=)\x81\xb7\xe8\xbfY\x05\xf5#\x01G\xd8\xbf\xbe\xce\xff\x0b\x01I\xe6?GZ/(\x01\xa1\xe8\xbfY\x05\xf5#\x01G\xd8\xbf\xbe\xce\xff\x0b\x01I\xe6?GZ/(\x01\xa1\xe8\xbf5\xafi,\x01\xfb\xd8\xbf\xbe\xce\xff\x0b\x01I\xe6?\x0b\xc5 \'\x81\x8a\xe8\xbf5\xafi,\x01\xfb\xd8\xbfG\xa4\xe2\t\x01\x1c\xe6?\x94\x9a\x03%\x81]\xe8\xbfM\xb7\xf9:\x011\xda\xbfG\xa4\xe2\t\x01\x1c\xe6?\x0b\xc5 \'\x81\x8a\xe8\xbf\xd6\x8c\xdc8\x01\x04\xda\xbfG\xa4\xe2\t\x01\x1c\xe6?\xd0/\x12&\x01t\xe8\xbf\xff?2C\x01\xe0\xda\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\x94\x9a\x03%\x81]\xe8\xbfvjOE\x01\r\xdb\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?v\xeb\xf5!\x81\x1c\xe8\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbfG\xa4\xe2\t\x01\x1c\xe6?Y\x05\xf5#\x01G\xe8\xbfS\x14\xc4M\x01\xc1\xdb\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?;V\xe7 \x01\x06\xe8\xbfAi\xfeQ\x01\x1b\xdc\xbfe\x8a\xe3\x07\x81\xf1\xe5?;V\xe7 \x01\x06\xe8\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?;V\xe7 \x01\x06\xe8\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?;V\xe7 \x01\x06\xe8\xbfS\x14\xc4M\x01\xc1\xdb\xbfe\x8a\xe3\x07\x81\xf1\xe5?;V\xe7 \x01\x06\xe8\xbf\xca>\xe1O\x01\xee\xdb\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x88\x96\xbb\x1d\x81\xc2\xe7\xbfS\x14\xc4M\x01\xc1\xdb\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xc4+\xca\x1e\x01\xd9\xe7\xbf\xca>\xe1O\x01\xee\xdb\xbf)\xf5\xd4\x06\x01\xdb\xe5?;V\xe7 \x01\x06\xe8\xbf\x05\x9d\xfcU\x01p\xdc\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xc4+\xca\x1e\x01\xd9\xe7\xbfj\x1cT\\\x01\xf7\xdc\xbf)\xf5\xd4\x06\x01\xdb\xe5?\x88\x96\xbb\x1d\x81\xc2\xe7\xbf\xe1Fq^\x01$\xdd\xbfv5\xa9\x03\x81\x97\xe5?M\x01\xad\x1c\x01\xac\xe7\xbf\x94\xcf\xa9f\x01\xd3\xdd\xbf;\xa0\x9a\x02\x01\x81\xe5?\x88\x96\xbb\x1d\x81\xc2\xe7\xbf^\xceXs\x01\xe1\xde\xbfv5\xa9\x03\x81\x97\xe5?\x88\x96\xbb\x1d\x81\xc2\xe7\xbf\x82$\xe4j\x01-\xde\xbfv5\xa9\x03\x81\x97\xe5?\x11l\x9e\x1b\x81\x95\xe7\xbf\xe7\xa3;q\x01\xb4\xde\xbf;\xa0\x9a\x02\x01\x81\xe5?/R\x9f\x19\x01k\xe7\xbfpy\x1eo\x01\x87\xde\xbf\xff\n\x8c\x01\x81j\xe5?\x11l\x9e\x1b\x81\x95\xe7\xbf\x82$\xe4j\x01-\xde\xbfv5\xa9\x03\x81\x97\xe5?/R\x9f\x19\x01k\xe7\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf\xff\n\x8c\x01\x81j\xe5?\xf3\xbc\x90\x18\x81T\xe7\xbf\xe7\xa3;q\x01\xb4\xde\xbf;\xa0\x9a\x02\x01\x81\xe5?|\x92s\x16\x81\'\xe7\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf\x1d\xf1\x8c\xff\x00@\xe5?\xb8\'\x82\x17\x01>\xe7\xbf^\xceXs\x01\xe1\xde\xbf\xff\n\x8c\x01\x81j\xe5?A\xfdd\x15\x01\x11\xe7\xbf^\xceXs\x01\xe1\xde\xbf\x1d\xf1\x8c\xff\x00@\xe5?A\xfdd\x15\x01\x11\xe7\xbf\x11W\x91{\x01\x90\xdf\xbfY\x86\x9b\x00\x81V\xe5?\xe7\xb8H\x11\x81\xb9\xe6\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\x1d\xf1\x8c\xff\x00@\xe5?\xca\xd2G\x13\x01\xe4\xe6\xbf\xb2\x95\x11\xc3\x808\xe0\xbfk1a\xfc\x80\xfc\xe4?\xe7\xb8H\x11\x81\xb9\xe6\xbf\xb2\x95\x11\xc3\x808\xe0\xbf\xe2[~\xfe\x80)\xe5?\xac#:\x10\x01\xa3\xe6\xbf\xd0D\x1f\xc6\x80y\xe0\xbf\xe2[~\xfe\x80)\xe5?\xac#:\x10\x01\xa3\xe6\xbf\x0b\xda-\xc7\x00\x90\xe0\xbfk1a\xfc\x80\xfc\xe4?\xac#:\x10\x01\xa3\xe6\xbf\x82\x04K\xc9\x00\xbd\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?\xbe\xce\xff\x0b\x01I\xe6\xbf\x82\x04K\xc9\x00\xbd\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?\xf9c\x0e\r\x81_\xe6\xbf\xd0D\x1f\xc6\x80y\xe0\xbfk1a\xfc\x80\xfc\xe4?\xbe\xce\xff\x0b\x01I\xe6\xbf\x94\xaf\x10\xc5\x00c\xe0\xbfk1a\xfc\x80\xfc\xe4?e\x8a\xe3\x07\x81\xf1\xe5\xbf\x94\xaf\x10\xc5\x00c\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?\x829\xf1\n\x812\xe6\xbf\xb2\x95\x11\xc3\x808\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?\xa0\x1f\xf2\x08\x01\x08\xe6\xbfY\x1a\x02\xc4\x80L\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?\xed_\xc6\x05\x81\xc4\xe5\xbf\xb2\x95\x11\xc3\x808\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?v5\xa9\x03\x81\x97\xe5\xbf\xb2\x95\x11\xc3\x808\xe0\xbf\xe2[~\xfe\x80)\xe5?;\xa0\x9a\x02\x01\x81\xe5\xbf\xd0D\x1f\xc6\x80y\xe0\xbfk1a\xfc\x80\xfc\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbf\xbe\x99Y\xca\x80\xd3\xe0\xbf/\x9cR\xfb\x00\xe6\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbf\x82\x04K\xc9\x00\xbd\xe0\xbf/\x9cR\xfb\x00\xe6\xe4?\xff\n\x8c\x01\x81j\xe5\xbf\xfa.h\xcb\x00\xea\xe0\xbf\xb8q5\xf9\x00\xb9\xe4?\xff\n\x8c\x01\x81j\xe5\xbf\x17\xdeu\xce\x00+\xe1\xbf\xb8q5\xf9\x00\xb9\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbfSs\x84\xcf\x80A\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?Y\x86\x9b\x00\x81V\xe5\xbf\x17\xdeu\xce\x00+\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbf\x8e\x08\x93\xd0\x00X\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?\xa6\xc6o\xfd\x00\x13\xe5\xbf\x8e\x08\x93\xd0\x00X\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbf\x053\xb0\xd2\x00\x85\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbf\x8e\x08\x93\xd0\x00X\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbf\x8e\x08\x93\xd0\x00X\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?\xf3\x06D\xfa\x80\xcf\xe4\xbf\x8e\x08\x93\xd0\x00X\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?/\x9cR\xfb\x00\xe6\xe4\xbfSs\x84\xcf\x80A\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?\xb8q5\xf9\x00\xb9\xe4\xbf\x053\xb0\xd2\x00\x85\xe1\xbf\xb8q5\xf9\x00\xb9\xe4?\x9a\xc2\'\xf6\x00x\xe4\xbf\xca\x9d\xa1\xd1\x80n\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?#\x98\n\xf4\x00K\xe4\xbfSs\x84\xcf\x80A\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?\xacm\xed\xf1\x00\x1e\xe4\xbf\xca\x9d\xa1\xd1\x80n\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?\xe8\x02\xfc\xf2\x804\xe4\xbf\xdcHg\xcd\x80\x14\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?5C\xd0\xef\x00\xf1\xe3\xbf\xca\x9d\xa1\xd1\x80n\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?q\xd8\xde\xf0\x80\x07\xe4\xbf\x8e\x08\x93\xd0\x00X\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?5C\xd0\xef\x00\xf1\xe3\xbf\x053\xb0\xd2\x00\x85\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?\x17\x94\xc2\xec\x00\xb0\xe3\xbf\x053\xb0\xd2\x00\x85\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?5C\xd0\xef\x00\xf1\xe3\xbfA\xc8\xbe\xd3\x80\x9b\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?5C\xd0\xef\x00\xf1\xe3\xbfA\xc8\xbe\xd3\x80\x9b\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?S)\xd1\xed\x80\xc6\xe3\xbf|]\xcd\xd4\x00\xb2\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?\xdc\xfe\xb3\xeb\x80\x99\xe3\xbf|]\xcd\xd4\x00\xb2\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?e\xd4\x96\xe9\x80l\xe3\xbf_w\xcc\xd6\x80\xdc\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?\xee\xa9y\xe7\x80?\xe3\xbf_w\xcc\xd6\x80\xdc\xe1\xbf_-\x19\xf5\x80a\xe4?G%\x89\xe6\x80+\xe3\xbf_w\xcc\xd6\x80\xdc\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?Y\xd0N\xe2\x80\xd1\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\xd6W6\xf7\x80\x8e\xe4?\x1d;@\xe1\x00\xbb\xe2\xbf\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?\x94e]\xe3\x00\xe8\xe2\xbf\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?\xe2\xa51\xe0\x80\xa4\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\x9a\xc2\'\xf6\x00x\xe4?\xc4\xf6#\xdd\x80c\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf_-\x19\xf5\x80a\xe4?\xc4\xf6#\xdd\x80c\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\xd6W6\xf7\x80\x8e\xe4?k{\x14\xde\x80w\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\x9a\xc2\'\xf6\x00x\xe4?k{\x14\xde\x80w\xe2\xbf\xd6\xa1\xe9\xd8\x80\t\xe2\xbf\xd6W6\xf7\x80\x8e\xe4?\xe2\xa51\xe0\x80\xa4\xe2\xbfM\xcc\x06\xdb\x806\xe2\xbf\x9a\xc2\'\xf6\x00x\xe4?\x1d;@\xe1\x00\xbb\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\xd6W6\xf7\x80\x8e\xe4?k{\x14\xde\x80w\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf_-\x19\xf5\x80a\xe4?\x88a\x15\xdc\x00M\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\xd6W6\xf7\x80\x8e\xe4?\x88a\x15\xdc\x00M\xe2\xbf\xd6\xa1\xe9\xd8\x80\t\xe2\xbf\xd6W6\xf7\x80\x8e\xe4?\x117\xf8\xd9\x00 \xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\xd6W6\xf7\x80\x8e\xe4?\x117\xf8\xd9\x00 \xe2\xbf\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf\xf3\x06D\xfa\x80\xcf\xe4?_w\xcc\xd6\x80\xdc\xe1\xbf|]\xcd\xd4\x00\xb2\xe1\xbfk1a\xfc\x80\xfc\xe4?|]\xcd\xd4\x00\xb2\xe1\xbf\xca\x9d\xa1\xd1\x80n\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?_w\xcc\xd6\x80\xdc\xe1\xbf\xca\x9d\xa1\xd1\x80n\xe1\xbf\xf3\x06D\xfa\x80\xcf\xe4?A\xc8\xbe\xd3\x80\x9b\xe1\xbfSs\x84\xcf\x80A\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?\x053\xb0\xd2\x00\x85\xe1\xbfSs\x84\xcf\x80A\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?A\xc8\xbe\xd3\x80\x9b\xe1\xbf\x053\xb0\xd2\x00\x85\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?\x053\xb0\xd2\x00\x85\xe1\xbf\x053\xb0\xd2\x00\x85\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?\x053\xb0\xd2\x00\x85\xe1\xbf#\xe2\xbd\xd5\x00\xc6\xe1\xbf\xf3\x06D\xfa\x80\xcf\xe4?\xca\x9d\xa1\xd1\x80n\xe1\xbf#\xe2\xbd\xd5\x00\xc6\xe1\xbf\xb8q5\xf9\x00\xb9\xe4?\x17\xdeu\xce\x00+\xe1\xbf\x117\xf8\xd9\x00 \xe2\xbf|\xdc&\xf8\x80\xa2\xe4?5\xc4v\xcc\x80\x00\xe1\xbf\x88a\x15\xdc\x00M\xe2\xbf\x9a\xc2\'\xf6\x00x\xe4?\xfa.h\xcb\x00\xea\xe0\xbf\xd6\xa1\xe9\xd8\x80\t\xe2\xbf_-\x19\xf5\x80a\xe4?\x82\x04K\xc9\x00\xbd\xe0\xbfM\xcc\x06\xdb\x806\xe2\xbf|\xdc&\xf8\x80\xa2\xe4?\x82\x04K\xc9\x00\xbd\xe0\xbfM\xcc\x06\xdb\x806\xe2\xbf|\xdc&\xf8\x80\xa2\xe4?\x0b\xda-\xc7\x00\x90\xe0\xbf\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf\xb8q5\xf9\x00\xb9\xe4?Y\x1a\x02\xc4\x80L\xe0\xbf|]\xcd\xd4\x00\xb2\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?\xb2\x95\x11\xc3\x808\xe0\xbf\xca\x9d\xa1\xd1\x80n\xe1\xbfk1a\xfc\x80\xfc\xe4?w\x00\x03\xc2\x00"\xe0\xbf\x17\xdeu\xce\x00+\xe1\xbfk1a\xfc\x80\xfc\xe4?\x88\x81\xae}\x01\xbd\xdf\xbf\xdcHg\xcd\x80\x14\xe1\xbf\xe2[~\xfe\x80)\xe5?#\x02Ww\x016\xdf\xbf5\xc4v\xcc\x80\x00\xe1\xbf\xe2[~\xfe\x80)\xe5?\xd5\xf8uu\x01\x0e\xdf\xbf\x82\x04K\xc9\x00\xbd\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?^\xceXs\x01\xe1\xde\xbf\x82\x04K\xc9\x00\xbd\xe0\xbfY\x86\x9b\x00\x81V\xe5?\xd5\xf8uu\x01\x0e\xdf\xbf\x82\x04K\xc9\x00\xbd\xe0\xbf\x1d\xf1\x8c\xff\x00@\xe5?\xe7\xa3;q\x01\xb4\xde\xbf\xbe\x99Y\xca\x80\xd3\xe0\xbf\x1d\xf1\x8c\xff\x00@\xe5?\xe7\xa3;q\x01\xb4\xde\xbf\xdcHg\xcd\x80\x14\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?py\x1eo\x01\x87\xde\xbf\x17\xdeu\xce\x00+\xe1\xbf\xe2[~\xfe\x80)\xe5?py\x1eo\x01\x87\xde\xbfSs\x84\xcf\x80A\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?\x82$\xe4j\x01-\xde\xbfA\xc8\xbe\xd3\x80\x9b\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?G\xc6\xc8d\x01\xab\xdd\xbf\x053\xb0\xd2\x00\x85\xe1\xbfk1a\xfc\x80\xfc\xe4?\x82$\xe4j\x01-\xde\xbf\x053\xb0\xd2\x00\x85\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?\x0b\xfa\xc6h\x01\x00\xde\xbf\x053\xb0\xd2\x00\x85\xe1\xbf\xf3\x06D\xfa\x80\xcf\xe4?Xq\x8e`\x01Q\xdd\xbfSs\x84\xcf\x80A\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?\xe1Fq^\x01$\xdd\xbf\xdcHg\xcd\x80\x14\xe1\xbfY\x86\x9b\x00\x81V\xe5?j\x1cT\\\x01\xf7\xdc\xbf\x17\xdeu\xce\x00+\xe1\xbf\x1d\xf1\x8c\xff\x00@\xe5?\x05\x9d\xfcU\x01p\xdc\xbfGo<\xc8\x80\xa6\xe0\xbfY\x86\x9b\x00\x81V\xe5?|\xc7\x19X\x01\x9d\xdc\xbf\x0b\xda-\xc7\x00\x90\xe0\xbfY\x86\x9b\x00\x81V\xe5?\x05\x9d\xfcU\x01p\xdc\xbf\x94\xaf\x10\xc5\x00c\xe0\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\x05\x9d\xfcU\x01p\xdc\xbf\x94\xaf\x10\xc5\x00c\xe0\xbf\xff\n\x8c\x01\x81j\xe5?\x8er\xdfS\x01C\xdc\xbfY\x1a\x02\xc4\x80L\xe0\xbf;\xa0\x9a\x02\x01\x81\xe5?\x05\x9d\xfcU\x01p\xdc\xbf\xd0D\x1f\xc6\x80y\xe0\xbfY\x86\x9b\x00\x81V\xe5?\x05\x9d\xfcU\x01p\xdc\xbf\x0b\xda-\xc7\x00\x90\xe0\xbfY\x86\x9b\x00\x81V\xe5?\x8er\xdfS\x01C\xdc\xbf\xfa.h\xcb\x00\xea\xe0\xbfY\x86\x9b\x00\x81V\xe5?Ai\xfeQ\x01\x1b\xdc\xbf5\xc4v\xcc\x80\x00\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?S\x14\xc4M\x01\xc1\xdb\xbfSs\x84\xcf\x80A\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?\x8er\xdfS\x01C\xdc\xbfSs\x84\xcf\x80A\xe1\xbfk1a\xfc\x80\xfc\xe4?\xca>\xe1O\x01\xee\xdb\xbf\x17\xdeu\xce\x00+\xe1\xbfY\x86\x9b\x00\x81V\xe5?S\x14\xc4M\x01\xc1\xdb\xbf\x17\xdeu\xce\x00+\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?S\x14\xc4M\x01\xc1\xdb\xbf5\xc4v\xcc\x80\x00\xe1\xbf\xe2[~\xfe\x80)\xe5?d\xbf\x89I\x01g\xdb\xbf\x0b\xda-\xc7\x00\x90\xe0\xbf\xff\n\x8c\x01\x81j\xe5?\xed\x94lG\x01:\xdb\xbf\xd0D\x1f\xc6\x80y\xe0\xbf;\xa0\x9a\x02\x01\x81\xe5?\xff?2C\x01\xe0\xda\xbfw\x00\x03\xc2\x00"\xe0\xbfv5\xa9\x03\x81\x97\xe5?vjOE\x01\r\xdb\xbf;k\xf4\xc0\x80\x0b\xe0\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xff?2C\x01\xe0\xda\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xc4\xe1\x16=\x01^\xda\xbf\x11W\x91{\x01\x90\xdf\xbf;\xa0\x9a\x02\x01\x81\xe5?M\xb7\xf9:\x011\xda\xbf\x9a,ty\x01c\xdf\xbf\xed_\xc6\x05\x81\xc4\xe5?\xd6\x8c\xdc8\x01\x04\xda\xbf\x88\x81\xae}\x01\xbd\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xe77\xa24\x01\xaa\xd9\xbf\x88\x81\xae}\x01\xbd\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?M\xb7\xf9:\x011\xda\xbf\x88\x81\xae}\x01\xbd\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xc4\xe1\x16=\x01^\xda\xbf;k\xf4\xc0\x80\x0b\xe0\xbf\xb2\xca\xb7\x04\x01\xae\xe5?M\xb7\xf9:\x011\xda\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xe77\xa24\x01\xaa\xd9\xbf;k\xf4\xc0\x80\x0b\xe0\xbfv5\xa9\x03\x81\x97\xe5?\xe77\xa24\x01\xaa\xd9\xbf;k\xf4\xc0\x80\x0b\xe0\xbf\xed_\xc6\x05\x81\xc4\xe5?\xe77\xa24\x01\xaa\xd9\xbfw\x00\x03\xc2\x00"\xe0\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xe77\xa24\x01\xaa\xd9\xbfw\x00\x03\xc2\x00"\xe0\xbfv5\xa9\x03\x81\x97\xe5?\xe77\xa24\x01\xaa\xd9\xbfw\x00\x03\xc2\x00"\xe0\xbfv5\xa9\x03\x81\x97\xe5?p\r\x852\x01}\xd9\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf;\xa0\x9a\x02\x01\x81\xe5?\xf9\xe2g0\x01P\xd9\xbf;k\xf4\xc0\x80\x0b\xe0\xbfv5\xa9\x03\x81\x97\xe5?\xf9\xe2g0\x01P\xd9\xbf\x11W\x91{\x01\x90\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?GZ/(\x01\xa1\xd8\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xed_\xc6\x05\x81\xc4\xe5?GZ/(\x01\xa1\xd8\xbf\xd5\xf8uu\x01\x0e\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xbe\x84L*\x01\xce\xd8\xbf^\xceXs\x01\xe1\xde\xbf\xed_\xc6\x05\x81\xc4\xe5?\xbe\x84L*\x01\xce\xd8\xbf^\xceXs\x01\xe1\xde\xbf\xed_\xc6\x05\x81\xc4\xe5?Y\x05\xf5#\x01G\xd8\xbf\xf9N\x01m\x01Z\xde\xbf\xed_\xc6\x05\x81\xc4\xe5?GZ/(\x01\xa1\xd8\xbf\xe7\xa3;q\x01\xb4\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?Y\x05\xf5#\x01G\xd8\xbf\x94\xcf\xa9f\x01\xd3\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xe2\xda\xd7!\x01\x1a\xd8\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xe2\xda\xd7!\x01\x1a\xd8\xbf\xf9N\x01m\x01Z\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x1d\xa7\xd9\x1d\x01\xc5\xd7\xbf\xf9N\x01m\x01Z\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?Y\x05\xf5#\x01G\xd8\xbfpy\x1eo\x01\x87\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xe2\xda\xd7!\x01\x1a\xd8\xbf\xe7\xa3;q\x01\xb4\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x1d\xa7\xd9\x1d\x01\xc5\xd7\xbf^\xceXs\x01\xe1\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xe2\xda\xd7!\x01\x1a\xd8\xbf#\x02Ww\x016\xdf\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x1d\xa7\xd9\x1d\x01\xc5\xd7\xbf\x9a,ty\x01c\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?j\xb0\xba\x1f\x01\xed\xd7\xbf\x88\x81\xae}\x01\xbd\xdf\xbf\xed_\xc6\x05\x81\xc4\xe5?\xb8\'\x82\x17\x01>\xd7\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xed_\xc6\x05\x81\xc4\xe5?A\xfdd\x15\x01\x11\xd7\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xed_\xc6\x05\x81\xc4\xe5?\x17J\x0f\x0b\x015\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\x8et,\r\x01b\xd6\xbf^\xceXs\x01\xe1\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?)\xf5\xd4\x06\x01\xdb\xd5\xbf\x82$\xe4j\x01-\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?;\xa0\x9a\x02\x01\x81\xd5\xbfG\xc6\xc8d\x01\xab\xdd\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xd6 C\xfc\x00\xfa\xd4\xbf\xe1Fq^\x01$\xdd\xbf\xbe\xce\xff\x0b\x01I\xe6?\xc4u}\x00\x01T\xd5\xbf|\xc7\x19X\x01\x9d\xdc\xbfG\xa4\xe2\t\x01\x1c\xe6?MK`\xfe\x00\'\xd5\xbf\x8er\xdfS\x01C\xdc\xbf\x829\xf1\n\x812\xe6?MK`\xfe\x00\'\xd5\xbfAi\xfeQ\x01\x1b\xdc\xbf\x829\xf1\n\x812\xe6?\xc4u}\x00\x01T\xd5\xbfAi\xfeQ\x01\x1b\xdc\xbf\xf9c\x0e\r\x81_\xe6?\xb2\xca\xb7\x04\x01\xae\xd5\xbf\x8er\xdfS\x01C\xdc\xbfG\xa4\xe2\t\x01\x1c\xe6?;\xa0\x9a\x02\x01\x81\xd5\xbf\x8er\xdfS\x01C\xdc\xbf\xf9c\x0e\r\x81_\xe6?;\xa0\x9a\x02\x01\x81\xd5\xbf\xf3\xf16Z\x01\xca\xdc\xbf5\xf9\x1c\x0e\x01v\xe6?\xb2\xca\xb7\x04\x01\xae\xd5\xbf|\xc7\x19X\x01\x9d\xdc\xbf\xf9c\x0e\r\x81_\xe6?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf\xe1Fq^\x01$\xdd\xbf\x829\xf1\n\x812\xe6?;\xa0\x9a\x02\x01\x81\xd5\xbf\xe1Fq^\x01$\xdd\xbf\x829\xf1\n\x812\xe6?\xb2\xca\xb7\x04\x01\xae\xd5\xbfG\xc6\xc8d\x01\xab\xdd\xbfG\xa4\xe2\t\x01\x1c\xe6?MK`\xfe\x00\'\xd5\xbf\x82$\xe4j\x01-\xde\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xd6 C\xfc\x00\xfa\xd4\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?MK`\xfe\x00\'\xd5\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf\xed_\xc6\x05\x81\xc4\xe5?\x88\x17b\xfa\x00\xd2\xd4\xbf\x0b\xfa\xc6h\x01\x00\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xd6 C\xfc\x00\xfa\xd4\xbf\x0b\xfa\xc6h\x01\x00\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x11\xedD\xf8\x00\xa5\xd4\xbfG\xc6\xc8d\x01\xab\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xd6 C\xfc\x00\xfa\xd4\xbfG\xc6\xc8d\x01\xab\xdd\xbfG\xa4\xe2\t\x01\x1c\xe6?\x88\x17b\xfa\x00\xd2\xd4\xbf\xe1Fq^\x01$\xdd\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?MK`\xfe\x00\'\xd5\xbf\xf3\xf16Z\x01\xca\xdc\xbfe\x8a\xe3\x07\x81\xf1\xe5?MK`\xfe\x00\'\xd5\xbf\xe1Fq^\x01$\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x88\x17b\xfa\x00\xd2\xd4\xbfj\x1cT\\\x01\xf7\xdc\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\x88\x17b\xfa\x00\xd2\xd4\xbfj\x1cT\\\x01\xf7\xdc\xbfG\xa4\xe2\t\x01\x1c\xe6?\xd6 C\xfc\x00\xfa\xd4\xbfj\x1cT\\\x01\xf7\xdc\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?MK`\xfe\x00\'\xd5\xbfj\x1cT\\\x01\xf7\xdc\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?MK`\xfe\x00\'\xd5\xbfj\x1cT\\\x01\xf7\xdc\xbfG\xa4\xe2\t\x01\x1c\xe6?MK`\xfe\x00\'\xd5\xbf\xe1Fq^\x01$\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?;\xa0\x9a\x02\x01\x81\xd5\xbfG\xc6\xc8d\x01\xab\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xc4u}\x00\x01T\xd5\xbfG\xc6\xc8d\x01\xab\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xb2\xca\xb7\x04\x01\xae\xd5\xbf\x94\xcf\xa9f\x01\xd3\xdd\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?)\xf5\xd4\x06\x01\xdb\xd5\xbf\x94\xcf\xa9f\x01\xd3\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xb2\xca\xb7\x04\x01\xae\xd5\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\x17J\x0f\x0b\x015\xd6\xbf\x82$\xe4j\x01-\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?)\xf5\xd4\x06\x01\xdb\xd5\xbf\x82$\xe4j\x01-\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?)\xf5\xd4\x06\x01\xdb\xd5\xbf^\xceXs\x01\xe1\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?)\xf5\xd4\x06\x01\xdb\xd5\xbf\xe7\xa3;q\x01\xb4\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf^\xceXs\x01\xe1\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xb2\xca\xb7\x04\x01\xae\xd5\xbf^\xceXs\x01\xe1\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf\x82$\xe4j\x01-\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf\xe7\xa3;q\x01\xb4\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x17J\x0f\x0b\x015\xd6\xbf^\xceXs\x01\xe1\xde\xbfG\xa4\xe2\t\x01\x1c\xe6?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x8et,\r\x01b\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\x17J\x0f\x0b\x015\xd6\xbf^\xceXs\x01\xe1\xde\xbf\xed_\xc6\x05\x81\xc4\xe5?\x17J\x0f\x0b\x015\xd6\xbf^\xceXs\x01\xe1\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?\x17J\x0f\x0b\x015\xd6\xbf\xf9N\x01m\x01Z\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf^\xceXs\x01\xe1\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x17J\x0f\x0b\x015\xd6\xbf#\x02Ww\x016\xdf\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xdc}\r\x0f\x01\x8a\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x8et,\r\x01b\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\x17J\x0f\x0b\x015\xd6\xbf#\x02Ww\x016\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\x17J\x0f\x0b\x015\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xdc}\r\x0f\x01\x8a\xd6\xbf#\x02Ww\x016\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\x8et,\r\x01b\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xdc}\r\x0f\x01\x8a\xd6\xbf\x9a,ty\x01c\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xca\xd2G\x13\x01\xe4\xd6\xbf\x11W\x91{\x01\x90\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?A\xfdd\x15\x01\x11\xd7\xbf\x88\x81\xae}\x01\xbd\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?A\xfdd\x15\x01\x11\xd7\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xb8\'\x82\x17\x01>\xd7\xbf\x88\x81\xae}\x01\xbd\xdf\xbf\xed_\xc6\x05\x81\xc4\xe5?A\xfdd\x15\x01\x11\xd7\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xb8\'\x82\x17\x01>\xd7\xbf\xb2\x95\x11\xc3\x808\xe0\xbfv5\xa9\x03\x81\x97\xe5?\xb8\'\x82\x17\x01>\xd7\xbfw\x00\x03\xc2\x00"\xe0\xbf\xb2\xca\xb7\x04\x01\xae\xe5?A\xfdd\x15\x01\x11\xd7\xbfw\x00\x03\xc2\x00"\xe0\xbfv5\xa9\x03\x81\x97\xe5?' 107 | p13 108 | tp14 109 | b. -------------------------------------------------------------------------------- /launch/calibrator.launch: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /nodes/calibrate_imu.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | import rospy 3 | from std_msgs.msg import Header 4 | from sensor_msgs.msg import Imu 5 | from geometry_msgs.msg import Vector3Stamped 6 | from std_srvs.srv import Empty, EmptyResponse 7 | import math 8 | import pickle 9 | from time import localtime,strftime 10 | import os 11 | from numpy import linalg,array,amax,amin,add,divide,multiply,subtract,power,Inf,matrix,tile,bmat,random,arange,ones,zeros,eye,squeeze 12 | 13 | 14 | class calibrate_imu: 15 | def __init__(self): 16 | self.mag_samples = [] 17 | self.imu_samples = [] 18 | self.mag_matrix = eye(3) 19 | self.mag_offset = zeros(3) 20 | self.sampling = False 21 | 22 | mag_topic = rospy.get_param('~mag_topic', '/imu/mag') 23 | imu_topic = rospy.get_param('~imu_topic', '/imu/data') 24 | self.publish_calibrated = rospy.get_param("~publish_calibrated", False) 25 | self.max_samples = rospy.get_param("~max_samples", 5000) 26 | self.__location__ = rospy.get_param("~calibrations_dir", "/data/mag_calibration") 27 | self.calibrated_mag_pub = rospy.Publisher('/imu/mag_calibrated',Vector3Stamped, queue_size='1') 28 | self.load_calibration() 29 | 30 | rospy.Subscriber(mag_topic,Vector3Stamped,self.mag_cb) 31 | rospy.Subscriber(imu_topic,Imu, self.imu_cb) 32 | rospy.Service('start_sampling',Empty,self.start_sampling) 33 | rospy.Service('stop_sampling',Empty,self.stop_sampling) 34 | rospy.Service('calibrate_mag',Empty,self.calibrate_mag) 35 | 36 | def load_calibration(self): 37 | file_path = os.path.join(self.__location__,"last_mag_calibration") 38 | try: 39 | f = open(file_path) 40 | self.mag_offset = squeeze(array(pickle.load(f))) 41 | self.mag_matrix = pickle.load(f) 42 | self.mag_samples = pickle.load(f) 43 | f.close() 44 | except: 45 | rospy.log_error("Could not open file %s"%(file_path)) 46 | 47 | rospy.loginfo("Magnetometer offset:\n %s",self.mag_offset) 48 | rospy.loginfo("Magnetometer Calibration Matrix:\n %s",self.mag_matrix) 49 | 50 | # callback for magnetometer readings 51 | def mag_cb(self,data): 52 | if self.sampling == True: 53 | #collect measurements 54 | self.mag_samples.append([data.vector.x,data.vector.y,data.vector.z]) 55 | if len(self.mag_samples)%50==0: 56 | rospy.loginfo("Got %d magnetometer readings"%(len(self.mag_samples))) 57 | if len(self.mag_samples) > self.max_samples: 58 | # drop the 50 oldest samples 59 | self.mag_samples = self.mag_samples[50:] 60 | 61 | if self.publish_calibrated == True: 62 | mag_raw = array([data.vector.x,data.vector.y,data.vector.z]) 63 | mag_cal = ((self.mag_matrix.dot((mag_raw-self.mag_offset.T).T)).T) 64 | calibrated_mag_msg = Vector3Stamped() 65 | calibrated_mag_msg.header.stamp = data.header.stamp 66 | calibrated_mag_msg.vector.x = mag_cal[0] 67 | calibrated_mag_msg.vector.y = mag_cal[1] 68 | calibrated_mag_msg.vector.z = mag_cal[2] 69 | 70 | self.calibrated_mag_pub.publish(calibrated_mag_msg) 71 | 72 | def imu_cb(self,data): 73 | pass 74 | 75 | def start_sampling(self,req): 76 | rospy.loginfo('Started collecting magnetometer readings') 77 | self.sampling = True 78 | self.mag_samples = [] 79 | self.imu_samples = [] 80 | return EmptyResponse() 81 | 82 | def stop_sampling(self,req): 83 | rospy.loginfo('Stopped collecting magnetometer readings') 84 | self.sampling = False 85 | return EmptyResponse() 86 | 87 | def calibrate_mag(self,req): 88 | if len(self.mag_samples)>=10: 89 | self.sampling = False 90 | xyz = matrix(self.mag_samples) 91 | rospy.loginfo('Starting magnetometer calibration with %d samples'%(len(self.mag_samples))) 92 | 93 | #compute the vectors [ x^2 y^2 z^2 2*x*y 2*y*z 2*x*z x y z 1] for every sample 94 | # the result for the x*y y*z and x*z components should be divided by 2 95 | xyz2 = power(xyz,2) 96 | xy = multiply(xyz[:,0],xyz[:,1]) 97 | xz = multiply(xyz[:,0],xyz[:,2]) 98 | yz = multiply(xyz[:,1],xyz[:,2]) 99 | 100 | # build the data matrix 101 | A = bmat('xyz2 xy xz yz xyz') 102 | 103 | b = 1.0*ones((xyz.shape[0],1)) 104 | 105 | # solve the system Ax = b 106 | q,res,rank,sing = linalg.lstsq(A,b) 107 | 108 | # build scaled ellipsoid quadric matrix (in homogeneous coordinates) 109 | A = matrix([[q[0][0],0.5*q[3][0],0.5*q[4][0],0.5*q[6][0]], 110 | [0.5*q[3][0],q[1][0],0.5*q[5][0],0.5*q[7][0]], 111 | [0.5*q[4][0],0.5*q[5][0],q[2][0],0.5*q[8][0]], 112 | [0.5*q[6][0],0.5*q[7][0],0.5*q[8][0],-1]]) 113 | 114 | # build scaled ellipsoid quadric matrix (in regular coordinates) 115 | Q = matrix([[q[0][0],0.5*q[3][0],0.5*q[4][0]], 116 | [0.5*q[3][0],q[1][0],0.5*q[5][0]], 117 | [0.5*q[4][0],0.5*q[5][0],q[2][0]]]) 118 | 119 | # obtain the centroid of the ellipsoid 120 | x0 = linalg.inv(-1.0*Q)*matrix([0.5*q[6][0],0.5*q[7][0],0.5*q[8][0]]).T 121 | 122 | # translate the ellipsoid in homogeneous coordinates to the center 123 | T_x0 = matrix(eye(4)) 124 | T_x0[0,3] = x0[0]; T_x0[1,3] = x0[1]; T_x0[2,3] = x0[2]; 125 | A = T_x0.T*A*T_x0 126 | 127 | # rescale the ellipsoid quadric matrix (in regular coordinates) 128 | Q = Q*(-1.0/A[3,3]) 129 | 130 | # take the cholesky decomposition of Q. this will be the matrix to transform 131 | # points from the ellipsoid to a sphere, after correcting for the offset x0 132 | L = eye(3) 133 | try: 134 | L = linalg.cholesky(Q).transpose() 135 | except Exception,e: 136 | rospy.loginfo(str(e)) 137 | L = eye(3) 138 | 139 | rospy.loginfo("Magnetometer offset:\n %s",x0) 140 | rospy.loginfo("Magnetometer Calibration Matrix:\n %s",L) 141 | 142 | file_path = os.path.join(self.__location__,"last_mag_calibration") 143 | f = open(file_path,"w+") 144 | pickle.dump(x0,f) 145 | pickle.dump(L,f) 146 | pickle.dump(matrix(self.mag_samples),f) 147 | f.close() 148 | # back up calibration 149 | calib_name = strftime("mag_calibration_%d_%m_%y_%H_%M_%S",localtime()) 150 | calib_path = os.path.join(self.__location__,calib_name) 151 | os.system("cp %s %s"%(file_path,calib_path)) 152 | 153 | self.mag_matrix = L 154 | self.mag_offset = squeeze(array(x0)) 155 | else: 156 | rospy.loginfo("Not enough samples to calibrate the magnetometer") 157 | return EmptyResponse() 158 | 159 | 160 | 161 | if __name__=='__main__': 162 | rospy.init_node('calibrate_imu') 163 | cbimu = calibrate_imu() 164 | rospy.spin() 165 | 166 | 167 | 168 | -------------------------------------------------------------------------------- /nodes/plot_calibration_data.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | 3 | import numpy as np 4 | from mpl_toolkits.mplot3d import Axes3D 5 | import matplotlib.pyplot as plt 6 | import pickle 7 | import argparse 8 | 9 | parser = argparse.ArgumentParser("Plot the results from calibrating the magnetometer") 10 | parser.add_argument('filename', metavar='filename', type=str, nargs='+',help='path to the file obtained from the calibrate_imu node') 11 | 12 | args = parser.parse_args() 13 | f = open(args.filename[0]) 14 | x0 = pickle.load(f) 15 | L = pickle.load(f) 16 | data = pickle.load(f) 17 | normalized_data = (L*(data.T-x0)).T 18 | 19 | fig = plt.figure() 20 | ax = fig.add_subplot(111,projection='3d') 21 | 22 | print data.shape 23 | print normalized_data.shape 24 | 25 | ax.scatter(np.array(data[:,0]),np.array(data[:,1]),np.array(data[:,2]),c='b',marker='^') 26 | 27 | fig = plt.figure() 28 | ax = fig.add_subplot(111,projection='3d') 29 | ax.scatter(np.array(normalized_data[:,0]),np.array(normalized_data[:,1]),np.array(normalized_data[:,2]),c='r',marker='o') 30 | 31 | plt.show() 32 | -------------------------------------------------------------------------------- /package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | calibrate_imu 4 | 0.0.0 5 | The calibrate_imu package 6 | 7 | juancamilog 8 | TODO 9 | 10 | catkin 11 | 12 | roscpp 13 | rospy 14 | std_msgs 15 | geometry_msgs 16 | 17 | roscpp 18 | std_msgs 19 | std_srvs 20 | message_runtime 21 | message_filters 22 | 23 | 24 | --------------------------------------------------------------------------------