<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def make_error_router():
 """ Creates an error router An error router takes a higher order observable a input and returns two observables: One containing the flattened items of the input observable and another one containing the flattened errors of the input observable. .. image:: ../docs/asset/error_router.png :scale: 60% :align: center Returns ------- error_observable: observable An observable emitting errors remapped. route_error: function A lettable function routing errors and taking three parameters: * source: Observable (higher order). Observable with errors to route. * error_map: function. Function used to map errors before routing them. * source_map: function. A function used to select the observable from each item is source. Examples -------- my_observable.let(route_error, error_map=lambda e: e) """

    sink_observer = None

    def on_subscribe(observer):
        nonlocal sink_observer
        sink_observer = observer

        def dispose():
            nonlocal sink_observer
            sink_observer = None

        return dispose

    def route_error(obs, convert):
        """ Handles error raised by obs observable

        catches any error raised by obs, maps it to anther object with the
        convert function, and emits in on the error observer.

        """
        def catch_error(e):
            sink_observer.on_next(convert(e))
            return Observable.empty()

        return obs.catch_exception(catch_error)

    def catch_or_flat_map(source, error_map, source_map=lambda i: i):
        return source.flat_map(lambda i: route_error(source_map(i), error_map))

    return Observable.create(on_subscribe), catch_or_flat_map