def receive_input(self, inpt, in_goal=None):
        """
        Receives and processes the input (i.e. the system's response) and
        updates the simulator's internal state.

        :param inpt: list of dialogue acts representing input from the system
        :param in_goal: the simulated user's goal
        :return: Nothing
        """

        if self.nlu and isinstance(inpt, str):
            system_acts = self.nlu.process_input(inpt)
        else:
            system_acts = inpt

        if in_goal:
            self.goal = in_goal

        self.dialogue_turn += 1

        # TODO: AVOID RE-CHECKING THIS IN THE HANDCRAFTED POLICY

        # Update user goal (in ABUS the state is factored into the goal and
        # the agenda)
        for system_act in system_acts:
            if system_act.intent == 'offer':
                self.offer_made = True

                # Reset past requests
                if self.prev_offer_name and \
                        system_act.params and \
                        system_act.params[0].slot and \
                        system_act.params[0].slot == 'name' and \
                        system_act.params[0].value and \
                        self.prev_offer_name != system_act.params[0].value:

                    self.prev_offer_name = system_act.params[0].value

                    self.goal.actual_requests = {}

                    for item in self.goal.requests:
                        item.value = ''

        if self.policy:
            self.receive_input_policy(system_acts)
        else:
            self.receive_input_handcrafted(system_acts)

        self.agenda.consistency_check()

        Receives and processes the input (i.e. the system's response) and
        updates the simulator's internal state.

        :param inpt: list of dialogue acts representing input from the system
        :param in_goal: the simulated user's goal
        :return: Nothing
        
plato/agent/component/user_simulator/agenda_based_user_simulator/agenda_based_us.py