<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def unicode_props(self, props, value, in_group=False, negate=False):
 """ Insert Unicode properties. Unicode properties are very forgiving. Case doesn't matter and `[ -_]` will be stripped out. """


        # `'GC = Some_Unpredictable-Category Name' -> 'gc=someunpredictablecategoryname'`
        category = None

        # `\p{^negated}` Strip off the caret after evaluation.
        if props.startswith("^"):
            negate = not negate
        if props.startswith("^"):
            props = props[1:]

        # Get the property and value.
        # If a property is present and not block,
        # we can assume `GC` as that is all we support.
        # If we are wrong it will fail.
        if value:
            if _uniprops.is_enum(props):
                category = props
                props = value
            elif value in ('y', 'yes', 't', 'true'):
                category = 'binary'
            elif value in ('n', 'no', 'f', 'false'):
                category = 'binary'
                negate = not negate
            else:
                raise ValueError('Invalid Unicode property!')

        v = _uniprops.get_unicode_property(("^" if negate else "") + props, category, self.is_bytes)
        if not in_group:
            if not v:
                v = '^%s' % ('\x00-\xff' if self.is_bytes else _uniprops.UNICODE_RANGE)
            v = "[%s]" % v
        properties = [v]

        return properties