<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def is_opening_code_fence(line: str, parser: str = 'github'):
 r"""Determine if the given line is possibly the opening of a fenced code block. :parameter line: a single markdown line to evaluate. :parameter parser: decides rules on how to generate the anchor text. Defaults to ``github``. :type line: str :type parser: str :returns: None if the input line is not an opening code fence. Otherwise, returns the string which will identify the closing code fence according to the input parsers' rules. :rtype: typing.Optional[str] :raises: a built-in exception. """

    if (parser == 'github' or parser == 'cmark' or parser == 'gitlab'
            or parser == 'commonmarker'):
        markers = md_parser['github']['code fence']['marker']
        marker_min_length = md_parser['github']['code fence'][
            'min_marker_characters']

        if not is_valid_code_fence_indent(line):
            return None

        line = line.lstrip(' ').rstrip('\n')
        if not line.startswith(
            (markers[0] * marker_min_length, markers[1] * marker_min_length)):
            return None

        if line == len(line) * line[0]:
            info_string = str()
        else:
            info_string = line.lstrip(line[0])
        # Backticks or tildes in info string are explicitly forbidden.
        if markers[0] in info_string or markers[1] in info_string:
            return None
        # Solves example 107. See:
        # https://github.github.com/gfm/#example-107
        if line.rstrip(markers[0]) != line and line.rstrip(markers[1]) != line:
            return None

        return line.rstrip(info_string)
    elif parser == 'redcarpet':
        # TODO.
        return None