You are given a code snippet that constructs a call graph recursively. The call graph represents the dependencies between various functions. In the code, the `trace_calls` function is called recursively to build the call graph. The overall process involves assigning a rank to each function and constructing an adjacency list to represent the dependencies between functions.

Your task is to implement a function, `construct_call_graph`, that takes two parameters: `XML` (a string representing XML data) and `FUNCTION` (the name of a top-level function). Your function should return the call graph constructed by the code snippet.

A call graph is represented as a dictionary, where the keys are function names and the values are lists of function names that the key function calls (direct dependencies). The call graph should include all functions encountered during the recursive call to `trace_calls`.

For example, given the following code snippet:

```
FUNCS[$next_rank]=$func
rank[$func]=$next_rank
((next_rank++))
done

# Create adjacency list for $2 and also mark treated:
graph[$2]=${FUNCS[@]}

for func in ${FUNCS[@]}; do
    trace_calls $1 "${func}"
done
}

info "Constructing call graph recursively..."
trace_calls "${XML}" "${FUNCTION}"
```

and the function call `construct_call_graph(xml_data, "main")`, where `xml_data` is an XML string, your function should return a dictionary representing the call graph.

Note:
- The rank assigned to each function represents the call sequence. The rank starts at 1 and increments for each new function encountered.
- The `trace_calls` function takes two parameters: `XML` and a function name. It is responsible for calling itself recursively for each function encountered and adding the function names to the `FUNCS` array.
- The `graph` variable is a dictionary that contains the adjacency list for each function. It is constructed by assigning the `FUNCS` array as the value for the current function in the `graph` dictionary.
[{'user_id': '74ebad2c-2384-4746-a6d9-79339adaef74', 'value': 'Te han dado un fragmento de código que construye un gráfico de llamadas de forma recursiva. El gráfico de llamadas representa las dependencias entre varias funciones. En el código, la función `rastrear_llamadas` se llama de forma recursiva para construir el gráfico de llamadas. El proceso global implica asignar un rango a cada función y construir una lista de adyacencia para representar las dependencias entre funciones.\n\nTu tarea consiste en implementar una función, `construir_gráfico_llamadas`, que reciba dos parámetros: `XML` (una cadena que representa datos en XML) y `FUNCTION` (el nombre de una función de nivel superior). La función debe devolver el gráfico de llamadas construido por el fragmento de código.\n\nUn gráfico de llamadas se representa como un diccionario, en el que las claves son nombres de funciones y los valores son listas de nombres de funciones a las que llama la función clave (dependencias directas). El gráfico de llamadas debe incluir todas las funciones encontradas durante la llamada recursiva a `rastrear_llamadas`.\n\nPor ejemplo, dado el siguiente fragmento de código:\n```\nFUNCS[$siguiente_rango]=$func\nrango[$func]=$siguiente_rango\n((siguiente_rango++))\ndone\n\n# Crea una lista de adyacencia para $2 y también marca los tratados:\ngráfico[$2]=${FUNCS[@]}\n\nfor func in ${FUNCS[@]}; do\n    rastrear_llamadas $1 «${func}»\ndone\n}\n\ninfo «Construyendo gráfico de llamadas recursivamente...»\nrastrear_llamadas "${XML}" "${FUNCTION}"\n```\ny la llamada a la función `construir_gráfico_llamadas(xml_data, "main")`, donde `xml_data` es una cadena XML, tu función debería devolver un diccionario representando el gráfico de llamadas.\n\nNota:\n- El rango asignado a cada función representa la secuencia de llamada. El rango comienza en 1 y aumenta por cada nueva función encontrada.\n- La función `rastrear_llamadas` recibe dos parámetros: `XML` y un nombre de función. Se encarga de llamarse a sí misma recursivamente por cada función encontrada y de añadir los nombres de las funciones a la lista `FUNCS`.\nLa variable `gráfico` es un diccionario que contiene la lista de adyacencia de cada función. Se construye asignando la lista `FUNCS` como valor de la función actual en el diccionario `gráfico`.\n', 'status': 'submitted'}]
{"evolved_from": null, "kind": "synthetic", "source": "argilla/DistiCoder-dpo-binarized"}