old_contents: #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  
  """Utilities for the KISS Python Module."""
  
  __author__ = 'Greg Albrecht W2GMD <gba@orionlabs.co>'
  __copyright__ = 'Copyright 2015 Orion Labs, Inc. and Contributors'
  __license__ = 'Apache License, Version 2.0'
  
  
  import kiss.constants
  
  
  def escape_special_codes(raw_codes):
      """
      Escape special codes, per KISS spec.
  
      "If the FEND or FESC codes appear in the data to be transferred, they
      need to be escaped. The FEND code is then sent as FESC, TFEND and the
      FESC is then sent as FESC, TFESC."
      - http://en.wikipedia.org/wiki/KISS_(TNC)#Description
      """
      return raw_codes.replace(
          kiss.constants.FESC,
          kiss.constants.FESC_TFESC
      ).replace(
          kiss.constants.FEND,
          kiss.constants.FESC_TFEND
      )
  
  
  def extract_ui(frame):
      """
      Extracts the UI component of an individual frame.
  
      :param frame: APRS/AX.25 frame.
      :type frame: str
      :returns: UI component of frame.
      :rtype: str
      """
      start_ui = frame.split(
          ''.join([kiss.constants.FEND, kiss.constants.DATA_FRAME]))
      end_ui = start_ui[0].split(''.join([kiss.constants.SLOT_TIME, chr(0xF0)]))
      return ''.join([chr(ord(x) >> 1) for x in end_ui[0]])
  
  
  def strip_df_start(frame):
      """
      Strips KISS DATA_FRAME start (0x00) and newline from frame.
  
      :param frame: APRS/AX.25 frame.
      :type frame: str
      :returns: APRS/AX.25 frame sans DATA_FRAME start (0x00).
      :rtype: str
      """
      return frame.lstrip(kiss.constants.DATA_FRAME).strip()
  
new_contents: #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  
  """Utilities for the KISS Python Module."""
  
  __author__ = 'Greg Albrecht W2GMD <gba@orionlabs.co>'
  __copyright__ = 'Copyright 2015 Orion Labs, Inc. and Contributors'
  __license__ = 'Apache License, Version 2.0'
  
  
  import kiss.constants
  
  
  def escape_special_codes(raw_codes):
      """
      Escape special codes, per KISS spec.
  
      "If the FEND or FESC codes appear in the data to be transferred, they
      need to be escaped. The FEND code is then sent as FESC, TFEND and the
      FESC is then sent as FESC, TFESC."
      - http://en.wikipedia.org/wiki/KISS_(TNC)#Description
      """
      return raw_codes.replace(
          kiss.constants.FESC,
          kiss.constants.FESC_TFESC
      ).replace(
          kiss.constants.FEND,
          kiss.constants.FESC_TFEND
      )
  
  def recover_special_codes(escaped_codes):
      """
      Recover special codes, per KISS spec.
  
      "If the FESC_TFESC or FESC_TFEND escaped codes appear in the data received, they
      need to be recovered to the original codes. The FESC_TFESC code is replaced by
      FESC code and FESC_TFEND is replaced by FEND code."
      - http://en.wikipedia.org/wiki/KISS_(TNC)#Description
      """
      return escaped_codes.replace(
          kiss.constants.FESC_TFESC,
          kiss.constants.FESC
      ).replace(
          kiss.constants.FESC_TFEND,
          kiss.constants.FEND
      )
  
  def extract_ui(frame):
      """
      Extracts the UI component of an individual frame.
  
      :param frame: APRS/AX.25 frame.
      :type frame: str
      :returns: UI component of frame.
      :rtype: str
      """
      start_ui = frame.split(
          ''.join([kiss.constants.FEND, kiss.constants.DATA_FRAME]))
      end_ui = start_ui[0].split(''.join([kiss.constants.SLOT_TIME, chr(0xF0)]))
      return ''.join([chr(ord(x) >> 1) for x in end_ui[0]])
  
  
  def strip_df_start(frame):
      """
      Strips KISS DATA_FRAME start (0x00) and newline from frame.
  
      :param frame: APRS/AX.25 frame.
      :type frame: str
      :returns: APRS/AX.25 frame sans DATA_FRAME start (0x00).
      :rtype: str
      """
      return frame.lstrip(kiss.constants.DATA_FRAME).strip()
  
subject: Update util.py to recover escaped KISS codes