import numpy as np def keypoint_hflip(kp, img_width): # Flip a keypoint horizontally around the y-axis # kp N,2 if len(kp.shape) == 2: kp[:,0] = (img_width - 1.) - kp[:,0] elif len(kp.shape) == 3: kp[:, :, 0] = (img_width - 1.) - kp[:, :, 0] return kp def convert_kps(joints2d, src, dst): src_names = eval(f'get_{src}_joint_names')() dst_names = eval(f'get_{dst}_joint_names')() out_joints2d = np.zeros((joints2d.shape[0], len(dst_names), joints2d.shape[-1])) for idx, jn in enumerate(dst_names): if jn in src_names: out_joints2d[:, idx] = joints2d[:, src_names.index(jn)] return out_joints2d def get_perm_idxs(src, dst): src_names = eval(f'get_{src}_joint_names')() dst_names = eval(f'get_{dst}_joint_names')() idxs = [src_names.index(h) for h in dst_names if h in src_names] return idxs def get_mpii3d_test_joint_names(): return [ 'headtop', # 'head_top', 'neck', 'rshoulder',# 'right_shoulder', 'relbow',# 'right_elbow', 'rwrist',# 'right_wrist', 'lshoulder',# 'left_shoulder', 'lelbow', # 'left_elbow', 'lwrist', # 'left_wrist', 'rhip', # 'right_hip', 'rknee', # 'right_knee', 'rankle',# 'right_ankle', 'lhip',# 'left_hip', 'lknee',# 'left_knee', 'lankle',# 'left_ankle' 'hip',# 'pelvis', 'Spine (H36M)',# 'spine', 'Head (H36M)',# 'head' ] def get_mpii3d_joint_names(): return [ 'spine3', # 0, 'spine4', # 1, 'spine2', # 2, 'Spine (H36M)', #'spine', # 3, 'hip', # 'pelvis', # 4, 'neck', # 5, 'Head (H36M)', # 'head', # 6, "headtop", # 'head_top', # 7, 'left_clavicle', # 8, "lshoulder", # 'left_shoulder', # 9, "lelbow", # 'left_elbow',# 10, "lwrist", # 'left_wrist',# 11, 'left_hand',# 12, 'right_clavicle',# 13, 'rshoulder',# 'right_shoulder',# 14, 'relbow',# 'right_elbow',# 15, 'rwrist',# 'right_wrist',# 16, 'right_hand',# 17, 'lhip', # left_hip',# 18, 'lknee', # 'left_knee',# 19, 'lankle', #left ankle # 20 'left_foot', # 21 'left_toe', # 22 "rhip", # 'right_hip',# 23 "rknee", # 'right_knee',# 24 "rankle", #'right_ankle', # 25 'right_foot',# 26 'right_toe' # 27 ] # def get_insta_joint_names(): # return [ # 'rheel' , # 0 # 'rknee' , # 1 # 'rhip' , # 2 # 'lhip' , # 3 # 'lknee' , # 4 # 'lheel' , # 5 # 'rwrist' , # 6 # 'relbow' , # 7 # 'rshoulder' , # 8 # 'lshoulder' , # 9 # 'lelbow' , # 10 # 'lwrist' , # 11 # 'neck' , # 12 # 'headtop' , # 13 # 'nose' , # 14 # 'leye' , # 15 # 'reye' , # 16 # 'lear' , # 17 # 'rear' , # 18 # 'lbigtoe' , # 19 # 'rbigtoe' , # 20 # 'lsmalltoe' , # 21 # 'rsmalltoe' , # 22 # 'lankle' , # 23 # 'rankle' , # 24 # ] def get_insta_joint_names(): return [ 'OP RHeel', 'OP RKnee', 'OP RHip', 'OP LHip', 'OP LKnee', 'OP LHeel', 'OP RWrist', 'OP RElbow', 'OP RShoulder', 'OP LShoulder', 'OP LElbow', 'OP LWrist', 'OP Neck', 'headtop', 'OP Nose', 'OP LEye', 'OP REye', 'OP LEar', 'OP REar', 'OP LBigToe', 'OP RBigToe', 'OP LSmallToe', 'OP RSmallToe', 'OP LAnkle', 'OP RAnkle', ] def get_mmpose_joint_names(): # this naming is for the first 23 joints of MMPose # does not include hands and face return [ 'OP Nose', # 1 'OP LEye', # 2 'OP REye', # 3 'OP LEar', # 4 'OP REar', # 5 'OP LShoulder', # 6 'OP RShoulder', # 7 'OP LElbow', # 8 'OP RElbow', # 9 'OP LWrist', # 10 'OP RWrist', # 11 'OP LHip', # 12 'OP RHip', # 13 'OP LKnee', # 14 'OP RKnee', # 15 'OP LAnkle', # 16 'OP RAnkle', # 17 'OP LBigToe', # 18 'OP LSmallToe', # 19 'OP LHeel', # 20 'OP RBigToe', # 21 'OP RSmallToe', # 22 'OP RHeel', # 23 ] def get_insta_skeleton(): return np.array( [ [0 , 1], [1 , 2], [2 , 3], [3 , 4], [4 , 5], [6 , 7], [7 , 8], [8 , 9], [9 ,10], [2 , 8], [3 , 9], [10,11], [8 ,12], [9 ,12], [12,13], [12,14], [14,15], [14,16], [15,17], [16,18], [0 ,20], [20,22], [5 ,19], [19,21], [5 ,23], [0 ,24], ]) def get_staf_skeleton(): return np.array( [ [0, 1], [1, 2], [2, 3], [3, 4], [1, 5], [5, 6], [6, 7], [1, 8], [8, 9], [9, 10], [10, 11], [8, 12], [12, 13], [13, 14], [0, 15], [0, 16], [15, 17], [16, 18], [2, 9], [5, 12], [1, 19], [20, 19], ] ) def get_staf_joint_names(): return [ 'OP Nose', # 0, 'OP Neck', # 1, 'OP RShoulder', # 2, 'OP RElbow', # 3, 'OP RWrist', # 4, 'OP LShoulder', # 5, 'OP LElbow', # 6, 'OP LWrist', # 7, 'OP MidHip', # 8, 'OP RHip', # 9, 'OP RKnee', # 10, 'OP RAnkle', # 11, 'OP LHip', # 12, 'OP LKnee', # 13, 'OP LAnkle', # 14, 'OP REye', # 15, 'OP LEye', # 16, 'OP REar', # 17, 'OP LEar', # 18, 'Neck (LSP)', # 19, 'Top of Head (LSP)', # 20, ] def get_spin_op_joint_names(): return [ 'OP Nose', # 0 'OP Neck', # 1 'OP RShoulder', # 2 'OP RElbow', # 3 'OP RWrist', # 4 'OP LShoulder', # 5 'OP LElbow', # 6 'OP LWrist', # 7 'OP MidHip', # 8 'OP RHip', # 9 'OP RKnee', # 10 'OP RAnkle', # 11 'OP LHip', # 12 'OP LKnee', # 13 'OP LAnkle', # 14 'OP REye', # 15 'OP LEye', # 16 'OP REar', # 17 'OP LEar', # 18 'OP LBigToe', # 19 'OP LSmallToe', # 20 'OP LHeel', # 21 'OP RBigToe', # 22 'OP RSmallToe', # 23 'OP RHeel', # 24 ] def get_openpose_joint_names(): return [ 'OP Nose', # 0 'OP Neck', # 1 'OP RShoulder', # 2 'OP RElbow', # 3 'OP RWrist', # 4 'OP LShoulder', # 5 'OP LElbow', # 6 'OP LWrist', # 7 'OP MidHip', # 8 'OP RHip', # 9 'OP RKnee', # 10 'OP RAnkle', # 11 'OP LHip', # 12 'OP LKnee', # 13 'OP LAnkle', # 14 'OP REye', # 15 'OP LEye', # 16 'OP REar', # 17 'OP LEar', # 18 'OP LBigToe', # 19 'OP LSmallToe', # 20 'OP LHeel', # 21 'OP RBigToe', # 22 'OP RSmallToe', # 23 'OP RHeel', # 24 ] def get_spin_joint_names(): return [ 'OP Nose', # 0 'OP Neck', # 1 'OP RShoulder', # 2 'OP RElbow', # 3 'OP RWrist', # 4 'OP LShoulder', # 5 'OP LElbow', # 6 'OP LWrist', # 7 'OP MidHip', # 8 'OP RHip', # 9 'OP RKnee', # 10 'OP RAnkle', # 11 'OP LHip', # 12 'OP LKnee', # 13 'OP LAnkle', # 14 'OP REye', # 15 'OP LEye', # 16 'OP REar', # 17 'OP LEar', # 18 'OP LBigToe', # 19 'OP LSmallToe', # 20 'OP LHeel', # 21 'OP RBigToe', # 22 'OP RSmallToe', # 23 'OP RHeel', # 24 'rankle', # 25 'rknee', # 26 'rhip', # 27 'lhip', # 28 'lknee', # 29 'lankle', # 30 'rwrist', # 31 'relbow', # 32 'rshoulder', # 33 'lshoulder', # 34 'lelbow', # 35 'lwrist', # 36 'neck', # 37 'headtop', # 38 'hip', # 39 'Pelvis (MPII)', # 39 'thorax', # 40 'Thorax (MPII)', # 40 'Spine (H36M)', # 41 'Jaw (H36M)', # 42 'Head (H36M)', # 43 'nose', # 44 'leye', # 45 'Left Eye', # 45 'reye', # 46 'Right Eye', # 46 'lear', # 47 'Left Ear', # 47 'rear', # 48 'Right Ear', # 48 ] def get_muco3dhp_joint_names(): return [ 'headtop', 'thorax', 'rshoulder', 'relbow', 'rwrist', 'lshoulder', 'lelbow', 'lwrist', 'rhip', 'rknee', 'rankle', 'lhip', 'lknee', 'lankle', 'hip', 'Spine (H36M)', 'Head (H36M)', 'R_Hand', 'L_Hand', 'R_Toe', 'L_Toe' ] def get_h36m_joint_names(): return [ 'hip', # 0 'lhip', # 1 'lknee', # 2 'lankle', # 3 'rhip', # 4 'rknee', # 5 'rankle', # 6 'Spine (H36M)', # 7 'neck', # 8 'Head (H36M)', # 9 'headtop', # 10 'lshoulder', # 11 'lelbow', # 12 'lwrist', # 13 'rshoulder', # 14 'relbow', # 15 'rwrist', # 16 ] def get_spin_skeleton(): return np.array( [ [0 , 1], [1 , 2], [2 , 3], [3 , 4], [1 , 5], [5 , 6], [6 , 7], [1 , 8], [8 , 9], [9 ,10], [10,11], [8 ,12], [12,13], [13,14], [0 ,15], [0 ,16], [15,17], [16,18], [21,19], [19,20], [14,21], [11,24], [24,22], [22,23], [0 ,38], ] ) def get_openpose_skeleton(): return np.array( [ [0 , 1], [1 , 2], [2 , 3], [3 , 4], [1 , 5], [5 , 6], [6 , 7], [1 , 8], [8 , 9], [9 ,10], [10,11], [8 ,12], [12,13], [13,14], [0 ,15], [0 ,16], [15,17], [16,18], [21,19], [19,20], [14,21], [11,24], [24,22], [22,23], ] ) def get_posetrack_joint_names(): return [ "nose", "neck", "headtop", "lear", "rear", "lshoulder", "rshoulder", "lelbow", "relbow", "lwrist", "rwrist", "lhip", "rhip", "lknee", "rknee", "lankle", "rankle" ] def get_posetrack_original_kp_names(): return [ 'nose', 'head_bottom', 'head_top', 'left_ear', 'right_ear', 'left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow', 'left_wrist', 'right_wrist', 'left_hip', 'right_hip', 'left_knee', 'right_knee', 'left_ankle', 'right_ankle' ] def get_pennaction_joint_names(): return [ "headtop", # 0 "lshoulder", # 1 "rshoulder", # 2 "lelbow", # 3 "relbow", # 4 "lwrist", # 5 "rwrist", # 6 "lhip" , # 7 "rhip" , # 8 "lknee", # 9 "rknee" , # 10 "lankle", # 11 "rankle" # 12 ] def get_common_joint_names(): return [ "rankle", # 0 "lankle", # 0 "rknee", # 1 "lknee", # 1 "rhip", # 2 "lhip", # 2 "lhip", # 3 "rhip", # 3 "lknee", # 4 "rknee", # 4 "lankle", # 5 "rankle", # 5 "rwrist", # 6 "lwrist", # 6 "relbow", # 7 "lelbow", # 7 "rshoulder", # 8 "lshoulder", # 8 "lshoulder", # 9 "rshoulder", # 9 "lelbow", # 10 "relbow", # 10 "lwrist", # 11 "rwrist", # 11 "neck", # 12 "neck", # 12 "headtop", # 13 "headtop", # 13 ] def get_common_paper_joint_names(): return [ "Right Ankle", # 0 "lankle", # 0 "Right Knee", # 1 "lknee", # 1 "Right Hip", # 2 "lhip", # 2 "Left Hip", # 3 "rhip", # 3 "Left Knee", # 4 "rknee", # 4 "Left Ankle", # 5 "rankle", # 5 "Right Wrist", # 6 "lwrist", # 6 "Right Elbow", # 7 "lelbow", # 7 "Right Shoulder", # 8 "lshoulder", # 8 "Left Shoulder", # 9 "rshoulder", # 9 "Left Elbow", # 10 "relbow", # 10 "Left Wrist", # 11 "rwrist", # 11 "Neck", # 12 "neck", # 12 "Head", # 13 "headtop", # 13 ] def get_common_skeleton(): return np.array( [ [ 0, 1 ], [ 1, 2 ], [ 3, 4 ], [ 4, 5 ], [ 6, 7 ], [ 7, 8 ], [ 8, 2 ], [ 8, 9 ], [ 9, 3 ], [ 2, 3 ], [ 8, 12], [ 9, 10], [12, 9 ], [10, 11], [12, 13], ] ) def get_coco_joint_names(): return [ "nose", # 0 "leye", # 1 "reye", # 2 "lear", # 3 "rear", # 4 "lshoulder", # 5 "rshoulder", # 6 "lelbow", # 7 "relbow", # 8 "lwrist", # 9 "rwrist", # 10 "lhip", # 11 "rhip", # 12 "lknee", # 13 "rknee", # 14 "lankle", # 15 "rankle", # 16 ] def get_ochuman_joint_names(): return [ 'rshoulder', 'relbow', 'rwrist', 'lshoulder', 'lelbow', 'lwrist', 'rhip', 'rknee', 'rankle', 'lhip', 'lknee', 'lankle', 'headtop', 'neck', 'rear', 'lear', 'nose', 'reye', 'leye' ] def get_crowdpose_joint_names(): return [ 'lshoulder', 'rshoulder', 'lelbow', 'relbow', 'lwrist', 'rwrist', 'lhip', 'rhip', 'lknee', 'rknee', 'lankle', 'rankle', 'headtop', 'neck' ] def get_coco_skeleton(): # 0 - nose, # 1 - leye, # 2 - reye, # 3 - lear, # 4 - rear, # 5 - lshoulder, # 6 - rshoulder, # 7 - lelbow, # 8 - relbow, # 9 - lwrist, # 10 - rwrist, # 11 - lhip, # 12 - rhip, # 13 - lknee, # 14 - rknee, # 15 - lankle, # 16 - rankle, return np.array( [ [15, 13], [13, 11], [16, 14], [14, 12], [11, 12], [ 5, 11], [ 6, 12], [ 5, 6 ], [ 5, 7 ], [ 6, 8 ], [ 7, 9 ], [ 8, 10], [ 1, 2 ], [ 0, 1 ], [ 0, 2 ], [ 1, 3 ], [ 2, 4 ], [ 3, 5 ], [ 4, 6 ] ] ) def get_mpii_joint_names(): return [ "rankle", # 0 "rknee", # 1 "rhip", # 2 "lhip", # 3 "lknee", # 4 "lankle", # 5 "hip", # 6 "thorax", # 7 "neck", # 8 "headtop", # 9 "rwrist", # 10 "relbow", # 11 "rshoulder", # 12 "lshoulder", # 13 "lelbow", # 14 "lwrist", # 15 ] def get_mpii_skeleton(): # 0 - rankle, # 1 - rknee, # 2 - rhip, # 3 - lhip, # 4 - lknee, # 5 - lankle, # 6 - hip, # 7 - thorax, # 8 - neck, # 9 - headtop, # 10 - rwrist, # 11 - relbow, # 12 - rshoulder, # 13 - lshoulder, # 14 - lelbow, # 15 - lwrist, return np.array( [ [ 0, 1 ], [ 1, 2 ], [ 2, 6 ], [ 6, 3 ], [ 3, 4 ], [ 4, 5 ], [ 6, 7 ], [ 7, 8 ], [ 8, 9 ], [ 7, 12], [12, 11], [11, 10], [ 7, 13], [13, 14], [14, 15] ] ) def get_aich_joint_names(): return [ "rshoulder", # 0 "relbow", # 1 "rwrist", # 2 "lshoulder", # 3 "lelbow", # 4 "lwrist", # 5 "rhip", # 6 "rknee", # 7 "rankle", # 8 "lhip", # 9 "lknee", # 10 "lankle", # 11 "headtop", # 12 "neck", # 13 ] def get_aich_skeleton(): # 0 - rshoulder, # 1 - relbow, # 2 - rwrist, # 3 - lshoulder, # 4 - lelbow, # 5 - lwrist, # 6 - rhip, # 7 - rknee, # 8 - rankle, # 9 - lhip, # 10 - lknee, # 11 - lankle, # 12 - headtop, # 13 - neck, return np.array( [ [ 0, 1 ], [ 1, 2 ], [ 3, 4 ], [ 4, 5 ], [ 6, 7 ], [ 7, 8 ], [ 9, 10], [10, 11], [12, 13], [13, 0 ], [13, 3 ], [ 0, 6 ], [ 3, 9 ] ] ) def get_3dpw_joint_names(): return [ "nose", # 0 "thorax", # 1 "rshoulder", # 2 "relbow", # 3 "rwrist", # 4 "lshoulder", # 5 "lelbow", # 6 "lwrist", # 7 "rhip", # 8 "rknee", # 9 "rankle", # 10 "lhip", # 11 "lknee", # 12 "lankle", # 13 ] def get_3dpw_skeleton(): return np.array( [ [ 0, 1 ], [ 1, 2 ], [ 2, 3 ], [ 3, 4 ], [ 1, 5 ], [ 5, 6 ], [ 6, 7 ], [ 2, 8 ], [ 5, 11], [ 8, 11], [ 8, 9 ], [ 9, 10], [11, 12], [12, 13] ] ) def get_smplcoco_joint_names(): return [ "rankle", # 0 "rknee", # 1 "rhip", # 2 "lhip", # 3 "lknee", # 4 "lankle", # 5 "rwrist", # 6 "relbow", # 7 "rshoulder", # 8 "lshoulder", # 9 "lelbow", # 10 "lwrist", # 11 "neck", # 12 "headtop", # 13 "nose", # 14 "leye", # 15 "reye", # 16 "lear", # 17 "rear", # 18 ] def get_smplcoco_skeleton(): return np.array( [ [ 0, 1 ], [ 1, 2 ], [ 3, 4 ], [ 4, 5 ], [ 6, 7 ], [ 7, 8 ], [ 8, 12], [12, 9 ], [ 9, 10], [10, 11], [12, 13], [14, 15], [15, 17], [16, 18], [14, 16], [ 8, 2 ], [ 9, 3 ], [ 2, 3 ], ] ) def get_smpl_joint_names(): return [ 'hips', # 0 'leftUpLeg', # 1 'rightUpLeg', # 2 'spine', # 3 'leftLeg', # 4 'rightLeg', # 5 'spine1', # 6 'leftFoot', # 7 'rightFoot', # 8 'spine2', # 9 'leftToeBase', # 10 'rightToeBase', # 11 'neck', # 12 'leftShoulder', # 13 'rightShoulder', # 14 'head', # 15 'leftArm', # 16 'rightArm', # 17 'leftForeArm', # 18 'rightForeArm', # 19 'leftHand', # 20 'rightHand', # 21 'leftHandIndex1', # 22 'rightHandIndex1', # 23 ] def get_smpl_paper_joint_names(): return [ 'Hips', # 0 'Left Hip', # 1 'Right Hip', # 2 'Spine', # 3 'Left Knee', # 4 'Right Knee', # 5 'Spine_1', # 6 'Left Ankle', # 7 'Right Ankle', # 8 'Spine_2', # 9 'Left Toe', # 10 'Right Toe', # 11 'Neck', # 12 'Left Shoulder', # 13 'Right Shoulder', # 14 'Head', # 15 'Left Arm', # 16 'Right Arm', # 17 'Left Elbow', # 18 'Right Elbow', # 19 'Left Hand', # 20 'Right Hand', # 21 'Left Thumb', # 22 'Right Thumb', # 23 ] def get_smpl_neighbor_triplets(): return [ [ 0, 1, 2 ], # 0 [ 1, 4, 0 ], # 1 [ 2, 0, 5 ], # 2 [ 3, 0, 6 ], # 3 [ 4, 7, 1 ], # 4 [ 5, 2, 8 ], # 5 [ 6, 3, 9 ], # 6 [ 7, 10, 4 ], # 7 [ 8, 5, 11], # 8 [ 9, 13, 14], # 9 [10, 7, 4 ], # 10 [11, 8, 5 ], # 11 [12, 9, 15], # 12 [13, 16, 9 ], # 13 [14, 9, 17], # 14 [15, 9, 12], # 15 [16, 18, 13], # 16 [17, 14, 19], # 17 [18, 20, 16], # 18 [19, 17, 21], # 19 [20, 22, 18], # 20 [21, 19, 23], # 21 [22, 20, 18], # 22 [23, 19, 21], # 23 ] def get_smpl_skeleton(): return np.array( [ [ 0, 1 ], [ 0, 2 ], [ 0, 3 ], [ 1, 4 ], [ 2, 5 ], [ 3, 6 ], [ 4, 7 ], [ 5, 8 ], [ 6, 9 ], [ 7, 10], [ 8, 11], [ 9, 12], [ 9, 13], [ 9, 14], [12, 15], [13, 16], [14, 17], [16, 18], [17, 19], [18, 20], [19, 21], [20, 22], [21, 23], ] ) def map_spin_joints_to_smpl(): # this function primarily will be used to copy 2D keypoint # confidences to pose parameters return [ [(39, 27, 28), 0], # hip,lhip,rhip->hips [(28,), 1], # lhip->leftUpLeg [(27,), 2], # rhip->rightUpLeg [(41, 27, 28, 39), 3], # Spine->spine [(29,), 4], # lknee->leftLeg [(26,), 5], # rknee->rightLeg [(41, 40, 33, 34,), 6], # spine, thorax ->spine1 [(30,), 7], # lankle->leftFoot [(25,), 8], # rankle->rightFoot [(40, 33, 34), 9], # thorax,shoulders->spine2 [(30,), 10], # lankle -> leftToe [(25,), 11], # rankle -> rightToe [(37, 42, 33, 34), 12], # neck, shoulders -> neck [(34,), 13], # lshoulder->leftShoulder [(33,), 14], # rshoulder->rightShoulder [(33, 34, 38, 43, 44, 45, 46, 47, 48,), 15], # nose, eyes, ears, headtop, shoulders->head [(34,), 16], # lshoulder->leftArm [(33,), 17], # rshoulder->rightArm [(35,), 18], # lelbow->leftForeArm [(32,), 19], # relbow->rightForeArm [(36,), 20], # lwrist->leftHand [(31,), 21], # rwrist->rightHand [(36,), 22], # lhand -> leftHandIndex [(31,), 23], # rhand -> rightHandIndex ] def map_smpl_to_common(): return [ [(11, 8), 0], # rightToe, rightFoot -> rankle [(5,), 1], # rightleg -> rknee, [(2,), 2], # rhip [(1,), 3], # lhip [(4,), 4], # leftLeg -> lknee [(10, 7), 5], # lefttoe, leftfoot -> lankle [(21, 23), 6], # rwrist [(18,), 7], # relbow [(17, 14), 8], # rshoulder [(16, 13), 9], # lshoulder [(19,), 10], # lelbow [(20, 22), 11], # lwrist [(0, 3, 6, 9, 12), 12], # neck [(15,), 13], # headtop ] def relation_among_spin_joints(): # this function primarily will be used to copy 2D keypoint # confidences to 3D joints return [ [(), 25], [(), 26], [(39,), 27], [(39,), 28], [(), 29], [(), 30], [(), 31], [(), 32], [(), 33], [(), 34], [(), 35], [(), 36], [(40,42,44,43,38,33,34,), 37], [(43,44,45,46,47,48,33,34,), 38], [(27,28,), 39], [(27,28,37,41,42,), 40], [(27,28,39,40,), 41], [(37,38,44,45,46,47,48,), 42], [(44,45,46,47,48,38,42,37,33,34,), 43], [(44,45,46,47,48,38,42,37,33,34), 44], [(44,45,46,47,48,38,42,37,33,34), 45], [(44,45,46,47,48,38,42,37,33,34), 46], [(44,45,46,47,48,38,42,37,33,34), 47], [(44,45,46,47,48,38,42,37,33,34), 48], ]