code: def unpack(self, buff, offset=0):
          
          begin = offset
          for attribute_name, class_attribute in self.get_class_attributes():
              if type(class_attribute).__name__ != "Header":
                  attribute = deepcopy(class_attribute)
                  if attribute_name == 'actions':
                      length = self.actions_len.value
                      attribute.unpack(buff[begin:begin+length])
                  else:
                      attribute.unpack(buff, begin)
                  setattr(self, attribute_name, attribute)
                  begin += attribute.get_size()
docs: Unpack a binary message into this object's attributes.
  
          Unpack the binary value *buff* and update this object attributes based
          on the results. It is an inplace method and it receives the binary data
          of the message **without the header**.
  
          This class' unpack method is like the :meth:`.GenericMessage.unpack`
          one, except for the ``actions`` attribute which has a length determined
          by the ``actions_len`` attribute.
  
          Args:
              buff (bytes): Binary data package to be unpacked, without the
                  header.
              offset (int): Where to begin unpacking.