diff --git a/5G_Core_Network/.gitignore b/5G_Core_Network/.gitignore old mode 100755 new mode 100644 index 70020ce..833e7a5 --- a/5G_Core_Network/.gitignore +++ b/5G_Core_Network/.gitignore @@ -3,3 +3,4 @@ /logs/ /open5gs/ install_time.txt +!install_patch_files/ diff --git a/5G_Core_Network/README.md b/5G_Core_Network/README.md old mode 100755 new mode 100644 index d2737a7..c5c4a48 --- a/5G_Core_Network/README.md +++ b/5G_Core_Network/README.md @@ -4,7 +4,7 @@ The 5G Core Network operates as a standalone network based on the 3GPP specifica ## Usage -- **Compile**: Use `./full_install.sh` to build the 5G Core. +- **Compile**: Use `./full_install.sh` to build and install the 5G Core components. - **Generate Configurations**: Use `./generate_configurations.sh` to create configuration files. - Configuration files can be accessed and modified in the `configs` directory. - **Start the 5G Core Network**: Use `./run.sh` to start the 5G Core components. @@ -12,12 +12,18 @@ The 5G Core Network operates as a standalone network based on the 3GPP specifica - **Stop the Network**: Terminate the network operation with `./stop.sh`. - **Status**: Check if the 5G Core is running with `./is_running.sh`. The output will display which components are running. - **Logs**: Access logs by navigating to the `logs` directory. +- **Uninstall**: Use `./uninstall.sh` to remove the 5G Core software. + +### Custom Gateway Address for UE Traffic + +To use a custom gateway address for UE traffic, edit the `ogstun_ipv4` and `ogstun_ipv6` fields in `5G_Core_Network/options.yaml`. Default subnets are 10.45.0.0/16 (IPv4) and 2001:db8:cafe::/48 (IPv6). Gateways are set to the first address in each subnet: 10.45.0.1 and 2001:db8:cafe::1, respectively. Apply changes with `./generate_configurations.sh`. ### Custom PLMN and TAC Identifiers -Modify the `5G_Core_Network/options.yaml` for different PLMN and TAC IDs, then apply changes with the following. +Modify the `5G_Core_Network/options.yaml` for different PLMN and TAC IDs, then apply changes with the following: ```console +./install_scripts/unregister_all_subscribers.sh ./generate_configurations.sh ./stop.sh ./run.sh @@ -36,7 +42,9 @@ Alternatively, to create subscriber entries from command line, use the following ./install_scripts/register_subscriber.sh --imsi 001010123456780 --key 00112233445566778899AABBCCDDEEFF --opc 63BFA50EE6523365FF14C1F45F88737D --apn srsapn ``` -By default, the configuration process automatically creates subscriber entries for UE 1, UE 2, and UE 3 based on the following table from the blueprint [[4]][nist-tn]. +Remove all registered subscribers with `./install_scripts/unregister_all_subscribers.sh`. + +By default, the configuration process automatically creates subscriber entries for UE 1, UE 2, and UE 3 based on the following table from the blueprint [[4]][nist-tn]. The IMSI values will be updated accordingly if the PLMN value is changed in options.yaml. diff --git a/5G_Core_Network/full_install.sh b/5G_Core_Network/full_install.sh index 4b0a350..35f7684 100755 --- a/5G_Core_Network/full_install.sh +++ b/5G_Core_Network/full_install.sh @@ -97,32 +97,6 @@ if ! getent group open5gs >/dev/null; then fi sudo usermod -a -G open5gs open5gs -# Step 3: Setting up TUN device -echo "Checking if TUN device ogstun exists..." -if ! ip link show ogstun >/dev/null 2>&1; then - echo "Creating TUN device..." - sudo ip tuntap add name ogstun mode tun -else - echo "TUN device ogstun already exists." -fi - -echo "Checking and assigning IP addresses to TUN device..." -if ! ip addr show ogstun | grep -q "10.45.0.1/16"; then - sudo ip addr add 10.45.0.1/16 dev ogstun -else - echo "IP address 10.45.0.1/16 already assigned to ogstun." -fi - -if ! ip addr show ogstun | grep -q "2001:db8:cafe::1/48"; then - sudo ip addr add 2001:db8:cafe::1/48 dev ogstun -else - echo "IPv6 address 2001:db8:cafe::1/48 already assigned to ogstun." -fi - -echo "Setting TUN device up..." -sudo ip link set ogstun up - -# Step 4: Building Open5GS echo "Installing dependencies for building Open5GS..." # Code from (https://open5gs.org/open5gs/docs/guide/02-building-open5gs-from-sources#building-open5gs): diff --git a/5G_Core_Network/full_uninstall.sh b/5G_Core_Network/full_uninstall.sh new file mode 100755 index 0000000..1a08d0e --- /dev/null +++ b/5G_Core_Network/full_uninstall.sh @@ -0,0 +1,81 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Do not exit immediately if a command fails +set +e + +echo "# Script: $(realpath $0)..." + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +cd "$SCRIPT_DIR" + +echo "Stopping all Open5GS processes..." +./stop.sh + +echo "Reverting network configurations..." +./install_scripts/revert_network_config.sh + +sudo apt-get remove --purge -y open5gs || true + +sudo ./install_scripts/uninstall_mongodb.sh + +echo "Removing Open5GS user and group..." +sudo userdel open5gs +sudo groupdel open5gs + +echo "Removing Open5GS installation directory..." +sudo rm -rf open5gs/ +sudo rm -rf /var/log/open5gs + +echo "Uninstalling WebUI..." +curl -fsSL https://open5gs.org/open5gs/assets/webui/uninstall | sudo -E bash - + +echo "Performing general system cleanup..." +sudo apt-get autoremove -y +sudo apt-get autoclean + +echo "Unsetting LD_LIBRARY_PATH..." +sudo rm -f /etc/profile.d/open5gs_ld_library_path.sh +unset LD_LIBRARY_PATH + +sudo rm -rf logs/ +sudo rm -rf configs/ +sudo rm -rf install_time.txt + +echo +echo +echo "################################################################################" +echo "# Successfully uninstalled 5G Core #" +echo "################################################################################" diff --git a/5G_Core_Network/generate_configurations.sh b/5G_Core_Network/generate_configurations.sh index fdf4765..a50b189 100755 --- a/5G_Core_Network/generate_configurations.sh +++ b/5G_Core_Network/generate_configurations.sh @@ -47,24 +47,71 @@ fi echo "Parsing options.yaml..." # Check if the YAML file exists, if not, set and save default values if [ ! -f "options.yaml" ]; then - echo "plmn: 00101" >"options.yaml" + echo "# Upon modification, apply changes with ./generate_configurations.sh." >>"options.yaml" + echo "" >>"options.yaml" + echo "# If false, AMF will use the default 127.0.0.5, otherwise, it will use the hostname IP" >>"options.yaml" + echo "expose_amf_over_hostname: false" >>"options.yaml" + echo "" >>"options.yaml" + echo "# Include the Security Edge Protection Proxies (SEPP1 and SEPP2)" >>"options.yaml" + echo "include_sepp: false" >>"options.yaml" + echo "" >>"options.yaml" + echo "# Configure the MCC/MNC and TAC" >>"options.yaml" + echo "plmn: 00101" >>"options.yaml" echo "tac: 7" >>"options.yaml" + echo "" >>"options.yaml" + echo "# Configure the ogstun gateway address for UE traffic" >>"options.yaml" + echo "ogstun_ipv4: 10.45.0.0/16" >>"options.yaml" + echo "ogstun_ipv6: 2001:db8:cafe::/48" >>"options.yaml" + echo "" >>"options.yaml" + echo "ogstun2_ipv4: 10.46.0.0/16" >>"options.yaml" + echo "ogstun2_ipv6: 2001:db8:babe::/48" >>"options.yaml" + echo "" >>"options.yaml" + echo "ogstun3_ipv4: 10.47.0.0/16" >>"options.yaml" + echo "ogstun3_ipv6: 2001:db8:face::/48" >>"options.yaml" fi + +# If expose_amf_over_hostname is false, AMF will use the default 127.0.0.5, otherwise, it will use the hostname IP +EXPOSE_AMF_OVER_HOSTNAME=$(yq eval '.expose_amf_over_hostname' options.yaml) +if [[ "$EXPOSE_AMF_OVER_HOSTNAME" == "null" || -z "$EXPOSE_AMF_OVER_HOSTNAME" ]]; then + echo "Missing parameter in options.yaml: expose_amf_over_hostname" + exit 1 +elif [[ "$EXPOSE_AMF_OVER_HOSTNAME" != "true" && "$EXPOSE_AMF_OVER_HOSTNAME" != "false" ]]; then + echo "Invalid value for expose_amf_over_hostname in options.yaml. Expected 'true' or 'false'." + exit 1 +fi + +# Set IS_OPEN5GS_ON_HOST if Open5GS will run on the host machine, otherwise, set it to false +if [ "$EXPOSE_AMF_OVER_HOSTNAME" = true ]; then + IS_OPEN5GS_ON_HOST=true +fi + # Read PLMN and TAC values from the YAML file using yq PLMN=$(yq eval '.plmn' options.yaml) TAC=$(yq eval '.tac' options.yaml) + # Parse Mobile Country Code (MCC) and Mobile Network Code (MNC) from PLMN -PLMN_MCC=${PLMN:0:3} -PLMN_MNC=${PLMN:3} +MCC="${PLMN:0:3}" +if [ ${#PLMN} -eq 5 ]; then + MNC="${PLMN:3:2}" +elif [ ${#PLMN} -eq 6 ]; then + MNC="${PLMN:3:3}" +fi +MNC_LENGTH=${#MNC} echo "PLMN value: $PLMN" -echo "MCC (Mobile Country Code): $PLMN_MCC" -echo "MNC (Mobile Network Code): $PLMN_MNC" +echo "MCC (Mobile Country Code): $MCC" +echo "MNC (Mobile Network Code): $MNC" echo "TAC value: $TAC" echo "Creating configs directory..." -rm -rf "$SCRIPT_DIR/configs" -mkdir "$SCRIPT_DIR/configs" -rm -rf "$SCRIPT_DIR/logs" +rm -rf configs +mkdir configs + +# Only remove the logs if no component is running +RUNNING_STATUS=$(./is_running.sh) +if [[ $RUNNING_STATUS != *": RUNNING"* ]]; then + rm -rf logs + mkdir logs +fi APPS=("mmed" "sgwcd" "smfd" "amfd" "sgwud" "upfd" "hssd" "pcrfd" "nrfd" "scpd" "seppd" "ausfd" "udmd" "pcfd" "nssfd" "bsfd" "udrd" "webui") @@ -153,25 +200,25 @@ update_yaml() { # Function to configure PLMN and TAC in the MME and AMF configurations configure_plmn_tac() { - local PLMN_MCC=$1 - local PLMN_MNC=$2 + local MCC=$1 + local MNC=$2 local TAC=$3 - local MME_CONFIG="configs/mme.yaml" local AMF_CONFIG="configs/amf.yaml" local NRF_CONFIG="configs/nrf.yaml" + local MME_CONFIG="configs/mme.yaml" # LTE - # Update MME and AMF configuration files - sed -i "s/^\(\s*mcc:\s*\).*/\1$PLMN_MCC/" $MME_CONFIG - sed -i "s/^\(\s*mnc:\s*\).*/\1$PLMN_MNC/" $MME_CONFIG - sed -i "s/^\(\s*tac:\s*\).*/\1$TAC/" $MME_CONFIG - - sed -i "s/^\(\s*mcc:\s*\).*/\1$PLMN_MCC/" $AMF_CONFIG - sed -i "s/^\(\s*mnc:\s*\).*/\1$PLMN_MNC/" $AMF_CONFIG + # Update AMF, NRF, and MME configuration files + sed -i "s/^\(\s*mcc:\s*\).*/\1$MCC/" $AMF_CONFIG + sed -i "s/^\(\s*mnc:\s*\).*/\1$MNC/" $AMF_CONFIG sed -i "s/^\(\s*tac:\s*\).*/\1$TAC/" $AMF_CONFIG - sed -i "s/^\(\s*mcc:\s*\).*/\1$PLMN_MCC/" $NRF_CONFIG - sed -i "s/^\(\s*mnc:\s*\).*/\1$PLMN_MNC/" $NRF_CONFIG + sed -i "s/^\(\s*mcc:\s*\).*/\1$MCC/" $NRF_CONFIG + sed -i "s/^\(\s*mnc:\s*\).*/\1$MNC/" $NRF_CONFIG sed -i "s/^\(\s*tac:\s*\).*/\1$TAC/" $NRF_CONFIG + + sed -i "s/^\(\s*mcc:\s*\).*/\1$MCC/" $MME_CONFIG + sed -i "s/^\(\s*mnc:\s*\).*/\1$MNC/" $MME_CONFIG + sed -i "s/^\(\s*tac:\s*\).*/\1$TAC/" $MME_CONFIG } # Function to set the logging path, disable timestamp for stderr to avoid duplicate timestamps in journalctl @@ -187,47 +234,103 @@ configure_logging() { update_yaml "$CONFIG_PATH" "logger.file" "path" "$SCRIPT_DIR/$LOG_PATH" } -# Function to get the primary IP for the network segment by resetting the last octet to 1 -get_primary_ip_for_network() { - local IP_ADDRESS=$1 - # Extract the first three octets and append .1 to get the primary IP for the network - local PRIMARY_IP=$(echo "$IP_ADDRESS" | awk -F '.' '{print $1"."$2"."$3".1"}') - echo $PRIMARY_IP -} +# In standalone mode, use AMF instead of MME +STANDALONE_MODE="true" -# Function to get the ngap_server configuration IP -get_configuration_ngap_server_ip() { - local FILE_PATH="configs/amf.yaml" - # Use yq to parse the YAML file and extract the IP address - local IP_ADDRESS=$(yq e '.amf.ngap.server[0].address' "$FILE_PATH") - if [[ -n $IP_ADDRESS ]]; then - echo $IP_ADDRESS +# Function to set the ngap_server configuration IP +set_configuration_server_ips() { + local IP_ADDRESS=$1 + # Use yq to parse the YAML file and update the IP address + if [ "$STANDALONE_MODE" = true ]; then + # From (https://open5gs.org/open5gs/docs/guide/01-quickstart/#setup-a-5g-core): + local AMF_FILE_PATH="configs/amf.yaml" + local UPF_FILE_PATH="configs/upf.yaml" + yq e -i ".amf.ngap.server[0].address = \"$IP_ADDRESS\"" "$AMF_FILE_PATH" + yq e -i ".upf.gtpu.server[0].address = \"$IP_ADDRESS\"" "$UPF_FILE_PATH" else - echo "IP address not found." + # From (https://open5gs.org/open5gs/docs/guide/01-quickstart/#setup-a-4g-5g-nsa-core): + local MME_FILE_PATH="configs/mme.yaml" # LTE + local SGWU_FILE_PATH="configs/sgwu.yaml" + yq e -i ".mme.s1ap.server[0].address = \"$IP_ADDRESS\"" "$MME_FILE_PATH" + yq e -i ".sgwu.gtpu.server[0].address = \"$IP_ADDRESS\"" "$SGWU_FILE_PATH" fi } -# Function to set the ngap_server configuration IP -set_configuration_ngap_and_gptu_server_ip() { - local AMF_FILE_PATH="configs/amf.yaml" +set_configuration_session_gateways() { + local SUBNET_IPV4=$1 + local GATEWAY_IPV4=$2 + local SUBNET_IPV6=$3 + local GATEWAY_IPV6=$4 + + local SMF_FILE_PATH="configs/smf.yaml" local UPF_FILE_PATH="configs/upf.yaml" - local IP_ADDRESS=$1 - # Use yq to parse the YAML file and update the IP address - yq e -i ".amf.ngap.server[0].address = \"$IP_ADDRESS\"" "$AMF_FILE_PATH" - yq e -i ".upf.gtpu.server[0].address = \"$IP_ADDRESS\"" "$UPF_FILE_PATH" + + yq e -i ".upf.session[0].subnet = \"$SUBNET_IPV4\"" "$UPF_FILE_PATH" + yq e -i ".upf.session[0].gateway = \"$GATEWAY_IPV4\"" "$UPF_FILE_PATH" + yq e -i ".upf.session[1].subnet = \"$SUBNET_IPV6\"" "$UPF_FILE_PATH" + yq e -i ".upf.session[1].gateway = \"$GATEWAY_IPV6\"" "$UPF_FILE_PATH" + + yq e -i ".smf.session[0].subnet = \"$SUBNET_IPV4\"" "$SMF_FILE_PATH" + yq e -i ".smf.session[0].gateway = \"$GATEWAY_IPV4\"" "$SMF_FILE_PATH" + yq e -i ".smf.session[1].subnet = \"$SUBNET_IPV6\"" "$SMF_FILE_PATH" + yq e -i ".smf.session[1].gateway = \"$GATEWAY_IPV6\"" "$SMF_FILE_PATH" +} + +OGSTUN_IPV4=$(yq eval '.ogstun_ipv4' options.yaml) +OGSTUN_IPV6=$(yq eval '.ogstun_ipv6' options.yaml) +if [[ "$OGSTUN_IPV4" == "null" || -z "$OGSTUN_IPV4" ]]; then + echo "Missing parameter in options.yaml: ogstun_ipv4" + exit 1 +fi +if [[ "$OGSTUN_IPV6" == "null" || -z "$OGSTUN_IPV6" ]]; then + echo "Missing parameter in options.yaml: ogstun_ipv6" + exit 1 +fi + +# Extract the first IPv4 address from a CIDR block by replacing the last octet with '.1' +# For example, 10.45.0.0/16 --> 10.45.0.1/16 +grab_first_ipv4_address() { + local IP=$1 + echo ${IP%.*}.1/${IP#*/} } -# To expose the core network to the external network, set EXPOSE_CORE_EXTERNALLY to true -EXPOSE_CORE_EXTERNALLY=false +# Extract the first IPv6 address from a CIDR block by replacing the suffix with '::1'. +# For example, 2001:db8:cafe::/48 --> 2001:db8:cafe::1/48 +grab_first_ipv6_address() { + local IP=$1 + echo ${IP%::*}::1/${IP#*/} +} + +# Remove the CIDR suffix from an IP address +# For example, 10.45.0.1/16 --> 10.45.0.1 +remove_cidr_suffix() { + local IP=$1 + echo ${IP%/*} +} -if [ "$EXPOSE_CORE_EXTERNALLY" = true ]; then - IP_ADDRESS=$(hostname -I | awk '{print $1}') - set_configuration_ngap_and_gptu_server_ip $IP_ADDRESS +# Extract the first IPv4 and IPv6 addresses from the CIDR blocks +OGSTUN_IPV4_1=$(grab_first_ipv4_address "$OGSTUN_IPV4") +OGSTUN_IPV6_1=$(grab_first_ipv6_address "$OGSTUN_IPV6") +OGSTUN_IPV4_1_NO_CIDR=$(remove_cidr_suffix "$OGSTUN_IPV4_1") +OGSTUN_IPV6_1_NO_CIDR=$(remove_cidr_suffix "$OGSTUN_IPV6_1") + +if [ "$EXPOSE_AMF_OVER_HOSTNAME" = true ]; then + AMF_IP=$(hostname -I | awk '{print $1}') + set_configuration_server_ips $AMF_IP + # Need an address for the gNodeB to bind to that is not the host IP. + if [ "$IS_OPEN5GS_ON_HOST" = true ]; then + AMF_IP_BIND=$OGSTUN_IPV4_1_NO_CIDR + else + AMF_IP_BIND=$AMF_IP + fi +else + AMF_IP="127.0.0.5" + AMF_IP_BIND="127.0.0.1" fi +set_configuration_session_gateways $OGSTUN_IPV4 $OGSTUN_IPV4_1_NO_CIDR $OGSTUN_IPV6 $OGSTUN_IPV6_1_NO_CIDR + # Get the following AMF IP, and it will be updated in the configuration file -AMF_IP=$(get_configuration_ngap_server_ip) -AMF_IP_BIND=$(get_primary_ip_for_network $AMF_IP) AMF_ADDRESSES_OUTPUT="configs/get_amf_address.txt" echo "$AMF_IP" >$AMF_ADDRESSES_OUTPUT echo "$AMF_IP_BIND" >>$AMF_ADDRESSES_OUTPUT @@ -235,36 +338,46 @@ echo "$AMF_IP_BIND" >>$AMF_ADDRESSES_OUTPUT # Configure logging for all components for APP_NAME in "${APP_NAMES[@]}"; do if [ -f "configs/${APP_NAME}.yaml" ]; then - configure_logging "logs/${APP_NAME}.txt" "configs/${APP_NAME}.yaml" + configure_logging "logs/${APP_NAME}.log" "configs/${APP_NAME}.yaml" fi done # Configure the PLMN and TAC to match regulatory requirements -configure_plmn_tac $PLMN_MCC $PLMN_MNC $TAC +configure_plmn_tac $MCC $MNC $TAC + +sudo ./install_scripts/network_config.sh -# Add route for the UE to have WAN connectivity -### Enable IPv4/IPv6 Forwarding +# Enable IPv4/IPv6 Forwarding sudo sysctl -w net.ipv4.ip_forward=1 sudo sysctl -w net.ipv6.conf.all.forwarding=1 -### Add NAT Rule -sudo iptables --wait -t nat -A POSTROUTING -s 10.45.0.0/16 ! -o ogstun -j MASQUERADE -sudo ip6tables --wait -t nat -A POSTROUTING -s 2001:db8:cafe::/48 ! -o ogstun -j MASQUERADE + echo "By default, Ubuntu enables a firewall that blocks the UE from accessing the internet. Disabling the firewall..." sudo ufw status || true sudo ./install_scripts/disable_firewall.sh sudo ufw status || true -mkdir -p "$SCRIPT_DIR/logs" -sudo chown $USER:$USER -R "$SCRIPT_DIR/logs" +# echo "Unregistering all subscribers in Open5GS database..." +# ./install_scripts/unregister_all_subscribers.sh + +PLMN_LENGTH=${#PLMN} +echo echo "Registering UE 1..." -./install_scripts/register_subscriber.sh --imsi 001010123456780 --key 00112233445566778899AABBCCDDEEFF --opc 63BFA50EE6523365FF14C1F45F88737D --apn srsapn +IMSI="001010123456780" +IMSI="${PLMN}${IMSI:$PLMN_LENGTH}" # Ensure that the beginning of the IMSI is the correct PLMN +./install_scripts/register_subscriber.sh --imsi $IMSI --key 00112233445566778899AABBCCDDEEFF --opc 63BFA50EE6523365FF14C1F45F88737D --apn srsapn +echo echo "Registering UE 2..." -./install_scripts/register_subscriber.sh --imsi 001010123456790 --key 00112233445566778899AABBCCDDEF00 --opc 63BFA50EE6523365FF14C1F45F88737D --apn srsapn +IMSI="001010123456790" +IMSI="${PLMN}${IMSI:$PLMN_LENGTH}" # Ensure that the beginning of the IMSI is the correct PLMN +./install_scripts/register_subscriber.sh --imsi $IMSI --key 00112233445566778899AABBCCDDEF00 --opc 63BFA50EE6523365FF14C1F45F88737D --apn srsapn +echo echo "Registering UE 3..." -./install_scripts/register_subscriber.sh --imsi 001010123456791 --key 00112233445566778899AABBCCDDEF01 --opc 63BFA50EE6523365FF14C1F45F88737D --apn srsapn +IMSI="001010123456791" +IMSI="${PLMN}${IMSI:$PLMN_LENGTH}" # Ensure that the beginning of the IMSI is the correct PLMN +./install_scripts/register_subscriber.sh --imsi $IMSI --key 00112233445566778899AABBCCDDEF01 --opc 63BFA50EE6523365FF14C1F45F88737D --apn srsapn # Restart Open5GS services to apply changes echo "To apply changed, stop and start the following:" diff --git a/5G_Core_Network/install_scripts/install_mongodb.sh b/5G_Core_Network/install_scripts/install_mongodb.sh index fffa402..5cd7486 100755 --- a/5G_Core_Network/install_scripts/install_mongodb.sh +++ b/5G_Core_Network/install_scripts/install_mongodb.sh @@ -71,7 +71,7 @@ else echo "Removing conflicting MongoDB packages..." # Remove all installed MongoDB-related packages - sudo apt-get purge -y mongodb-org mongodb-org-server mongodb-org-shell mongodb-org-mongos mongodb-org-tools \ + sudo apt-get remove --purge -y mongodb-org mongodb-org-server mongodb-org-shell mongodb-org-mongos mongodb-org-tools \ mongodb-server mongodb-server-core mongodb-clients || { echo "Failed to remove conflicting MongoDB packages" exit 1 diff --git a/5G_Core_Network/install_scripts/network_config.sh b/5G_Core_Network/install_scripts/network_config.sh index 7e14a3a..283a135 100755 --- a/5G_Core_Network/install_scripts/network_config.sh +++ b/5G_Core_Network/install_scripts/network_config.sh @@ -30,48 +30,166 @@ echo "# Script: $(realpath $0)..." -# Define the interface and addresses -INTERFACE="ogstun" -IPv4_ADDR="10.45.0.1/16" -IPv6_ADDR="2001:db8:cafe::1/48" -IPv4_SUBNET="10.45.0.0/16" +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +if [ ! -f options.yaml ]; then + echo "File options.yaml does not exist. Please generate configurations first." + exit 1 +fi + +DEFAULT_OGSTUN_IPV4=10.45.0.0/16 +DEFAULT_OGSTUN_IPV6=2001:db8:cafe::/48 +DEFAULT_OGSTUN2_IPV4=10.46.0.0/16 +DEFAULT_OGSTUN2_IPV6=2001:db8:babe::/48 +DEFAULT_OGSTUN3_IPV4=10.47.0.0/16 +DEFAULT_OGSTUN3_IPV6=2001:db8:face::/48 +OGSTUN_IPV4=$(yq eval '.ogstun_ipv4' options.yaml) +OGSTUN_IPV6=$(yq eval '.ogstun_ipv6' options.yaml) +OGSTUN2_IPV4=$(yq eval '.ogstun2_ipv4' options.yaml) +OGSTUN2_IPV6=$(yq eval '.ogstun2_ipv6' options.yaml) +OGSTUN3_IPV4=$(yq eval '.ogstun3_ipv4' options.yaml) +OGSTUN3_IPV6=$(yq eval '.ogstun3_ipv6' options.yaml) +if [[ "$OGSTUN_IPV4" == "null" || -z "$OGSTUN_IPV4" ]]; then + echo "Missing parameter in options.yaml: ogstun_ipv4" + exit 1 +fi +if [[ "$OGSTUN_IPV6" == "null" || -z "$OGSTUN_IPV6" ]]; then + echo "Missing parameter in options.yaml: ogstun_ipv6" + exit 1 +fi +if [[ "$OGSTUN2_IPV4" == "null" || -z "$OGSTUN2_IPV4" ]]; then + echo "Missing parameter in options.yaml: ogstun2_ipv4" + exit 1 +fi +if [[ "$OGSTUN2_IPV6" == "null" || -z "$OGSTUN2_IPV6" ]]; then + echo "Missing parameter in options.yaml: ogstun2_ipv6" + exit 1 +fi +if [[ "$OGSTUN3_IPV4" == "null" || -z "$OGSTUN3_IPV4" ]]; then + echo "Missing parameter in options.yaml: ogstun3_ipv4" + exit 1 +fi +if [[ "$OGSTUN3_IPV6" == "null" || -z "$OGSTUN3_IPV6" ]]; then + echo "Missing parameter in options.yaml: ogstun3_ipv6" + exit 1 +fi + +# Extract the first IPv4 address from a CIDR block by replacing the last octet with '.1' +# For example, 10.45.0.0/16 --> 10.45.0.1/16 +grab_first_ipv4_address() { + local IP=$1 + echo ${IP%.*}.1/${IP#*/} +} + +# Extract the first IPv6 address from a CIDR block by replacing the suffix with '::1'. +# For example, 2001:db8:cafe::/48 --> 2001:db8:cafe::1/48 +grab_first_ipv6_address() { + local IP=$1 + echo ${IP%::*}::1/${IP#*/} +} + +# Extract the first IPv4 and IPv6 addresses from the CIDR blocks +DEFAULT_OGSTUN_IPV4_1=$(grab_first_ipv4_address "$DEFAULT_OGSTUN_IPV4") +DEFAULT_OGSTUN_IPV6_1=$(grab_first_ipv6_address "$DEFAULT_OGSTUN_IPV6") +DEFAULT_OGSTUN2_IPV4_1=$(grab_first_ipv4_address "$DEFAULT_OGSTUN2_IPV4") +DEFAULT_OGSTUN2_IPV6_1=$(grab_first_ipv6_address "$DEFAULT_OGSTUN2_IPV6") +DEFAULT_OGSTUN3_IPV4_1=$(grab_first_ipv4_address "$DEFAULT_OGSTUN3_IPV4") +DEFAULT_OGSTUN3_IPV6_1=$(grab_first_ipv6_address "$DEFAULT_OGSTUN3_IPV6") +OGSTUN_IPV4_1=$(grab_first_ipv4_address "$OGSTUN_IPV4") +OGSTUN_IPV6_1=$(grab_first_ipv6_address "$OGSTUN_IPV6") +OGSTUN2_IPV4_1=$(grab_first_ipv4_address "$OGSTUN2_IPV4") +OGSTUN2_IPV6_1=$(grab_first_ipv6_address "$OGSTUN2_IPV6") +OGSTUN3_IPV4_1=$(grab_first_ipv4_address "$OGSTUN3_IPV4") +OGSTUN3_IPV6_1=$(grab_first_ipv6_address "$OGSTUN3_IPV6") # Check if the tun interface already exists, if not, add it -if ! ip link show $INTERFACE >/dev/null 2>&1; then - echo "Adding TUN interface $INTERFACE..." - sudo ip tuntap add name $INTERFACE mode tun +if ! ip link show ogstun >/dev/null 2>&1; then + echo "Adding TUN interface ogstun..." + sudo ip tuntap add name ogstun mode tun +fi +if ! ip link show ogstun2 >/dev/null 2>&1; then + echo "Adding TUN interface ogstun2..." + sudo ip tuntap add name ogstun2 mode tun +fi +if ! ip link show ogstun3 >/dev/null 2>&1; then + echo "Adding TUN interface ogstun3..." + sudo ip tuntap add name ogstun3 mode tun +fi + +echo "Checking and assigning IP addresses to TUN device..." +if ! ip addr show ogstun | grep -q "$DEFAULT_OGSTUN_IPV4_1"; then + sudo ip addr add $DEFAULT_OGSTUN_IPV4_1 dev ogstun +else + echo "IP address $DEFAULT_OGSTUN_IPV4_1 already assigned to ogstun." fi -# Check if the IPv4 address is already assigned, if not, add it -if ! ip addr show $INTERFACE | grep -q $IPv4_ADDR; then - echo "Adding IPv4 address $IPv4_ADDR to $INTERFACE..." - sudo ip addr add $IPv4_ADDR dev $INTERFACE +if ! ip addr show ogstun | grep -q "$DEFAULT_OGSTUN_IPV6_1"; then + sudo ip addr add $DEFAULT_OGSTUN_IPV6_1 dev ogstun +else + echo "IPv6 address $DEFAULT_OGSTUN_IPV6_1 already assigned to ogstun." fi -# Check if the IPv6 address is already assigned, if not, add it -if ! ip addr show $INTERFACE | grep -q $IPv6_ADDR; then - echo "Adding IPv6 address $IPv6_ADDR to $INTERFACE..." - sudo ip addr add $IPv6_ADDR dev $INTERFACE +if [ ! -f open5gs/misc/netconf.sh ]; then + echo "File open5gs/misc/netconf.sh does not exist." + exit 1 fi -# Bring the interface up if it's not already up -if ! ip link show $INTERFACE | grep -q "state UP"; then - echo "Bringing up $INTERFACE..." - sudo ip link set $INTERFACE up +# Escape periods in the IPv4 addresses for sed +DEFAULT_OGSTUN_IPV4_ESC=$(echo $DEFAULT_OGSTUN_IPV4 | sed 's/\./\\./g') +DEFAULT_OGSTUN2_IPV4_ESC=$(echo $DEFAULT_OGSTUN2_IPV4 | sed 's/\./\\./g') +DEFAULT_OGSTUN3_IPV4_ESC=$(echo $DEFAULT_OGSTUN3_IPV4 | sed 's/\./\\./g') +OGSTUN_IPV4_ESC=$(echo $OGSTUN_IPV4 | sed 's/\./\\./g') +OGSTUN2_IPV4_ESC=$(echo $OGSTUN2_IPV4 | sed 's/\./\\./g') +OGSTUN3_IPV4_ESC=$(echo $OGSTUN3_IPV4 | sed 's/\./\\./g') +DEFAULT_OGSTUN_IPV4_1_ESC=$(echo $DEFAULT_OGSTUN_IPV4_1 | sed 's/\./\\./g') +DEFAULT_OGSTUN2_IPV4_1_ESC=$(echo $DEFAULT_OGSTUN2_IPV4_1 | sed 's/\./\\./g') +DEFAULT_OGSTUN3_IPV4_1_ESC=$(echo $DEFAULT_OGSTUN3_IPV4_1 | sed 's/\./\\./g') +OGSTUN_IPV4_1_ESC=$(echo $OGSTUN_IPV4_1 | sed 's/\./\\./g') +OGSTUN2_IPV4_1_ESC=$(echo $OGSTUN2_IPV4_1 | sed 's/\./\\./g') +OGSTUN3_IPV4_1_ESC=$(echo $OGSTUN3_IPV4_1 | sed 's/\./\\./g') + +if [ ! -f open5gs/misc/netconf.sh.previous ]; then + # Backup the original netconf.sh script + cp open5gs/misc/netconf.sh open5gs/misc/netconf.sh.previous +else + # Restore the original netconf.sh script + cp open5gs/misc/netconf.sh.previous open5gs/misc/netconf.sh fi +sed -i "s|$DEFAULT_OGSTUN_IPV4_ESC|$OGSTUN_IPV4_ESC|g" open5gs/misc/netconf.sh +sed -i "s|$DEFAULT_OGSTUN_IPV6|$OGSTUN_IPV6|g" open5gs/misc/netconf.sh +sed -i "s|$DEFAULT_OGSTUN2_IPV4_ESC|$OGSTUN2_IPV4_ESC|g" open5gs/misc/netconf.sh +sed -i "s|$DEFAULT_OGSTUN2_IPV6|$OGSTUN2_IPV6|g" open5gs/misc/netconf.sh +sed -i "s|$DEFAULT_OGSTUN3_IPV4_ESC|$OGSTUN3_IPV4_ESC|g" open5gs/misc/netconf.sh +sed -i "s|$DEFAULT_OGSTUN3_IPV6|$OGSTUN3_IPV6|g" open5gs/misc/netconf.sh +sed -i "s|$DEFAULT_OGSTUN_IPV4_1_ESC|$OGSTUN_IPV4_1_ESC|g" open5gs/misc/netconf.sh +sed -i "s|$DEFAULT_OGSTUN_IPV6_1|$OGSTUN_IPV6_1|g" open5gs/misc/netconf.sh +sed -i "s|$DEFAULT_OGSTUN2_IPV4_1_ESC|$OGSTUN2_IPV4_1_ESC|g" open5gs/misc/netconf.sh +sed -i "s|$DEFAULT_OGSTUN2_IPV6_1|$OGSTUN2_IPV6_1|g" open5gs/misc/netconf.sh +sed -i "s|$DEFAULT_OGSTUN3_IPV4_1_ESC|$OGSTUN3_IPV4_1_ESC|g" open5gs/misc/netconf.sh +sed -i "s|$DEFAULT_OGSTUN3_IPV6_1|$OGSTUN3_IPV6_1|g" open5gs/misc/netconf.sh + +echo "Running patched Open5GS netconf.sh script..." +cd open5gs/misc +sudo ./netconf.sh +cd .. + # Enable IP forwarding sudo sysctl -w net.ipv4.ip_forward=1 sudo sysctl -w net.ipv6.conf.all.forwarding=1 # Check if the iptables MASQUERADE rule already exists, if not, add it -if ! sudo iptables --wait -t nat -C POSTROUTING -s $IPv4_SUBNET ! -o $INTERFACE -j MASQUERADE 2>/dev/null; then +if ! sudo iptables --wait -t nat -C POSTROUTING -s $DEFAULT_OGSTUN_IPV4 ! -o ogstun -j MASQUERADE 2>/dev/null; then echo "Adding iptables MASQUERADE rule for IPv4..." - sudo iptables --wait -t nat -A POSTROUTING -s $IPv4_SUBNET ! -o $INTERFACE -j MASQUERADE + sudo iptables --wait -t nat -A POSTROUTING -s $DEFAULT_OGSTUN_IPV4 ! -o ogstun -j MASQUERADE fi # Check if the ip6tables MASQUERADE rule already exists, if not, add it -if ! sudo ip6tables --wait -t nat -C POSTROUTING -s $IPv6_SUBNET -o $INTERFACE -j MASQUERADE 2>/dev/null; then +if ! sudo ip6tables --wait -t nat -C POSTROUTING -s $DEFAULT_OGSTUN_IPV6 -o ogstun -j MASQUERADE 2>/dev/null; then echo "Adding ip6tables MASQUERADE rule for IPv6..." - sudo ip6tables --wait -t nat -A POSTROUTING -s $IPv6_SUBNET -o $INTERFACE -j MASQUERADE 2>/dev/null + sudo ip6tables --wait -t nat -A POSTROUTING -s $DEFAULT_OGSTUN_IPV6 -o ogstun -j MASQUERADE 2>/dev/null fi + +echo "Configured network settings for Open5GS." diff --git a/5G_Core_Network/install_scripts/revert_network_config.sh b/5G_Core_Network/install_scripts/revert_network_config.sh new file mode 100755 index 0000000..b7fea76 --- /dev/null +++ b/5G_Core_Network/install_scripts/revert_network_config.sh @@ -0,0 +1,110 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +set -e + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +if [ ! -f options.yaml ]; then + echo "File options.yaml does not exist. Please generate configurations first." + exit 1 +fi + +DEFAULT_OGSTUN_IPV4=10.45.0.0/16 +DEFAULT_OGSTUN_IPV6=2001:db8:cafe::/48 +DEFAULT_OGSTUN2_IPV4=10.46.0.0/16 +DEFAULT_OGSTUN2_IPV6=2001:db8:babe::/48 +DEFAULT_OGSTUN3_IPV4=10.47.0.0/16 +DEFAULT_OGSTUN3_IPV6=2001:db8:face::/48 +OGSTUN_IPV4=$(yq eval '.ogstun_ipv4' options.yaml) +OGSTUN_IPV6=$(yq eval '.ogstun_ipv6' options.yaml) +OGSTUN2_IPV4=$(yq eval '.ogstun2_ipv4' options.yaml) +OGSTUN2_IPV6=$(yq eval '.ogstun2_ipv6' options.yaml) +OGSTUN3_IPV4=$(yq eval '.ogstun3_ipv4' options.yaml) +OGSTUN3_IPV6=$(yq eval '.ogstun3_ipv6' options.yaml) +if [[ "$OGSTUN_IPV4" == "null" || -z "$OGSTUN_IPV4" ]]; then + echo "Missing parameter in options.yaml: ogstun_ipv4" + exit 1 +fi +if [[ "$OGSTUN_IPV6" == "null" || -z "$OGSTUN_IPV6" ]]; then + echo "Missing parameter in options.yaml: ogstun_ipv6" + exit 1 +fi +if [[ "$OGSTUN2_IPV4" == "null" || -z "$OGSTUN2_IPV4" ]]; then + echo "Missing parameter in options.yaml: ogstun2_ipv4" + exit 1 +fi +if [[ "$OGSTUN2_IPV6" == "null" || -z "$OGSTUN2_IPV6" ]]; then + echo "Missing parameter in options.yaml: ogstun2_ipv6" + exit 1 +fi +if [[ "$OGSTUN3_IPV4" == "null" || -z "$OGSTUN3_IPV4" ]]; then + echo "Missing parameter in options.yaml: ogstun3_ipv4" + exit 1 +fi +if [[ "$OGSTUN3_IPV6" == "null" || -z "$OGSTUN3_IPV6" ]]; then + echo "Missing parameter in options.yaml: ogstun3_ipv6" + exit 1 +fi + +# Remove sysctl settings +if [ -f /etc/sysctl.d/30-open5gs.conf ]; then + rm /etc/sysctl.d/30-open5gs.conf + sysctl -p +fi + +# Remove IPv4 and IPv6 addresses from the interfaces +for INTERFACE in ogstun ogstun2 ogstun3; do + if ip link show $INTERFACE >/dev/null 2>&1; then + sudo ip addr flush dev $INTERFACE + ip link set $INTERFACE down + ip link del $INTERFACE + fi +done + +# Remove iptables and ip6tables MASQUERADE rules +sudo iptables --wait -t nat -D POSTROUTING -s $DEFAULT_OGSTUN_IPV4 ! -o ogstun -j MASQUERADE 2>/dev/null || true +sudo ip6tables --wait -t nat -D POSTROUTING -s $DEFAULT_OGSTUN_IPV6 -o ogstun -j MASQUERADE 2>/dev/null || true +sudo iptables --wait -t nat -D POSTROUTING -s $DEFAULT_OGSTUN2_IPV4 ! -o ogstun2 -j MASQUERADE 2>/dev/null || true +sudo ip6tables --wait -t nat -D POSTROUTING -s $DEFAULT_OGSTUN2_IPV6 -o ogstun -j2 MASQUERADE 2>/dev/null || true +sudo iptables --wait -t nat -D POSTROUTING -s $DEFAULT_OGSTUN3_IPV4 ! -o ogstun -j MASQUERADE 2>/dev/null || true +sudo ip6tables --wait -t nat -D POSTROUTING -s $DEFAULT_OGSTUN3_IPV6 -o ogstun -j MASQUERADE 2>/dev/null || true +sudo iptables --wait -t nat -D POSTROUTING -s $OGSTUN_IPV4 ! -o ogstun -j MASQUERADE 2>/dev/null || true +sudo ip6tables --wait -t nat -D POSTROUTING -s $OGSTUN_IPV6 -o ogstun -j MASQUERADE 2>/dev/null || true +sudo iptables --wait -t nat -D POSTROUTING -s $OGSTUN2_IPV4 ! -o ogstun2 -j MASQUERADE 2>/dev/null || true +sudo ip6tables --wait -t nat -D POSTROUTING -s $OGSTUN2_IPV6 -o ogstun -j2 MASQUERADE 2>/dev/null || true +sudo iptables --wait -t nat -D POSTROUTING -s $OGSTUN3_IPV4 ! -o ogstun -j MASQUERADE 2>/dev/null || true +sudo ip6tables --wait -t nat -D POSTROUTING -s $OGSTUN3_IPV6 -o ogstun -j MASQUERADE 2>/dev/null || true + +# Disable IP forwarding +sudo sysctl -w net.ipv4.ip_forward=0 >/dev/null 2>&1 +sudo sysctl -w net.ipv6.conf.all.forwarding=0 >/dev/null 2>&1 diff --git a/5G_Core_Network/install_scripts/uninstall_mongodb.sh b/5G_Core_Network/install_scripts/uninstall_mongodb.sh index f1ce50a..0f5df0d 100755 --- a/5G_Core_Network/install_scripts/uninstall_mongodb.sh +++ b/5G_Core_Network/install_scripts/uninstall_mongodb.sh @@ -28,22 +28,19 @@ # damage to property. The software developed by NIST employees is not subject to # copyright protection within the United States. -# Don't exit immediately if a command fails +# Do not exit immediately if a command fails set +e echo "# Script: $(realpath $0)..." -SCRIPT_DIR=$(dirname "$(realpath "$0")") -cd "$(dirname "$SCRIPT_DIR")" - # Stop and disable the MongoDB service -sudo systemctl stop mongod -sudo systemctl disable mongod - -#!!!!!!!!!!!!!!!!!!TODO if mongodb was uninstalled after purge THEN it's okay to remove the other stuff, otherwise it's used by another dependency... +if systemctl is-active --quiet mongod; then + sudo systemctl stop mongod + sudo systemctl disable mongod +fi # Uninstall the MongoDB packages -sudo apt-get purge -y mongodb-org mongodb-org-server mongodb-org-shell mongodb-org-mongos mongodb-org-tools mongosh +sudo apt-get remove --purge -y mongodb-org mongodb-org-server mongodb-org-shell mongodb-org-mongos mongodb-org-tools mongosh # Remove MongoDB and its user and group sudo userdel mongodb @@ -69,5 +66,3 @@ echo "mongodb-org-tools install" | sudo dpkg --set-selections sudo apt-get autoremove -y sudo apt-get clean - -sudo apt-get purge -y libssl1.1 diff --git a/5G_Core_Network/install_scripts/unregister_all_subscribers.sh b/5G_Core_Network/install_scripts/unregister_all_subscribers.sh new file mode 100755 index 0000000..bade6f9 --- /dev/null +++ b/5G_Core_Network/install_scripts/unregister_all_subscribers.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +echo "# Script: $(realpath $0)..." + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +cd "$(dirname "$SCRIPT_DIR")" + +DBCTL_DIR="./open5gs/misc/db/open5gs-dbctl" + +# Command to remove all subscribers using the open5gs-dbctl tool +CMD="$DBCTL_DIR reset" + +echo "Running command: $CMD" +$CMD + +# Check exit status of the command +if [ $? -eq 0 ]; then + echo "Subscribers successfully removed from the database." + $DBCTL_DIR showpretty +else + echo "Failed to remove subscribers from the database." +fi diff --git a/5G_Core_Network/is_running.sh b/5G_Core_Network/is_running.sh index c71297c..722da52 100755 --- a/5G_Core_Network/is_running.sh +++ b/5G_Core_Network/is_running.sh @@ -50,13 +50,17 @@ check_service() { fi } +INCLUDE_SEPP=$(yq eval '.include_sepp' options.yaml) + # Latest components (see https://open5gs.org/open5gs/docs/guide/01-quickstart/#:~:text=Starting%20and%20Stopping%20Open5GS) APPS=("mmed" "sgwcd" "smfd" "amfd" "sgwud" "upfd" "hssd" "pcrfd" "nrfd" "scpd" "seppd" "ausfd" "udmd" "pcfd" "nssfd" "bsfd" "udrd" "webui") for APP in "${APPS[@]}"; do if [ "$APP" == "seppd" ]; then - check_service "seppd.*sepp1.yaml" "seppd_1" - check_service "seppd.*sepp2.yaml" "seppd_2" + if [ "$INCLUDE_SEPP" == true ]; then + check_service "seppd.*sepp1.yaml" "seppd_1" + check_service "seppd.*sepp2.yaml" "seppd_2" + fi else check_service "$APP" "$APP" fi diff --git a/5G_Core_Network/options.yaml b/5G_Core_Network/options.yaml old mode 100755 new mode 100644 index c8c6457..f6a3d15 --- a/5G_Core_Network/options.yaml +++ b/5G_Core_Network/options.yaml @@ -1,2 +1,21 @@ +# Upon modification, apply changes with ./generate_configurations.sh. + +# If false, AMF will use the default 127.0.0.5, otherwise, it will use the hostname IP +expose_amf_over_hostname: false + +# Include the Security Edge Protection Proxies (SEPP1 and SEPP2) +include_sepp: false + +# Configure the MCC/MNC and TAC plmn: 00101 tac: 7 + +# Configure the ogstun gateway address for UE traffic +ogstun_ipv4: 10.45.0.0/16 +ogstun_ipv6: 2001:db8:cafe::/48 + +ogstun2_ipv4: 10.46.0.0/16 +ogstun2_ipv6: 2001:db8:babe::/48 + +ogstun3_ipv4: 10.47.0.0/16 +ogstun3_ipv6: 2001:db8:face::/48 diff --git a/5G_Core_Network/run.sh b/5G_Core_Network/run.sh index c743750..b45277d 100755 --- a/5G_Core_Network/run.sh +++ b/5G_Core_Network/run.sh @@ -44,34 +44,44 @@ mkdir -p logs sudo ./install_scripts/network_config.sh +INCLUDE_SEPP=$(yq eval '.include_sepp' options.yaml) + run_in_background() { local APP_NAME="open5gs-$1" if [ "$1" == "seppd" ]; then - local SEPP1_RUNNING=$(pgrep -f "$APP_NAME.*sepp1.yaml") - local SEPP2_RUNNING=$(pgrep -f "$APP_NAME.*sepp2.yaml") - if [ -z "$SEPP1_RUNNING" ]; then - CONFIG_FILE_1="$SCRIPT_DIR/configs/sepp1.yaml" - if [ ! -f "$CONFIG_FILE_1" ]; then - echo "Configuration file not found: $CONFIG_FILE_1" - exit 1 + if [ "$INCLUDE_SEPP" == true ]; then + local SEPP1_RUNNING=$(pgrep -f "$APP_NAME.*sepp1.yaml") + local SEPP2_RUNNING=$(pgrep -f "$APP_NAME.*sepp2.yaml") + if [ -z "$SEPP1_RUNNING" ]; then + CONFIG_FILE_1="$SCRIPT_DIR/configs/sepp1.yaml" + if [ ! -f "$CONFIG_FILE_1" ]; then + echo "Configuration file not found: $CONFIG_FILE_1" + exit 1 + fi + # Remove the log file if it exists before starting the application + LOG_PATH=$(yq eval '.logger.file.path' "$CONFIG_FILE_1") + rm -f "$LOG_PATH" + echo "Starting $APP_NAME 1 in background..." + ./open5gs/install/bin/$APP_NAME -c $CONFIG_FILE_1 >/dev/null 2>&1 & + #./open5gs/install/bin/$APP_NAME -c $CONFIG_FILE_1 >logs/${1}_1_stdout.txt 2>&1 & + else + echo "Already running $APP_NAME 1." fi - echo "Starting $APP_NAME 1 in background..." - ./open5gs/install/bin/$APP_NAME -c $CONFIG_FILE_1 >/dev/null 2>&1 & - #./open5gs/install/bin/$APP_NAME -c $CONFIG_FILE_1 >logs/${1}_1_stdout.txt 2>&1 & - else - echo "Already running $APP_NAME 1." - fi - if [ -z "$SEPP2_RUNNING" ]; then - CONFIG_FILE_2="$SCRIPT_DIR/configs/sepp2.yaml" - if [ ! -f "$CONFIG_FILE_2" ]; then - echo "Configuration file not found: $CONFIG_FILE_2" - exit 1 + if [ -z "$SEPP2_RUNNING" ]; then + CONFIG_FILE_2="$SCRIPT_DIR/configs/sepp2.yaml" + if [ ! -f "$CONFIG_FILE_2" ]; then + echo "Configuration file not found: $CONFIG_FILE_2" + exit 1 + fi + # Remove the log file if it exists before starting the application + LOG_PATH=$(yq eval '.logger.file.path' "$CONFIG_FILE_2") + rm -f "$LOG_PATH" + echo "Starting $APP_NAME 2 in background..." + ./open5gs/install/bin/$APP_NAME -c $CONFIG_FILE_2 >/dev/null 2>&1 & + #./open5gs/install/bin/$APP_NAME -c $CONFIG_FILE_2 >logs/${1}_2_stdout.txt 2>&1 & + else + echo "Already running $APP_NAME 2." fi - echo "Starting $APP_NAME 2 in background..." - ./open5gs/install/bin/$APP_NAME -c $CONFIG_FILE_2 >/dev/null 2>&1 & - #./open5gs/install/bin/$APP_NAME -c $CONFIG_FILE_2 >logs/${1}_2_stdout.txt 2>&1 & - else - echo "Already running $APP_NAME 2." fi return fi @@ -97,29 +107,37 @@ run_in_background() { run_in_terminal() { local APP_NAME="open5gs-$1" if [ "$1" == "seppd" ]; then - local SEPP1_RUNNING=$(pgrep -f "$APP_NAME.*sepp1.yaml") - local SEPP2_RUNNING=$(pgrep -f "$APP_NAME.*sepp2.yaml") - if [ -z "$SEPP1_RUNNING" ]; then - CONFIG_FILE_1="$SCRIPT_DIR/configs/sepp1.yaml" - if [ ! -f "$CONFIG_FILE_1" ]; then - echo "Configuration file not found: $CONFIG_FILE_1" - exit 1 + if [ "$INCLUDE_SEPP" == true ]; then + local SEPP1_RUNNING=$(pgrep -f "$APP_NAME.*sepp1.yaml") + local SEPP2_RUNNING=$(pgrep -f "$APP_NAME.*sepp2.yaml") + if [ -z "$SEPP1_RUNNING" ]; then + CONFIG_FILE_1="$SCRIPT_DIR/configs/sepp1.yaml" + if [ ! -f "$CONFIG_FILE_1" ]; then + echo "Configuration file not found: $CONFIG_FILE_1" + exit 1 + fi + # Remove the log file if it exists before starting the application + LOG_PATH=$(yq eval '.logger.file.path' "$CONFIG_FILE") + rm -f "$LOG_PATH" + echo "Starting $APP_NAME 1 in GNOME Terminal..." + gnome-terminal -t "$APP_NAME 1 Node" -- /bin/sh -c "./open5gs/install/bin/$APP_NAME -c $CONFIG_FILE_1" + else + echo "Already running $APP_NAME 1." fi - echo "Starting $APP_NAME 1 in GNOME Terminal..." - gnome-terminal -t "$APP_NAME 1 Node" -- /bin/sh -c "./open5gs/install/bin/$APP_NAME -c $CONFIG_FILE_1" - else - echo "Already running $APP_NAME 1." - fi - if [ -z "$SEPP2_RUNNING" ]; then - CONFIG_FILE_2="$SCRIPT_DIR/configs/sepp2.yaml" - if [ ! -f "$CONFIG_FILE_2" ]; then - echo "Configuration file not found: $CONFIG_FILE_2" - exit 1 + if [ -z "$SEPP2_RUNNING" ]; then + CONFIG_FILE_2="$SCRIPT_DIR/configs/sepp2.yaml" + if [ ! -f "$CONFIG_FILE_2" ]; then + echo "Configuration file not found: $CONFIG_FILE_2" + exit 1 + fi + # Remove the log file if it exists before starting the application + LOG_PATH=$(yq eval '.logger.file.path' "$CONFIG_FILE") + rm -f "$LOG_PATH" + echo "Starting $APP_NAME 2 in GNOME Terminal..." + gnome-terminal -t "$APP_NAME 2 Node" -- /bin/sh -c "./open5gs/install/bin/$APP_NAME -c $CONFIG_FILE_2" + else + echo "Already running $APP_NAME 2." fi - echo "Starting $APP_NAME 2 in GNOME Terminal..." - gnome-terminal -t "$APP_NAME 2 Node" -- /bin/sh -c "./open5gs/install/bin/$APP_NAME -c $CONFIG_FILE_2" - else - echo "Already running $APP_NAME 2." fi return fi diff --git a/5G_Core_Network/start_webui.sh b/5G_Core_Network/start_webui.sh index 2ea1039..0b24f38 100755 --- a/5G_Core_Network/start_webui.sh +++ b/5G_Core_Network/start_webui.sh @@ -33,10 +33,7 @@ if ! systemctl is-active --quiet "open5gs-webui"; then sudo systemctl start open5gs-webui fi -WEBUI_PORT=3000 -if ! curl -s localhost:$WEBUI_PORT >/dev/null; then - WEBUI_PORT=9999 -fi +WEBUI_PORT=9999 if command -v google-chrome &>/dev/null; then echo "Opening the WebUI in Google Chrome..." diff --git a/5G_Core_Network/stop.sh b/5G_Core_Network/stop.sh index 9120dff..164ab8e 100755 --- a/5G_Core_Network/stop.sh +++ b/5G_Core_Network/stop.sh @@ -59,3 +59,5 @@ for APP in "${APPS[@]}"; do done ./is_running.sh + +sudo ./install_scripts/revert_network_config.sh diff --git a/Additional_Scripts/download_dependency_repositories.bat b/Additional_Scripts/download_dependency_repositories.bat old mode 100755 new mode 100644 index cf37bb9..479d277 --- a/Additional_Scripts/download_dependency_repositories.bat +++ b/Additional_Scripts/download_dependency_repositories.bat @@ -1,5 +1,3 @@ -@echo off - REM NIST-developed software is provided by NIST as a public service. You may use, REM copy, and distribute copies of the software in any medium, provided that you REM keep intact this entire notice. You may improve, modify, and create derivative @@ -28,19 +26,20 @@ REM to be used in any situation where a failure could cause risk of injury or REM damage to property. The software developed by NIST employees is not subject to REM copyright protection within the United States. -REM This script will download the 5G_Core_Network, gNodeB, User_Equipment, and RAN_Intelligent_Controllers repositories for analyzing the source code without requiring a full testbed build and installation. +@echo off + +REM This is an automatically generated script to download the testbed repositories to analyze the source code without requiring a full testbed build and installation. +REM WARNING: Please do not edit this file manually since it is overwritten with the script: ./Additional_Scripts/generate_download_dependency_repositories.bat.sh echo Script: %~f0... REM Change to the parent directory of the script -cd %~dp0.. - cd %~dp0.. if exist "5G_Core_Network\open5gs" rmdir /s /q "5G_Core_Network\open5gs" cd 5G_Core_Network git clone https://github.com/open5gs/open5gs.git cd open5gs -git checkout e3dd98cd291fba233a46adb2881213fc6e38b924 +git checkout 7b40d5a3f1080f088c653abfdc01f3adfac5d3cd cd ..\.. cd %~dp0.. @@ -72,7 +71,7 @@ if exist "Next_Generation_Node_B\srsRAN_Project" rmdir /s /q "Next_Generation_No cd Next_Generation_Node_B git clone https://github.com/srsran/srsRAN_Project.git cd srsRAN_Project -git checkout cc2869f967adfd8d33f9d1440839bf5f1b282998 +git checkout 644263b5a7c7b98b892bc1120940ae8d801eaee0 cd ..\.. cd %~dp0.. @@ -176,7 +175,7 @@ if exist "RAN_Intelligent_Controllers\Non-Real-Time-RIC\dep" rmdir /s /q "RAN_In cd RAN_Intelligent_Controllers\Non-Real-Time-RIC git clone https://gerrit.o-ran-sc.org/r/it/dep.git cd dep -git checkout cdb4ba3d9d5a86cda7b68d70c2ea0cb891d38471 +git checkout dfcfdbc9b540b3e6d401b8c09379e5a8b6267848 git restore --source=HEAD :/ cd ..\..\.. @@ -185,7 +184,7 @@ if exist "RAN_Intelligent_Controllers\Non-Real-Time-RIC\dep\ranpm" rmdir /s /q " cd RAN_Intelligent_Controllers\Non-Real-Time-RIC\dep git clone https://gerrit.o-ran-sc.org/r/nonrtric/plt/ranpm.git cd ranpm -git checkout cfb34a99dc39c0ef22d5b1aab884483338ffed95 +git checkout b5f4f8698217ce70d3c2e6a454146fbcd2111d35 cd ..\..\..\.. cd %~dp0.. @@ -209,7 +208,7 @@ if exist "RAN_Intelligent_Controllers\Non-Real-Time-RIC\dep\smo-install\onap_oom cd RAN_Intelligent_Controllers\Non-Real-Time-RIC\dep\smo-install git clone https://gerrit.onap.org/r/oom.git cd onap_oom -git checkout 60c14232c92f4e04c53d1a75a76c3f17bb32d0e2 +git checkout 1ca9e322036072b2d1ef69046c297ca13f1618b7 cd ..\..\..\..\.. cd %~dp0.. @@ -231,7 +230,42 @@ cd ..\..\.. cd RAN_Intelligent_Controllers\Non-Real-Time-RIC mkdir rApps cd ..\.. +cd %~dp0.. +if exist "OpenAirInterface_Testbed\5G_Core_Network\open5gs" rmdir /s /q "OpenAirInterface_Testbed\5G_Core_Network\open5gs" +cd OpenAirInterface_Testbed\5G_Core_Network +git clone https://github.com/open5gs/open5gs.git +cd open5gs +git checkout 7b40d5a3f1080f088c653abfdc01f3adfac5d3cd +cd ..\..\.. + +cd %~dp0.. +if exist "OpenAirInterface_Testbed\User_Equipment\openairinterface5g" rmdir /s /q "OpenAirInterface_Testbed\User_Equipment\openairinterface5g" +cd OpenAirInterface_Testbed\User_Equipment +git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git +cd openairinterface5g +git checkout acb982d0bd96b01dee84aea730f01dfff73875d0 +cd ..\..\.. + +cd OpenAirInterface_Testbed\Next_Generation_Node_B +mklink /D openairinterface5g ..\User_Equipment\openairinterface5g +cd ..\.. + +cd %~dp0.. +if exist "OpenAirInterface_Testbed\RAN_Intelligent_Controllers\Flexible-RIC\swig" rmdir /s /q "OpenAirInterface_Testbed\RAN_Intelligent_Controllers\Flexible-RIC\swig" +cd OpenAirInterface_Testbed\RAN_Intelligent_Controllers\Flexible-RIC +git clone https://github.com/swig/swig.git +cd swig +git checkout 01bf5808dd44516a7937afd4fb5438c026d937ac +cd ..\..\..\.. + +cd %~dp0.. +if exist "OpenAirInterface_Testbed\RAN_Intelligent_Controllers\Flexible-RIC\flexric" rmdir /s /q "OpenAirInterface_Testbed\RAN_Intelligent_Controllers\Flexible-RIC\flexric" +cd OpenAirInterface_Testbed\RAN_Intelligent_Controllers\Flexible-RIC +git clone https://gitlab.eurecom.fr/mosaic5g/flexric.git +cd flexric +git checkout 596a1ae67309618a74e09e56dff9a723ea7d99c5 +cd ..\..\..\.. + echo Repositories were cloned successfully. pause - diff --git a/Additional_Scripts/download_dependency_repositories.sh b/Additional_Scripts/download_dependency_repositories.sh index 5536b6b..858cc8d 100755 --- a/Additional_Scripts/download_dependency_repositories.sh +++ b/Additional_Scripts/download_dependency_repositories.sh @@ -86,4 +86,21 @@ cd .. mkdir -p rApps cd ../.. +cd OpenAirInterface_Testbed/5G_Core_Network +./install_scripts/git_clone.sh https://github.com/open5gs/open5gs.git +cd ../.. + +cd OpenAirInterface_Testbed/User_Equipment +./install_scripts/git_clone.sh https://gitlab.eurecom.fr/oai/openairinterface5g.git +cd ../.. + +cd OpenAirInterface_Testbed/Next_Generation_Node_B +ln -s "../User_Equipment/openairinterface5g" openairinterface5g +cd ../.. + +cd OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC +./install_scripts/git_clone.sh https://github.com/swig/swig.git +./install_scripts/git_clone.sh https://gitlab.eurecom.fr/mosaic5g/flexric.git +cd ../.. + echo "Repositories were cloned successfully." diff --git a/Additional_Scripts/generate_download_dependency_repositories.bat.sh b/Additional_Scripts/generate_download_dependency_repositories.bat.sh index 8d0f7c4..c033da1 100755 --- a/Additional_Scripts/generate_download_dependency_repositories.bat.sh +++ b/Additional_Scripts/generate_download_dependency_repositories.bat.sh @@ -44,9 +44,7 @@ cd "$SCRIPT_DIR" JSON_FILE="../commit_hashes.json" # Start the batch file output -echo "@echo off" >download_dependency_repositories.bat -echo "" >>download_dependency_repositories.bat -echo "REM NIST-developed software is provided by NIST as a public service. You may use," >>download_dependency_repositories.bat +echo "REM NIST-developed software is provided by NIST as a public service. You may use," >download_dependency_repositories.bat echo "REM copy, and distribute copies of the software in any medium, provided that you" >>download_dependency_repositories.bat echo "REM keep intact this entire notice. You may improve, modify, and create derivative" >>download_dependency_repositories.bat echo "REM works of the software or any portion of the software, and you may copy and" >>download_dependency_repositories.bat @@ -74,12 +72,12 @@ echo "REM to be used in any situation where a failure could cause risk of injury echo "REM damage to property. The software developed by NIST employees is not subject to" >>download_dependency_repositories.bat echo "REM copyright protection within the United States." >>download_dependency_repositories.bat echo "" >>download_dependency_repositories.bat -echo "REM This script will download the 5G_Core_Network, gNodeB, User_Equipment, and RAN_Intelligent_Controllers repositories for analyzing the source code without requiring a full testbed build and installation." >>download_dependency_repositories.bat +echo "@echo off" >>download_dependency_repositories.bat echo "" >>download_dependency_repositories.bat -echo "echo Script: %~f0..." >>download_dependency_repositories.bat +echo "REM This is an automatically generated script to download the testbed repositories to analyze the source code without requiring a full testbed build and installation." >>download_dependency_repositories.bat +echo "REM WARNING: Please do not edit this file manually since it is overwritten with the script: ./Additional_Scripts/generate_download_dependency_repositories.bat.sh" >>download_dependency_repositories.bat echo "" >>download_dependency_repositories.bat -echo "REM Change to the parent directory of the script" >>download_dependency_repositories.bat -echo "cd %~dp0.." >>download_dependency_repositories.bat +echo "echo Script: %~f0..." >>download_dependency_repositories.bat echo "" >>download_dependency_repositories.bat if ! command -v jq >/dev/null 2>&1; then @@ -148,7 +146,8 @@ function generate_commands() { echo "" >>download_dependency_repositories.bat } -# Using the function to generate commands for each repository +# Using the function to generate commands for each repository in the blueprint testbed +echo "REM Change to the parent directory of the script" >>download_dependency_repositories.bat generate_commands "https://github.com/open5gs/open5gs.git" "5G_Core_Network" "open5gs" generate_commands "https://github.com/srsran/srsRAN_4G.git" "User_Equipment" "srsRAN_4G" generate_commands "https://github.com/zeromq/libzmq.git" "User_Equipment" "libzmq" @@ -172,6 +171,7 @@ generate_commands "https://gerrit.o-ran-sc.org/r/ric-app/qp.git" "RAN_Intelligen generate_commands "https://gerrit.o-ran-sc.org/r/ric-app/rc.git" "RAN_Intelligent_Controllers\\Near-Real-Time-RIC\\xApps" "rc" generate_commands "https://gerrit.o-ran-sc.org/r/ric-app/ts.git" "RAN_Intelligent_Controllers\\Near-Real-Time-RIC\\xApps" "ts" +# O-RAN SC Non-RT RIC repositories generate_commands "https://gerrit.o-ran-sc.org/r/it/dep.git" "RAN_Intelligent_Controllers\\Non-Real-Time-RIC" "dep" generate_commands "https://gerrit.o-ran-sc.org/r/nonrtric/plt/ranpm.git" "RAN_Intelligent_Controllers\\Non-Real-Time-RIC\\dep" "ranpm" generate_commands "https://gerrit.o-ran-sc.org/r/ric-plt/ric-dep.git" "RAN_Intelligent_Controllers\\Non-Real-Time-RIC\\dep" "ric-dep" @@ -179,13 +179,22 @@ generate_commands "https://github.com/onap/multicloud-k8s.git" "RAN_Intelligent_ generate_commands "https://gerrit.onap.org/r/oom.git" "RAN_Intelligent_Controllers\\Non-Real-Time-RIC\\dep\\smo-install" "onap_oom" generate_commands "https://gerrit.o-ran-sc.org/r/portal/nonrtric-controlpanel.git" "RAN_Intelligent_Controllers\\Non-Real-Time-RIC" "nonrtric-controlpanel" generate_commands "https://gerrit.o-ran-sc.org/r/nonrtric/plt/rappmanager.git" "RAN_Intelligent_Controllers\\Non-Real-Time-RIC" "rappmanager" - echo "cd RAN_Intelligent_Controllers\\Non-Real-Time-RIC" >>download_dependency_repositories.bat echo "mkdir rApps" >>download_dependency_repositories.bat echo "cd ..\\.." >>download_dependency_repositories.bat + +# OpenAirInterface testbed repositories +generate_commands "https://github.com/open5gs/open5gs.git" "OpenAirInterface_Testbed\\5G_Core_Network" "open5gs" +generate_commands "https://gitlab.eurecom.fr/oai/openairinterface5g.git" "OpenAirInterface_Testbed\\User_Equipment" "openairinterface5g" +echo "cd OpenAirInterface_Testbed\\Next_Generation_Node_B" >>download_dependency_repositories.bat +echo "mklink /D openairinterface5g ..\\User_Equipment\\openairinterface5g" >>download_dependency_repositories.bat +echo "cd ..\\.." >>download_dependency_repositories.bat +echo "" >>download_dependency_repositories.bat +generate_commands "https://github.com/swig/swig.git" "OpenAirInterface_Testbed\\RAN_Intelligent_Controllers\\Flexible-RIC" "swig" +generate_commands "https://gitlab.eurecom.fr/mosaic5g/flexric.git" "OpenAirInterface_Testbed\\RAN_Intelligent_Controllers\\Flexible-RIC" "flexric" + echo "" >>download_dependency_repositories.bat echo "echo Repositories were cloned successfully." >>download_dependency_repositories.bat echo "pause" >>download_dependency_repositories.bat -echo "" >>download_dependency_repositories.bat echo "Windows batch file 'download_dependency_repositories.bat' has been generated." diff --git a/Additional_Scripts/migrate_to_new_version.sh b/Additional_Scripts/migrate_to_new_version.sh index 569365d..f4366c2 100755 --- a/Additional_Scripts/migrate_to_new_version.sh +++ b/Additional_Scripts/migrate_to_new_version.sh @@ -94,6 +94,20 @@ if [ -d 5G_Core/open5gs ] || [ -d gNodeB/srsRAN_Project ] || [ -d RAN_Intelligen echo fi +if [ -d OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC ]; then + echo + echo + echo "################################################################################" + echo "# Migrating from commit 630c2f212bb7ddd748fdf94013bec163b4b8d647 #" + echo "################################################################################" + echo + echo + sudo mv OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/* OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC + sudo rm -rf OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC + echo "Successfully migrated from commit 630c2f212bb7ddd748fdf94013bec163b4b8d647 to the new version." + echo +fi + echo "Updating package lists..." cd $SCRIPT_DIR if ! sudo apt-get update; then diff --git a/Additional_Scripts/update_commit_hashes.sh b/Additional_Scripts/update_commit_hashes.sh index d8aced4..4bc5835 100755 --- a/Additional_Scripts/update_commit_hashes.sh +++ b/Additional_Scripts/update_commit_hashes.sh @@ -49,6 +49,8 @@ SCRIPT_DIR=$(dirname "$(realpath "$0")") cd "$(dirname "$SCRIPT_DIR")" if ! command -v jq &>/dev/null; then + sudo apt-get update + echo "Installing jq..." sudo apt-get install -y jq fi diff --git a/Images/Architecture_Dark.svg b/Images/Architecture_Dark.svg new file mode 100644 index 0000000..6349874 --- /dev/null +++ b/Images/Architecture_Dark.svg @@ -0,0 +1 @@ +Service Management and OrchestrationO-RAN SC RICNon-RT RICUser EquipmentRF Simulator / ZeroMQMobile PhoneSoftware-Defined RadiosrsRAN_4GOpenAirInterface5GNext Generation Node BSoftware-Defined RadioRF Simulator / ZeroMQsrsRAN_ProjectOpenAirInterface5GO-RAN SC E2 Simulator5G Core NetworkAMFUPFOpen5GSNear-RT RAN Intelligent ControllerO-RAN SC RICFlexRICPolicyKey Performance MeasurementRAN ControlKPMMonitorTraffic SteeringQoEPredictionRAN ControlrAppsPolicy ManagementxAppsTunnel from UPF to UEfor internet \ No newline at end of file diff --git a/Images/Architecture_Light.svg b/Images/Architecture_Light.svg new file mode 100644 index 0000000..3221899 --- /dev/null +++ b/Images/Architecture_Light.svg @@ -0,0 +1 @@ +Service Management and OrchestrationO-RAN SC RICNon-RT RICUser EquipmentRF Simulator / ZeroMQMobile PhoneSoftware-Defined RadiosrsRAN_4GOpenAirInterface5GNext Generation Node BSoftware-Defined RadioRF Simulator / ZeroMQsrsRAN_ProjectOpenAirInterface5GO-RAN SC E2 Simulator5G Core NetworkAMFUPFOpen5GSNear-RT RAN Intelligent ControllerO-RAN SC RICFlexRICA1 PolicyKey Performance MeasurementRAN ControlKPMMonitorTraffic SteeringQoEPredictionRAN ControlrAppsPolicy ManagementxAppsTunnel from UPF to UEfor internet \ No newline at end of file diff --git a/Images/Cilium_Hubble_UI.png b/Images/Cilium_Hubble_UI.png new file mode 100644 index 0000000..980ddeb Binary files /dev/null and b/Images/Cilium_Hubble_UI.png differ diff --git a/Images/NIST_Dark.png b/Images/NIST_Dark.png new file mode 100644 index 0000000..78a9b12 Binary files /dev/null and b/Images/NIST_Dark.png differ diff --git a/Images/NIST_Dark.svg b/Images/NIST_Dark.svg new file mode 100644 index 0000000..cd9c875 --- /dev/null +++ b/Images/NIST_Dark.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NIST.png b/Images/NIST_Light.png similarity index 100% rename from NIST.png rename to Images/NIST_Light.png diff --git a/Images/Support_Dark.svg b/Images/Support_Dark.svg new file mode 100644 index 0000000..427eef4 --- /dev/null +++ b/Images/Support_Dark.svg @@ -0,0 +1 @@ +Open5GSSupported by default installationSupported after adjusting configsPresumably not supportedOAI : USRPsrsRAN_Project: ZeroMQsrsRAN_Project: USRPO-RAN SC : E2 SimulatorNext Generation Node BOAI : RF SimulatorOAI : USRPsrsRAN_4G : ZeroMQsrsRAN_4G : USRPMobile PhoneUser EquipmentOAI : RF SimulatorO-RAN SC : Non-RT RICNon-RT RICNear-RT RICMosaic5G : FlexRICO-RAN SC : Near-RT RICO-RAN SC : A1 Simulator5G Core Network \ No newline at end of file diff --git a/Images/Support_Light.svg b/Images/Support_Light.svg new file mode 100644 index 0000000..90f06d1 --- /dev/null +++ b/Images/Support_Light.svg @@ -0,0 +1 @@ +Open5GS5G Core NetworkOAI : USRPsrsRAN_Project: ZeroMQsrsRAN_Project: USRPO-RAN SC : E2 SimulatorNext Generation Node BOAI : RF SimulatorOAI : USRPsrsRAN_4G : ZeroMQsrsRAN_4G : USRPMobile PhoneUser EquipmentOAI : RF SimulatorO-RAN SC : Non-RT RICNon-RT RICSupported by default installationSupported after adjusting configsPresumably not supportedNear-RT RICMosaic5G : FlexRICO-RAN SC : Near-RT RICO-RAN SC : A1 Simulator \ No newline at end of file diff --git a/Images/xApp_Dashboard.png b/Images/xApp_Dashboard.png new file mode 100644 index 0000000..dd3494f Binary files /dev/null and b/Images/xApp_Dashboard.png differ diff --git a/Jenkinsfile b/Jenkinsfile old mode 100755 new mode 100644 index 13da98c..4d22897 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,7 +2,7 @@ pipeline { agent none stages { stage('Testing Ubuntu 20') { - agent { label 'linux && vagrant && ubuntu24' } + agent { label 'linux && vagrant && ubuntu20' } steps { sh ''' pwd && hostname diff --git a/Next_Generation_Node_B/.gitignore b/Next_Generation_Node_B/.gitignore old mode 100755 new mode 100644 index 896c559..1fcc2a0 --- a/Next_Generation_Node_B/.gitignore +++ b/Next_Generation_Node_B/.gitignore @@ -7,3 +7,4 @@ czmq install_time.txt libzmq +!install_patch_files/ diff --git a/Next_Generation_Node_B/OpenAirInterface_gNodeB b/Next_Generation_Node_B/OpenAirInterface_gNodeB new file mode 120000 index 0000000..66d102a --- /dev/null +++ b/Next_Generation_Node_B/OpenAirInterface_gNodeB @@ -0,0 +1 @@ +../OpenAirInterface_Testbed/Next_Generation_Node_B/ \ No newline at end of file diff --git a/Next_Generation_Node_B/README.md b/Next_Generation_Node_B/README.md old mode 100755 new mode 100644 index d0a645d..df2f7b3 --- a/Next_Generation_Node_B/README.md +++ b/Next_Generation_Node_B/README.md @@ -4,17 +4,18 @@ The Next Generation Node B (gNodeB) is a 5G base station configured with srsRAN_ ## Usage -- **Compile**: Use `./full_install.sh` to build the gNodeB. +- **Compile**: Use `./full_install.sh` to build and install the gNodeB software. - **Generate Configurations**: Use `./generate_configurations.sh` to create configuration files. - - The script automatically retrieves the 5G Core Network's AMF address and the SCTP address from the Near Real-Time RAN Intelligent Controller's E2 Terminator. If either are not found locally, the script will prompt the user to enter the address manually. + - The script automatically retrieves the 5G Core Network's AMF address and the SCTP address from the Near-Real-Time RAN Intelligent Controller's E2 Terminator. If either are not found locally, the script will prompt the user to enter the address manually. - Configuration files can be accessed and modified in the `configs` directory. - **Start the gNodeB**: Use `./run.sh` to start the gNodeB, or `./run_background.sh` to run it as a background process where the output is redirected to `logs/gnb_stdout.txt`. - **Stop the gNodeB**: Terminate the gNodeB with `./stop.sh`. - **Status**: Check if the gNodeB is running with `./is_running.sh`. - **Logs**: Access logs by navigating to the `logs` directory. +- **Uninstall**: Use `./uninstall.sh` to remove the gNodeB software. > [!NOTE] -> If the directory `RAN_Intelligent_Controllers/Near-Real-Time-RIC` is not found, then the `generate_configurations.sh` script will disable the E2 interface, so please delete this directory if you only want to use the UE, gNodeB, and 5G Core Network. +> If the directory `RAN_Intelligent_Controllers/Near-Real-Time-RIC` is not found, then the `generate_configurations.sh` script will disable the E2 interface. Alternatively, if prompted to enter an E2 address, enter nothing ("") to disable the E2 interface in the gNodeB configuration. ## References diff --git a/Next_Generation_Node_B/full_install.sh b/Next_Generation_Node_B/full_install.sh index c7ad3ea..0e8ac62 100755 --- a/Next_Generation_Node_B/full_install.sh +++ b/Next_Generation_Node_B/full_install.sh @@ -96,7 +96,7 @@ fi export NEEDRESTART_SUSPEND=1 # Code from (https://docs.srsran.com/projects/project/en/latest/user_manuals/source/installation.html#manual-installation-dependencies): -sudo apt-get install -y cmake make gcc g++ pkg-config libfftw3-dev libmbedtls-dev libsctp-dev libyaml-cpp-dev libgtest-dev +sudo apt-get install -y build-essential cmake cmake-data make gcc g++ pkg-config libfftw3-dev libmbedtls-dev libsctp-dev libyaml-cpp-dev libgtest-dev sudo apt-get install -y autoconf automake libtool sudo apt-get install -y libuhd-dev @@ -121,6 +121,17 @@ else echo "SCTP module loaded successfully." fi +# Check if GCC 13 is installed, if not, install it and set it as the default +GCC_VERSION=$(gcc -v 2>&1 | grep "gcc version" | awk '{print $3}') +if [[ -z "$GCC_VERSION" || ! "$GCC_VERSION" == 13.* ]]; then + echo "Installing GCC 13..." + sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + sudo apt-get update + sudo apt-get install -y gcc-13 g++-13 + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100 +fi + cd "$SCRIPT_DIR" echo diff --git a/Next_Generation_Node_B/full_uninstall.sh b/Next_Generation_Node_B/full_uninstall.sh new file mode 100755 index 0000000..965ef5a --- /dev/null +++ b/Next_Generation_Node_B/full_uninstall.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Do not exit immediately if a command fails +set +e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +cd "$SCRIPT_DIR" + +echo "Stopping Next Generation Node B..." +./stop.sh + +echo "Uninstalling ZeroMQ libzmq..." +if [ -d libzmq ]; then + cd libzmq + sudo make uninstall + cd .. +fi +sudo rm -rf libzmq + +echo "Uninstalling ZeroMQ czmq..." +if [ -d czmq ]; then + cd czmq + sudo make uninstall + cd .. +fi +sudo rm -rf czmq + +echo "Uninstalling srsRAN_Project..." +if [ -d srsRAN_Project/build ]; then + cd srsRAN_Project/build + sudo make uninstall &>/dev/null + cd ../.. +fi +sudo rm -rf srsRAN_Project + +sudo rm -rf logs/ +sudo rm -rf configs/ +sudo rm -rf install_time.txt + +echo +echo +echo "################################################################################" +echo "# Successfully uninstalled Next Generation Node B #" +echo "################################################################################" diff --git a/Next_Generation_Node_B/generate_configurations.sh b/Next_Generation_Node_B/generate_configurations.sh index 1849410..a3c05a9 100755 --- a/Next_Generation_Node_B/generate_configurations.sh +++ b/Next_Generation_Node_B/generate_configurations.sh @@ -68,16 +68,14 @@ fi echo "Restoring gNodeB configuration file..." rm -rf configs mkdir configs -rm -rf logs -cp srsRAN_Project/configs/gnb_rf_b200_tdd_n78_20mhz.yml configs/gnb.yaml -# Function to prompt user for IP address -prompt_for_e2term_ip() { - echo "Please enter the IP address of the service." >&2 - echo "You can find this by running: kubectl get service -n ricplt | grep service-ricplt-e2term-sctp" >&2 - read -p "Enter IP Address: " USER_IP - echo "$USER_IP" -} +# Only remove the logs if is not running +RUNNING_STATUS=$(./is_running.sh) +if [[ $RUNNING_STATUS != *": RUNNING"* ]]; then + rm -rf logs + mkdir logs +fi +cp srsRAN_Project/configs/gnb_rf_b200_tdd_n78_20mhz.yml configs/gnb.yaml ENABLE_E2_TERM="true" if [ ! -d "../RAN_Intelligent_Controllers/Near-Real-Time-RIC" ]; then @@ -87,52 +85,57 @@ fi if [ "$ENABLE_E2_TERM" = "true" ]; then echo "Fetching E2 termination service IP address..." - - INSIDE_CLUSTER="yes" - # echo "Are you connecting to the e2term from inside the Kubernetes cluster? [yes/no]" - # read -p "Enter choice (yes/no): " INSIDE_CLUSTER - if [ "$INSIDE_CLUSTER" = "yes" ]; then - PORT_E2TERM=36422 - else - PORT_E2TERM=32222 - fi + PORT_E2TERM=36422 # Check if kubectl is installed + PROMPT_FOR_E2_ADDRESS="false" if ! command -v kubectl &>/dev/null; then echo "Could not find kubectl." - IP_E2TERM=$(prompt_for_e2term_ip) + PROMPT_FOR_E2_ADDRESS="true" else - SERVICE_INFO=$(kubectl get service -n ricplt | grep service-ricplt-e2term-sctp) + SERVICE_INFO=$(kubectl get service -n ricplt 2>/dev/null | grep service-ricplt-e2term-sctp || echo "") # Check if SERVICE_INFO is empty if [ -z "$SERVICE_INFO" ]; then echo "No service found or kubectl command failed." - IP_E2TERM=$(prompt_for_e2term_ip) + PROMPT_FOR_E2_ADDRESS="true" else # Use awk to extract the IP and the correct port based on the connection context IP_E2TERM=$(echo "$SERVICE_INFO" | awk '{print $3}') - if [ "$INSIDE_CLUSTER" = "yes" ]; then - PORT_E2TERM=$(echo "$SERVICE_INFO" | awk '{print $5}' | cut -d ':' -f1 | cut -d '/' -f1) - else - PORT_E2TERM=$(echo "$SERVICE_INFO" | awk '{print $5}' | cut -d ':' -f2 | cut -d '/' -f1) - fi + PORT_E2TERM=$(echo "$SERVICE_INFO" | awk '{print $5}' | cut -d ':' -f1 | cut -d '/' -f1) # 36422 if [ -z "$IP_E2TERM" ] || [ "$IP_E2TERM" == "" ]; then - IP_E2TERM=$(prompt_for_e2term_ip) + PROMPT_FOR_E2_ADDRESS="true" fi fi fi - # Calculate the bind address based on the IP address - # if [[ "$IP_E2TERM" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - # # Extract the first three octets and append .1 - # IP_E2TERM_BIND=$(echo "$IP_E2TERM" | cut -d '.' -f1-3).1 - # else - # IP_E2TERM_BIND=$IP_E2TERM - # fi - IP_E2TERM_BIND=$IP_E2TERM - echo "IP_E2TERM: $IP_E2TERM" - echo "PORT_E2TERM: $PORT_E2TERM" - echo "IP_E2TERM_BIND: $IP_E2TERM_BIND" + + if [ "$PROMPT_FOR_E2_ADDRESS" = "true" ]; then + echo + echo "Please enter the IP address where the E2 termination service is located." + echo "You can find this by running: kubectl get service -n ricplt | grep service-ricplt-e2term-sctp" + echo "Type \"\" to disable E2 support in the gNodeB configuration." + read -p "Enter IP Address: " IP_E2TERM + IP_E2TERM=$(echo "$IP_E2TERM" | xargs) # Trim whitespace + fi + + if [ -z "$IP_E2TERM" ]; then + echo + echo "No E2 address was provided, disabling E2 termination support." + ENABLE_E2_TERM="false" + else + # Calculate the bind address based on the IP address + # if [[ "$IP_E2TERM" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + # # Extract the first three octets and append .1 + # IP_E2TERM_BIND=$(echo "$IP_E2TERM" | cut -d '.' -f1-3).1 + # else + # IP_E2TERM_BIND=$IP_E2TERM + # fi + IP_E2TERM_BIND=$IP_E2TERM + echo "IP_E2TERM: $IP_E2TERM" + echo "PORT_E2TERM: $PORT_E2TERM" + echo "IP_E2TERM_BIND: $IP_E2TERM_BIND" + fi fi echo "Fetching AMF addresses..." @@ -207,8 +210,7 @@ update_yaml() { mkdir -p "$SCRIPT_DIR/logs" -DEVICE_ARGS="" -DEVICE_ARGS+="tx_port0=tcp://127.0.0.1:2000,rx_port0=tcp://127.0.0.1:2001,base_srate=23.04e6" +DEVICE_ARGS="tx_port0=tcp://127.0.0.1:2000,rx_port0=tcp://127.0.0.1:2001,base_srate=23.04e6" # DEVICE_ARGS="" # Multiple RF devices: # DEVICE_ARGS+="tx_port0=tcp://127.0.0.1:2100,rx_port0=tcp://127.0.0.1:2101," # DEVICE_ARGS+="tx_port1=tcp://127.0.0.1:2200,rx_port1=tcp://127.0.0.1:2201," @@ -218,6 +220,8 @@ DEVICE_ARGS+="tx_port0=tcp://127.0.0.1:2000,rx_port0=tcp://127.0.0.1:2001,base_s # Update configuration values for AMF connection update_yaml "configs/gnb.yaml" "cu_cp.amf" "addr" "$AMF_ADDR" update_yaml "configs/gnb.yaml" "cu_cp.amf" "bind_addr" "$AMF_ADDR_BIND" +update_yaml "configs/gnb.yaml" "cu_cp.amf.supported_tracking_areas[0]" "tac" $TAC +update_yaml "configs/gnb.yaml" "cu_cp.amf.supported_tracking_areas[0].plmn_list[0]" "plmn" $PLMN # Update configuration values for RF front-end device update_yaml "configs/gnb.yaml" "ru_sdr" "device_driver" "zmq" @@ -271,9 +275,6 @@ else update_yaml "configs/gnb.yaml" "e2" "enable_du_e2" "false" update_yaml "configs/gnb.yaml" "e2" "e2sm_kpm_enabled" "false" update_yaml "configs/gnb.yaml" "e2" "e2sm_rc_enabled" "false" - update_yaml "configs/gnb.yaml" "e2" "addr" null - update_yaml "configs/gnb.yaml" "e2" "bind_addr" null - update_yaml "configs/gnb.yaml" "e2" "port" null fi # Update configuration values for CU-CP @@ -337,7 +338,4 @@ if [ $(nproc) -lt 4 ]; then update_yaml "configs/gnb.yaml" "expert_execution.threads.non_rt" "nof_non_rt_threads" "$(nproc)" fi -mkdir -p logs -sudo chown $USER:$USER -R logs - echo "Successfully configured the gNodeB. The configuration file is located in the configs/ directory." diff --git a/Next_Generation_Node_B/run.sh b/Next_Generation_Node_B/run.sh index ab55673..51a2712 100755 --- a/Next_Generation_Node_B/run.sh +++ b/Next_Generation_Node_B/run.sh @@ -28,6 +28,9 @@ # damage to property. The software developed by NIST employees is not subject to # copyright protection within the United States. +# Exit immediately if a command fails +set -e + if ! command -v realpath &>/dev/null; then echo "Package \"coreutils\" not found, installing..." sudo apt-get install -y coreutils @@ -49,7 +52,6 @@ if pgrep -x "gnb" >/dev/null; then else echo "Starting gnb..." mkdir -p logs - sudo chown -R $USER:$USER logs >logs/gnb.log >logs/gnb_stdout.txt srsRAN_Project/build/apps/gnb/gnb -c configs/gnb.yaml # cell_cfg prach --ports 0 1 2 diff --git a/Next_Generation_Node_B/run_background.sh b/Next_Generation_Node_B/run_background.sh index 511a219..51abcfe 100755 --- a/Next_Generation_Node_B/run_background.sh +++ b/Next_Generation_Node_B/run_background.sh @@ -28,6 +28,9 @@ # damage to property. The software developed by NIST employees is not subject to # copyright protection within the United States. +# Exit immediately if a command fails +set -e + if ! command -v realpath &>/dev/null; then echo "Package \"coreutils\" not found, installing..." sudo apt-get install -y coreutils @@ -46,10 +49,9 @@ else echo "Starting gNodeB in background..." mkdir -p logs - sudo chown -R $USER:$USER logs >logs/gnb.log - >gnb_stdout.txt - sudo setsid bash -c 'stdbuf -oL -eL srsRAN_Project/build/apps/gnb/gnb -c configs/gnb.yaml > logs/gnb_stdout.txt 2>&1' logs/gnb_stdout.txt + setsid bash -c 'stdbuf -oL -eL srsRAN_Project/build/apps/gnb/gnb -c configs/gnb.yaml > logs/gnb_stdout.txt 2>&1' /dev/null 2>&1 + # Send a graceful shutdown signal to the gNodeB process sudo pkill -f "gnb" >/dev/null 2>&1 & diff --git a/OpenAirInterface_Testbed/Additional_Scripts/update_commit_hashes.sh b/OpenAirInterface_Testbed/Additional_Scripts/update_commit_hashes.sh new file mode 100755 index 0000000..6c45491 --- /dev/null +++ b/OpenAirInterface_Testbed/Additional_Scripts/update_commit_hashes.sh @@ -0,0 +1,95 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# This script updates the commit hash for each repository in the JSON file. It respects the first field in each repository's entry, which is the branch name. If the branch name is "", it fetches the default branch's latest commit hash instead. + +export DEBIAN_FRONTEND=noninteractive +# Modifies the needrestart configuration to suppress interactive prompts +if [ -f "/etc/needrestart/needrestart.conf" ]; then + if ! grep -q "^\$nrconf{restart} = 'a';$" "/etc/needrestart/needrestart.conf"; then + sudo sed -i "/\$nrconf{restart} = /c\$nrconf{restart} = 'a';" "/etc/needrestart/needrestart.conf" + echo "Modified needrestart configuration to auto-restart services." + fi +fi +export NEEDRESTART_SUSPEND=1 + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +cd "$(dirname "$SCRIPT_DIR")" + +if ! command -v jq &>/dev/null; then + echo "Installing jq..." + sudo apt-get install -y jq +fi + +JSON_FILE="commit_hashes.json" +JSON_CONTENTS=$(jq '.' "$JSON_FILE") + +# Go through each repository and update the commit hash +for REPOSITORY in $(jq 'keys[]' "$JSON_FILE" | tr -d '"'); do + if [[ "$REPOSITORY" != *".git" ]]; then + REPOSITORY_NEW="${REPOSITORY}.git" + JSON_CONTENTS=$(jq ".[\"$REPOSITORY_NEW\"] = .[\"$REPOSITORY\"] | del(.[\"$REPOSITORY\"])" <<<"$JSON_CONTENTS") + REPOSITORY="$REPOSITORY_NEW" + fi + BRANCH=$(jq -r ".[\"$REPOSITORY\"][0]" <<<"$JSON_CONTENTS") + PREV_COMMIT_HASH=$(jq -r ".[\"$REPOSITORY\"][1]" <<<"$JSON_CONTENTS") + + if [[ -z "$BRANCH" ]]; then + # Fetch the default branch's latest commit + echo "Updating commit hash for $REPOSITORY..." + COMMIT_HASH=$(git ls-remote "$REPOSITORY" HEAD | awk '{ print $1 }') + else + # Fetch the specified branch's latest commit + echo "Updating commit hash for $REPOSITORY on branch $BRANCH..." + COMMIT_HASH=$(git ls-remote "$REPOSITORY" "refs/heads/$BRANCH" | awk '{ print $1 }') + fi + + if [[ -n "$COMMIT_HASH" ]]; then + # Update the commit hash in the JSON structure + JSON_CONTENTS=$(jq ".[\"$REPOSITORY\"][1] = \"$COMMIT_HASH\"" <<<"$JSON_CONTENTS") + echo " $COMMIT_HASH" + else + echo " Failed to retrieve commit hash, skipping." + echo + fi +done + +# Format the JSON for easier reading +FORMATTED_JSON_CONTENTS=$(echo "$JSON_CONTENTS" | sed -e ':a' -e 'N' -e '$!ba' -e 's/\[\n /[/g') +FORMATTED_JSON_CONTENTS=$(echo "$FORMATTED_JSON_CONTENTS" | sed -e ':a' -e 'N' -e '$!ba' -e 's/,\n /, /g') +FORMATTED_JSON_CONTENTS=$(echo "$FORMATTED_JSON_CONTENTS" | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n ]/]/g') + +echo "$FORMATTED_JSON_CONTENTS" >"$JSON_FILE" +echo "Successfully updated commit hashes." diff --git a/OpenAirInterface_Testbed/Next_Generation_Node_B/.gitignore b/OpenAirInterface_Testbed/Next_Generation_Node_B/.gitignore old mode 100755 new mode 100644 index 9bd275a..f6a49f7 --- a/OpenAirInterface_Testbed/Next_Generation_Node_B/.gitignore +++ b/OpenAirInterface_Testbed/Next_Generation_Node_B/.gitignore @@ -1,5 +1,7 @@ # Ignore testbed subdirectories +/configs/ /logs/ /openairinterface5g/ openairinterface5g install_time.txt +!install_patch_files/ diff --git a/OpenAirInterface_Testbed/Next_Generation_Node_B/README.md b/OpenAirInterface_Testbed/Next_Generation_Node_B/README.md old mode 100755 new mode 100644 index 0c1a62c..5e8fd55 --- a/OpenAirInterface_Testbed/Next_Generation_Node_B/README.md +++ b/OpenAirInterface_Testbed/Next_Generation_Node_B/README.md @@ -4,7 +4,7 @@ The Next Generation Node B (gNodeB) is a 5G base station configured with OpenAir ## Usage -- **Compile**: Use `./full_install.sh` to build the gNodeB. +- **Compile**: Use `./full_install.sh` to build and install the gNodeB software. - **Generate Configurations**: Use `./generate_configurations.sh` to create configuration files. - The script automatically retrieves the 5G Core Network's AMF address. If it is not found locally, the script will prompt the user to enter the address manually. - Configuration files can be accessed and modified in the `configs` directory. @@ -12,6 +12,7 @@ The Next Generation Node B (gNodeB) is a 5G base station configured with OpenAir - **Stop the gNodeB**: Terminate the gNodeB with `./stop.sh`. - **Status**: Check if the gNodeB is running with `./is_running.sh`. - **Logs**: Access logs by navigating to the `logs` directory. +- **Uninstall**: Use `./uninstall.sh` to remove the gNodeB/UE software. ## References diff --git a/OpenAirInterface_Testbed/Next_Generation_Node_B/configs/gnb.conf b/OpenAirInterface_Testbed/Next_Generation_Node_B/configs/gnb.conf deleted file mode 100755 index 27a41ca..0000000 --- a/OpenAirInterface_Testbed/Next_Generation_Node_B/configs/gnb.conf +++ /dev/null @@ -1,253 +0,0 @@ -Active_gNBs = ( "gNB-OAI"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -gNBs = -( - { - ////////// Identification parameters: - gNB_ID = 0xe00; - gNB_name = "gNB-OAI"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = 7; - plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) }); - - nr_cellid = 12345678L; - - ////////// Physical parameters: - - do_CSIRS = 1; - do_SRS = 1; - - #uess_agg_levels = [0,1,2,2,1] - servingCellConfigCommon = ( - { - #spCellConfigCommon - - physCellId = 0; - -# downlinkConfigCommon - #frequencyInfoDL - # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) - absoluteFrequencySSB = 641280; - dl_frequencyBand = 78; - # this is 3600 MHz - dl_absoluteFrequencyPointA = 640008; - #scs-SpecificCarrierList - dl_offstToCarrier = 0; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - dl_subcarrierSpacing = 1; - dl_carrierBandwidth = 106; - #initialDownlinkBWP - #genericParameters - # this is RBstart=27,L=48 (275*(L-1))+RBstart - initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - initialDLBWPsubcarrierSpacing = 1; - #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 12; - initialDLBWPsearchSpaceZero = 0; - - #uplinkConfigCommon - #frequencyInfoUL - ul_frequencyBand = 78; - #scs-SpecificCarrierList - ul_offstToCarrier = 0; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - ul_subcarrierSpacing = 1; - ul_carrierBandwidth = 106; - pMax = 20; - #initialUplinkBWP - #genericParameters - initialULBWPlocationAndBandwidth = 28875; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - initialULBWPsubcarrierSpacing = 1; - #rach-ConfigCommon - #rach-ConfigGeneric - prach_ConfigurationIndex = 98; -#prach_msg1_FDM -#0 = one, 1=two, 2=four, 3=eight - prach_msg1_FDM = 0; - prach_msg1_FrequencyStart = 0; - zeroCorrelationZoneConfig = 13; - preambleReceivedTargetPower = -96; -#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) - preambleTransMax = 6; -#powerRampingStep -# 0=dB0,1=dB2,2=dB4,3=dB6 - powerRampingStep = 1; -#ra_ReponseWindow -#1,2,4,8,10,20,40,80 - ra_ResponseWindow = 4; -#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR -#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen - ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; -#one (0..15) 4,8,12,16,...60,64 - ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; -#ra_ContentionResolutionTimer -#(0..7) 8,16,24,32,40,48,56,64 - ra_ContentionResolutionTimer = 7; - rsrp_ThresholdSSB = 19; -#prach-RootSequenceIndex_PR -#1 = 839, 2 = 139 - prach_RootSequenceIndex_PR = 2; - prach_RootSequenceIndex = 1; - # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex - # - msg1_SubcarrierSpacing = 1, -# restrictedSetConfig -# 0=unrestricted, 1=restricted type A, 2=restricted type B - restrictedSetConfig = 0, - - msg3_DeltaPreamble = 1; - p0_NominalWithGrant =-90; - -# pucch-ConfigCommon setup : -# pucchGroupHopping -# 0 = neither, 1= group hopping, 2=sequence hopping - pucchGroupHopping = 0; - hoppingId = 40; - p0_nominal = -90; - - ssb_PositionsInBurst_Bitmap = 1; - -# ssb_periodicityServingCell -# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 - ssb_periodicityServingCell = 2; - -# dmrs_TypeA_position -# 0 = pos2, 1 = pos3 - dmrs_TypeA_Position = 0; - -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - subcarrierSpacing = 1; - - - #tdd-UL-DL-ConfigurationCommon -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - referenceSubcarrierSpacing = 1; - # pattern1 - # dl_UL_TransmissionPeriodicity - # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 - dl_UL_TransmissionPeriodicity = 6; - nrofDownlinkSlots = 7; - nrofDownlinkSymbols = 6; - nrofUplinkSlots = 2; - nrofUplinkSymbols = 4; - - ssPBCH_BlockPower = -25; - } - - ); - - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - - ////////// AMF parameters: - amf_ip_address = ({ ipv4 = "127.0.0.5"; }); - - - NETWORK_INTERFACES : - { - GNB_IPV4_ADDRESS_FOR_NG_AMF = "127.0.0.1/24"; - GNB_IPV4_ADDRESS_FOR_NGU = "127.0.0.1/24"; - GNB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - } -); - -MACRLCs = ( -{ - num_cc = 1; - tr_s_preference = "local_L1"; - tr_n_preference = "local_RRC"; - pusch_TargetSNRx10 = 150; - pucch_TargetSNRx10 = 200; -} -); - -L1s = ( -{ - num_cc = 1; - tr_n_preference = "local_mac"; - prach_dtx_threshold = 120; - pucch0_dtx_threshold = 100; - ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 -} -); - -RUs = ( -{ - local_rf = "yes" - nb_tx = 1 - nb_rx = 1 - att_tx = 12; - att_rx = 12; - bands = [78]; - max_pdschReferenceSignalPower = -27; - max_rxgain = 114; - eNB_instances = [0]; - clock_src = "internal"; -} -); - - -rfsimulator : -{ - serveraddr = "server"; - serverport = 4043; - options = (); #("saviq"); or/and "chanmod" - modelname = "AWGN"; - IQfile = "/tmp/rfsimulator.iqs"; -}; - -security = { - # preferred ciphering algorithms - # the first one of the list that an UE supports in chosen - # valid values: nea0, nea1, nea2, nea3 - ciphering_algorithms = ( "nea0" ); - - # preferred integrity algorithms - # the first one of the list that an UE supports in chosen - # valid values: nia0, nia1, nia2, nia3 - integrity_algorithms = ( "nia2", "nia0" ); - - # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter - # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' - drb_ciphering = "yes"; - drb_integrity = "no"; -}; - -log_config : -{ - global_log_level ="info"; - hw_log_level ="info"; - phy_log_level ="info"; - mac_log_level ="info"; - rlc_log_level ="info"; - pdcp_log_level ="info"; - rrc_log_level ="info"; - ngap_log_level ="debug"; - f1ap_log_level ="debug"; -}; - -e2_agent = { - near_ric_ip_addr = "127.0.0.1"; - #sm_dir = "/path/where/the/SMs/are/located/" - sm_dir = "/usr/local/lib/flexric/" -}; diff --git a/OpenAirInterface_Testbed/Next_Generation_Node_B/full_install.sh b/OpenAirInterface_Testbed/Next_Generation_Node_B/full_install.sh index 62be218..bb9fc08 100755 --- a/OpenAirInterface_Testbed/Next_Generation_Node_B/full_install.sh +++ b/OpenAirInterface_Testbed/Next_Generation_Node_B/full_install.sh @@ -31,6 +31,8 @@ # Exit immediately if a command fails set -e +CLEAN_INSTALL=false + if ! command -v realpath &>/dev/null; then echo "Package \"coreutils\" not found, installing..." sudo apt-get install -y coreutils @@ -41,16 +43,16 @@ cd "$SCRIPT_DIR" # Check if a symbolic link can be created to the openairinterface5g directory if [ ! -f "openairinterface5g/cmake_targets/build_oai" ]; then + sudo rm -rf openairinterface5g if [ -f "../User_Equipment/openairinterface5g/cmake_targets/build_oai" ]; then - sudo rm -rf openairinterface5g echo "Creating symbolic link to openairinterface5g..." ln -s "../User_Equipment/openairinterface5g" openairinterface5g fi fi # Check for gNB binary to determine if srsRAN_Project is already installed -if [ -f "openairinterface5g/cmake_targets/ran_build/build/nr-softmodem" ]; then - echo "Open Air Interface gNB is already installed, skipping." +if [ "$CLEAN_INSTALL" = false ] && [ -f "openairinterface5g/cmake_targets/ran_build/build/nr-softmodem" ]; then + echo "OpenAirInterface gNB is already installed, skipping." exit 0 fi @@ -65,23 +67,12 @@ if [ ! -d "openairinterface5g" ]; then ./install_scripts/git_clone.sh https://gitlab.eurecom.fr/oai/openairinterface5g.git openairinterface5g fi -# Add support for Linux Mint 20, 21, and 22 to OpenAirInterface -if grep -q "Linux Mint" /etc/os-release; then - echo - echo "Linux Mint detected, attempting to patching OpenAirInterface to support Linux Mint 20, 21, and 22..." - cd openairinterface5g - git apply --verbose --ignore-whitespace "$SCRIPT_DIR/install_patch_files/openairinterface/cmake_targets/tools/build_helper.patch" || true - cd .. - echo "Patching completed." - echo -fi - -echo "Updating package lists..." -sudo apt-get update +echo "Patching OpenAirInterface..." +./install_scripts/apply_patches.sh echo echo -echo "Installing Open Air Interface Next Generation Node B..." +echo "Installing OpenAirInterface Next Generation Node B..." export DEBIAN_FRONTEND=noninteractive # Modifies the needrestart configuration to suppress interactive prompts if [ -f "/etc/needrestart/needrestart.conf" ]; then @@ -92,11 +83,43 @@ if [ -f "/etc/needrestart/needrestart.conf" ]; then fi export NEEDRESTART_SUSPEND=1 +# Check if GCC 13 is installed, if not, install it and set it as the default +GCC_VERSION=$(gcc -v 2>&1 | grep "gcc version" | awk '{print $3}') +if [[ -z "$GCC_VERSION" || ! "$GCC_VERSION" == 13.* ]]; then + echo "Installing GCC 13..." + sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + sudo apt-get update + sudo apt-get install -y gcc-13 g++-13 + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100 +fi + +if ! command -v cmake &>/dev/null; then + echo "Installing CMake..." + sudo apt-get update + sudo apt-get install -y cmake +fi +CMAKE_VERSION=$(cmake --version | head -n1 | awk '{print $3}') +if [[ "$CMAKE_VERSION" == 3.16.* ]]; then + echo "Detected CMake 3.16. Updating CMake for compatibility with OpenAirInterface..." + # Add Kitware's APT repository + wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc | sudo apt-key add - + sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main' + sudo apt update + sudo apt-get install -y cmake +fi + +ADDITIONAL_FLAGS="" +# if clean install is true, add flag -C +if [ "$CLEAN_INSTALL" = true ]; then + ADDITIONAL_FLAGS="-C" +fi + cd "$SCRIPT_DIR" echo echo -echo "Compiling and Installing Open Air Interface gNB..." +echo "Compiling and Installing OpenAirInterface gNB..." # Install OAI dependencies cd "$SCRIPT_DIR/openairinterface5g/cmake_targets" @@ -104,7 +127,7 @@ cd "$SCRIPT_DIR/openairinterface5g/cmake_targets" # Build OAI 5G gNB cd "$SCRIPT_DIR/openairinterface5g/cmake_targets" -./build_oai --ninja --gNB --build-e2 -w SIMU # -w USRP +./build_oai --ninja --gNB --build-e2 -w SIMU $ADDITIONAL_FLAGS # -w USRP cd "$SCRIPT_DIR" diff --git a/OpenAirInterface_Testbed/Next_Generation_Node_B/full_uninstall.sh b/OpenAirInterface_Testbed/Next_Generation_Node_B/full_uninstall.sh new file mode 100755 index 0000000..deb8513 --- /dev/null +++ b/OpenAirInterface_Testbed/Next_Generation_Node_B/full_uninstall.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Do not exit immediately if a command fails +set +e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +cd "$SCRIPT_DIR" + +echo "Stopping Next Generation Node B..." +./stop.sh + +cd ../User_Equipment + +if [ -d openairinterface5g ]; then + cd "openairinterface5g/cmake_targets" + ./build_oai -C --clean-kernel + cd ../.. +fi +sudo rm -rf openairinterface5g + +sudo rm -rf logs/ +sudo rm -rf configs/ +sudo rm -rf install_time.txt + +cd "$SCRIPT_DIR" + +if [ -d openairinterface5g ]; then + cd "openairinterface5g/cmake_targets" + ./build_oai -C --clean-kernel + cd ../.. +fi +sudo rm -rf openairinterface5g + +sudo rm -rf logs/ +sudo rm -rf configs/ +sudo rm -rf install_time.txt + +echo +echo +echo "################################################################################" +echo "# Successfully uninstalled OpenAirInterface UE and gNodeB #" +echo "################################################################################" diff --git a/OpenAirInterface_Testbed/Next_Generation_Node_B/generate_configurations.sh b/OpenAirInterface_Testbed/Next_Generation_Node_B/generate_configurations.sh index f96913e..88a5660 100755 --- a/OpenAirInterface_Testbed/Next_Generation_Node_B/generate_configurations.sh +++ b/OpenAirInterface_Testbed/Next_Generation_Node_B/generate_configurations.sh @@ -39,6 +39,10 @@ fi SCRIPT_DIR=$(dirname "$(realpath "$0")") cd "$SCRIPT_DIR" +# There are two types of RSRP measurements: SSB and CSI +# If using MIMO, then USE_SSB_RSRP must be set to false (https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/develop/doc/RUNMODEM.md#5g-gnb-mimo-configuration) +USE_SSB_RSRP="true" + # Function to update or add configuration properties in .conf files, considering sections and uncommenting if needed update_conf() { echo "update_conf($1, $2, $3)" @@ -63,7 +67,7 @@ comment_out() { sed -i "s|^\(\s*\)$STRING|#\1$STRING|" "$FILE_PATH" } -# Define the path to the YAML file +# Define the path to the 5G Core YAML file YAML_PATH="../../5G_Core_Network/options.yaml" if [ ! -f "$YAML_PATH" ]; then echo "Configuration not found in $YAML_PATH, please generate the configuration for 5G_Core_Network first." @@ -82,13 +86,14 @@ if [ -z "$TAC" ]; then exit 1 fi +# Parse Mobile Country Code (MCC) and Mobile Network Code (MNC) from PLMN MCC="${PLMN:0:3}" -MNC="${PLMN:3:2}" -if [ ${#MNC} -eq 2 ]; then - MNC_LENGTH=2 -else - MNC_LENGTH=3 +if [ ${#PLMN} -eq 5 ]; then + MNC="${PLMN:3:2}" +elif [ ${#PLMN} -eq 6 ]; then + MNC="${PLMN:3:3}" fi +MNC_LENGTH=${#MNC} echo "PLMN value: $PLMN" echo "TAC value: $TAC" @@ -102,9 +107,15 @@ if ! command -v yq &>/dev/null; then fi echo "Saving configuration file example..." -rm -rf "$SCRIPT_DIR/configs" -mkdir "$SCRIPT_DIR/configs" -rm -rf "$SCRIPT_DIR/logs" +rm -rf configs +mkdir configs + +# Only remove the logs if not running +RUNNING_STATUS=$(./is_running.sh) +if [[ $RUNNING_STATUS != *": RUNNING"* ]]; then + rm -rf logs + mkdir logs +fi cp openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf "$SCRIPT_DIR/configs/gnb.conf" @@ -146,7 +157,10 @@ update_conf "configs/gnb.conf" "GNB_IPV4_ADDRESS_FOR_NGU" "\"$AMF_ADDR_BIND/24\" update_conf "configs/gnb.conf" "tracking_area_code" "$TAC" update_conf "configs/gnb.conf" "plmn_list" "({ mcc = $MCC; mnc = $MNC; mnc_length = $MNC_LENGTH; snssaiList = ({ sst = 1; }) })" -mkdir -p "$SCRIPT_DIR/logs" -sudo chown $USER:$USER -R "$SCRIPT_DIR/logs" +if [ "$USE_SSB_RSRP" = "true" ]; then + update_conf "configs/gnb.conf" "do_CSIRS" "0" +else + update_conf "configs/gnb.conf" "do_CSIRS" "1" +fi echo "Successfully configured the UE. The configuration file is located in the configs/ directory." diff --git a/OpenAirInterface_Testbed/Next_Generation_Node_B/install_patch_files b/OpenAirInterface_Testbed/Next_Generation_Node_B/install_patch_files new file mode 120000 index 0000000..4310779 --- /dev/null +++ b/OpenAirInterface_Testbed/Next_Generation_Node_B/install_patch_files @@ -0,0 +1 @@ +../User_Equipment/install_patch_files/ \ No newline at end of file diff --git a/OpenAirInterface_Testbed/Next_Generation_Node_B/install_patch_files/openairinterface/cmake_targets/tools/build_helper.patch b/OpenAirInterface_Testbed/Next_Generation_Node_B/install_patch_files/openairinterface/cmake_targets/tools/build_helper.patch deleted file mode 120000 index 0022a38..0000000 --- a/OpenAirInterface_Testbed/Next_Generation_Node_B/install_patch_files/openairinterface/cmake_targets/tools/build_helper.patch +++ /dev/null @@ -1 +0,0 @@ -/home/sjw10/Desktop/O-RAN-Testbed-Init/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/cmake_targets/tools/build_helper.patch \ No newline at end of file diff --git a/OpenAirInterface_Testbed/Next_Generation_Node_B/install_scripts/apply_patches.sh b/OpenAirInterface_Testbed/Next_Generation_Node_B/install_scripts/apply_patches.sh new file mode 120000 index 0000000..a2b9532 --- /dev/null +++ b/OpenAirInterface_Testbed/Next_Generation_Node_B/install_scripts/apply_patches.sh @@ -0,0 +1 @@ +../../User_Equipment/install_scripts/apply_patches.sh \ No newline at end of file diff --git a/OpenAirInterface_Testbed/Next_Generation_Node_B/run_background.sh b/OpenAirInterface_Testbed/Next_Generation_Node_B/run_background.sh index 60af58a..6fc22e3 100755 --- a/OpenAirInterface_Testbed/Next_Generation_Node_B/run_background.sh +++ b/OpenAirInterface_Testbed/Next_Generation_Node_B/run_background.sh @@ -46,11 +46,10 @@ else echo "Starting gNodeB in background..." mkdir -p logs - sudo chown -R $USER:$USER logs >logs/gnb_stdout.txt cd "$SCRIPT_DIR/openairinterface5g/cmake_targets/ran_build/build" - sudo setsid bash -c "stdbuf -oL -eL sudo ./nr-softmodem -O \"$SCRIPT_DIR/configs/gnb.conf\" --rfsim --rfsimulator.serveraddr server --gNBs.[0].min_rxtxtime 6 > \"$SCRIPT_DIR/logs/gnb_stdout.txt\" 2>&1" \"$SCRIPT_DIR/logs/gnb_stdout.txt\" 2>&1" /dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") + +#!/bin/bash + +if ! command -v gdb &>/dev/null; then + echo "Installing GNU Debugger..." + sudo apt update + sudo apt-get install -y gdb +fi + +cd "$SCRIPT_DIR/openairinterface5g/cmake_targets/ran_build/build" + +sudo gdb --args ./nr-softmodem -O "$SCRIPT_DIR/configs/gnb.conf" --rfsim --rfsimulator.serveraddr server --gNBs.[0].min_rxtxtime 6 diff --git a/OpenAirInterface_Testbed/Next_Generation_Node_B/stop.sh b/OpenAirInterface_Testbed/Next_Generation_Node_B/stop.sh index c76936a..9abbdde 100755 --- a/OpenAirInterface_Testbed/Next_Generation_Node_B/stop.sh +++ b/OpenAirInterface_Testbed/Next_Generation_Node_B/stop.sh @@ -42,12 +42,15 @@ if $(./is_running.sh | grep -q "gNodeB: NOT_RUNNING"); then exit 0 fi +# Prevent the subsequent command from requiring credential input +sudo ls >/dev/null 2>&1 + # Send a graceful shutdown signal to the gNodeB process sudo pkill -f "nr-softmodem" >/dev/null 2>&1 & # Wait for the process to terminate gracefully COUNT=0 -MAX_COUNT=10 +MAX_COUNT=5 sleep 1 while [ $COUNT -lt $MAX_COUNT ]; do IS_RUNNING=$(./is_running.sh) diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/.gitignore b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/.gitignore old mode 100755 new mode 100644 similarity index 56% rename from OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/.gitignore rename to OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/.gitignore index 6ab152b..105d458 --- a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/.gitignore +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/.gitignore @@ -1,5 +1,8 @@ # Ignore testbed subdirectories +/configs/ /flexric/ /logs/ /swig/ +influxdb_auth_token.json install_time.txt +!install_patch_files/ \ No newline at end of file diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/README.md b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/README.md new file mode 100644 index 0000000..5f28404 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/README.md @@ -0,0 +1,65 @@ +## Flexible RAN Intelligent Controller (FlexRIC) + +The Near-RT RIC, conceptualized by the O-RAN Alliance's Working Group 3 (WG3) [[1]][oran-wg3] and implemented by Mosaic5G [\[2][publication-nearrtric], [3\]][mosaic5g-nearrtric], enables dynamic management and optimization of Radio Access Networks (RAN). + +## Usage + +- **Compile**: Use `./full_install.sh` to build and install the Near-RT RIC software. +- **Generate Configurations**: Use `./generate_configurations.sh` to create configuration files. + - Configuration files can be accessed and modified in the `configs` directory. +- **Start the Near-RT RIC**: Use `./run.sh` to start the Near-RT RIC application. +- **Stop the Near-RT RIC**: Terminate the Near-RT RIC with `./stop.sh`. +- **Status**: Check if the Near-RT RIC is running with `./is_running.sh`. +- **Logs**: Access logs by navigating to the `logs` directory. +- **Uninstall**: Use `./uninstall.sh` to remove the Near-RT RIC software. + +## Running an xApp + +This installation of the Near-RT RIC supports four xApps. + +- **KPI Monitor xApp (xapp_kpm_moni)**: + - Run with `./run_xapp_kpm_moni.sh`. + - Patched to run indefinitely and include SSB/CSI-RS RSRP metric in KPIs. +- **MAC + RLC + PDCP + GTP Monitor xApp (xapp_gtp_mac_rlc_pdcp_moni)**: + - Run with `./additional_scripts/run_xapp_gtp_mac_rlc_pdcp_moni.sh`. +- **RIC Control xApp (xapp_kpm_rc)**: + - Run with `./additional_scripts/run_xapp_kpm_rc.sh`. +- **RIC Control Monitor xApp (xapp_rc_moni)**: + - Run with `./additional_scripts/run_xapp_rc_moni.sh`. + +## KPI Monitor Visualization in Grafana + +After the KPI Monitor xApp subscribes to the E2 node, metrics of the gNodeB and UE are sent through the E2 interface and received by the xApp. An xApp has been made at `flexric/build/examples/xApp/c/monitor/xapp_kpm_moni_write_to_csv` which writes the metrics to logs/KPI_Metrics.csv instead of printing them to the console. The Python server at `additional_scripts/grafana_host_kpi_metrics_over_http.py` will make this CSV file accessible at `http://localhost:3030/KPI_Metrics.csv`, and a Grafana dashboard has been created to consume this data and visualize it. + +- **Real-Time Metrics**: To start the xApp that generates `logs/KPI_Monitor.csv`, the Python server that hosts the file, and the Grafana server, run the following. + ```console + ./additional_scripts/start_grafana_with_xapp_kpm_moni.sh + ``` + +- **Non-Real Time Metrics**: Since it is not a requirement for the xApp to actively write metrics to `logs/KPI_Monitor.csv`, the Python server and Grafana server can be started without the xApp by running the following. + ```console + ./additional_scripts/start_grafana_only.sh + ``` + A sample KPI_Metrics.csv file has been provided, and can be applied with `cp additional_scripts/sample_KPI_Metrics.csv logs/KPI_Metrics.csv`. + +- **Initial Configuration**: The dashboard uses the Infinity plugin (yesoreyeram-infinity-datasource), which may require creating a data source under Connections → Data sources → Add data source → Infinity. Configure it under URL, Headers & Params → Base URL → Type "`http://localhost:3030/KPI_Metrics.csv`" → Save & test. + +- **Stop Grafana**: To stop the Grafana server, Python server, and xApp, use `./additional_scripts/stop_grafana.sh`. + +The Grafana dashboard is accessible at `http://localhost:3000` with default credentials being "admin". Upon initial startup, import the following JSON file into the Grafana client by navigating to Dashboards → New → Import: `additional_scripts/grafana_xapp_dashboard.json`. Please note that the dashboard and the metrics provided with this software are still in development and therefore may display some inaccurate values. Below is a snapshot of the dashboard in its current state. + +

+ Grafana dashboard of xApp KPI metrics +

+ +## References + +1. Working Group 3: Near-Real-time RAN Intelligent Controller and E2 Interface Workgroup. O-RAN Alliance. [https://public.o-ran.org/display/WG3/Introduction][oran-wg3] +2. FlexRIC: an SDK for next-generation SD-RANs. R. Schmidt, M. Irazabal, N. Nikaein. [https://dl.acm.org/doi/10.1145/3485983.3494870][publication-nearrtric] +3. Flexible RAN Intelligent Controller (FlexRIC) and E2 Agent. Mosaic5G. [https://gitlab.eurecom.fr/mosaic5g/flexric][mosaic5g-nearrtric] + + + +[oran-wg3]: https://public.o-ran.org/display/WG3/Introduction +[publication-nearrtric]: https://dl.acm.org/doi/10.1145/3485983.3494870 +[mosaic5g-nearrtric]: https://gitlab.eurecom.fr/mosaic5g/flexric diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/grafana_host_kpi_metrics_over_http.py b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/grafana_host_kpi_metrics_over_http.py new file mode 100644 index 0000000..1dd2efc --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/grafana_host_kpi_metrics_over_http.py @@ -0,0 +1,221 @@ +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +import http.server +import os +import socketserver +import urllib.parse +import mmap +import time + +script_dir = os.path.dirname(os.path.abspath(__file__)) +parent_dir = os.path.dirname(script_dir) +base_dir = os.path.dirname(os.path.dirname(os.path.dirname(parent_dir))) + +class SingleFileHTTPRequestHandler(http.server.SimpleHTTPRequestHandler): + + # Perform a binary search to find the offset in the mmap file where the timestamp is greater than or equal to the target timestamp. + def find_offset(self, mmap_file: mmap.mmap, header_end_offset: int, target_timestamp: int): + low, high = header_end_offset, mmap_file.size() + while low < high: + mid = (low + high) // 2 + mmap_file.seek(mid) + mmap_file.readline() # Skip a possibly partial line + current_position = mmap_file.tell() + line = mmap_file.readline() + if not line: + high = mid + continue + try: + timestamp = int(line.split(b',', 1)[0]) + except ValueError: + high = mid + continue + + if timestamp < target_timestamp: + low = current_position + len(line) + else: + high = mid + + # If the line is still less than the target timestamp, check the next line + mmap_file.seek(low) + candidate = mmap_file.readline() + try: + ts = int(candidate.split(b',',1)[0]) + except: + ts = None + if ts is None or ts < target_timestamp: + return mmap_file.size() + return low + + def do_GET(self): + start_time = time.perf_counter() + + # Parse the URL path and query string + parsed = urllib.parse.urlparse(self.path) + path = parsed.path.lstrip('/') + query = urllib.parse.parse_qs(parsed.query) + + # Handle requests for KPI_Metrics.csv + if path == 'KPI_Metrics.csv': + csv_path = os.path.join(parent_dir, 'logs', 'KPI_Metrics.csv') + if not os.path.exists(csv_path): + return self.send_error(404, "Not found") + + # Helper function to parse query parameters + def parse(name): + value = query.get(name) + return int(value[0]) if value and value[0].isdigit() else None + + from_timestamp, to_timestamp = parse('from'), parse('to') + filter_param = query.get('filter', [None])[0] + filter_columns = filter_param.split(',') if filter_param else None + + # If no filters are provided, fall back to the default handler + if from_timestamp is None and to_timestamp is None and not filter_columns: + self.path = csv_path + return super().do_GET() + + # Open and mmap the file for efficient access + with open(csv_path, 'rb') as f: + mmap_file = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) + header_end = mmap_file.find(b'\n') + 1 + start = header_end if from_timestamp is None else self.find_offset(mmap_file, header_end, from_timestamp) + + # If the start position is beyond the file size, return the header + if start >= mmap_file.size(): + header = mmap_file[:header_end] + self.send_response(200) + self.send_header('Content-Type', 'text/csv') + self.send_header('Content-Length', str(len(header))) + self.end_headers() + self.wfile.write(header) + mmap_file.close() + return + + mmap_file.seek(start) + + # Always send the header row + buffer = bytearray() + + if filter_columns: + # Read the header and filter columns + header = mmap_file[:header_end] + header_line = header.decode().rstrip('\n').split(',') + column_indices = [header_line.index(col) for col in filter_columns if col in header_line] + filtered_header = [header_line[i] for i in column_indices] + filtered_bytes = (','.join(filtered_header) + '\n').encode() + buffer.extend(filtered_bytes) + + mmap_file.seek(start) + while True: + line = mmap_file.readline() + if not line: + break + timestamp = int(line.split(b',', 1)[0]) if line.split(b',', 1)[0].isdigit() else None + if to_timestamp is not None and timestamp is not None and timestamp > to_timestamp: + break + + cells = line.rstrip(b'\r\n').split(b',') + filtered_line = b','.join(cells[i] for i in column_indices) + b'\n' + buffer.extend(filtered_line) + else: + # If no filtering is applied, send the entire file content + header = mmap_file[:header_end] + buffer.extend(header) + + # Read lines until the end of the file or until the to_timestamp is reached + while True: + line = mmap_file.readline() + if not line: + break + timestamp = int(line.split(b',', 1)[0]) if line.split(b',', 1)[0].isdigit() else None + if to_timestamp is not None and timestamp is not None and timestamp > to_timestamp: + break + buffer.extend(line) + + mmap_file.close() + + data = bytes(buffer) + # Set the response headers + self.send_response(200) + self.send_header('Content-Type', 'text/csv') + self.send_header('Content-Length', str(len(data))) + self.end_headers() + self.wfile.write(data) + + elapsed = (time.perf_counter() - start_time) * 1000 + #print(f"{elapsed:.2f} ms") + return + + # NIST.svg handling stays the same + elif path == 'NIST.svg': + self.path = os.path.join(base_dir, 'Images', 'NIST_Dark.svg') + else: + self.send_error(404, f'File not found: {self.path}') + return + + if not os.path.isfile(self.path): + self.send_error(404, f'File not found: {self.path}') + raise Exception(f"File not found: {self.path}") + + #print(f"Serving file: {os.path.basename(self.path)}") + result = super().do_GET() + elapsed = (time.perf_counter() - start_time) * 1000 + #print(f"{elapsed:.2f} ms") + return result + + # Override to serve files from the correct directory + def translate_path(self, path): + return os.path.abspath(self.path) + + # Override to add headers to prevent caching of the files + def end_headers(self): + # self.send_header('Cache-Control', 'no-store, must-revalidate') + # self.send_header('Pragma', 'no-cache') + # self.send_header('Expires', '0') + + self.send_header('Cache-Control', 'no-store, must-revalidate') + self.send_header('Pragma', 'no-cache') + self.send_header('Expires', '0') + self.send_header('Access-Control-Allow-Origin', '*') + self.send_header('Access-Control-Allow-Methods', 'GET') + self.send_header('Access-Control-Allow-Headers', 'Content-Type') + return super().end_headers() + +PORT = 3030 + +class MyTCPServer(socketserver.TCPServer): + allow_reuse_address = True + +with MyTCPServer(('', PORT), SingleFileHTTPRequestHandler) as httpd: + print('Serving the following routes:') + print(f' http://localhost:{PORT}/KPI_Metrics.csv?from=&to=&filter=') + print(f' http://localhost:{PORT}/KPI_Metrics.csv...') + print(f' http://localhost:{PORT}/NIST.svg...') + httpd.serve_forever() \ No newline at end of file diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/grafana_influxdb_xapp_dashboard.json b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/grafana_influxdb_xapp_dashboard.json new file mode 100644 index 0000000..fe5d3eb --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/grafana_influxdb_xapp_dashboard.json @@ -0,0 +1,4422 @@ +{ + "__inputs": [ + { + "name": "DS_YESOREYERAM-INFINITY-DATASOURCE", + "label": "yesoreyeram-infinity-datasource", + "description": "", + "type": "datasource", + "pluginId": "yesoreyeram-infinity-datasource", + "pluginName": "Infinity" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "panel", + "id": "bargauge", + "name": "Bar gauge", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "11.6.1" + }, + { + "type": "panel", + "id": "histogram", + "name": "Histogram", + "version": "" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "" + }, + { + "type": "panel", + "id": "text", + "name": "Text", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + }, + { + "type": "datasource", + "id": "yesoreyeram-infinity-datasource", + "name": "Infinity", + "version": "3.2.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": null, + "links": [], + "panels": [ + { + "gridPos": { + "h": 4, + "w": 9, + "x": 0, + "y": 0 + }, + "id": 10, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "html" + }, + "pluginVersion": "11.6.1", + "transparent": true, + "type": "text" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "center", + "cellOptions": { + "type": "color-text", + "wrapText": false + }, + "filterable": false, + "inspect": false, + "minWidth": 1 + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "super-light-yellow" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 11, + "y": 0 + }, + "id": 21, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "enablePagination": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": false + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "UE ID", + "text": "UE_ID", + "type": "number" + }, + { + "selector": "Time (UNIX ms)", + "text": "UNIX Epoch (ms)", + "type": "timestamp_epoch" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "UE IDs", + "transformations": [ + { + "id": "groupToNestedTable", + "options": { + "fields": { + "Time (UNIX ms)": { + "aggregations": [], + "operation": "groupby" + }, + "UE ID": { + "aggregations": [ + "uniqueValues" + ], + "operation": "aggregate" + }, + "UE_ID": { + "aggregations": [ + "allValues" + ], + "operation": "aggregate" + }, + "UNIX Epoch (ms)": { + "aggregations": [], + "operation": "groupby" + }, + "Value": { + "aggregations": [] + } + }, + "showSubframeHeaders": true + } + }, + { + "id": "reduce", + "options": { + "includeTimeField": false, + "mode": "reduceFields", + "reducers": [ + "lastNotNull" + ] + } + }, + { + "id": "extractFields", + "options": { + "delimiter": ",", + "format": "delimiter", + "keepTime": false, + "replace": true, + "source": "UE_ID (allValues)" + } + }, + { + "id": "transpose", + "options": {} + }, + { + "id": "filterFieldsByName", + "options": { + "byVariable": false, + "include": { + "names": [ + "1" + ] + } + } + } + ], + "transparent": true, + "type": "table" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "super-light-yellow", + "mode": "fixed" + }, + "fieldMinMax": false, + "mappings": [], + "min": 0, + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "super-light-yellow" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 13, + "y": 0 + }, + "id": 20, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "/^UE \\(count\\)$/", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "UE ID", + "text": "UE", + "type": "number" + }, + { + "selector": "Time (UNIX ms)", + "text": "UNIX Epoch (ms)", + "type": "number" + } + ], + "computed_columns": [ + { + "selector": "", + "text": "", + "type": "string" + } + ], + "csv_options": { + "relax_column_count": false + }, + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "dataframe", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "summarizeExpression": "", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Current UEs", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "greaterOrEqual", + "options": { + "value": "$__from" + } + }, + "fieldName": "UNIX Epoch (ms)" + } + ], + "match": "any", + "type": "include" + } + }, + { + "id": "groupBy", + "options": { + "fields": { + "UE": { + "aggregations": [ + "count" + ], + "operation": "aggregate" + }, + "UNIX Epoch (ms)": { + "aggregations": [], + "operation": "groupby" + } + } + } + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "super-light-yellow", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "super-light-yellow" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "UEs" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 15, + "y": 0 + }, + "id": 22, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "UE ID", + "text": "UE", + "type": "number" + }, + { + "selector": "Time (UNIX ms)", + "text": "UNIX Epoch (ms)", + "type": "timestamp_epoch" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "UEs Over Time", + "transformations": [ + { + "id": "groupBy", + "options": { + "fields": { + "UE": { + "aggregations": [ + "count" + ], + "operation": "aggregate" + }, + "UNIX Epoch (ms)": { + "aggregations": [], + "operation": "groupby" + } + } + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "fixed" + }, + "decimals": 2, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "yellow" + }, + { + "color": "purple", + "value": 80 + } + ] + }, + "unit": "Kbits" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Aggregated UE DL Throughput (sum)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "Aggregated UE DL Throughput" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Aggregated UE UL Throughput (sum)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "Aggregated UE UL Throughput" + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 19, + "y": 0 + }, + "id": 19, + "options": { + "displayMode": "gradient", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "DRB.UEThpDl (kbps)", + "text": "Aggregated UE DL Throughput", + "type": "number" + }, + { + "selector": "DRB.UEThpUl (kbps)", + "text": "Aggregated UE UL Throughput", + "type": "number" + }, + { + "selector": "Time (UNIX ms)", + "text": "UNIX Timestamp (ms)", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "transformations": [ + { + "id": "groupBy", + "options": { + "fields": { + "Aggregate UE Downlink Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregate UE Uplink Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregated UE DL": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregated UE DL Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregated UE Downlink Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregated UE UL": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregated UE UL Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregated UE Uplink Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Current DL": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Current UE DL": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Current UE UL": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Current UL": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UE DL Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UE DL Thrp": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UE Downlink Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UE UL Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UE UL Thrp": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UE Uplink Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UNIX Timestamp (ms)": { + "aggregations": [], + "operation": "groupby" + } + } + } + } + ], + "type": "bargauge" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dBm" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RSRQ (dB)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "N_RSRP_MEAS" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RSRP (dBm)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 7, + "x": 0, + "y": 4 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RSRP (dBm)", + "text": "RSRP (dBm)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Reference Signal Received Power (RSRP)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + }, + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "0" + } + }, + "fieldName": "RSRP (dBm)" + } + ], + "match": "any", + "type": "exclude" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic-by-name" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "points", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RSRQ (dB)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "N_RSRP_MEAS" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 7, + "y": 4 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "N_RSRP_MEAS", + "text": "N_RSRP_MEAS", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Num. RSRP Measurements", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Kbits" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "DRB.UEThpUl (kbps)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.UEThpDl (kbps)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 6, + "x": 13, + "y": 4 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.UEThpDl (kbps)", + "text": "DRB.UEThpDl (kbps)", + "type": "number" + }, + { + "selector": "DRB.UEThpUl (kbps)", + "text": "DRB.UEThpUl (kbps)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "UE Throughput Downlink / Uplink", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "deckbytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeUL (kb) (sum)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "Volume Uplink (DRB.PdcpSduVolumeUL)" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeDL (kb) (sum)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "Volume Downlink (DRB.PdcpSduVolumeDL)" + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 19, + "y": 4 + }, + "id": 2, + "maxPerRow": 12, + "options": { + "displayMode": "basic", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.PdcpSduVolumeDL (kb)", + "text": "DRB.PdcpSduVolumeDL (kb)", + "type": "number" + }, + { + "selector": "DRB.PdcpSduVolumeUL (kb)", + "text": "DRB.PdcpSduVolumeUL (kb)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + }, + { + "id": "groupBy", + "options": { + "fields": { + "DRB.PdcpSduVolumeDL (kb)": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "DRB.PdcpSduVolumeUL (kb)": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Timestamp": { + "aggregations": [], + "operation": "groupby" + } + } + } + } + ], + "type": "bargauge" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "µs" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "DRB.RlcSduDelayDl (μs)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 19, + "y": 8 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.RlcSduDelayDl (μs)", + "text": "DRB.RlcSduDelayDl (μs)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Delay Downlink", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 0.8 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "PACKET_RETRANSMISISON_RATE" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.MacSduRetransmissionRateDl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.MacSduRetransmissionRateUl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.HarqBlockErrorRateDl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.HarqBlockErrorRateUl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.HarqMcsDl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.HarqMcsUl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 7, + "y": 11 + }, + "id": 37, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.HarqMcsDl", + "text": "DRB.HarqMcsDl", + "type": "number" + }, + { + "selector": "DRB.HarqMcsUl", + "text": "DRB.HarqMcsUl", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Modulation and Coding Scheme", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic-by-name" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dBm" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RSRQ (dB)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RSSI (dBm)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-purple", + "mode": "fixed", + "seriesBy": "last" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 7, + "x": 0, + "y": 12 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RSSI (dBm)", + "text": "RSSI (dBm)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Received Signal Strength Indicator (RSSI)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 0.8 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "PACKET_RETRANSMISISON_RATE" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.MacSduRetransmissionRateDl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.MacSduRetransmissionRateUl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 19, + "y": 12 + }, + "id": 32, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.MacSduRetransmissionRateDl", + "text": "DRB.MacSduRetransmissionRateDl", + "type": "number" + }, + { + "selector": "DRB.MacSduRetransmissionRateUl", + "text": "DRB.MacSduRetransmissionRateUl", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "MAC SDU Retransmission Rate (%)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "PRBs" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RRU.PrbTotUl (PRBs)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RRU.PrbTotDl (PRBs)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 6, + "x": 13, + "y": 14 + }, + "id": 15, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RRU.PrbTotDl (PRBs)", + "text": "RRU.PrbTotDl (PRBs)", + "type": "number" + }, + { + "selector": "RRU.PrbTotUl (PRBs)", + "text": "RRU.PrbTotUl (PRBs)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Number of PRBs Downlink / Uplink Since Last Sample", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 0.8 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "PACKET_RETRANSMISISON_RATE" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.MacSduRetransmissionRateDl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.MacSduRetransmissionRateUl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.HarqBlockErrorRateDl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.HarqBlockErrorRateUl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 7, + "y": 17 + }, + "id": 36, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.HarqBlockErrorRateDl", + "text": "DRB.HarqBlockErrorRateDl", + "type": "number" + }, + { + "selector": "DRB.HarqBlockErrorRateUl", + "text": "DRB.HarqBlockErrorRateUl", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Block Error Rate", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 0.8 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "PACKET_RETRANSMISISON_RATE" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PACKET_DROP_RATE" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.MacSduErrorRateDl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.MacSduErrorRateUl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 19, + "y": 18 + }, + "id": 33, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.MacSduErrorRateDl", + "text": "DRB.MacSduErrorRateDl", + "type": "number" + }, + { + "selector": "DRB.MacSduErrorRateUl", + "text": "DRB.MacSduErrorRateUl", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "MAC SDU Error Rate (%)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "#c87474", + "mode": "shades" + }, + "fieldMinMax": true, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dB" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 7, + "x": 0, + "y": 19 + }, + "id": 14, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "PUSCH_SNR (dB)", + "text": "SNR: Physical Uplink Shared Channel (PUSCH)", + "type": "number" + }, + { + "selector": "PUCCH_SNR (dB)", + "text": "SNR: Physical Uplink Control Channel (PUCCH)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Signal-to-Noise Ratios", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 31, + "panels": [], + "title": "Experimental Panels", + "type": "row" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dB" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RSRQ (dB)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-purple", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 0, + "y": 25 + }, + "id": 30, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RSRQ (dB)", + "text": "RSRQ (dB)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Ref. Signal Received Quality (RSRQ)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "stacking": { + "group": "A", + "mode": "none" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dB" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RSRQ (dB)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-purple", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 3, + "x": 4, + "y": 25 + }, + "id": 18, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RSRQ (dB)", + "text": "RSRQ (dB)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Histogram of RSRQ", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "histogram" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RSRQ (dB)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "N_PRB" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-purple", + "mode": "fixed" + } + } + ] + }, + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "N_PRB" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [] + } + ] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 7, + "y": 25 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "N_PRB", + "text": "N_PRB", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Num. PRBs (for RSSI)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic-by-name" + }, + "custom": { + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "stacking": { + "group": "A", + "mode": "none" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "PRB" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RRU.PrbTotUl (PRBs)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 13, + "y": 25 + }, + "id": 17, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RRU.PrbTotUl (PRBs)", + "text": "RRU.PrbTotUl (PRBs)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Histogram of PRBs Uplink Since Last Sample", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "histogram" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "deckbytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeUL (kb) (sum)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "Aggregated UE UL Volume" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeDL (kb) (sum)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "Aggregated UE DL Volume" + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 19, + "y": 25 + }, + "id": 29, + "maxPerRow": 12, + "options": { + "displayMode": "basic", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.PdcpSduVolumeDL (kb)", + "text": "DRB.PdcpSduVolumeDL (kb)", + "type": "number" + }, + { + "selector": "DRB.PdcpSduVolumeUL (kb)", + "text": "DRB.PdcpSduVolumeUL (kb)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "transformations": [ + { + "disabled": true, + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + }, + { + "id": "groupBy", + "options": { + "fields": { + "DRB.PdcpSduVolumeDL (kb)": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "DRB.PdcpSduVolumeUL (kb)": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Timestamp": { + "aggregations": [], + "operation": "groupby" + } + } + } + }, + { + "id": "calculateField", + "options": { + "binary": { + "left": { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeDL (kb)" + } + }, + "operator": "/", + "right": { + "fixed": "8" + } + }, + "mode": "binary", + "reduce": { + "reducer": "sum" + } + } + }, + { + "id": "calculateField", + "options": { + "binary": { + "left": { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeUL (kb)" + } + }, + "operator": "/", + "right": { + "fixed": "8" + } + }, + "mode": "binary", + "reduce": { + "include": [], + "reducer": "sum" + } + } + }, + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "DRB.PdcpSduVolumeDL (kb) (sum)", + "DRB.PdcpSduVolumeUL (kb) (sum)" + ] + } + } + } + ], + "type": "bargauge" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "max": 15, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 7, + "y": 29 + }, + "id": 34, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "CQI_SINGLE_CODEWORD", + "text": "CQI_SINGLE_CODEWORD", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "CQI (Single Codeword)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "max": 15, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 10, + "y": 29 + }, + "id": 35, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "CQI_DUAL_CODEWORD", + "text": "CQI_DUAL_CODEWORD", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "CQI (Dual Codeword)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "super-light-blue", + "mode": "fixed" + }, + "custom": { + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "stacking": { + "group": "A", + "mode": "none" + } + }, + "decimals": 0, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "super-light-blue" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "PRBs" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RRU.PrbTotDl (PRBs)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 13, + "y": 29 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RRU.PrbTotDl (PRBs)", + "text": "RRU.PrbTotDl (PRBs)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + } + ], + "title": "Histogram of PRBs Downlink Since Last Sample", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "histogram" + } + ], + "refresh": "auto", + "schemaVersion": 41, + "tags": [], + "templating": { + "list": [ + { + "current": {}, + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "definition": "", + "description": "", + "includeAll": false, + "name": "Selected_UE_ID", + "options": [], + "query": { + "infinityQuery": { + "columns": [ + { + "selector": "UE ID", + "text": "UE_ID", + "type": "number" + } + ], + "filters": [], + "format": "table", + "parser": "backend", + "refId": "variable", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET" + } + }, + "query": "", + "queryType": "infinity" + }, + "refresh": 2, + "regex": "", + "type": "query" + } + ] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "FlexRIC KPI Monitor", + "uid": "bekdqgorfelmoc", + "version": 2, + "weekStart": "" +} \ No newline at end of file diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/grafana_xapp_dashboard.json b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/grafana_xapp_dashboard.json new file mode 100644 index 0000000..196b8e6 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/grafana_xapp_dashboard.json @@ -0,0 +1,4983 @@ +{ + "__inputs": [ + { + "name": "DS_YESOREYERAM-INFINITY-DATASOURCE", + "label": "yesoreyeram-infinity-datasource", + "description": "", + "type": "datasource", + "pluginId": "yesoreyeram-infinity-datasource", + "pluginName": "Infinity" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "panel", + "id": "bargauge", + "name": "Bar gauge", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "11.6.1" + }, + { + "type": "panel", + "id": "histogram", + "name": "Histogram", + "version": "" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "" + }, + { + "type": "panel", + "id": "text", + "name": "Text", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + }, + { + "type": "datasource", + "id": "yesoreyeram-infinity-datasource", + "name": "Infinity", + "version": "3.2.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": null, + "links": [], + "panels": [ + { + "gridPos": { + "h": 4, + "w": 10, + "x": 0, + "y": 0 + }, + "id": 10, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "html" + }, + "pluginVersion": "11.6.1", + "transparent": true, + "type": "text" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "center", + "cellOptions": { + "type": "color-text", + "wrapText": false + }, + "filterable": false, + "inspect": false, + "minWidth": 1 + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "super-light-yellow" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 12, + "y": 0 + }, + "id": 21, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "enablePagination": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": false + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "UE ID", + "text": "UE_ID", + "type": "number" + }, + { + "selector": "Time (UNIX ms)", + "text": "UNIX Epoch (ms)", + "type": "timestamp_epoch" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "UE ID,Time (UNIX ms)" + } + ] + } + } + ], + "title": "UE IDs", + "transformations": [ + { + "id": "groupToNestedTable", + "options": { + "fields": { + "Time (UNIX ms)": { + "aggregations": [], + "operation": "groupby" + }, + "UE ID": { + "aggregations": [ + "uniqueValues" + ], + "operation": "aggregate" + }, + "UE_ID": { + "aggregations": [ + "allValues" + ], + "operation": "aggregate" + }, + "UNIX Epoch (ms)": { + "aggregations": [], + "operation": "groupby" + }, + "Value": { + "aggregations": [] + } + }, + "showSubframeHeaders": true + } + }, + { + "id": "reduce", + "options": { + "includeTimeField": false, + "mode": "reduceFields", + "reducers": [ + "lastNotNull" + ] + } + }, + { + "id": "extractFields", + "options": { + "delimiter": ",", + "format": "delimiter", + "keepTime": false, + "replace": true, + "source": "UE_ID (allValues)" + } + }, + { + "id": "transpose", + "options": {} + }, + { + "id": "filterFieldsByName", + "options": { + "byVariable": false, + "include": { + "names": [ + "1" + ] + } + } + } + ], + "transparent": true, + "type": "table" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "super-light-yellow", + "mode": "fixed" + }, + "fieldMinMax": false, + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "super-light-yellow" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 14, + "y": 0 + }, + "id": 20, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "UE ID", + "text": "UE", + "type": "number" + }, + { + "selector": "Time (UNIX ms)", + "text": "UNIX Epoch (ms)", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "UE ID,Time (UNIX ms)" + } + ] + } + } + ], + "title": "Current UEs", + "transformations": [ + { + "id": "groupBy", + "options": { + "fields": { + "UE": { + "aggregations": [ + "count" + ], + "operation": "aggregate" + }, + "UNIX Epoch (ms)": { + "aggregations": [], + "operation": "groupby" + } + } + } + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "super-light-yellow", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "super-light-yellow" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "UEs" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 16, + "y": 0 + }, + "id": 22, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "UE ID", + "text": "UE", + "type": "number" + }, + { + "selector": "Time (UNIX ms)", + "text": "UNIX Epoch (ms)", + "type": "timestamp_epoch" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "filter", + "value": "UE ID,Time (UNIX ms)" + } + ] + } + } + ], + "title": "UEs Over Time", + "transformations": [ + { + "id": "groupBy", + "options": { + "fields": { + "UE": { + "aggregations": [ + "count" + ], + "operation": "aggregate" + }, + "UNIX Epoch (ms)": { + "aggregations": [], + "operation": "groupby" + } + } + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "fixed" + }, + "decimals": 2, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "yellow" + }, + { + "color": "purple", + "value": 80 + } + ] + }, + "unit": "Kbits" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Aggregated UE DL Throughput (sum)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "Aggregated UE DL Throughput" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Aggregated UE UL Throughput (sum)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "Aggregated UE UL Throughput" + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 19, + "y": 0 + }, + "id": 19, + "options": { + "displayMode": "gradient", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "DRB.UEThpDl (kbps)", + "text": "Aggregated UE DL Throughput", + "type": "number" + }, + { + "selector": "DRB.UEThpUl (kbps)", + "text": "Aggregated UE UL Throughput", + "type": "number" + }, + { + "selector": "Time (UNIX ms)", + "text": "UNIX Timestamp (ms)", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "DRB.UEThpDl (kbps),DRB.UEThpUl (kbps),Time (UNIX ms)" + } + ] + } + } + ], + "transformations": [ + { + "id": "groupBy", + "options": { + "fields": { + "Aggregate UE Downlink Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregate UE Uplink Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregated UE DL": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregated UE DL Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregated UE Downlink Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregated UE UL": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregated UE UL Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Aggregated UE Uplink Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Current DL": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Current UE DL": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Current UE UL": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Current UL": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UE DL Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UE DL Thrp": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UE Downlink Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UE UL Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UE UL Thrp": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UE Uplink Throughput": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "UNIX Timestamp (ms)": { + "aggregations": [], + "operation": "groupby" + } + } + } + } + ], + "type": "bargauge" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dBm" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RSRP (dBm)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#b3e0accc", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 7, + "x": 0, + "y": 4 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RSRP (dBm)", + "text": "RSRP (dBm)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),RSRP (dBm),UE ID" + } + ] + } + } + ], + "title": "Reference Signal Received Power (RSRP)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + }, + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "0" + } + }, + "fieldName": "RSRP (dBm)" + } + ], + "match": "any", + "type": "exclude" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic-by-name" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "points", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "N_RSRP_MEAS" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 4, + "x": 7, + "y": 4 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "N_RSRP_MEAS", + "text": "N_RSRP_MEAS", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),N_RSRP_MEAS,UE ID" + } + ] + } + } + ], + "title": "Num. RSRP Measurements", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Kbits" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "DRB.UEThpUl (kbps)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.UEThpDl (kbps)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 7, + "x": 11, + "y": 4 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.UEThpDl (kbps)", + "text": "DRB.UEThpDl (kbps)", + "type": "number" + }, + { + "selector": "DRB.UEThpUl (kbps)", + "text": "DRB.UEThpUl (kbps)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),DRB.UEThpDl (kbps),DRB.UEThpUl (kbps),UE ID" + } + ] + } + } + ], + "title": "User Equipment Throughput", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "µs" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "DRB.RlcSduDelayDl (μs)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 18, + "y": 4 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.RlcSduDelayDl (μs)", + "text": "DRB.RlcSduDelayDl (μs)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),DRB.RlcSduDelayDl (μs),UE ID" + } + ] + } + } + ], + "title": "Delay Downlink", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 0.8 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "PACKET_RETRANSMISISON_RATE" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.MacSduRetransmissionRateDl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.MacSduRetransmissionRateUl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 18, + "y": 8 + }, + "id": 32, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.MacSduRetransmissionRateDl", + "text": "DRB.MacSduRetransmissionRateDl", + "type": "number" + }, + { + "selector": "DRB.MacSduRetransmissionRateUl", + "text": "DRB.MacSduRetransmissionRateUl", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),DRB.MacSduRetransmissionRateDl,DRB.MacSduRetransmissionRateUl,UE ID" + } + ] + } + } + ], + "title": "MAC SDU Retransmission Rate", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic-by-name" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dBm" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RSSI (dBm)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#cb95e6bd", + "mode": "fixed", + "seriesBy": "last" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 7, + "x": 0, + "y": 11 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RSSI (dBm)", + "text": "RSSI (dBm)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),RSSI (dBm),UE ID" + } + ] + } + } + ], + "title": "Received Signal Strength Indicator (RSSI)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "N_PRB" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#deb6f2bd", + "mode": "fixed" + } + } + ] + }, + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "N_PRB" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [] + } + ] + }, + "gridPos": { + "h": 7, + "w": 4, + "x": 7, + "y": 11 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "N_PRB", + "text": "N_PRB", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),N_PRB,UE ID" + } + ] + } + } + ], + "title": "Num. PRBs (for RSSI)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "PRBs" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RRU.PrbTotUl (PRBs)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RRU.PrbTotDl (PRBs)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 7, + "x": 11, + "y": 11 + }, + "id": 15, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RRU.PrbTotDl (PRBs)", + "text": "RRU.PrbTotDl (PRBs)", + "type": "number" + }, + { + "selector": "RRU.PrbTotUl (PRBs)", + "text": "RRU.PrbTotUl (PRBs)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),RRU.PrbTotDl (PRBs),RRU.PrbTotUl (PRBs),UE ID" + } + ] + } + } + ], + "title": "Number of Physical Resource Blocks (PRBs)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 0.8 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "DRB.HarqBlockErrorRateDl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 18, + "y": 14 + }, + "id": 38, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.HarqBlockErrorRateDl", + "text": "DRB.HarqBlockErrorRateDl", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),DRB.HarqBlockErrorRateDl,UE ID" + } + ] + } + } + ], + "title": "HARQ Downlink Block Error Rate (BLER)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "#c87474", + "mode": "shades" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": true, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dB" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "SNR (PUSCH)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#fa7e8db3", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "SNR (PUCCH)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-yellow", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 11, + "x": 0, + "y": 18 + }, + "id": 14, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "PUSCH_SNR (dB)", + "text": "SNR (PUSCH)", + "type": "number" + }, + { + "selector": "PUCCH_SNR (dB)", + "text": "SNR (PUCCH)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),PUSCH_SNR (dB),PUCCH_SNR (dB),UE ID" + } + ] + } + } + ], + "title": "Signal-to-Noise Ratio (SNR)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 0.8 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "PACKET_RETRANSMISISON_RATE" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PACKET_DROP_RATE" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.HarqBlockErrorRateDl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.HarqBlockErrorRateUl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.HarqMcsDl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.HarqMcsUl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 7, + "x": 11, + "y": 18 + }, + "id": 36, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.HarqMcsDl", + "text": "DRB.HarqMcsDl", + "type": "number" + }, + { + "selector": "DRB.HarqMcsUl", + "text": "DRB.HarqMcsUl", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),DRB.HarqMcsDl,DRB.HarqMcsUl,UE ID" + } + ] + } + } + ], + "title": "Modulation and Coding Scheme (MCS)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 0.8 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "DRB.HarqBlockErrorRateUl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 18, + "y": 19 + }, + "id": 39, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.HarqBlockErrorRateUl", + "text": "DRB.HarqBlockErrorRateUl", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),DRB.HarqBlockErrorRateUl,UE ID" + } + ] + } + } + ], + "title": "HARQ Uplink Block Error Rate (BLER)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 31, + "panels": [ + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dB" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RSRQ (dB)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-purple", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 0, + "y": 25 + }, + "id": 30, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RSRQ (dB)", + "text": "RSRQ (dB)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),RSRQ (dB),UE ID" + } + ] + } + } + ], + "title": "Ref. Signal Received Quality (RSRQ)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "stacking": { + "group": "A", + "mode": "none" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dB" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RSRQ (dB)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-purple", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 3, + "x": 5, + "y": 25 + }, + "id": 18, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RSRQ (dB)", + "text": "RSRQ (dB)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),RSRQ (dB),UE ID" + } + ] + } + } + ], + "title": "Histogram of RSRQ", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "histogram" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dB" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RSRQ (dB)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-purple", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "CQI_SINGLE_CODEWORD" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 8, + "y": 25 + }, + "id": 34, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "CQI_SINGLE_CODEWORD", + "text": "CQI_SINGLE_CODEWORD", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),CQI_SINGLE_CODEWORD,UE ID" + } + ] + } + } + ], + "title": "CQI (Single Codeword)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dB" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RSRQ (dB)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-purple", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "CQI_SINGLE_CODEWORD" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 13, + "y": 25 + }, + "id": 35, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "CQI_DUAL_CODEWORD", + "text": "CQI_DUAL_CODEWORD", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),CQI_DUAL_CODEWORD,UE ID" + } + ] + } + } + ], + "title": "CQI (Dual Codeword)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "deckbytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeUL (kb) (sum) / 8" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "Aggregated UE UL Volume" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeDL (kb) (sum) / 8" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "Aggregated UE DL Volume" + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 18, + "y": 25 + }, + "id": 29, + "maxPerRow": 12, + "options": { + "displayMode": "basic", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.PdcpSduVolumeDL (kb)", + "text": "DRB.PdcpSduVolumeDL (kb)", + "type": "number" + }, + { + "selector": "DRB.PdcpSduVolumeUL (kb)", + "text": "DRB.PdcpSduVolumeUL (kb)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),DRB.PdcpSduVolumeDL (kb),DRB.PdcpSduVolumeUL (kb),UE ID" + } + ] + } + } + ], + "title": "", + "transformations": [ + { + "disabled": true, + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + }, + { + "id": "groupBy", + "options": { + "fields": { + "DRB.PdcpSduVolumeDL (kb)": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "DRB.PdcpSduVolumeUL (kb)": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Timestamp": { + "aggregations": [], + "operation": "groupby" + } + } + } + }, + { + "id": "calculateField", + "options": { + "binary": { + "left": { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeDL (kb) (sum)" + } + }, + "operator": "/", + "right": { + "fixed": "8" + } + }, + "mode": "binary", + "reduce": { + "reducer": "sum" + } + } + }, + { + "id": "calculateField", + "options": { + "binary": { + "left": { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeUL (kb) (sum)" + } + }, + "operator": "/", + "right": { + "fixed": "8" + } + }, + "mode": "binary", + "reduce": { + "include": [], + "reducer": "sum" + } + } + }, + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "Timestamp", + "DRB.PdcpSduVolumeDL (kb) (sum) / 8", + "DRB.PdcpSduVolumeUL (kb) (sum) / 8" + ] + } + } + } + ], + "type": "bargauge" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "super-light-blue", + "mode": "fixed" + }, + "custom": { + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "stacking": { + "group": "A", + "mode": "none" + } + }, + "decimals": 0, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "super-light-blue" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "PRBs" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RRU.PrbTotDl (PRBs)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 18, + "y": 29 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RRU.PrbTotDl (PRBs)", + "text": "RRU.PrbTotDl (PRBs)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),RRU.PrbTotDl (PRBs),UE ID" + } + ] + } + } + ], + "title": "Histogram of PRBs Downlink", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "histogram" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeUL (kb) (sum) / 8" + }, + "properties": [] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeDL (kb) (sum) / 8" + }, + "properties": [] + } + ] + }, + "gridPos": { + "h": 6, + "w": 13, + "x": 0, + "y": 31 + }, + "id": 2, + "maxPerRow": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.PdcpSduVolumeDL (kb)", + "text": "DRB.PdcpSduVolumeDL (kb)", + "type": "number" + }, + { + "selector": "DRB.PdcpSduVolumeUL (kb)", + "text": "DRB.PdcpSduVolumeUL (kb)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),DRB.PdcpSduVolumeDL (kb),DRB.PdcpSduVolumeUL (kb),UE ID" + } + ] + } + } + ], + "title": "", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + }, + { + "id": "groupBy", + "options": { + "fields": { + "DRB.PdcpSduVolumeDL (kb)": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "DRB.PdcpSduVolumeUL (kb)": { + "aggregations": [ + "sum" + ], + "operation": "aggregate" + }, + "Timestamp": { + "aggregations": [], + "operation": "groupby" + } + } + } + }, + { + "id": "calculateField", + "options": { + "alias": "", + "binary": { + "left": { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeDL (kb) (sum)" + } + }, + "operator": "/", + "right": { + "fixed": "8" + } + }, + "mode": "binary", + "reduce": { + "reducer": "sum" + }, + "replaceFields": false + } + }, + { + "id": "calculateField", + "options": { + "binary": { + "left": { + "matcher": { + "id": "byName", + "options": "DRB.PdcpSduVolumeUL (kb) (sum)" + } + }, + "operator": "/", + "right": { + "fixed": "8" + } + }, + "mode": "binary", + "reduce": { + "reducer": "sum" + } + } + }, + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "Timestamp", + "DRB.PdcpSduVolumeDL (kb) (sum) / 8", + "DRB.PdcpSduVolumeUL (kb) (sum) / 8" + ] + } + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 0.8 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "PACKET_RETRANSMISISON_RATE" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PACKET_DROP_RATE" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.HarqBlockErrorRateDl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.HarqBlockErrorRateUl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.MacSduErrorRateDl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "DRB.MacSduErrorRateUl" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 13, + "y": 31 + }, + "id": 33, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "DRB.MacSduErrorRateDl", + "text": "DRB.MacSduErrorRateDl", + "type": "number" + }, + { + "selector": "DRB.MacSduErrorRateUl", + "text": "DRB.MacSduErrorRateUl", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),DRB.MacSduErrorRateDl,DRB.MacSduErrorRateUl,UE ID" + } + ] + } + } + ], + "title": "MAC SDU Error Rate (%)", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic-by-name" + }, + "custom": { + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "stacking": { + "group": "A", + "mode": "none" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "PRB" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "RRU.PrbTotUl (PRBs)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 18, + "y": 33 + }, + "id": 17, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "columns": [ + { + "selector": "Time (UNIX ms)", + "text": "Timestamp", + "type": "timestamp_epoch" + }, + { + "selector": "RRU.PrbTotUl (PRBs)", + "text": "RRU.PrbTotUl (PRBs)", + "type": "number" + }, + { + "selector": "UE ID", + "text": "UE_ID", + "type": "string" + } + ], + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "filters": [], + "format": "table", + "global_query_id": "", + "parser": "backend", + "refId": "A", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "Time (UNIX ms),RRU.PrbTotUl (PRBs),UE ID" + } + ] + } + } + ], + "title": "Histogram of PRBs Uplink", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "equal", + "options": { + "value": "${Selected_UE_ID}" + } + }, + "fieldName": "UE_ID" + } + ], + "match": "any", + "type": "include" + } + } + ], + "type": "histogram" + } + ], + "title": "Experimental Panels", + "type": "row" + } + ], + "refresh": "auto", + "schemaVersion": 41, + "tags": [], + "templating": { + "list": [ + { + "current": {}, + "datasource": { + "type": "yesoreyeram-infinity-datasource", + "uid": "${DS_YESOREYERAM-INFINITY-DATASOURCE}" + }, + "definition": "", + "description": "", + "includeAll": false, + "name": "Selected_UE_ID", + "options": [], + "query": { + "infinityQuery": { + "columns": [ + { + "selector": "UE ID", + "text": "UE_ID", + "type": "number" + } + ], + "filters": [], + "format": "table", + "parser": "backend", + "refId": "variable", + "root_selector": "", + "source": "url", + "type": "csv", + "url": "", + "url_options": { + "data": "", + "method": "GET", + "params": [ + { + "key": "from", + "value": "$__from" + }, + { + "key": "to", + "value": "$__to" + }, + { + "key": "filter", + "value": "UE ID" + } + ] + } + }, + "query": "", + "queryType": "infinity" + }, + "refresh": 2, + "regex": "", + "type": "query" + } + ] + }, + "time": { + "from": "2025-04-30T20:09:15.177Z", + "to": "2025-04-30T21:46:22.176Z" + }, + "timepicker": {}, + "timezone": "browser", + "title": "FlexRIC KPI Monitor", + "uid": "ric_dashboard1", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_gtp_mac_rlc_pdcp_moni.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_gtp_mac_rlc_pdcp_moni.sh new file mode 100755 index 0000000..2358693 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_gtp_mac_rlc_pdcp_moni.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Exit immediately if a command fails +set -e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +echo "# Script: $(realpath $0)..." + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") + +cd "$PARENT_DIR/flexric/" + +CONFIG_PATH="" +if [ -f "../configs/flexric.conf" ]; then + CONFIG_PATH="-c ../configs/flexric.conf" +fi + +./build/examples/xApp/c/monitor/xapp_gtp_mac_rlc_pdcp_moni $CONFIG_PATH diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_kpm_moni_write_to_csv.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_kpm_moni_write_to_csv.sh new file mode 100755 index 0000000..cac3784 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_kpm_moni_write_to_csv.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Exit immediately if a command fails +set -e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +echo "# Script: $(realpath $0)..." + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +OUTPUT_CSV_PATH="$PARENT_DIR/logs/KPI_Metrics.csv" + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") + +cd "$PARENT_DIR/flexric/" + +# Optionally, ensure that the output CSV file is empty before running the xApp) +if [ ! -f "$OUTPUT_CSV_PATH" ]; then + touch "$OUTPUT_CSV_PATH" +else + >"$OUTPUT_CSV_PATH" +fi + +CONFIG_PATH="" +if [ -f "../configs/flexric.conf" ]; then + CONFIG_PATH="-c ../configs/flexric.conf" +fi + +echo +echo "Output CSV path: $OUTPUT_CSV_PATH" +echo + +./build/examples/xApp/c/monitor/xapp_kpm_moni_write_to_csv "$OUTPUT_CSV_PATH" $CONFIG_PATH diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_kpm_moni_write_to_influxdb.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_kpm_moni_write_to_influxdb.sh new file mode 100755 index 0000000..14f5358 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_kpm_moni_write_to_influxdb.sh @@ -0,0 +1,96 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Exit immediately if a command fails +set -e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +echo "# Script: $(realpath $0)..." + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +# Check that the xApp binary exists +if [ ! -f "$PARENT_DIR/flexric/build/examples/xApp/c/monitor/xapp_kpm_moni_write_to_influxdb" ]; then + echo "xapp_kpm_moni_write_to_influxdb binary not found. Please build flexric first." + exit 1 +fi + +INFLUXDB_ORG="xapp-kpm-moni" +INFLUXDB_BUCKET="xapp-kpm-moni" +INFLUXDB_TOKEN_PATH="$PARENT_DIR/influxdb_auth_token.json" + +# Check if influxdb is even installed: +if ! command -v influx &>/dev/null; then + echo "InfluxDB is not installed. Installing InfluxDB..." + ./install_scripts/install_influxdb.sh +fi + +if ! systemctl is-active --quiet influxdb; then + echo "Starting InfluxDB service..." + ./install_scripts/start_influxdb_service.sh + sleep 5 + # Check if the service is running + if ! systemctl is-active --quiet influxdb; then + echo "Failed to start InfluxDB service." + exit 1 + fi + echo "InfluxDB service started." +fi + +# Ensure that an InfluxDB token is created +if [ -f "$INFLUXDB_TOKEN_PATH" ]; then + if [ ! -s "$INFLUXDB_TOKEN_PATH" ]; then + echo "Deleting empty InfluxDB token file..." + sudo rm -f "$INFLUXDB_TOKEN_PATH" + fi +else + echo "InfluxDB token file does not exist." +fi +if [ ! -f "$INFLUXDB_TOKEN_PATH" ]; then + echo "Creating an InfluxDB token to influxdb_auth_token.json..." + influx auth create --all-access --json >"$INFLUXDB_TOKEN_PATH" +fi +INFLUXDB_TOKEN=$(jq -r '.token' "$INFLUXDB_TOKEN_PATH") + +cd "$PARENT_DIR/flexric/" + +CONFIG_PATH="" +if [ -f "../configs/flexric.conf" ]; then + CONFIG_PATH="-c ../configs/flexric.conf" +fi + +echo "Starting xApp KPM monitor..." +./build/examples/xApp/c/monitor/xapp_kpm_moni_write_to_influxdb "$INFLUXDB_TOKEN" $CONFIG_PATH diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/run_xapp_ric_control.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_kpm_rc.sh similarity index 91% rename from OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/run_xapp_ric_control.sh rename to OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_kpm_rc.sh index 18c8642..43ed90c 100755 --- a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/run_xapp_ric_control.sh +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_kpm_rc.sh @@ -31,16 +31,21 @@ # Exit immediately if a command fails set -e -# Guide: https://gitlab.eurecom.fr/mosaic5g/flexric - if ! command -v realpath &>/dev/null; then echo "Package \"coreutils\" not found, installing..." sudo apt-get install -y coreutils fi +echo "# Script: $(realpath $0)..." + SCRIPT_DIR=$(dirname "$(realpath "$0")") PARENT_DIR=$(dirname "$SCRIPT_DIR") cd "$PARENT_DIR/flexric/" -./build/examples/xApp/c/kpm_rc/xapp_kpm_rc +CONFIG_PATH="" +if [ -f "../configs/flexric.conf" ]; then + CONFIG_PATH="-c ../configs/flexric.conf" +fi + +./build/examples/xApp/c/kpm_rc/xapp_kpm_rc $CONFIG_PATH diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/is_running.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_rc_moni.sh similarity index 87% rename from OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/is_running.sh rename to OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_rc_moni.sh index bfad238..7fc20eb 100755 --- a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/is_running.sh +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/run_xapp_rc_moni.sh @@ -28,16 +28,24 @@ # damage to property. The software developed by NIST employees is not subject to # copyright protection within the United States. +# Exit immediately if a command fails +set -e + if ! command -v realpath &>/dev/null; then echo "Package \"coreutils\" not found, installing..." sudo apt-get install -y coreutils fi +echo "# Script: $(realpath $0)..." + SCRIPT_DIR=$(dirname "$(realpath "$0")") -cd "$SCRIPT_DIR" +PARENT_DIR=$(dirname "$SCRIPT_DIR") -if pgrep -x "nearRT-RIC" >/dev/null; then - echo "FlexRIC: RUNNING" -else - echo "FlexRIC: NOT_RUNNING" +cd "$PARENT_DIR/flexric/" + +CONFIG_PATH="" +if [ -f "../configs/flexric.conf" ]; then + CONFIG_PATH="-c ../configs/flexric.conf" fi + +./build/examples/xApp/c/monitor/xapp_rc_moni $CONFIG_PATH diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/sample_KPI_Metrics.csv b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/sample_KPI_Metrics.csv new file mode 100644 index 0000000..a400bd3 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/sample_KPI_Metrics.csv @@ -0,0 +1,4211 @@ +Time (UNIX ms),UE ID,DRB.PdcpSduVolumeDL (kb),DRB.PdcpSduVolumeUL (kb),DRB.RlcSduDelayDl (μs),DRB.UEThpDl (kbps),DRB.UEThpUl (kbps),RRU.PrbTotDl (PRBs),RRU.PrbTotUl (PRBs),RSRP (dBm),N_RSRP_MEAS,N_PRB,RSSI (dBm),RSRQ (dB),PUSCH_SNR (dB),PUCCH_SNR (dB),DRB.HarqMcsUl,DRB.HarqMcsDl,DRB.HarqBlockErrorRateUl,DRB.HarqBlockErrorRateDl,DRB.MacSduRetransmissionRateUl,DRB.MacSduRetransmissionRateDl,DRB.MacSduErrorRateUl,DRB.MacSduErrorRateDl,CQI_SINGLE_CODEWORD,CQI_DUAL_CODEWORD, +1746043755177,19,0,0,0.00,0.00,0.00,343,3063,-66.06,16,5,-48.28,6.84,25.50,27.00,0,0,0.02,0.00,0.01,0.00,nan,0.00,0,0, +1746043756176,19,0,0,0.00,0.00,0.00,5,50,-66.31,16,5,-48.53,6.83,27.00,27.00,0,0,0.01,0.00,0.01,0.00,nan,0.00,0,0, +1746043757176,19,0,0,0.00,0.00,0.00,5,50,-66.31,16,5,-48.53,6.83,25.50,26.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043758176,19,0,0,0.00,0.00,0.00,5,50,-66.31,16,5,-48.53,6.83,26.50,27.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043759176,19,0,0,0.00,0.00,0.00,5,50,-66.19,16,5,-48.41,6.84,25.50,27.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043760176,19,0,0,0.00,0.00,0.00,5,50,-66.19,16,5,-48.41,6.84,26.00,27.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043761176,19,0,0,0.00,0.00,0.00,5,50,-66.06,16,5,-48.28,6.84,25.50,27.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043762176,19,0,0,0.00,0.00,0.00,5,50,-66.06,16,5,-48.28,6.84,26.00,27.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043763176,19,0,0,0.00,0.00,0.00,5,50,-66.38,16,5,-48.59,6.83,26.00,27.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043764176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,26.50,28.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043765176,19,0,0,0.00,0.00,0.00,5,50,-66.19,16,5,-48.41,6.84,25.50,29.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043766176,19,0,0,0.00,0.00,0.00,5,50,-66.19,16,5,-48.41,6.84,26.50,27.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043767176,19,0,0,0.00,0.00,0.00,5,50,-66.06,16,5,-48.28,6.84,25.50,26.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043768176,19,0,0,0.00,0.00,0.00,5,50,-66.06,16,5,-48.28,6.84,25.50,25.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043769176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,26.50,30.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043770176,19,0,0,0.00,0.00,0.00,5,50,-65.88,16,5,-48.09,6.85,26.00,30.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043771176,19,0,0,0.00,0.00,0.00,5,50,-65.88,16,5,-48.09,6.85,26.00,26.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043772176,19,0,0,0.00,0.00,0.00,5,50,-65.94,16,5,-48.16,6.85,25.50,28.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043773176,19,0,0,0.00,0.00,0.00,5,50,-65.75,16,5,-47.97,6.85,25.50,26.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043774176,19,0,0,0.00,0.00,0.00,5,50,-66.12,16,5,-48.34,6.84,26.50,26.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043775176,19,0,0,0.00,0.00,0.00,5,50,-65.62,16,5,-47.84,6.86,26.50,28.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043776176,19,0,0,0.00,0.00,0.00,5,50,-65.62,16,5,-47.84,6.86,26.50,27.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043777176,19,0,0,0.00,0.00,0.00,5,50,-65.75,16,5,-47.97,6.85,26.00,30.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043778176,19,0,0,0.00,0.00,0.00,5,50,-65.88,16,5,-48.09,6.85,26.00,26.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043779176,19,0,0,0.00,0.00,0.00,5,50,-65.81,16,5,-48.03,6.85,27.50,26.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043780176,19,0,0,0.00,0.00,0.00,5,50,-65.81,16,5,-48.03,6.85,26.00,27.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043781176,19,0,0,0.00,0.00,0.00,5,50,-65.94,16,5,-48.16,6.85,25.00,27.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043782176,19,0,0,0.00,0.00,0.00,5,50,-65.81,16,5,-48.03,6.85,27.00,28.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043783176,19,0,0,0.00,0.00,0.00,5,50,-66.06,16,5,-48.28,6.84,24.50,26.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043784176,19,0,0,0.00,0.00,0.00,5,50,-66.38,16,5,-48.59,6.83,26.00,25.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043785176,19,0,0,0.00,0.00,0.00,5,50,-66.38,16,5,-48.59,6.83,26.00,26.00,0,0,0.00,0.00,0.01,0.00,nan,0.00,0,0, +1746043786176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,25.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043787176,19,0,0,0.00,0.00,0.00,5,50,-66.31,16,5,-48.53,6.83,25.00,28.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043788176,19,0,0,0.00,0.00,0.00,5,50,-65.94,16,5,-48.16,6.85,25.50,28.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043789176,19,0,0,0.00,0.00,0.00,5,50,-65.94,16,5,-48.16,6.85,26.50,28.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043790176,19,0,0,0.00,0.00,0.00,5,50,-66.38,16,5,-48.59,6.83,26.00,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043791176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,26.50,26.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043792176,19,0,0,0.00,0.00,0.00,5,50,-66.06,16,5,-48.28,6.84,26.50,29.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043793176,19,0,0,0.00,0.00,0.00,5,50,-65.94,16,5,-48.16,6.85,26.00,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043794176,19,0,0,0.00,0.00,0.00,5,50,-65.94,16,5,-48.16,6.85,25.50,26.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043795176,19,0,0,0.00,0.00,0.00,5,50,-65.88,16,5,-48.09,6.85,25.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043796176,19,0,0,0.00,0.00,0.00,5,50,-65.88,16,5,-48.09,6.85,25.00,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043797176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,25.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043798176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,26.00,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043799176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,24.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043800176,19,0,0,0.00,0.00,0.00,5,50,-65.81,16,5,-48.03,6.85,26.50,26.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043801176,19,0,0,0.00,0.00,0.00,5,50,-65.94,16,5,-48.16,6.85,26.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043802176,19,0,0,0.00,0.00,0.00,5,50,-65.88,16,5,-48.09,6.85,26.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043803176,19,0,0,0.00,0.00,0.00,5,50,-65.88,16,5,-48.09,6.85,26.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043804176,19,0,0,0.00,0.00,0.00,5,50,-66.12,16,5,-48.34,6.84,25.00,28.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043805176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,25.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043806176,19,0,0,0.00,0.00,0.00,5,50,-65.88,16,5,-48.09,6.85,25.50,28.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043807176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,26.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043808176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,25.50,28.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043809176,19,0,0,0.00,0.00,0.00,5,50,-66.25,16,5,-48.47,6.83,25.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043810176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,25.00,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043811176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,27.50,26.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043812176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,26.50,26.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043813176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,26.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043814176,19,0,0,0.00,0.00,0.00,5,50,-66.00,16,5,-48.22,6.84,25.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043815176,19,0,0,0.00,0.00,0.00,5,50,-65.75,16,5,-47.97,6.85,27.00,28.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043816176,19,0,0,0.00,0.00,0.00,5,50,-65.69,16,5,-47.91,6.86,26.00,28.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043817176,19,0,0,0.00,0.00,0.00,5,50,-65.69,16,5,-47.91,6.86,26.00,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043818176,19,0,0,0.00,0.00,0.00,5,50,-66.12,16,5,-48.34,6.84,26.00,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043819176,19,0,0,0.00,0.00,0.00,5,50,-66.19,16,5,-48.41,6.84,25.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043820176,19,0,0,0.00,0.00,0.00,5,50,-65.88,16,5,-48.09,6.85,26.00,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043821176,19,0,0,0.00,0.00,0.00,5,50,-65.88,16,5,-48.09,6.85,27.00,26.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043822176,19,0,0,0.00,0.00,0.00,5,50,-66.06,16,5,-48.28,6.84,26.50,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746043823176,19,27,778,0.00,28.65,788.75,1072,17795,-66.19,16,70,-36.94,125.41,26.00,28.00,7,1,0.00,0.00,0.00,0.00,0.00,0.00,0,0, +1746043824176,19,4,1066,0.00,5.40,1076.51,212,10110,-65.88,16,100,-35.08,187.77,25.50,28.00,17,2,0.00,0.00,0.00,0.00,0.00,0.00,0,0, +1746043825176,19,4,1054,0.00,5.38,1063.47,291,7204,-66.25,16,5,-48.47,6.83,26.50,26.00,14,4,0.15,0.00,0.06,0.00,0.00,0.00,0,0, +1746043826176,19,4,1090,0.00,5.42,1110.70,210,9031,-66.25,16,53,-38.22,91.88,25.50,28.00,14,6,0.05,0.00,0.05,0.00,0.00,0.00,0,0, +1746043827176,19,4,1054,0.00,5.38,1065.97,181,7571,-66.06,16,31,-40.36,50.75,26.50,27.00,19,9,0.20,0.00,0.09,0.00,0.00,0.00,0,0, +1746043828176,19,4,1078,0.00,5.25,1076.70,153,9194,-66.06,16,26,-41.12,41.77,25.50,27.00,15,5,0.08,0.00,0.09,0.00,0.00,0.00,0,0, +1746043829176,19,4,1066,0.00,5.42,1075.94,221,8514,-66.00,16,5,-48.22,6.84,27.00,27.00,19,8,0.05,0.00,0.08,0.00,0.00,0.00,0,0, +1746043830176,19,4,1078,0.00,5.35,1087.24,226,7607,-66.00,16,24,-41.41,38.26,25.50,27.00,16,8,0.11,0.00,0.10,0.00,0.00,0.00,0,0, +1746043831176,19,4,1054,0.00,5.47,1077.39,208,7725,-65.81,16,83,-35.83,152.45,25.50,27.00,19,11,0.04,0.00,0.09,0.00,0.00,0.00,0,0, +1746043832176,19,4,1078,0.00,5.28,1085.19,161,8716,-66.00,16,37,-39.53,61.78,26.00,27.00,18,7,0.09,0.00,0.11,0.00,0.00,0.00,0,0, +1746043833176,19,4,1066,0.00,5.40,1071.78,199,7928,-66.12,16,71,-36.82,127.51,25.50,25.00,20,7,0.12,0.00,0.12,0.00,0.00,0.00,0,0, +1746043834176,19,4,1078,0.00,5.45,1080.47,196,7948,-66.06,16,100,-35.27,187.30,25.50,26.00,16,13,0.10,0.00,0.12,0.00,0.00,0.00,0,0, +1746043835176,19,4,1054,0.00,5.42,1063.24,185,7317,-66.06,16,106,-35.02,199.97,25.00,27.00,19,10,0.05,0.05,0.12,0.00,0.00,0.00,0,0, +1746043836176,19,4,1078,0.00,5.26,1088.66,156,8343,-66.25,16,7,-47.01,9.87,27.00,27.00,18,5,0.09,0.02,0.13,0.00,0.00,0.00,0,0, +1746043837176,19,4,1042,0.00,5.40,1052.17,206,8101,-66.12,16,5,-48.34,6.84,26.50,27.00,17,11,0.15,0.01,0.14,0.00,0.00,0.00,0,0, +1746043838176,19,1394,1118,479.80,1401.51,1140.38,6830,8448,-66.06,16,41,-39.14,69.20,26.00,28.00,17,8,0.06,0.17,0.13,0.19,0.00,0.00,0,0, +1746043839176,19,2149,1071,583.05,2160.53,1072.31,16031,8790,-66.06,16,5,-48.28,6.84,27.00,27.00,18,7,0.14,0.06,0.14,0.08,0.00,0.00,0,0, +1746043840176,19,2137,1059,500.20,2147.91,1071.89,11888,9343,-66.06,16,5,-48.28,6.84,28.50,26.00,19,13,0.05,0.18,0.13,0.10,0.00,0.00,0,0, +1746043841176,19,2137,1083,625.52,2147.94,1105.29,11060,8719,-66.06,16,5,-48.28,6.84,27.00,27.00,18,11,0.09,0.07,0.14,0.09,0.00,0.00,0,0, +1746043842176,19,2149,1071,657.77,2165.71,1071.71,10892,8297,-66.25,16,5,-48.47,6.83,25.00,26.00,18,12,0.15,0.06,0.14,0.09,0.00,0.00,0,0, +1746043843176,19,2137,1083,579.95,2148.19,1098.62,10146,8882,-66.12,16,20,-42.32,31.25,27.00,27.00,18,12,0.05,0.07,0.13,0.10,0.00,0.00,0,0, +1746043844176,19,2137,1071,633.00,2148.16,1088.33,11236,8723,-66.12,16,37,-39.65,61.70,26.00,27.00,18,8,0.11,0.14,0.14,0.11,0.00,0.00,0,0, +1746043845176,19,2149,1071,634.95,2160.23,1072.22,14086,8783,-66.00,16,80,-36.18,145.95,25.00,27.00,19,8,0.11,0.05,0.14,0.10,0.00,0.00,0,0, +1746043846176,19,2137,1071,568.35,2148.21,1093.38,11090,8043,-65.88,16,40,-39.06,67.46,25.50,26.00,17,12,0.07,0.22,0.13,0.12,0.00,0.00,0,0, +1746043847176,19,2137,1071,823.90,2148.39,1083.94,13472,9097,-65.81,16,5,-48.03,6.85,26.50,27.00,19,8,0.04,0.09,0.13,0.11,0.00,0.00,0,0, +1746043848176,19,2149,1071,473.90,2160.34,1072.41,13330,8344,-66.50,16,5,-48.72,6.82,25.50,27.00,17,12,0.09,0.07,0.13,0.10,0.00,0.00,0,0, +1746043849176,19,2137,1083,598.29,2148.02,1095.42,10108,9353,-66.50,16,106,-35.46,198.81,25.00,27.00,19,12,0.11,0.11,0.14,0.11,0.00,0.00,0,0, +1746043850176,19,2137,1071,571.68,2147.90,1083.07,10322,8060,-66.19,16,16,-43.35,24.43,25.50,27.00,17,10,0.10,0.17,0.14,0.12,0.00,0.00,0,0, +1746043851176,19,2149,1071,599.47,2159.91,1082.86,12523,8893,-66.06,16,106,-35.02,199.97,25.00,26.00,19,9,0.10,0.06,0.14,0.11,0.00,0.00,0,0, +1746043852176,19,2137,1071,593.33,2147.86,1083.94,10576,8685,-65.88,16,5,-48.09,6.85,25.00,28.00,16,11,0.09,0.17,0.14,0.11,0.00,0.00,0,0, +1746043853176,19,2137,1059,491.45,2148.14,1079.58,12735,8141,-65.88,16,15,-43.32,22.81,25.50,27.00,19,10,0.11,0.06,0.14,0.11,0.00,0.00,0,0, +1746043854176,19,2149,1095,601.75,2159.84,1098.12,10602,9091,-66.38,16,7,-47.13,9.86,25.50,28.00,18,12,0.08,0.06,0.14,0.11,0.00,0.00,0,0, +1746043855176,19,2137,1071,580.59,2148.10,1087.59,10282,8770,-66.25,16,20,-42.45,31.21,26.50,27.00,18,12,0.17,0.13,0.14,0.12,0.00,0.00,0,0, +1746043856176,19,2137,1071,688.71,2147.99,1079.16,11339,8208,-66.25,16,16,-43.42,24.41,25.00,28.00,17,11,0.06,0.07,0.14,0.11,0.00,0.00,0,0, +1746043857176,19,2149,1071,656.73,2160.09,1082.93,11952,8411,-65.88,16,5,-48.09,6.85,26.00,30.00,18,10,0.12,0.11,0.14,0.12,0.00,0.00,0,0, +1746043858176,19,2137,1071,480.15,2148.10,1082.94,12381,9082,-65.88,16,80,-36.05,146.18,25.50,28.00,19,13,0.08,0.05,0.14,0.11,0.00,0.00,0,0, +1746043859176,19,2137,1071,508.27,2159.23,1094.24,12463,8261,-66.00,16,5,-48.22,6.84,26.50,27.00,17,8,0.08,0.11,0.15,0.11,0.00,0.00,0,0, +1746043860176,19,2149,1083,729.00,2160.16,1083.66,13818,8488,-66.12,16,19,-42.55,29.53,26.50,27.00,18,11,0.17,0.04,0.15,0.11,0.00,0.00,0,0, +1746043861176,19,2137,1071,570.18,2148.03,1094.33,9772,9312,-66.00,16,40,-39.19,67.37,25.50,27.00,17,13,0.06,0.15,0.15,0.11,0.00,0.00,0,0, +1746043862176,19,2137,1071,618.27,2147.90,1073.34,11065,8736,-66.00,16,24,-41.41,38.26,26.00,28.00,17,11,0.13,0.07,0.15,0.11,0.00,0.00,0,0, +1746043863176,19,2149,1071,600.24,2160.05,1083.09,10742,8763,-65.81,16,5,-48.03,6.85,25.00,27.00,18,12,0.05,0.09,0.15,0.11,0.00,0.00,0,0, +1746043864176,19,2137,1071,733.33,2148.02,1093.55,12054,8443,-65.94,16,40,-39.13,67.41,26.00,27.00,17,8,0.10,0.11,0.15,0.11,0.00,0.00,0,0, +1746043865176,19,2137,1059,590.81,2148.12,1060.94,13724,8158,-66.38,16,5,-48.59,6.83,25.50,28.00,19,11,0.12,0.04,0.15,0.11,0.00,0.00,0,0, +1746043866176,19,2149,1083,544.95,2160.10,1094.41,11724,9087,-65.81,16,5,-48.03,6.85,26.50,27.00,18,6,0.07,0.15,0.15,0.11,0.00,0.00,0,0, +1746043867176,19,2137,1083,565.48,2148.28,1099.11,18807,8396,-65.81,16,20,-42.01,31.33,27.00,27.00,18,6,0.13,0.05,0.15,0.11,0.00,0.00,0,0, +1746043868176,19,2137,1083,593.47,2147.98,1091.10,12047,9356,-65.81,16,80,-35.99,146.29,25.50,27.00,19,13,0.05,0.21,0.15,0.11,0.00,0.00,0,0, +1746043869176,19,2149,1059,573.15,2159.86,1071.55,13327,8445,-66.00,16,5,-48.22,6.84,27.50,27.00,15,7,0.13,0.10,0.15,0.11,0.00,0.00,0,0, +1746043870176,19,2137,1071,538.76,2148.16,1087.90,15069,9629,-65.88,16,5,-48.09,6.85,25.50,28.00,16,11,0.05,0.03,0.15,0.10,0.00,0.00,0,0, +1746043871176,19,2137,1071,660.22,2148.01,1088.93,10436,8313,-66.25,16,5,-48.47,6.83,26.00,29.00,17,9,0.16,0.14,0.15,0.11,0.00,0.00,0,0, +1746043872176,19,2149,1071,531.00,2147.93,1072.67,12512,8392,-66.25,16,5,-48.47,6.83,28.00,28.00,17,9,0.06,0.05,0.15,0.10,0.00,0.00,0,0, +1746043873176,19,2137,1083,722.90,2160.15,1098.97,11169,8416,-66.00,16,20,-42.20,31.28,27.50,26.00,18,9,0.13,0.14,0.15,0.11,0.00,0.00,0,0, +1746043874176,19,2137,1059,696.21,2148.06,1074.15,12777,8892,-66.25,16,15,-43.70,22.74,25.50,26.00,19,9,0.09,0.05,0.15,0.10,0.00,0.00,0,0, +1746043875176,19,2149,1083,552.86,2159.98,1087.26,10723,8287,-66.12,16,5,-48.34,6.84,27.00,27.00,18,12,0.10,0.08,0.15,0.11,0.00,0.00,0,0, +1746043876176,19,2137,1071,494.50,2148.05,1091.38,10230,8694,-66.12,16,23,-41.72,36.46,26.50,29.00,19,12,0.12,0.10,0.15,0.11,0.00,0.00,0,0, +1746043877176,19,2137,1071,693.71,2148.18,1084.23,10092,8838,-66.12,16,5,-48.34,6.84,25.50,28.00,18,12,0.07,0.10,0.15,0.11,0.00,0.00,0,0, +1746043878176,19,2149,1071,575.55,2160.27,1071.94,10456,8675,-66.19,16,5,-48.41,6.84,25.00,27.00,18,11,0.14,0.14,0.16,0.11,0.00,0.00,0,0, +1746043879176,19,2137,1047,636.11,2147.83,1067.42,11247,9280,-66.19,16,18,-42.84,27.81,26.00,27.00,19,12,0.05,0.05,0.15,0.11,0.00,0.00,0,0, +1746043880176,19,2137,1107,713.04,2148.06,1110.53,10067,8133,-66.25,16,16,-43.42,24.41,26.00,26.00,17,12,0.13,0.12,0.16,0.11,0.00,0.00,0,0, +1746043881176,19,2149,1059,535.48,2147.96,1081.55,12848,8278,-66.25,16,106,-35.21,199.47,25.50,27.00,19,8,0.04,0.09,0.16,0.11,0.00,0.00,0,0, +1746043882176,19,2137,1083,647.58,2160.18,1089.80,12712,9347,-66.44,16,5,-48.66,6.83,25.00,27.00,18,14,0.09,0.05,0.16,0.11,0.00,0.00,0,0, +1746043883176,19,2137,1059,887.43,2147.91,1066.18,11334,8471,-66.19,16,5,-48.41,6.84,25.50,28.00,18,8,0.16,0.11,0.16,0.11,0.00,0.00,0,0, +1746043884176,19,2149,1083,441.33,2148.26,1095.41,13881,8844,-66.06,16,5,-48.28,6.84,26.50,27.00,17,10,0.06,0.04,0.16,0.11,0.00,0.00,0,0, +1746043885176,19,2137,1083,474.86,2160.09,1094.74,10296,8278,-66.06,16,29,-40.65,47.13,26.00,30.00,17,10,0.11,0.17,0.16,0.11,0.00,0.00,0,0, +1746043886176,19,2137,1047,769.90,2148.00,1060.52,12664,8473,-65.81,16,5,-48.03,6.85,26.50,26.00,19,9,0.06,0.06,0.16,0.11,0.00,0.00,0,0, +1746043887176,19,2149,1095,559.23,2160.05,1106.50,11485,9228,-65.81,16,25,-41.04,40.09,26.00,28.00,15,9,0.10,0.21,0.16,0.11,0.00,0.00,0,0, +1746043888176,19,2137,1047,639.95,2148.62,1071.11,18160,9217,-66.00,16,5,-48.22,6.84,26.50,28.00,19,6,0.04,0.07,0.16,0.11,0.00,0.00,0,0, +1746043889176,19,2137,1095,726.62,2148.23,1095.49,14127,8488,-66.25,16,5,-48.47,6.83,25.50,27.00,17,13,0.09,0.04,0.16,0.11,0.00,0.00,0,0, +1746043890176,19,2149,1071,503.74,2147.98,1082.79,10127,8356,-66.25,16,106,-35.21,199.47,25.50,27.00,19,11,0.13,0.12,0.16,0.11,0.00,0.00,0,0, +1746043891176,19,2137,1083,653.76,2160.26,1094.19,11416,8326,-66.00,16,29,-40.58,47.16,26.00,27.00,17,12,0.08,0.06,0.16,0.11,0.00,0.00,0,0, +1746043892176,19,2137,1071,600.05,2148.12,1082.81,11503,8255,-66.19,16,16,-43.35,24.43,26.00,27.00,17,11,0.14,0.08,0.16,0.11,0.00,0.00,0,0, +1746043893176,19,2149,1071,555.20,2148.13,1093.88,10827,8209,-65.88,16,37,-39.40,61.86,25.50,27.00,18,12,0.05,0.05,0.16,0.11,0.00,0.00,0,0, +1746043894176,19,2137,1071,745.24,2165.74,1077.70,12335,9024,-65.88,16,5,-48.09,6.85,26.00,28.00,18,8,0.09,0.12,0.16,0.11,0.00,0.00,0,0, +1746043895176,19,2137,1071,658.73,2148.23,1078.03,13887,8500,-65.88,16,51,-38.01,88.39,26.00,30.00,19,10,0.14,0.04,0.16,0.11,0.00,0.00,0,0, +1746043896176,19,2137,1071,563.47,2147.96,1083.58,11596,9039,-65.94,16,5,-48.16,6.85,26.50,27.00,18,8,0.06,0.14,0.16,0.11,0.00,0.00,0,0, +1746043897176,19,2149,1083,506.40,2160.44,1094.18,14110,8708,-66.00,16,7,-46.76,9.88,25.50,27.00,18,9,0.11,0.05,0.16,0.11,0.00,0.00,0,0, +1746043898176,19,2137,1047,621.90,2148.05,1076.09,10529,9124,-65.94,16,43,-38.81,73.05,26.50,27.00,19,12,0.11,0.12,0.16,0.11,0.00,0.00,0,0, +1746043899176,19,2137,1095,600.50,2148.15,1100.92,11602,8496,-65.94,16,41,-39.02,69.29,26.00,27.00,17,9,0.07,0.12,0.16,0.11,0.00,0.00,0,0, +1746043900176,19,2149,1059,495.65,2159.87,1065.99,12426,8158,-66.00,16,5,-48.22,6.84,25.50,27.00,19,11,0.09,0.04,0.16,0.11,0.00,0.00,0,0, +1746043901176,19,2137,1083,747.32,2148.33,1090.00,11186,7779,-66.19,16,5,-48.41,6.84,26.00,26.00,19,11,0.10,0.10,0.16,0.11,0.00,0.00,0,0, +1746043902176,19,2137,1071,553.89,2147.94,1082.46,11011,8988,-66.25,16,5,-48.47,6.83,26.50,27.00,18,12,0.09,0.09,0.16,0.11,0.00,0.00,0,0, +1746043903176,19,2149,1083,567.70,2160.04,1094.26,10280,8272,-66.44,16,51,-38.57,87.85,26.00,26.00,19,11,0.08,0.15,0.16,0.11,0.00,0.00,0,0, +1746043904176,19,2137,1071,513.38,2148.08,1083.63,11544,8186,-66.44,16,24,-41.84,38.11,26.50,27.00,16,11,0.09,0.07,0.16,0.11,0.00,0.00,0,0, +1746043905176,19,2137,1047,509.72,2150.50,1075.08,10959,8731,-66.00,16,28,-40.74,45.36,26.00,27.00,19,10,0.09,0.19,0.16,0.11,0.00,0.00,0,0, +1746043906176,19,2149,1095,514.40,2160.31,1090.86,14106,8215,-65.87,15,5,-48.09,6.85,26.00,26.00,17,8,0.07,0.07,0.16,0.11,0.00,0.00,0,0, +1746043907176,19,2137,1059,654.60,2148.10,1080.31,11859,8430,-66.38,16,18,-43.03,27.77,26.50,27.00,19,12,0.17,0.09,0.16,0.11,0.00,0.00,0,0, +1746043908176,19,2137,1083,595.43,2148.08,1096.54,10351,8243,-66.38,16,5,-48.59,6.83,27.00,25.00,16,12,0.08,0.10,0.16,0.11,0.00,0.00,0,0, +1746043909176,19,2149,1083,500.05,2159.96,1084.10,10255,8729,-65.94,16,51,-38.07,88.33,25.50,28.00,19,12,0.07,0.11,0.16,0.11,0.00,0.00,0,0, +1746043910176,19,2137,1059,676.11,2147.95,1080.35,11286,7864,-66.06,16,25,-41.29,40.00,25.50,27.00,19,11,0.09,0.07,0.16,0.11,0.00,0.00,0,0, +1746043911176,19,2137,1083,657.16,2148.02,1096.07,11135,8203,-66.06,16,41,-39.14,69.20,25.50,27.00,17,12,0.08,0.05,0.16,0.11,0.00,0.00,0,0, +1746043912176,19,2149,1059,662.65,2160.12,1060.33,12695,8411,-66.12,16,5,-48.34,6.84,26.50,27.00,19,8,0.12,0.10,0.16,0.11,0.00,0.00,0,0, +1746043913176,19,2137,1083,457.75,2148.30,1094.34,13205,8416,-66.12,16,22,-41.91,34.71,26.50,27.00,18,12,0.11,0.03,0.16,0.11,0.00,0.00,0,0, +1746043914176,19,2137,1059,714.90,2148.06,1071.17,9579,8717,-66.38,16,5,-48.59,6.83,26.00,26.00,19,11,0.06,0.22,0.16,0.11,0.00,0.00,0,0, +1746043915176,19,2149,1095,724.74,2160.38,1106.16,14088,9005,-66.06,16,7,-46.82,9.88,25.50,28.00,18,8,0.10,0.08,0.16,0.11,0.00,0.00,0,0, +1746043916176,19,2137,1071,736.23,2148.24,1088.08,12548,8922,-66.31,16,5,-48.53,6.83,26.50,28.00,19,12,0.12,0.12,0.16,0.11,0.00,0.00,0,0, +1746043917176,19,2137,1047,456.53,2148.12,1068.33,10761,7528,-66.31,16,5,-48.53,6.83,26.00,27.00,19,11,0.08,0.13,0.16,0.11,0.00,0.00,0,0, +1746043918176,19,2149,1095,534.48,2160.18,1094.58,11313,8837,-66.38,16,5,-48.59,6.83,27.50,27.00,18,13,0.08,0.04,0.16,0.11,0.00,0.00,0,0, +1746043919176,19,2137,1083,669.11,2148.10,1092.13,11102,8638,-66.12,16,92,-35.70,170.43,25.50,27.00,18,9,0.15,0.12,0.16,0.11,0.00,0.00,0,0, +1746043920176,19,2137,1059,703.60,2148.09,1081.89,12699,8968,-66.19,16,5,-48.41,6.84,27.00,27.00,18,11,0.05,0.04,0.16,0.11,0.00,0.00,0,0, +1746043921176,19,2149,1083,603.90,2164.85,1083.79,9787,8353,-66.12,16,22,-41.91,34.71,26.50,28.00,17,11,0.11,0.17,0.16,0.11,0.00,0.00,0,0, +1746043922176,19,2137,1059,780.80,2147.86,1076.66,12510,8704,-66.12,16,20,-42.32,31.25,27.00,27.00,19,10,0.07,0.06,0.16,0.11,0.00,0.00,0,0, +1746043923176,19,2137,1071,604.90,2148.16,1076.95,10759,7662,-66.25,16,87,-36.06,159.82,24.50,27.00,19,10,0.12,0.20,0.16,0.11,0.00,0.00,0,0, +1746043924176,19,2149,1083,614.15,2160.47,1094.75,14120,8711,-66.06,16,5,-48.28,6.84,27.00,28.00,18,8,0.08,0.07,0.16,0.11,0.00,0.00,0,0, +1746043925176,19,2137,1071,673.24,2148.12,1082.77,11464,8522,-66.25,16,22,-42.03,34.67,27.00,26.00,18,13,0.19,0.09,0.17,0.11,0.00,0.00,0,0, +1746043926176,19,2137,1071,544.10,2147.99,1094.25,10378,8828,-66.25,16,5,-48.47,6.83,26.50,26.00,16,11,0.07,0.11,0.16,0.11,0.00,0.00,0,0, +1746043927176,19,2149,1059,478.38,2160.07,1059.79,11343,8208,-66.00,16,5,-48.22,6.84,27.50,27.00,18,12,0.16,0.06,0.17,0.11,0.00,0.00,0,0, +1746043928176,19,2137,1095,591.82,2147.90,1111.34,9953,8975,-66.38,16,20,-42.57,31.18,26.50,27.00,18,12,0.05,0.11,0.16,0.11,0.00,0.00,0,0, +1746043929176,19,2137,1071,540.05,2148.02,1088.99,10170,8918,-66.12,16,41,-39.21,69.15,26.00,27.00,17,12,0.11,0.08,0.17,0.11,0.00,0.00,0,0, +1746043930176,19,2149,1047,673.79,2160.00,1056.58,10321,8540,-66.00,16,5,-48.22,6.84,26.00,27.00,19,12,0.06,0.09,0.16,0.11,0.00,0.00,0,0, +1746043931176,19,2137,1095,638.78,2148.11,1099.80,10171,9169,-66.00,16,22,-41.78,34.75,27.00,28.00,18,12,0.09,0.08,0.17,0.11,0.00,0.00,0,0, +1746043932176,19,2137,1059,586.37,2148.02,1079.96,9882,8500,-66.00,16,15,-43.45,22.79,24.50,26.00,19,12,0.08,0.09,0.17,0.11,0.00,0.00,0,0, +1746043933176,19,2149,1083,618.89,2159.97,1084.77,10522,8278,-65.94,16,5,-48.16,6.85,26.00,27.00,17,9,0.10,0.15,0.17,0.11,0.00,0.00,0,0, +1746043934176,19,2137,1059,582.77,2148.16,1071.88,12759,9060,-66.12,16,5,-48.34,6.84,26.50,28.00,19,9,0.12,0.05,0.17,0.11,0.00,0.00,0,0, +1746043935176,19,2137,1083,615.42,2148.14,1097.23,11489,8043,-66.06,16,48,-38.46,82.45,26.00,27.00,19,9,0.10,0.14,0.17,0.11,0.00,0.00,0,0, +1746043936176,19,2149,1083,527.32,2160.22,1091.26,12856,8577,-66.06,16,5,-48.28,6.84,25.50,27.00,17,10,0.08,0.05,0.17,0.11,0.00,0.00,0,0, +1746043937176,19,2137,1071,582.74,2148.06,1083.15,10396,8401,-66.00,16,22,-41.78,34.75,26.50,26.00,18,12,0.16,0.08,0.17,0.11,0.00,0.00,0,0, +1746043938176,19,2137,1071,680.67,2147.98,1093.80,10005,9125,-66.19,16,5,-48.41,6.84,27.00,26.00,18,12,0.06,0.11,0.17,0.11,0.00,0.00,0,0, +1746043939176,19,2149,1083,666.00,2160.10,1083.94,10201,8459,-66.19,16,7,-46.94,9.87,26.00,27.00,18,12,0.14,0.11,0.17,0.11,0.00,0.00,0,0, +1746043940176,19,2137,1035,593.36,2148.13,1050.22,12290,9086,-66.19,16,18,-42.84,27.81,26.00,27.00,19,8,0.05,0.12,0.17,0.12,0.00,0.00,0,0, +1746043941176,19,2137,1107,718.45,2148.05,1126.97,13448,8732,-66.12,16,41,-39.21,69.15,26.00,27.00,17,11,0.14,0.04,0.17,0.11,0.00,0.00,0,0, +1746043942176,19,2149,1071,553.50,2160.10,1073.03,10379,8505,-66.50,16,5,-48.72,6.82,28.00,27.00,18,11,0.05,0.19,0.17,0.12,0.00,0.00,0,0, +1746043943176,19,2137,1071,682.45,2148.08,1087.62,12629,8479,-66.25,16,5,-48.47,6.83,26.00,27.00,16,9,0.13,0.07,0.17,0.11,0.00,0.00,0,0, +1746043944176,19,2137,1071,737.52,2148.12,1089.64,11045,8578,-66.25,16,5,-48.47,6.83,27.00,28.00,17,11,0.05,0.19,0.17,0.12,0.00,0.00,0,0, +1746043945176,19,2149,1083,572.24,2159.95,1083.11,12470,8092,-66.25,16,5,-48.47,6.83,27.00,26.00,19,9,0.12,0.07,0.17,0.11,0.00,0.00,0,0, +1746043946176,19,2137,1047,643.50,2147.98,1060.02,10931,7537,-66.25,16,80,-36.43,145.50,25.50,27.00,19,12,0.07,0.15,0.17,0.11,0.00,0.00,0,0, +1746043947176,19,2137,1095,502.71,2148.02,1106.60,10254,8765,-66.06,16,22,-41.85,34.73,26.50,26.00,18,12,0.08,0.12,0.17,0.12,0.00,0.00,0,0, +1746043948176,19,2149,1071,671.53,2160.30,1082.70,11068,8940,-66.00,16,5,-48.22,6.84,27.50,26.00,18,11,0.13,0.11,0.17,0.12,0.00,0.00,0,0, +1746043949176,19,2137,1059,631.71,2148.01,1080.49,11227,9392,-66.00,16,106,-34.96,200.14,25.00,26.00,19,12,0.07,0.05,0.17,0.12,0.00,0.00,0,0, +1746043950176,19,2137,1083,528.10,2148.16,1096.43,10307,8233,-66.00,16,5,-48.22,6.84,25.50,26.00,17,12,0.14,0.09,0.17,0.12,0.00,0.00,0,0, +1746043951176,19,2149,1071,605.14,2160.08,1072.62,10207,8441,-65.94,16,5,-48.16,6.85,27.50,27.00,18,12,0.05,0.10,0.17,0.12,0.00,0.00,0,0, +1746043952176,19,2137,1083,646.05,2148.05,1098.82,10218,8041,-65.94,16,20,-42.14,31.30,26.50,28.00,18,11,0.12,0.17,0.17,0.12,0.00,0.00,0,0, +1746043953176,19,2137,1059,666.91,2148.18,1077.96,12708,8969,-66.44,16,106,-35.39,198.98,25.50,27.00,19,10,0.08,0.06,0.17,0.12,0.00,0.00,0,0, +1746043954176,19,2149,1083,547.18,2160.20,1083.94,10265,8675,-66.44,16,5,-48.66,6.83,26.50,27.00,18,11,0.08,0.17,0.17,0.12,0.00,0.00,0,0, +1746043955176,19,2137,1071,455.76,2148.10,1087.12,12780,8868,-66.44,16,5,-48.66,6.83,28.00,27.00,18,10,0.12,0.06,0.17,0.12,0.00,0.00,0,0, +1746043956176,19,2137,1059,803.64,2147.95,1071.94,10646,8867,-66.19,16,5,-48.41,6.84,25.50,26.00,19,12,0.11,0.09,0.17,0.12,0.00,0.00,0,0, +1746043957176,19,2149,1083,690.33,2148.11,1088.97,14027,7793,-66.19,16,5,-48.41,6.84,26.00,27.00,17,7,0.09,0.10,0.17,0.12,0.00,0.00,0,0, +1746043958176,19,2137,1071,676.05,2160.30,1089.71,14987,9108,-66.19,16,16,-43.35,24.43,25.00,27.00,19,11,0.05,0.04,0.17,0.12,0.00,0.00,0,0, +1746043959176,19,2137,1083,662.70,2148.21,1087.71,12189,8524,-66.38,16,26,-41.43,41.65,26.00,27.00,15,9,0.11,0.09,0.17,0.12,0.00,0.00,0,0, +1746043960176,19,2149,1071,516.58,2148.03,1083.10,11501,9623,-66.56,16,5,-48.78,6.82,26.00,27.00,17,13,0.04,0.08,0.17,0.12,0.00,0.00,0,0, +1746043961176,19,2137,1071,672.00,2160.40,1087.03,15262,8597,-66.12,16,5,-48.34,6.84,26.50,30.00,18,6,0.10,0.11,0.17,0.12,0.00,0.00,0,0, +1746043962176,19,2137,1059,472.35,2148.29,1065.77,17864,8134,-65.94,16,5,-48.16,6.85,26.00,27.00,19,8,0.13,0.04,0.17,0.11,0.00,0.00,0,0, +1746043963176,19,2149,1083,750.41,2160.06,1095.58,11267,9273,-65.94,16,5,-48.16,6.85,24.50,28.00,18,9,0.07,0.17,0.17,0.11,0.00,0.00,0,0, +1746043964176,19,2137,1059,506.55,2148.15,1075.09,14094,8095,-65.81,16,7,-46.57,9.89,25.00,27.00,19,8,0.06,0.06,0.17,0.11,0.00,0.00,0,0, +1746043965176,19,2137,1095,800.47,2148.06,1102.67,11979,7862,-66.31,16,22,-42.10,34.66,27.50,27.00,18,9,0.19,0.15,0.17,0.11,0.00,0.00,0,0, +1746043966176,19,2149,1071,600.72,2147.92,1082.98,12501,8821,-66.88,16,5,-49.09,6.81,26.50,27.00,16,9,0.07,0.06,0.17,0.11,0.00,0.00,0,0, +1746043967176,19,2137,1047,548.32,2160.10,1064.93,12268,8256,-66.06,16,5,-48.28,6.84,25.50,25.00,19,8,0.14,0.15,0.17,0.11,0.00,0.00,0,0, +1746043968176,19,2137,1095,755.62,2148.15,1112.67,13974,8776,-66.06,16,5,-48.28,6.84,26.00,27.00,17,8,0.07,0.05,0.17,0.11,0.00,0.00,0,0, +1746043969176,19,2149,1071,654.62,2160.20,1071.62,10478,7968,-65.88,16,5,-48.09,6.85,27.50,31.00,17,13,0.14,0.12,0.17,0.11,0.00,0.00,0,0, +1746043970176,19,2137,1083,671.86,2148.08,1094.71,10456,8264,-65.81,16,29,-40.40,47.25,26.50,27.00,17,10,0.05,0.17,0.17,0.11,0.00,0.00,0,0, +1746043971176,19,2137,1071,641.00,2148.03,1084.02,12785,8493,-66.19,16,24,-41.59,38.19,26.00,27.00,17,9,0.11,0.06,0.17,0.11,0.00,0.00,0,0, +1746043972176,19,2149,1059,623.55,2172.94,1070.31,10368,8692,-66.19,16,5,-48.41,6.84,25.00,25.00,19,12,0.06,0.21,0.17,0.11,0.00,0.00,0,0, +1746043973176,19,2137,1083,545.95,2148.10,1100.22,15835,9003,-66.25,16,5,-48.47,6.83,26.00,28.00,18,6,0.09,0.11,0.17,0.11,0.00,0.00,0,0, +1746043974176,19,2137,1071,558.57,2148.06,1078.89,17341,8879,-66.12,16,22,-41.91,34.71,26.50,27.00,18,9,0.07,0.04,0.16,0.11,0.00,0.00,0,0, +1746043975176,19,2149,1071,680.52,2159.85,1082.64,10334,8670,-65.94,16,5,-48.16,6.85,27.00,27.00,17,10,0.13,0.17,0.17,0.11,0.00,0.00,0,0, +1746043976176,19,2137,1083,679.09,2148.16,1094.75,12843,8475,-66.06,16,27,-40.96,43.55,26.00,26.00,18,9,0.05,0.06,0.16,0.11,0.00,0.00,0,0, +1746043977177,19,2137,1071,578.86,2148.33,1082.06,10993,8221,-66.06,16,16,-43.23,24.45,26.50,27.00,16,12,0.12,0.11,0.16,0.11,0.00,0.00,0,0, +1746043978176,19,2137,1071,569.82,2148.07,1093.86,11597,8436,-66.31,16,37,-39.84,61.59,25.50,27.00,19,11,0.04,0.07,0.16,0.11,0.00,0.00,0,0, +1746043979176,19,2149,1071,665.95,2160.08,1077.30,10862,8521,-66.19,16,5,-48.41,6.84,26.00,27.00,18,12,0.09,0.09,0.16,0.11,0.00,0.00,0,0, +1746043980176,19,2137,1047,745.95,2148.10,1054.56,11698,8611,-66.19,16,5,-48.41,6.84,26.00,27.00,19,9,0.14,0.12,0.17,0.11,0.00,0.00,0,0, +1746043981176,19,2149,1095,594.35,2160.32,1106.95,13023,9192,-66.19,16,5,-48.41,6.84,26.00,27.00,18,11,0.06,0.04,0.16,0.11,0.00,0.00,0,0, +1746043982176,19,2137,1083,584.50,2148.27,1094.53,10328,8919,-66.19,16,7,-46.94,9.87,25.50,27.00,18,9,0.11,0.16,0.17,0.11,0.00,0.00,0,0, +1746043983176,19,2137,1071,548.70,2148.18,1082.75,12730,8794,-66.00,16,106,-34.96,200.14,24.50,27.00,19,9,0.11,0.06,0.17,0.11,0.00,0.00,0,0, +1746043984176,19,2149,1071,506.53,2159.85,1094.20,11188,8593,-66.38,16,41,-39.46,68.97,26.00,27.00,17,8,0.07,0.21,0.16,0.11,0.00,0.00,0,0, +1746043985176,19,2137,1071,822.41,2152.90,1076.74,20892,8186,-66.25,16,5,-48.47,6.83,25.50,27.00,18,5,0.14,0.07,0.17,0.11,0.00,0.00,0,0, +1746043986176,19,2137,1083,666.30,2149.99,1090.50,16534,8992,-66.25,16,51,-38.38,88.03,25.50,27.00,19,12,0.05,0.03,0.16,0.11,0.00,0.00,0,0, +1746043987176,19,2149,1059,551.90,2148.14,1070.71,9567,8638,-65.88,16,5,-48.09,6.85,25.50,28.00,18,12,0.11,0.14,0.17,0.11,0.00,0.00,0,0, +1746043988176,19,2137,1071,682.90,2160.09,1091.95,11606,8750,-65.75,16,106,-34.71,200.82,25.00,27.00,19,11,0.08,0.06,0.17,0.11,0.00,0.00,0,0, +1746043989176,19,2137,1083,643.48,2148.04,1096.12,11273,8113,-66.12,16,40,-39.31,67.28,25.50,27.00,17,9,0.08,0.14,0.17,0.11,0.00,0.00,0,0, +1746043990176,19,2149,1083,566.53,2147.89,1084.44,12645,8418,-66.12,16,34,-40.02,56.18,26.00,27.00,18,10,0.17,0.05,0.17,0.11,0.00,0.00,0,0, +1746043991176,19,2137,1059,656.71,2160.44,1070.90,11950,8298,-66.25,16,5,-48.47,6.83,26.00,28.00,17,8,0.06,0.14,0.16,0.11,0.00,0.00,0,0, +1746043992176,19,2137,1071,568.35,2148.10,1083.17,13926,8548,-66.31,16,5,-48.53,6.83,26.00,27.00,17,9,0.12,0.05,0.17,0.11,0.00,0.00,0,0, +1746043993176,19,2149,1071,651.95,2147.97,1083.30,10913,8270,-66.25,16,106,-35.21,199.47,25.00,27.00,19,9,0.04,0.16,0.16,0.11,0.00,0.00,0,0, +1746043994176,19,2137,1083,576.00,2160.30,1094.62,13019,8682,-66.50,16,7,-47.26,9.85,24.50,27.00,18,9,0.08,0.05,0.17,0.11,0.00,0.00,0,0, +1746043995176,19,2137,1071,711.05,2147.97,1082.86,11077,8800,-66.50,16,16,-43.67,24.37,26.00,28.00,17,9,0.14,0.15,0.17,0.11,0.00,0.00,0,0, +1746043996176,19,2137,1071,628.19,2148.07,1093.96,12658,8632,-66.06,16,37,-39.59,61.74,25.50,27.00,18,9,0.05,0.05,0.16,0.11,0.00,0.00,0,0, +1746043997176,19,2149,1071,563.86,2160.10,1072.18,11423,8070,-66.19,16,5,-48.41,6.84,26.00,27.00,17,9,0.10,0.14,0.17,0.11,0.00,0.00,0,0, +1746043998176,19,2137,1059,679.30,2148.21,1085.32,12973,8772,-66.19,16,106,-35.14,199.64,22.00,27.00,19,9,0.11,0.05,0.17,0.11,0.00,0.00,0,0, +1746043999176,19,2137,1083,496.95,2148.00,1091.94,10136,8688,-66.00,16,5,-48.22,6.84,26.50,27.00,17,12,0.08,0.17,0.17,0.11,0.00,0.00,0,0, +1746044000176,19,2149,1083,651.10,2160.06,1083.51,12470,8011,-66.00,16,9,-45.67,13.01,26.50,27.00,17,10,0.15,0.07,0.17,0.11,0.00,0.00,0,0, +1746044001176,19,2137,1071,627.14,2147.76,1088.42,10119,8402,-66.12,16,23,-41.72,36.46,26.00,27.00,17,13,0.05,0.09,0.17,0.11,0.00,0.00,0,0, +1746044002176,19,2137,1071,620.00,2148.22,1089.12,12047,8576,-66.00,16,41,-39.08,69.24,25.50,27.00,17,9,0.11,0.09,0.17,0.11,0.00,0.00,0,0, +1746044003176,19,2149,1059,663.19,2159.96,1065.30,11655,8267,-66.19,16,106,-35.14,199.64,22.50,27.00,19,13,0.04,0.06,0.17,0.11,0.00,0.00,0,0, +1746044004176,19,2137,1083,519.40,2148.17,1100.21,11129,8000,-66.19,16,40,-39.38,67.24,25.50,27.00,17,11,0.09,0.07,0.17,0.11,0.00,0.00,0,0, +1746044005176,19,2137,1047,567.35,2147.84,1059.66,10522,8356,-66.38,16,5,-48.59,6.83,26.50,25.00,19,12,0.15,0.10,0.17,0.11,0.00,0.00,0,0, +1746044006176,19,2149,1107,634.33,2159.93,1108.58,10106,9690,-66.19,16,11,-44.98,16.19,26.50,25.00,15,12,0.08,0.11,0.17,0.11,0.00,0.00,0,0, +1746044007176,19,2137,1059,569.00,2153.57,1078.10,10324,8717,-66.31,16,15,-43.76,22.73,25.00,27.00,19,12,0.10,0.12,0.17,0.11,0.00,0.00,0,0, +1746044008176,19,2137,1083,550.79,2148.29,1098.22,11197,8990,-66.25,16,37,-39.78,61.63,26.00,26.00,18,11,0.07,0.09,0.17,0.11,0.00,0.00,0,0, +1746044009176,19,2149,1059,565.23,2160.32,1067.74,11828,8580,-66.25,16,5,-48.47,6.83,27.50,27.00,18,12,0.13,0.05,0.17,0.11,0.00,0.00,0,0, +1746044010176,19,2137,1083,746.55,2147.81,1088.37,10072,9234,-66.31,16,22,-42.10,34.66,27.00,27.00,18,12,0.05,0.10,0.17,0.11,0.00,0.00,0,0, +1746044011176,19,2137,1071,447.35,2148.00,1093.77,10174,8316,-66.12,16,5,-48.34,6.84,25.50,26.00,17,12,0.13,0.11,0.17,0.11,0.00,0.00,0,0, +1746044012176,19,2149,1071,529.20,2160.08,1072.66,10278,8252,-66.06,16,5,-48.28,6.84,26.50,27.00,18,12,0.05,0.13,0.17,0.11,0.00,0.00,0,0, +1746044013176,19,2137,1083,806.19,2148.02,1105.07,10166,8588,-66.06,16,40,-39.25,67.32,25.50,27.00,17,12,0.11,0.14,0.17,0.11,0.00,0.00,0,0, +1746044014176,19,2137,1071,633.29,2148.42,1072.30,13790,8146,-66.25,16,80,-36.43,145.50,22.00,27.00,19,8,0.07,0.09,0.17,0.11,0.00,0.00,0,0, +1746044015176,19,2149,1059,612.95,2160.24,1077.78,12891,8441,-66.25,16,5,-48.47,6.83,26.00,27.00,18,13,0.10,0.04,0.17,0.11,0.00,0.00,0,0, +1746044016176,19,2137,1083,565.29,2147.97,1086.95,9739,8463,-65.88,16,5,-48.09,6.85,26.00,26.00,18,11,0.08,0.17,0.17,0.11,0.00,0.00,0,0, +1746044017176,19,2137,1071,615.35,2148.03,1093.49,12614,8938,-66.12,16,5,-48.34,6.84,26.00,26.00,17,10,0.16,0.06,0.17,0.11,0.00,0.00,0,0, +1746044018176,19,2149,1071,546.00,2159.98,1072.66,9895,8560,-66.12,16,5,-48.34,6.84,27.50,27.00,17,13,0.05,0.09,0.17,0.11,0.00,0.00,0,0, +1746044019176,19,2137,1059,638.86,2147.86,1088.20,11012,8666,-65.94,16,15,-43.38,22.80,24.50,27.00,19,11,0.12,0.07,0.17,0.11,0.00,0.00,0,0, +1746044020176,19,2137,1095,507.00,2148.02,1089.87,10884,8395,-66.06,16,16,-43.23,24.45,26.00,28.00,17,9,0.08,0.15,0.17,0.11,0.00,0.00,0,0, +1746044021176,19,2149,1071,650.14,2160.13,1083.62,12865,9149,-66.12,16,5,-48.34,6.84,26.50,28.00,18,9,0.07,0.05,0.17,0.11,0.00,0.00,0,0, +1746044022176,19,2137,1071,525.50,2148.12,1082.87,10728,8625,-66.12,16,5,-48.34,6.84,26.50,27.00,18,12,0.16,0.10,0.17,0.11,0.00,0.00,0,0, +1746044023176,19,2137,1071,421.63,2147.84,1094.54,10916,8141,-65.94,16,5,-48.16,6.85,27.00,27.00,17,11,0.06,0.08,0.17,0.11,0.00,0.00,0,0, +1746044024176,19,2149,1071,578.37,2160.05,1081.69,10929,8309,-66.31,16,19,-42.73,29.48,26.00,27.00,18,12,0.14,0.06,0.17,0.11,0.00,0.00,0,0, +1746044025176,19,2137,1083,687.00,2148.08,1085.41,10227,9352,-66.25,16,34,-40.14,56.11,26.00,27.00,18,12,0.07,0.09,0.17,0.11,0.00,0.00,0,0, +1746044026176,19,2137,1071,620.30,2148.00,1082.99,10263,8756,-66.19,16,106,-35.14,199.64,22.50,26.00,18,12,0.06,0.08,0.17,0.11,0.00,0.00,0,0, +1746044027176,19,2149,1071,714.86,2160.17,1082.89,10269,8273,-66.19,16,5,-48.41,6.84,26.50,26.00,18,12,0.17,0.09,0.17,0.11,0.00,0.00,0,0, +1746044028176,19,2137,1071,685.33,2148.06,1093.24,10097,8621,-66.12,16,40,-39.31,67.28,26.00,27.00,17,12,0.06,0.11,0.17,0.11,0.00,0.00,0,0, +1746044029176,19,2137,1071,598.71,2148.09,1083.76,12659,8756,-66.06,16,5,-48.28,6.84,25.50,26.00,17,9,0.15,0.08,0.17,0.11,0.00,0.00,0,0, +1746044030176,19,2149,1071,640.14,2159.98,1072.66,11407,8791,-65.88,16,5,-48.09,6.85,26.00,26.00,17,12,0.05,0.19,0.17,0.11,0.00,0.00,0,0, +1746044031176,19,2137,1083,594.10,2148.30,1100.51,12689,8695,-65.94,16,7,-46.69,9.88,26.00,26.00,18,9,0.11,0.08,0.17,0.11,0.00,0.00,0,0, +1746044032176,19,2137,1071,592.67,2147.85,1078.82,11141,9206,-65.94,16,22,-41.72,34.77,26.50,28.00,18,12,0.05,0.16,0.17,0.11,0.00,0.00,0,0, +1746044033176,19,2149,1071,549.76,2160.18,1082.78,11612,8630,-66.06,16,5,-48.28,6.84,25.50,27.00,17,11,0.10,0.06,0.17,0.11,0.00,0.00,0,0, +1746044034176,19,2137,1071,543.00,2148.02,1085.02,10379,8397,-66.00,16,80,-36.18,145.95,22.00,26.00,19,9,0.11,0.20,0.17,0.11,0.00,0.00,0,0, +1746044035176,19,2137,1071,708.00,2148.24,1081.26,15937,8406,-66.25,16,5,-48.47,6.83,27.00,26.00,17,7,0.08,0.07,0.17,0.11,0.00,0.00,0,0, +1746044036176,19,2149,1071,662.81,2160.18,1082.27,12853,8636,-66.25,16,5,-48.47,6.83,27.00,28.00,17,14,0.15,0.04,0.17,0.11,0.00,0.00,0,0, +1746044037176,19,2137,1083,608.29,2147.98,1094.94,11645,8285,-66.00,16,29,-40.58,47.16,26.50,28.00,17,10,0.05,0.09,0.17,0.11,0.00,0.00,0,0, +1746044038176,19,2137,1071,628.90,2147.87,1083.31,11156,8485,-66.00,16,22,-41.78,34.75,26.00,27.00,18,13,0.12,0.09,0.17,0.11,0.00,0.00,0,0, +1746044039176,19,2149,1059,517.62,2160.48,1074.65,12498,9428,-65.75,16,5,-47.97,6.85,26.00,27.00,18,10,0.07,0.09,0.17,0.11,0.00,0.00,0,0, +1746044040176,19,2137,1083,650.26,2147.73,1101.16,11060,9086,-66.31,16,5,-48.53,6.83,25.50,27.00,18,13,0.06,0.10,0.17,0.11,0.00,0.00,0,0, +1746044041176,19,2137,1059,646.95,2148.13,1068.00,11976,8392,-66.31,16,20,-42.51,31.20,27.50,28.00,19,9,0.13,0.09,0.17,0.11,0.00,0.00,0,0, +1746044042176,19,2149,1083,701.62,2160.28,1087.95,11888,8418,-66.12,16,5,-48.34,6.84,26.50,27.00,18,13,0.09,0.09,0.17,0.11,0.00,0.00,0,0, +1746044043176,19,2137,1083,696.50,2148.02,1099.67,14035,9225,-66.12,16,20,-42.32,31.25,26.50,27.00,18,7,0.07,0.11,0.17,0.11,0.00,0.00,0,0, +1746044044176,19,2137,1071,726.55,2148.12,1079.66,15146,9385,-65.81,16,22,-41.60,34.81,26.50,27.00,18,10,0.05,0.04,0.17,0.11,0.00,0.00,0,0, +1746044045176,19,2149,1071,592.30,2159.95,1093.80,10803,9420,-65.81,16,37,-39.34,61.90,26.00,27.00,18,9,0.07,0.15,0.17,0.11,0.00,0.00,0,0, +1746044046176,19,2137,1071,613.18,2148.06,1077.94,12955,9125,-65.94,16,5,-48.16,6.85,26.50,27.00,18,9,0.06,0.05,0.17,0.11,0.00,0.00,0,0, +1746044047176,19,2137,1071,692.09,2148.30,1088.41,10827,8254,-66.00,16,5,-48.22,6.84,27.00,27.00,17,12,0.17,0.09,0.17,0.11,0.00,0.00,0,0, +1746044048176,19,2149,1071,539.75,2159.74,1072.67,11018,8628,-66.12,16,5,-48.34,6.84,26.50,27.00,16,10,0.06,0.11,0.17,0.11,0.00,0.00,0,0, +1746044049176,19,2137,1071,518.43,2148.06,1082.54,12214,7942,-65.88,16,5,-48.09,6.85,26.50,28.00,18,13,0.14,0.04,0.17,0.11,0.00,0.00,0,0, +1746044050176,19,2137,1083,606.91,2148.08,1095.52,9259,9009,-65.88,16,22,-41.66,34.79,26.50,27.00,18,13,0.06,0.12,0.17,0.11,0.00,0.00,0,0, +1746044051176,19,2149,1071,611.58,2159.99,1082.58,10057,8636,-66.00,16,5,-48.22,6.84,27.00,27.00,17,12,0.17,0.11,0.17,0.11,0.00,0.00,0,0, +1746044052176,19,2137,1071,631.15,2148.01,1093.85,10207,8809,-66.00,16,40,-39.19,67.37,26.00,27.00,16,12,0.06,0.11,0.17,0.11,0.00,0.00,0,0, +1746044053176,19,2137,1071,726.33,2147.99,1073.28,10134,8517,-66.25,16,24,-41.66,38.17,26.50,28.00,16,12,0.15,0.12,0.17,0.11,0.00,0.00,0,0, +1746044054176,19,2149,1071,684.67,2159.93,1082.88,10143,8196,-66.25,16,5,-48.47,6.83,27.00,28.00,16,12,0.05,0.11,0.17,0.11,0.00,0.00,0,0, +1746044055176,19,2137,1083,598.09,2148.22,1094.64,10445,8660,-66.06,16,7,-46.82,9.88,24.50,27.00,18,12,0.11,0.09,0.17,0.11,0.00,0.00,0,0, +1746044056176,19,2137,1059,572.50,2147.98,1071.85,10252,9234,-66.12,16,5,-48.34,6.84,25.50,28.00,18,12,0.06,0.10,0.17,0.11,0.00,0.00,0,0, +1746044057176,19,2149,1083,529.76,2159.86,1105.73,10012,9139,-65.81,16,37,-39.34,61.90,25.50,27.00,18,12,0.14,0.10,0.17,0.11,0.00,0.00,0,0, +1746044058176,19,2137,1083,616.11,2147.95,1084.88,10225,9028,-65.75,16,92,-35.32,171.26,22.50,27.00,18,12,0.06,0.07,0.17,0.11,0.00,0.00,0,0, +1746044059176,19,2137,1059,729.43,2148.30,1071.34,12174,8561,-65.75,16,5,-47.97,6.85,26.00,27.00,17,9,0.16,0.10,0.17,0.11,0.00,0.00,0,0, +1746044060176,19,2149,1071,643.84,2148.02,1093.92,12113,8142,-65.94,16,5,-48.16,6.85,26.00,27.00,17,13,0.06,0.04,0.17,0.11,0.00,0.00,0,0, +1746044061176,19,2137,1083,644.90,2160.15,1083.66,12647,8835,-66.06,16,29,-40.65,47.13,26.00,27.00,17,8,0.13,0.11,0.17,0.11,0.00,0.00,0,0, +1746044062176,19,2137,1047,665.55,2148.23,1059.70,13612,8456,-65.94,16,5,-48.16,6.85,25.50,27.00,18,11,0.06,0.04,0.17,0.11,0.00,0.00,0,0, +1746044063176,19,2149,1083,581.67,2148.10,1108.46,10205,9028,-65.81,16,37,-39.34,61.90,26.00,29.00,18,12,0.10,0.10,0.17,0.11,0.00,0.00,0,0, +1746044064176,19,2137,1083,516.50,2160.28,1086.22,12142,9168,-65.81,16,5,-48.03,6.85,26.00,26.00,18,9,0.06,0.10,0.17,0.11,0.00,0.00,0,0, +1746044065176,19,2137,1071,742.80,2148.15,1078.92,12105,8832,-66.12,16,24,-41.53,38.21,26.50,29.00,17,13,0.14,0.04,0.17,0.11,0.00,0.00,0,0, +1746044066176,19,2149,1071,689.59,2160.25,1092.26,12009,9085,-66.00,16,5,-48.22,6.84,26.50,27.00,12,10,0.21,0.08,0.17,0.11,0.00,0.00,0,0, +1746044067176,19,2137,1083,657.57,2148.02,1086.42,10983,12939,-66.00,16,39,-39.30,65.50,26.00,27.00,10,13,0.07,0.11,0.17,0.11,0.00,0.00,0,0, +1746044068176,19,2137,1059,699.14,2148.01,1081.94,9437,10859,-66.00,16,106,-34.96,200.14,16.00,28.00,14,11,0.13,0.19,0.17,0.11,0.00,0.00,0,0, +1746044069176,19,2149,1083,685.18,2160.17,1094.89,12781,11304,-66.00,16,87,-35.81,160.33,16.00,27.00,11,9,0.08,0.06,0.17,0.11,0.00,0.00,0,0, +1746044070176,19,2137,1071,595.75,2148.09,1072.92,10786,10765,-66.06,16,106,-35.02,199.97,17.00,26.00,14,13,0.13,0.14,0.17,0.11,0.00,0.00,0,0, +1746044071176,19,2137,1071,671.32,2148.07,1082.43,9722,9637,-65.88,16,5,-48.09,6.85,26.00,26.00,13,12,0.11,0.13,0.17,0.11,0.00,0.00,0,0, +1746044072176,19,2149,1071,438.90,2160.09,1082.90,10234,10118,-66.00,16,5,-48.22,6.84,27.00,28.00,13,12,0.09,0.10,0.17,0.11,0.00,0.00,0,0, +1746044073176,19,2137,1071,651.45,2148.34,1082.01,10485,9211,-66.00,16,5,-48.22,6.84,27.00,26.00,13,12,0.08,0.11,0.17,0.12,0.00,0.00,0,0, +1746044074176,19,2137,1071,744.05,2148.17,1084.65,10116,9508,-66.12,16,5,-48.34,6.84,26.50,24.00,13,12,0.09,0.09,0.17,0.12,0.00,0.00,0,0, +1746044075176,19,2149,1071,511.12,2148.10,1085.60,9990,8966,-66.25,16,98,-35.55,182.65,16.50,26.00,13,12,0.07,0.09,0.17,0.12,0.00,0.00,0,0, +1746044076176,19,2137,1071,510.37,2160.42,1076.81,10661,9771,-66.38,16,5,-48.59,6.83,28.00,25.00,13,12,0.06,0.12,0.17,0.12,0.00,0.00,0,0, +1746044077176,19,2137,1095,642.90,2148.22,1106.61,10249,9706,-66.38,16,53,-38.34,91.75,15.00,26.00,13,12,0.06,0.11,0.17,0.12,0.00,0.00,0,0, +1746044078176,19,2149,1047,665.47,2148.31,1058.16,10329,9488,-66.38,16,5,-48.59,6.83,27.50,27.00,13,12,0.08,0.10,0.17,0.12,0.00,0.00,0,0, +1746044079176,19,2137,1095,541.58,2160.17,1106.68,11444,10157,-66.31,16,21,-42.30,32.92,26.50,27.00,13,11,0.06,0.08,0.17,0.12,0.00,0.00,0,0, +1746044080176,19,2137,1071,754.75,2148.03,1087.68,10552,9891,-66.31,16,39,-39.61,65.29,25.50,27.00,13,12,0.06,0.07,0.17,0.12,0.00,0.00,0,0, +1746044081176,19,2149,1071,587.74,2148.16,1088.54,12128,9183,-66.25,16,74,-36.77,133.34,16.00,27.00,12,10,0.19,0.08,0.17,0.12,0.00,0.00,0,0, +1746044082176,19,2137,1071,739.62,2160.21,1073.60,11550,12596,-66.25,16,5,-48.47,6.83,25.50,27.00,10,13,0.07,0.13,0.17,0.12,0.00,0.00,0,0, +1746044083176,19,2137,1047,753.61,2148.29,1059.14,14195,10722,-66.44,16,16,-43.60,24.38,25.50,27.00,14,7,0.11,0.11,0.17,0.12,0.00,0.00,0,0, +1746044084176,19,2149,1083,483.29,2148.46,1100.09,15448,9807,-66.31,16,5,-48.53,6.83,26.50,26.00,13,10,0.11,0.04,0.17,0.12,0.00,0.00,0,0, +1746044085176,19,2137,1095,581.32,2160.57,1100.37,10848,9996,-66.19,16,8,-46.36,11.42,25.50,27.00,13,12,0.09,0.11,0.17,0.12,0.00,0.00,0,0, +1746044086176,19,2137,1059,709.85,2148.34,1072.57,10389,9597,-66.19,16,5,-48.41,6.84,26.50,27.00,13,12,0.09,0.14,0.17,0.12,0.00,0.00,0,0, +1746044087176,19,2137,1071,559.15,2148.28,1086.35,11539,9825,-66.06,16,64,-37.21,113.63,14.50,27.00,13,11,0.10,0.08,0.17,0.12,0.00,0.00,0,0, +1746044088176,19,2149,1083,588.10,2160.22,1088.34,10835,9779,-66.06,16,36,-39.71,59.89,26.00,27.00,13,12,0.09,0.07,0.17,0.12,0.00,0.00,0,0, +1746044089176,19,2137,1083,611.65,2147.85,1094.92,9808,9788,-66.19,16,53,-38.15,91.94,14.00,27.00,13,12,0.08,0.07,0.17,0.12,0.00,0.00,0,0, +1746044090176,19,2137,1047,584.61,2148.26,1064.16,10546,9398,-66.12,16,5,-48.34,6.84,26.00,27.00,13,11,0.09,0.16,0.17,0.12,0.00,0.00,0,0, +1746044091176,19,2149,1083,574.86,2160.14,1088.11,11542,8841,-66.12,16,5,-48.34,6.84,25.50,27.00,13,11,0.10,0.05,0.17,0.12,0.00,0.00,0,0, +1746044092176,19,2137,1083,705.65,2148.49,1094.51,10961,9603,-66.06,16,53,-38.03,92.07,14.00,28.00,13,10,0.08,0.16,0.17,0.12,0.00,0.00,0,0, +1746044093176,19,2137,1071,630.39,2148.34,1082.32,12834,9495,-66.06,16,62,-37.35,109.67,15.00,28.00,13,10,0.09,0.06,0.17,0.12,0.00,0.00,0,0, +1746044094176,19,2149,1059,619.70,2160.26,1077.13,10731,10250,-66.25,16,5,-48.47,6.83,26.50,27.00,13,10,0.07,0.24,0.17,0.12,0.00,0.00,0,0, +1746044095176,19,2137,1083,719.30,2148.54,1088.59,17477,9500,-66.38,16,5,-48.59,6.83,26.00,26.00,13,6,0.08,0.08,0.17,0.12,0.00,0.00,0,0, +1746044096176,19,2137,1059,564.53,2148.34,1075.69,15317,9418,-66.38,16,5,-48.59,6.83,26.00,28.00,13,12,0.07,0.03,0.17,0.12,0.00,0.00,0,0, +1746044097176,19,2149,1083,596.50,2160.20,1088.45,10960,9812,-66.19,16,5,-48.41,6.84,26.00,27.00,13,10,0.08,0.12,0.17,0.12,0.00,0.00,0,0, +1746044098176,19,2137,1083,638.22,2148.15,1094.64,12176,9810,-66.25,16,5,-48.47,6.83,25.50,26.00,13,12,0.07,0.04,0.17,0.12,0.00,0.00,0,0, +1746044099176,19,2137,1083,561.05,2147.84,1094.13,9811,9469,-66.06,16,35,-39.83,58.05,25.50,28.00,13,12,0.10,0.08,0.17,0.12,0.00,0.00,0,0, +1746044100176,19,2149,1059,635.80,2160.11,1070.81,11701,9685,-66.06,16,5,-48.28,6.84,26.00,27.00,13,10,0.10,0.09,0.17,0.12,0.00,0.00,0,0, +1746044101176,19,2137,1071,705.82,2153.13,1088.14,11658,9953,-66.06,16,38,-39.47,63.60,26.00,27.00,13,13,0.09,0.12,0.16,0.12,0.00,0.00,0,0, +1746044102176,19,2137,1071,723.51,2149.38,1078.93,14748,9261,-66.00,16,5,-48.22,6.84,26.50,26.00,13,5,0.08,0.14,0.16,0.12,0.00,0.00,0,0, +1746044103176,19,2149,1083,606.00,2165.93,1092.18,21892,9541,-65.94,16,5,-48.16,6.85,26.00,28.00,13,6,0.07,0.05,0.16,0.12,0.00,0.00,0,0, +1746044104176,19,2137,1071,696.43,2148.41,1082.74,12130,9246,-66.44,16,5,-48.66,6.83,27.00,28.00,13,11,0.07,0.25,0.16,0.12,0.00,0.00,0,0, +1746044105176,19,2137,1083,568.30,2148.25,1094.17,15073,9672,-66.44,16,35,-40.21,57.84,26.00,27.00,13,7,0.09,0.09,0.16,0.12,0.00,0.00,0,0, +1746044106176,19,2149,1059,600.37,2160.40,1070.26,14295,9657,-66.06,16,5,-48.28,6.84,27.00,27.00,13,12,0.10,0.03,0.16,0.12,0.00,0.00,0,0, +1746044107176,19,2137,1071,567.30,2147.90,1081.92,11028,9131,-66.00,16,5,-48.22,6.84,26.50,28.00,13,10,0.09,0.12,0.16,0.12,0.00,0.00,0,0, +1746044108176,19,2137,1059,481.29,2148.18,1076.74,12437,9778,-66.12,16,5,-48.34,6.84,26.50,27.00,13,12,0.09,0.04,0.16,0.12,0.00,0.00,0,0, +1746044109176,19,2149,1083,618.50,2160.02,1088.18,10393,9560,-66.12,16,5,-48.34,6.84,25.50,27.00,13,10,0.09,0.16,0.16,0.12,0.00,0.00,0,0, +1746044110176,19,2137,1083,648.86,2148.21,1099.68,12875,9734,-66.25,16,39,-39.55,65.33,25.50,27.00,13,10,0.08,0.06,0.16,0.12,0.00,0.00,0,0, +1746044111176,19,2137,1071,604.70,2148.34,1087.51,10196,9670,-66.25,16,106,-35.21,199.47,17.50,26.00,13,13,0.09,0.10,0.16,0.12,0.00,0.00,0,0, +1746044112176,19,2149,1071,635.41,2160.22,1072.94,14223,9672,-66.12,16,5,-48.34,6.84,27.00,27.00,13,6,0.09,0.12,0.16,0.12,0.00,0.00,0,0, +1746044113176,19,2137,1071,649.27,2148.44,1088.14,17995,9978,-66.25,16,38,-39.66,63.48,25.50,27.00,13,8,0.08,0.04,0.16,0.11,0.00,0.00,0,0, +1746044114176,19,2137,1083,655.05,2148.13,1088.30,10832,9630,-66.25,16,5,-48.47,6.83,26.00,27.00,13,11,0.09,0.25,0.16,0.12,0.00,0.00,0,0, +1746044115176,19,2149,1071,644.27,2160.28,1082.57,15183,9473,-66.38,16,71,-37.07,127.13,15.00,27.00,13,7,0.09,0.09,0.16,0.12,0.00,0.00,0,0, +1746044116176,19,2137,1059,586.45,2148.37,1076.23,14464,9198,-66.19,16,64,-37.33,113.46,15.00,27.00,13,12,0.11,0.03,0.16,0.11,0.00,0.00,0,0, +1746044117176,19,2137,1083,612.90,2148.09,1097.15,11078,9795,-66.31,16,95,-35.74,176.25,16.00,26.00,13,10,0.12,0.12,0.16,0.12,0.00,0.00,0,0, +1746044118176,19,2149,1059,647.59,2160.26,1060.91,12170,9382,-66.31,16,5,-48.53,6.83,29.00,27.00,13,13,0.12,0.05,0.16,0.11,0.00,0.00,0,0, +1746044119176,19,2137,1083,608.90,2148.30,1093.73,11347,9670,-66.06,16,5,-48.28,6.84,26.50,27.00,13,8,0.10,0.14,0.16,0.12,0.00,0.00,0,0, +1746044120176,19,2137,1071,667.20,2148.18,1088.40,14007,9547,-66.06,16,5,-48.28,6.84,25.50,27.00,13,9,0.09,0.05,0.16,0.11,0.00,0.00,0,0, +1746044121176,19,2149,1071,690.50,2160.34,1076.30,10861,9512,-66.12,16,5,-48.34,6.84,25.50,27.00,13,12,0.09,0.07,0.16,0.11,0.00,0.00,0,0, +1746044122176,19,2137,1083,595.95,2148.24,1099.27,10357,9598,-66.00,16,38,-39.41,63.64,25.00,27.00,13,12,0.09,0.07,0.16,0.12,0.00,0.00,0,0, +1746044123176,19,2137,1071,614.60,2148.24,1083.54,10129,9560,-66.00,16,38,-39.41,63.64,25.50,27.00,13,12,0.08,0.06,0.16,0.12,0.00,0.00,0,0, +1746044124176,19,2149,1071,676.11,2160.30,1078.22,10248,9893,-66.12,16,38,-39.54,63.56,26.00,28.00,13,12,0.09,0.08,0.16,0.12,0.00,0.00,0,0, +1746044125176,19,2137,1071,551.43,2148.10,1086.50,10017,9668,-66.12,16,38,-39.54,63.56,25.50,27.00,13,12,0.10,0.09,0.16,0.12,0.00,0.00,0,0, +1746044126176,19,2137,1071,681.50,2148.21,1078.55,10249,9544,-66.19,16,38,-39.60,63.52,25.50,27.00,13,12,0.09,0.09,0.16,0.12,0.00,0.00,0,0, +1746044127176,19,2149,1071,584.95,2160.22,1080.37,10062,9818,-66.00,16,5,-48.22,6.84,26.50,27.00,13,12,0.09,0.09,0.16,0.12,0.00,0.00,0,0, +1746044128176,19,2137,1083,507.65,2148.21,1103.22,10067,9273,-66.00,16,36,-39.65,59.93,26.00,28.00,13,12,0.08,0.12,0.16,0.12,0.00,0.00,0,0, +1746044129176,19,2137,1083,684.00,2148.21,1084.62,10884,9177,-66.31,16,53,-38.28,91.82,14.50,27.00,13,11,0.09,0.10,0.16,0.12,0.00,0.00,0,0, +1746044130176,19,2149,1059,527.00,2160.46,1070.48,11249,9883,-66.25,16,5,-48.47,6.83,27.00,28.00,13,12,0.11,0.14,0.16,0.12,0.00,0.00,0,0, +1746044131176,19,2137,1071,669.40,2148.33,1082.10,10335,9684,-66.19,16,5,-48.41,6.84,27.00,27.00,13,12,0.11,0.13,0.16,0.12,0.00,0.00,0,0, +1746044132176,19,2137,1047,753.64,2148.34,1066.73,10191,9711,-66.19,16,5,-48.41,6.84,27.00,28.00,13,12,0.12,0.11,0.16,0.12,0.00,0.00,0,0, +1746044133176,19,2149,1083,755.14,2160.34,1092.43,10495,9689,-65.94,16,62,-37.22,109.83,14.50,26.00,13,11,0.10,0.16,0.16,0.12,0.00,0.00,0,0, +1746044134176,19,2137,1071,596.90,2148.27,1095.74,11737,9855,-65.94,16,58,-37.51,101.95,15.00,27.00,13,11,0.13,0.06,0.16,0.12,0.00,0.00,0,0, +1746044135176,19,2137,1107,741.57,2148.22,1098.73,10371,9525,-66.06,16,53,-38.03,92.07,14.50,28.00,13,10,0.11,0.15,0.16,0.12,0.00,0.00,0,0, +1746044136176,19,2149,1059,623.36,2160.30,1080.18,12741,9597,-66.19,16,36,-39.83,59.82,25.50,27.00,13,10,0.10,0.05,0.16,0.12,0.00,0.00,0,0, +1746044137176,19,2137,1059,665.72,2152.54,1060.36,10150,9576,-66.19,16,5,-48.41,6.84,27.50,28.00,13,9,0.10,0.15,0.16,0.12,0.00,0.00,0,0, +1746044138176,19,2137,1083,504.50,2148.29,1094.31,12803,9214,-66.19,16,5,-48.41,6.84,26.00,28.00,13,9,0.12,0.05,0.16,0.12,0.00,0.00,0,0, +1746044139176,19,2149,1071,506.60,2160.18,1083.34,10778,9651,-66.31,16,53,-38.28,91.82,14.00,27.00,13,12,0.10,0.09,0.16,0.12,0.00,0.00,0,0, +1746044140176,19,2137,1083,574.14,2157.96,1092.85,11774,9603,-66.00,16,36,-39.65,59.93,26.00,27.00,13,10,0.13,0.09,0.16,0.12,0.00,0.00,0,0, +1746044141176,19,2137,1083,635.26,2148.22,1094.31,11295,9640,-66.00,16,53,-37.97,92.14,14.00,27.00,13,14,0.12,0.12,0.16,0.12,0.00,0.00,0,0, +1746044142176,19,2149,1035,624.38,2148.50,1065.48,11872,9101,-66.00,16,58,-37.57,101.88,15.00,27.00,13,10,0.11,0.08,0.16,0.12,0.00,0.00,0,0, +1746044143176,19,2137,1083,619.36,2160.38,1081.05,11803,9808,-66.00,16,62,-37.28,109.75,15.00,27.00,13,12,0.11,0.08,0.16,0.12,0.00,0.00,0,0, +1746044144176,19,2137,1059,670.48,2148.29,1072.31,10647,9829,-66.00,16,5,-48.22,6.84,27.00,26.00,13,10,0.10,0.15,0.16,0.12,0.00,0.00,0,0, +1746044145176,19,2149,1095,637.05,2160.28,1098.19,12794,9549,-66.38,16,5,-48.59,6.83,28.00,25.00,13,10,0.08,0.05,0.16,0.12,0.00,0.00,0,0, +1746044146176,19,2137,1071,435.82,2148.42,1088.03,10745,9337,-66.38,16,64,-37.52,113.22,15.00,26.00,13,12,0.08,0.08,0.16,0.12,0.00,0.00,0,0, +1746044147176,19,2137,1071,549.45,2148.38,1087.48,10421,9605,-66.25,16,64,-37.40,113.38,15.50,27.00,13,12,0.08,0.13,0.16,0.12,0.00,0.00,0,0, +1746044148176,19,2149,1083,584.38,2160.40,1083.44,10391,9679,-66.31,16,5,-48.53,6.83,27.00,27.00,13,12,0.07,0.15,0.16,0.12,0.00,0.00,0,0, +1746044149176,19,2137,1071,574.47,2148.18,1086.99,10100,9544,-66.06,16,5,-48.28,6.84,26.50,27.00,13,12,0.09,0.11,0.16,0.12,0.00,0.00,0,0, +1746044150176,19,2137,1071,738.70,2148.19,1077.02,10220,9450,-66.06,16,5,-48.28,6.84,26.50,26.00,13,12,0.12,0.10,0.16,0.12,0.00,0.00,0,0, +1746044151176,19,2149,1059,571.00,2160.20,1076.66,10109,9288,-66.06,16,5,-48.28,6.84,26.50,27.00,13,12,0.11,0.11,0.16,0.12,0.00,0.00,0,0, +1746044152176,19,2137,1083,645.50,2148.38,1093.65,10420,9364,-66.00,16,64,-37.15,113.71,15.00,28.00,13,12,0.12,0.09,0.16,0.12,0.00,0.00,0,0, +1746044153176,19,2137,1071,676.35,2147.94,1076.46,9935,9554,-66.00,16,5,-48.22,6.84,27.00,27.00,13,12,0.11,0.08,0.16,0.12,0.00,0.00,0,0, +1746044154176,19,2149,1071,467.63,2160.22,1087.26,10314,9024,-66.12,16,98,-35.42,182.95,16.00,27.00,13,11,0.12,0.16,0.16,0.12,0.00,0.00,0,0, +1746044155176,19,2137,1071,567.68,2148.42,1082.56,13029,9571,-66.12,16,62,-37.41,109.59,15.00,27.00,13,10,0.11,0.06,0.16,0.12,0.00,0.00,0,0, +1746044156176,19,2137,1095,678.55,2148.26,1099.74,10405,9203,-66.31,16,62,-37.60,109.35,15.00,27.00,13,11,0.12,0.26,0.16,0.12,0.00,0.00,0,0, +1746044157176,19,2149,1059,550.10,2160.42,1080.94,16693,9761,-66.12,16,36,-39.77,59.86,25.50,27.00,13,6,0.11,0.09,0.16,0.12,0.00,0.00,0,0, +1746044158176,19,2137,1083,507.57,2148.58,1084.58,16329,9729,-66.12,16,64,-37.27,113.55,14.50,27.00,13,11,0.10,0.03,0.16,0.12,0.00,0.00,0,0, +1746044159176,19,2137,1071,589.74,2148.26,1087.23,11226,9617,-66.19,16,38,-39.60,63.52,25.50,27.00,13,9,0.13,0.12,0.16,0.12,0.00,0.00,0,0, +1746044160176,19,2149,1059,546.50,2159.99,1071.26,12454,9116,-66.19,16,62,-37.47,109.51,15.00,27.00,13,11,0.12,0.04,0.16,0.12,0.00,0.00,0,0, +1746044161176,19,2137,1083,671.19,2151.04,1093.15,11848,9602,-66.19,16,5,-48.41,6.84,26.00,27.00,13,10,0.12,0.10,0.16,0.12,0.00,0.00,0,0, +1746044162176,19,2137,1083,540.43,2148.36,1088.72,11864,9030,-66.12,16,53,-38.09,92.01,15.00,28.00,13,13,0.12,0.07,0.16,0.12,0.00,0.00,0,0, +1746044163176,19,2149,1059,633.24,2148.50,1074.68,14357,9855,-66.12,16,62,-37.41,109.59,15.50,28.00,13,6,0.11,0.12,0.16,0.12,0.00,0.00,0,0, +1746044164176,19,2137,1071,737.24,2160.52,1084.06,18318,9375,-66.12,16,64,-37.27,113.55,16.00,27.00,13,8,0.09,0.04,0.16,0.12,0.00,0.00,0,0, +1746044165176,19,2137,1071,570.65,2147.91,1076.22,10317,9515,-66.38,16,5,-48.59,6.83,27.50,28.00,13,11,0.12,0.18,0.16,0.12,0.00,0.00,0,0, +1746044166176,19,2149,1083,559.20,2148.39,1094.12,12890,9884,-66.38,16,62,-37.66,109.28,15.00,29.00,13,10,0.12,0.07,0.16,0.12,0.00,0.00,0,0, +1746044167176,19,2137,1059,577.29,2160.34,1070.40,11201,9240,-66.62,16,5,-48.84,6.82,27.00,27.00,13,12,0.13,0.12,0.16,0.12,0.00,0.00,0,0, +1746044168176,19,2137,1083,705.53,2148.10,1093.70,11212,9166,-66.44,16,5,-48.66,6.83,25.50,27.00,13,11,0.12,0.09,0.16,0.12,0.00,0.00,0,0, +1746044169176,19,2149,1059,580.37,2148.28,1076.27,11159,9391,-66.44,16,5,-48.66,6.83,26.00,26.00,13,12,0.15,0.09,0.16,0.12,0.00,0.00,0,0, +1746044170176,19,2137,1095,497.32,2160.36,1100.42,10507,9658,-66.25,16,8,-46.43,11.42,25.00,27.00,13,12,0.13,0.14,0.16,0.12,0.00,0.00,0,0, +1746044171176,19,2137,1059,757.62,2148.17,1070.36,11574,9426,-66.12,16,5,-48.34,6.84,27.00,28.00,13,8,0.12,0.14,0.16,0.12,0.00,0.00,0,0, +1746044172176,19,2149,1095,613.75,2148.51,1105.78,14415,8896,-66.00,16,35,-39.77,58.09,26.00,27.00,13,8,0.14,0.05,0.16,0.12,0.00,0.00,0,0, +1746044173176,19,2137,1047,419.05,2160.37,1064.60,11602,9747,-66.00,16,5,-48.22,6.84,27.00,26.00,13,10,0.12,0.15,0.16,0.12,0.00,0.00,0,0, +1746044174176,19,2137,1095,608.70,2148.17,1099.97,12763,9594,-65.81,16,53,-37.78,92.33,14.50,28.00,13,10,0.11,0.05,0.16,0.12,0.00,0.00,0,0, +1746044175176,19,2149,1047,506.95,2147.94,1058.50,10332,9277,-66.00,16,5,-48.22,6.84,26.50,27.00,13,10,0.10,0.15,0.16,0.12,0.00,0.00,0,0, +1746044176176,19,2137,1095,646.05,2160.53,1105.78,13177,9623,-65.94,16,62,-37.22,109.83,15.50,27.00,13,10,0.12,0.05,0.16,0.12,0.00,0.00,0,0, +1746044177176,19,2137,1071,587.86,2148.02,1082.22,10454,9530,-66.12,16,69,-36.94,123.50,15.50,26.00,13,9,0.10,0.21,0.16,0.12,0.00,0.00,0,0, +1746044178176,19,2149,1059,598.41,2148.15,1076.90,17704,9709,-66.12,16,64,-37.27,113.55,15.50,27.00,13,6,0.09,0.07,0.16,0.12,0.00,0.00,0,0, +1746044179176,19,2137,1071,601.26,2160.46,1082.23,14825,9329,-66.19,16,5,-48.41,6.84,25.50,26.00,13,12,0.10,0.06,0.16,0.12,0.00,0.00,0,0, +1746044180176,19,2137,1083,704.53,2153.11,1092.46,9729,9619,-66.19,16,5,-48.41,6.84,25.50,27.00,13,12,0.12,0.16,0.16,0.12,0.00,0.00,0,0, +1746044181176,19,2137,1059,534.47,2148.29,1071.69,11730,9409,-66.25,16,5,-48.47,6.83,25.00,28.00,13,11,0.09,0.06,0.16,0.12,0.00,0.00,0,0, +1746044182176,19,2149,1071,614.45,2160.27,1083.04,10234,10039,-66.25,16,62,-37.53,109.43,16.00,27.00,13,13,0.10,0.07,0.16,0.12,0.00,0.00,0,0, +1746044183176,19,2137,1095,764.60,2148.27,1099.88,9783,9350,-66.12,16,53,-38.09,92.01,14.50,26.00,13,12,0.10,0.11,0.16,0.12,0.00,0.00,0,0, +1746044184176,19,2137,1071,651.18,2148.30,1081.98,10329,9317,-66.06,16,58,-37.64,101.81,14.50,28.00,13,12,0.11,0.11,0.16,0.12,0.00,0.00,0,0, +1746044185176,19,2149,1071,578.00,2160.31,1082.50,11728,9512,-66.12,16,5,-48.34,6.84,27.00,27.00,13,9,0.10,0.12,0.16,0.12,0.00,0.00,0,0, +1746044186176,19,2137,1071,694.82,2148.10,1088.42,12326,9865,-65.94,16,38,-39.35,63.68,26.00,27.00,13,12,0.09,0.04,0.16,0.12,0.00,0.00,0,0, +1746044187176,19,2137,1059,694.74,2148.13,1070.96,11267,9390,-65.94,16,5,-48.16,6.85,25.50,27.00,13,7,0.09,0.18,0.16,0.12,0.00,0.00,0,0, +1746044188176,19,2149,1071,607.86,2160.46,1082.25,18774,9767,-65.88,16,62,-37.16,109.91,15.00,27.00,13,6,0.09,0.06,0.16,0.12,0.00,0.00,0,0, +1746044189176,19,2137,1083,498.27,2148.31,1088.06,13447,9188,-65.88,16,5,-48.09,6.85,26.50,29.00,13,13,0.10,0.10,0.16,0.12,0.00,0.00,0,0, +1746044190176,19,2137,1083,579.75,2148.22,1093.99,12334,9689,-66.00,16,62,-37.28,109.75,15.50,26.00,13,10,0.11,0.07,0.16,0.12,0.00,0.00,0,0, +1746044191176,19,2149,1059,687.80,2160.21,1076.86,10922,9659,-65.94,16,5,-48.16,6.85,26.00,27.00,13,12,0.09,0.21,0.16,0.12,0.00,0.00,0,0, +1746044192176,19,2137,1071,652.95,2149.16,1250.36,12677,11219,-65.94,16,90,-35.60,166.68,8.00,26.00,7,9,0.39,0.08,0.16,0.12,0.00,0.00,0,0, +1746044193176,19,2137,1083,533.74,2147.79,1097.66,11581,34582,-66.00,7,106,-34.96,200.14,8.50,27.00,0,14,0.23,0.05,0.16,0.12,0.00,0.00,0,0, +1746044194176,19,2149,1083,688.60,2160.13,1101.00,12029,48769,-65.82,11,106,-34.77,200.63,8.50,24.00,0,9,0.08,0.10,0.16,0.12,0.00,0.00,0,0, +1746044195176,19,2137,1059,648.45,2148.10,1085.11,12090,35350,-65.82,11,66,-36.83,117.94,7.50,27.00,4,13,0.08,0.04,0.16,0.12,0.00,0.00,0,0, +1746044196176,19,2137,1083,508.10,2147.98,1092.11,11477,21557,-65.82,11,16,-42.99,24.50,25.50,30.00,4,9,0.15,0.12,0.16,0.12,0.00,0.00,0,0, +1746044197176,19,2149,1071,578.95,2160.00,1084.57,12586,27436,-66.00,4,106,-34.96,200.14,8.50,27.00,3,11,0.07,0.04,0.16,0.12,0.00,0.00,0,0, +1746044198176,19,2137,1071,617.48,2147.98,1093.45,10266,23915,-65.67,9,87,-35.48,161.02,9.00,26.00,3,12,0.16,0.08,0.16,0.12,0.00,0.00,0,0, +1746044199176,19,2137,1071,645.68,2147.59,1083.28,9922,31514,-65.67,9,93,-35.19,173.54,9.00,26.00,2,12,0.06,0.12,0.15,0.12,0.00,0.00,0,0, +1746044200176,19,2149,1071,603.80,2159.98,1086.34,12594,23493,-66.17,12,106,-35.12,199.70,10.00,26.00,4,9,0.09,0.08,0.15,0.12,0.00,0.00,0,0, +1746044201176,19,2137,1071,649.24,2148.10,1089.77,11859,21853,-66.17,12,106,-35.12,199.70,10.00,30.00,3,12,0.16,0.07,0.15,0.12,0.00,0.00,0,0, +1746044202176,19,2137,1071,729.95,2147.86,1078.41,10224,26938,-66.12,8,100,-35.33,187.15,9.00,28.00,3,12,0.05,0.11,0.15,0.12,0.00,0.00,0,0, +1746044203176,19,2149,1083,556.40,2160.07,1107.66,10245,22169,-66.00,9,16,-43.17,24.46,25.50,26.00,4,12,0.14,0.10,0.15,0.12,0.00,0.00,0,0, +1746044204176,19,2137,1059,766.37,2148.01,1067.97,10293,26417,-66.00,6,106,-34.96,200.14,9.00,27.00,3,12,0.07,0.12,0.15,0.12,0.00,0.00,0,0, +1746044205176,19,2137,1071,690.32,2148.19,1081.77,10372,22441,-66.00,6,5,-48.22,6.84,28.00,27.00,4,12,0.10,0.13,0.15,0.12,0.00,0.00,0,0, +1746044206176,19,2149,1083,606.41,2160.02,1097.25,10197,21135,-66.00,7,24,-41.41,38.26,26.00,27.00,4,12,0.15,0.10,0.15,0.12,0.00,0.00,0,0, +1746044207176,19,2137,1071,636.71,2148.20,1093.11,10390,26769,-66.00,8,106,-34.96,200.14,9.00,27.00,3,12,0.07,0.10,0.15,0.12,0.00,0.00,0,0, +1746044208176,19,2137,1059,604.43,2147.77,1066.21,10182,22797,-66.17,6,5,-48.39,6.84,26.50,26.00,4,12,0.06,0.08,0.15,0.12,0.00,0.00,0,0, +1746044209176,19,2149,1095,461.33,2159.92,1109.77,11450,21954,-66.00,6,5,-48.22,6.84,27.50,26.00,4,10,0.09,0.10,0.15,0.12,0.00,0.00,0,0, +1746044210176,19,2137,1071,553.62,2147.95,1086.82,11658,21245,-66.00,6,106,-34.96,200.14,9.50,28.00,4,13,0.07,0.07,0.15,0.12,0.00,0.00,0,0, +1746044211176,19,2137,1059,716.00,2148.14,1070.90,12663,20559,-66.50,8,5,-48.72,6.82,27.00,26.00,4,8,0.09,0.10,0.15,0.12,0.00,0.00,0,0, +1746044212176,19,2149,1083,754.10,2159.99,1108.32,13118,21736,-66.00,4,106,-34.96,200.14,9.00,27.00,4,12,0.08,0.04,0.15,0.12,0.00,0.00,0,0, +1746044213176,19,2137,1059,511.35,2148.06,1068.82,10428,21395,-66.17,6,106,-35.12,199.70,8.50,27.00,4,9,0.07,0.16,0.15,0.12,0.00,0.00,0,0, +1746044214176,19,2137,1083,700.05,2147.79,1092.19,12466,21325,-66.17,6,106,-35.12,199.70,9.00,27.00,4,9,0.06,0.05,0.15,0.12,0.00,0.00,0,0, +1746044215176,19,2149,1083,635.37,2159.84,1094.94,10171,21516,-65.71,7,106,-34.67,200.92,9.00,27.00,4,13,0.05,0.08,0.15,0.12,0.00,0.00,0,0, +1746044216176,19,2137,1071,519.95,2148.18,1094.06,9711,22812,-66.00,4,96,-35.39,179.06,9.00,26.00,3,13,0.10,0.12,0.15,0.12,0.00,0.00,0,0, +1746044217176,19,2137,1059,531.90,2148.00,1073.61,9410,25377,-66.00,3,66,-37.01,117.69,8.00,27.00,4,13,0.07,0.13,0.15,0.12,0.00,0.00,0,0, +1746044218176,19,2149,1083,667.59,2160.10,1087.60,9929,21625,-66.00,6,94,-35.48,174.87,8.50,27.00,4,10,0.09,0.17,0.15,0.12,0.00,0.00,0,0, +1746044219176,19,2137,1071,744.41,2148.12,1095.72,13006,22309,-66.00,6,106,-34.96,200.14,9.00,27.00,4,9,0.08,0.06,0.15,0.12,0.00,0.00,0,0, +1746044220176,19,2137,1059,702.05,2147.99,1062.00,10683,20837,-66.00,5,5,-48.22,6.84,26.50,26.00,4,13,0.06,0.10,0.15,0.12,0.00,0.00,0,0, +1746044221176,19,2149,1095,633.45,2159.84,1109.04,10688,21603,-66.00,6,106,-34.96,200.14,9.00,25.00,4,9,0.07,0.13,0.15,0.12,0.00,0.00,0,0, +1746044222176,19,2137,1059,613.57,2148.13,1078.20,12854,21671,-66.20,10,106,-35.16,199.61,9.50,25.00,4,10,0.08,0.05,0.15,0.12,0.00,0.00,0,0, +1746044223176,19,2137,1071,731.36,2147.90,1097.43,10077,20675,-66.00,3,106,-34.96,200.14,9.00,25.00,4,11,0.11,0.14,0.15,0.12,0.00,0.00,0,0, +1746044224176,19,2149,1083,597.27,2159.94,1079.46,11574,20821,-66.00,3,11,-44.79,16.21,26.50,28.00,4,11,0.13,0.05,0.15,0.12,0.00,0.00,0,0, +1746044225176,19,2137,1083,667.42,2147.86,1097.19,10290,21526,-66.00,4,60,-37.43,105.81,8.50,26.00,4,11,0.14,0.20,0.15,0.12,0.00,0.00,0,0, +1746044226176,19,2137,1047,772.21,2148.26,1061.49,13983,22321,-65.67,6,5,-47.89,6.86,26.50,27.00,2,8,0.15,0.08,0.15,0.12,0.00,0.00,0,0, +1746044227176,19,2149,1095,546.60,2159.94,1121.82,13127,32236,-65.88,8,68,-36.76,121.86,7.50,26.00,2,12,0.05,0.10,0.14,0.12,0.00,0.00,0,0, +1746044228176,19,2137,1047,739.76,2147.89,1069.56,10104,22527,-65.88,8,106,-34.83,200.48,10.50,25.00,4,12,0.07,0.09,0.14,0.12,0.00,0.00,0,0, +1746044229176,19,2137,1095,637.18,2148.18,1093.20,13024,20821,-66.00,3,106,-34.96,200.14,9.50,26.00,4,10,0.13,0.07,0.14,0.12,0.00,0.00,0,0, +1746044230176,19,2149,1071,840.05,2147.95,1084.58,11499,26137,-66.12,8,106,-35.08,199.81,9.00,27.00,3,12,0.08,0.20,0.14,0.12,0.00,0.00,0,0, +1746044231176,19,2137,1047,640.30,2160.09,1078.46,15838,23988,-65.90,10,106,-34.86,200.41,9.50,27.00,4,6,0.06,0.11,0.14,0.12,0.00,0.00,0,0, +1746044232176,19,2137,1095,683.67,2148.07,1102.91,17789,21408,-65.80,5,28,-40.54,45.45,25.00,27.00,4,8,0.08,0.04,0.14,0.12,0.00,0.00,0,0, +1746044233176,19,2149,1083,739.95,2159.69,1086.86,10360,20603,-65.80,5,43,-38.67,73.16,23.50,26.00,4,11,0.09,0.22,0.14,0.12,0.00,0.00,0,0, +1746044234176,19,2137,1059,562.71,2148.14,1090.63,15290,21521,-66.00,2,66,-37.01,117.69,7.50,32.00,4,7,0.12,0.09,0.14,0.12,0.00,0.00,0,0, +1746044235176,19,2137,1059,629.45,2148.10,1055.98,14755,21037,-66.00,6,5,-48.22,6.84,26.50,26.00,4,11,0.14,0.03,0.14,0.12,0.00,0.00,0,0, +1746044236176,19,2149,1095,555.05,2159.84,1109.30,10673,21683,-66.33,6,66,-37.35,117.23,7.00,28.00,4,8,0.12,0.24,0.14,0.12,0.00,0.00,0,0, +1746044237176,19,2137,1083,786.03,2153.08,1099.30,24306,20798,-66.33,6,106,-35.29,199.25,9.00,27.00,4,4,0.15,0.09,0.14,0.12,0.00,0.00,0,0, +1746044238176,19,2137,1059,669.17,2152.96,1081.33,23627,22061,-66.20,5,28,-40.94,45.28,25.50,27.00,4,8,0.11,0.04,0.14,0.12,0.00,0.00,0,0, +1746044239176,19,2149,1083,623.70,2159.86,1086.70,10203,21445,-66.00,6,106,-34.96,200.14,9.00,26.00,4,11,0.12,0.18,0.14,0.12,0.00,0.00,0,0, +1746044240176,19,2137,1071,664.11,2147.98,1092.11,12700,26128,-65.80,5,37,-39.33,61.91,24.50,26.00,3,10,0.08,0.06,0.14,0.12,0.00,0.00,0,0, +1746044241176,19,2137,1059,659.71,2147.86,1077.46,10251,24952,-66.00,9,66,-37.01,117.69,9.00,26.00,4,12,0.07,0.18,0.14,0.12,0.00,0.00,0,0, +1746044242176,19,2149,1083,580.68,2160.13,1087.97,15889,20941,-66.00,9,5,-48.22,6.84,25.50,26.00,4,6,0.10,0.11,0.14,0.12,0.00,0.00,0,0, +1746044243176,19,2137,1083,588.17,2148.46,1096.78,17816,21099,-66.00,7,106,-34.96,200.14,9.50,25.00,4,9,0.07,0.05,0.14,0.12,0.00,0.00,0,0, +1746044244176,19,2137,1047,612.20,2147.84,1060.46,10906,20471,-65.50,4,5,-47.72,6.86,26.50,27.00,4,10,0.06,0.14,0.14,0.12,0.00,0.00,0,0, +1746044245176,19,2149,1083,668.19,2160.10,1097.14,12855,21747,-65.25,4,106,-34.21,202.21,9.00,26.00,4,10,0.08,0.06,0.14,0.12,0.00,0.00,0,0, +1746044246176,19,2137,1059,448.95,2147.87,1097.34,10880,21545,-65.25,4,106,-34.21,202.21,8.50,29.00,4,11,0.10,0.13,0.14,0.12,0.00,0.00,0,0, +1746044247176,19,2137,1071,657.35,2147.83,1060.56,11323,21452,-65.50,2,5,-47.72,6.86,27.50,26.00,4,11,0.10,0.05,0.14,0.12,0.00,0.00,0,0, +1746044248176,19,2149,1083,563.35,2148.02,1104.06,12133,21361,-66.50,4,106,-35.46,198.81,9.00,27.00,4,9,0.08,0.10,0.14,0.12,0.00,0.00,0,0, +1746044249176,19,2137,1083,609.00,2160.05,1092.93,12710,21197,-66.14,7,31,-40.44,50.71,26.00,26.00,4,11,0.08,0.04,0.14,0.12,0.00,0.00,0,0, +1746044250176,19,2137,1083,681.27,2147.95,1096.18,9362,21314,-66.00,4,106,-34.96,200.14,9.50,28.00,4,12,0.08,0.16,0.14,0.12,0.00,0.00,0,0, +1746044251176,19,2149,1059,458.65,2160.23,1082.26,10564,21230,-66.00,4,13,-44.07,19.47,24.50,27.00,4,12,0.07,0.13,0.14,0.12,0.00,0.00,0,0, +1746044252176,19,2137,1071,546.84,2147.92,1083.92,11440,21766,-66.60,5,38,-40.01,63.25,24.50,27.00,4,11,0.09,0.07,0.14,0.12,0.00,0.00,0,0, +1746044253176,19,2137,1083,742.33,2148.13,1087.65,10824,21733,-66.00,3,94,-35.48,174.87,9.00,25.00,4,12,0.09,0.16,0.14,0.12,0.00,0.00,0,0, +1746044254176,19,2149,1071,585.67,2160.01,1086.14,11726,21102,-66.50,4,106,-35.46,198.81,9.00,27.00,4,11,0.09,0.06,0.14,0.12,0.00,0.00,0,0, +1746044255176,19,2137,1071,653.40,2147.74,1096.24,10260,22107,-66.00,8,66,-37.01,117.69,8.50,26.00,4,12,0.09,0.06,0.14,0.12,0.00,0.00,0,0, +1746044256176,19,2137,1083,649.14,2147.99,1089.84,11134,21751,-66.00,8,11,-44.79,16.21,25.00,27.00,4,11,0.06,0.09,0.14,0.12,0.00,0.00,0,0, +1746044257176,19,2149,1059,592.05,2148.17,1082.96,11385,20255,-65.89,9,27,-40.78,43.62,26.00,27.00,5,13,0.12,0.05,0.14,0.12,0.00,0.00,0,0, +1746044258176,19,2137,1071,728.62,2160.32,1076.35,13493,21043,-65.89,9,106,-34.84,200.44,9.50,27.00,4,6,0.07,0.14,0.14,0.12,0.00,0.00,0,0, +1746044259176,19,2137,1059,710.32,2148.23,1066.77,18412,20827,-65.67,12,5,-47.89,6.86,26.00,28.00,4,7,0.05,0.05,0.14,0.12,0.00,0.00,0,0, +1746044260176,19,2149,1095,579.65,2147.90,1109.06,11374,23254,-65.67,12,100,-34.87,188.29,8.50,27.00,3,12,0.10,0.08,0.14,0.12,0.00,0.00,0,0, +1746044261176,19,2137,1071,579.90,2160.02,1091.34,11467,24686,-66.00,10,106,-34.96,200.14,8.50,27.00,5,11,0.09,0.08,0.14,0.12,0.00,0.00,0,0, +1746044262176,19,2137,1071,658.25,2147.96,1086.78,10616,25670,-66.00,11,106,-34.96,200.14,9.00,26.00,3,12,0.07,0.10,0.14,0.12,0.00,0.00,0,0, +1746044263176,19,2149,1083,575.68,2147.74,1093.19,10734,22772,-66.27,11,28,-41.01,45.25,26.50,26.00,5,9,0.08,0.15,0.14,0.12,0.00,0.00,0,0, +1746044264176,19,2137,1071,537.37,2160.15,1096.07,12853,24864,-65.91,11,106,-34.86,200.39,8.50,24.00,3,9,0.08,0.05,0.14,0.12,0.00,0.00,0,0, +1746044265176,19,2137,1047,600.22,2148.10,1054.66,11254,24118,-65.91,11,5,-48.13,6.85,27.00,25.00,4,9,0.06,0.18,0.14,0.12,0.00,0.00,0,0, +1746044266176,19,2149,1083,632.77,2148.25,1097.61,14275,23472,-65.90,10,5,-48.12,6.85,26.50,25.00,2,8,0.12,0.07,0.14,0.12,0.00,0.00,0,0, +1746044267176,19,2137,1095,635.95,2159.94,1112.10,12366,31289,-66.22,9,106,-35.18,199.55,8.50,28.00,4,9,0.04,0.16,0.14,0.12,0.00,0.00,0,0, +1746044268176,19,2137,1059,532.77,2148.26,1080.10,12809,21838,-66.33,9,106,-35.29,199.25,9.00,28.00,3,9,0.11,0.06,0.14,0.12,0.00,0.00,0,0, +1746044269176,19,2137,1071,567.50,2148.11,1088.68,11313,25218,-66.33,9,106,-35.29,199.25,9.00,27.00,5,10,0.09,0.17,0.14,0.12,0.00,0.00,0,0, +1746044270176,19,2149,1083,566.81,2160.20,1097.90,12948,20645,-66.00,10,16,-43.17,24.46,26.00,26.00,4,9,0.10,0.07,0.14,0.12,0.00,0.00,0,0, +1746044271176,19,2137,1071,513.57,2147.83,1072.82,10501,21481,-66.00,7,94,-35.48,174.87,9.00,27.00,4,12,0.05,0.19,0.14,0.12,0.00,0.00,0,0, +1746044272176,19,2137,1059,609.30,2147.82,1073.44,14150,21110,-65.75,8,5,-47.97,6.85,26.00,27.00,2,7,0.16,0.09,0.14,0.12,0.00,0.00,0,0, +1746044273176,19,2149,1095,632.00,2160.13,1112.79,14459,32000,-66.15,13,93,-35.68,172.44,8.50,27.00,2,12,0.06,0.04,0.14,0.12,0.00,0.00,0,0, +1746044274176,19,2137,1059,757.05,2148.18,1080.95,9664,23823,-66.15,13,106,-35.11,199.73,9.00,25.00,3,13,0.12,0.11,0.14,0.12,0.00,0.00,0,0, +1746044275176,19,2137,1059,713.95,2148.08,1087.82,12748,26289,-66.00,10,106,-34.96,200.14,9.00,27.00,5,8,0.05,0.10,0.14,0.12,0.00,0.00,0,0, +1746044276176,19,2149,1095,591.60,2160.44,1088.08,14132,24098,-66.00,4,106,-34.96,200.14,8.50,27.00,3,10,0.08,0.04,0.14,0.12,0.00,0.00,0,0, +1746044277176,19,2137,1059,687.55,2148.02,1072.63,10756,22531,-66.40,10,5,-48.62,6.83,27.00,26.00,5,10,0.14,0.19,0.14,0.12,0.00,0.00,0,0, +1746044278176,19,2137,1071,660.89,2148.11,1088.04,14175,30157,-66.40,10,5,-48.62,6.83,26.00,28.00,2,8,0.08,0.08,0.13,0.12,0.00,0.00,0,0, +1746044279176,19,2149,1095,595.33,2160.20,1111.14,12733,27156,-66.27,11,106,-35.23,199.41,8.00,24.00,4,10,0.06,0.17,0.13,0.12,0.00,0.00,0,0, +1746044280176,19,2137,1059,568.86,2147.77,1080.55,12451,21718,-65.40,10,106,-34.36,201.79,8.00,26.00,3,9,0.12,0.06,0.13,0.12,0.00,0.00,0,0, +1746044281176,19,2137,1071,679.21,2148.02,1078.11,11192,25841,-66.10,10,64,-37.25,113.58,7.00,26.00,5,9,0.05,0.21,0.13,0.12,0.00,0.00,0,0, +1746044282176,19,2149,1083,604.25,2160.46,1096.21,18049,20393,-65.78,9,106,-34.73,200.74,8.50,27.00,4,6,0.11,0.08,0.13,0.12,0.00,0.00,0,0, +1746044283176,19,2137,1047,604.00,2148.17,1060.46,15469,21377,-65.78,9,5,-48.00,6.85,27.00,28.00,4,12,0.08,0.03,0.13,0.12,0.00,0.00,0,0, +1746044284176,19,2137,1083,520.10,2147.95,1096.74,10662,20111,-65.71,7,5,-47.93,6.85,27.00,28.00,3,9,0.16,0.15,0.13,0.12,0.00,0.00,0,0, +1746044285176,19,2149,1095,672.81,2160.20,1109.66,13000,28384,-66.00,6,100,-35.21,187.46,8.00,27.00,3,9,0.05,0.05,0.13,0.12,0.00,0.00,0,0, +1746044286176,19,2137,1071,688.55,2147.88,1091.10,10472,21925,-65.86,7,106,-34.81,200.53,8.50,27.00,5,12,0.07,0.10,0.13,0.12,0.00,0.00,0,0, +1746044287176,19,2137,1059,504.43,2147.97,1066.61,10325,23848,-65.80,10,100,-35.01,187.96,8.00,26.00,3,12,0.08,0.11,0.13,0.12,0.00,0.00,0,0, +1746044288176,19,2149,1059,586.60,2159.81,1104.14,11949,22528,-65.80,10,66,-36.81,117.97,7.00,28.00,4,9,0.16,0.09,0.13,0.12,0.00,0.00,0,0, +1746044289176,19,2137,1083,751.10,2147.91,1080.28,11943,30114,-66.20,10,106,-35.16,199.61,8.50,27.00,2,12,0.07,0.05,0.13,0.12,0.00,0.00,0,0, +1746044290176,19,2137,1083,611.89,2147.91,1088.44,12566,23845,-65.62,8,27,-40.52,43.73,25.50,28.00,4,8,0.17,0.11,0.13,0.12,0.00,0.00,0,0, +1746044291176,19,2149,1071,563.29,2160.36,1083.16,13957,27307,-65.70,10,94,-35.18,175.56,8.00,27.00,3,11,0.06,0.04,0.13,0.12,0.00,0.00,0,0, +1746044292176,19,2137,1083,701.52,2148.19,1100.90,12256,22651,-65.70,10,25,-40.93,40.13,25.00,27.00,3,10,0.12,0.09,0.13,0.12,0.00,0.00,0,0, +1746044293176,19,2137,1047,679.22,2147.89,1057.86,11228,26044,-65.91,11,5,-48.13,6.85,25.50,26.00,4,13,0.05,0.07,0.13,0.12,0.00,0.00,0,0, +1746044294176,19,2149,1095,524.67,2160.04,1109.09,10202,20709,-66.12,8,5,-48.34,6.84,27.00,27.00,4,11,0.11,0.13,0.13,0.12,0.00,0.00,0,0, +1746044295176,19,2137,1059,635.89,2147.82,1078.26,11562,21737,-66.00,7,106,-34.96,200.14,8.00,26.00,4,11,0.07,0.06,0.13,0.12,0.00,0.00,0,0, +1746044296176,19,2137,1083,692.50,2147.86,1099.55,10495,20770,-66.27,11,11,-45.07,16.18,25.50,27.00,3,12,0.13,0.10,0.13,0.12,0.00,0.00,0,0, +1746044297176,19,2149,1071,638.57,2160.04,1078.38,10130,26944,-66.27,11,94,-35.75,174.26,7.50,27.00,4,12,0.05,0.14,0.13,0.12,0.00,0.00,0,0, +1746044298176,19,2137,1059,594.29,2148.03,1079.90,10220,19995,-66.00,7,106,-34.96,200.14,8.50,27.00,4,12,0.10,0.12,0.13,0.12,0.00,0.00,0,0, +1746044299176,19,2137,1071,636.00,2147.82,1077.62,10168,20874,-65.75,8,5,-47.97,6.85,26.00,26.00,4,12,0.07,0.11,0.13,0.12,0.00,0.00,0,0, +1746044300176,19,2149,1095,739.55,2159.61,1109.53,9807,21319,-65.88,8,11,-44.67,16.22,25.50,27.00,3,12,0.13,0.10,0.13,0.12,0.00,0.00,0,0, +1746044301176,19,2137,1047,502.48,2147.96,1085.61,10129,27039,-65.88,8,106,-34.83,200.48,7.50,27.00,4,12,0.05,0.11,0.13,0.12,0.00,0.00,0,0, +1746044302176,19,2137,1083,623.25,2147.90,1073.47,11131,20662,-66.00,7,5,-48.22,6.84,27.50,25.00,4,11,0.10,0.08,0.13,0.12,0.00,0.00,0,0, +1746044303176,19,2149,1083,706.73,2159.94,1097.43,10221,21983,-65.83,6,66,-36.85,117.92,6.50,28.00,4,13,0.08,0.13,0.13,0.12,0.00,0.00,0,0, +1746044304176,19,2137,1059,593.82,2148.14,1079.97,14253,21621,-66.10,10,106,-35.06,199.87,8.00,27.00,4,7,0.06,0.10,0.13,0.12,0.00,0.00,0,0, +1746044305176,19,2137,1071,571.86,2148.00,1077.73,15551,21873,-65.67,6,5,-47.89,6.86,26.50,27.00,3,9,0.12,0.04,0.13,0.12,0.00,0.00,0,0, +1746044306176,19,2149,1095,484.62,2160.10,1109.60,11259,26790,-65.67,6,106,-34.62,201.05,8.00,27.00,4,10,0.05,0.14,0.13,0.12,0.00,0.00,0,0, +1746044307176,19,2137,1071,517.95,2148.02,1088.11,12706,20274,-65.80,10,11,-44.59,16.23,24.50,27.00,4,11,0.13,0.05,0.13,0.12,0.00,0.00,0,0, +1746044308176,19,2137,1059,605.55,2148.01,1069.13,11244,20714,-65.89,9,5,-48.11,6.85,25.00,26.00,4,10,0.08,0.12,0.13,0.12,0.00,0.00,0,0, +1746044309176,19,2149,1083,619.20,2159.77,1107.45,12708,24305,-66.25,4,81,-36.37,147.53,6.50,27.00,2,10,0.12,0.05,0.13,0.12,0.00,0.00,0,0, +1746044310176,19,2137,1083,564.14,2147.90,1090.62,11662,30483,-66.25,4,16,-43.42,24.41,25.50,26.00,4,7,0.04,0.16,0.13,0.12,0.00,0.00,0,0, +1746044311176,19,2137,1047,572.73,2147.97,1060.82,15966,23170,-65.50,8,5,-47.72,6.86,25.50,26.00,3,7,0.10,0.07,0.13,0.12,0.00,0.00,0,0, +1746044312176,19,2149,1083,596.16,2148.06,1104.90,12974,24341,-66.00,6,69,-36.82,123.68,6.50,27.00,5,13,0.14,0.05,0.13,0.12,0.00,0.00,0,0, +1746044313176,19,2137,1083,600.89,2159.84,1097.71,12673,32486,-66.25,4,15,-43.70,22.74,24.50,27.00,1,7,0.09,0.14,0.13,0.12,0.00,0.00,0,0, +1746044314176,19,2137,1071,675.61,2148.22,1086.85,15876,33794,-66.25,4,97,-35.59,180.56,7.50,26.00,5,8,0.04,0.05,0.13,0.12,0.00,0.00,0,0, +1746044315176,19,2149,1071,517.57,2159.70,1086.86,10459,26686,-66.25,4,93,-35.77,172.23,7.50,30.00,2,11,0.09,0.28,0.13,0.12,0.00,0.00,0,0, +1746044316176,19,2137,1047,890.86,2150.91,1067.84,18612,26610,-66.33,3,106,-35.29,199.25,8.00,27.00,5,5,0.11,0.11,0.13,0.12,0.00,0.00,0,0, +1746044317176,19,2137,1083,664.05,2153.70,1093.58,21035,25816,-66.60,5,5,-48.82,6.82,24.00,26.00,3,7,0.07,0.04,0.13,0.12,0.00,0.00,0,0, +1746044318176,19,2149,1095,699.55,2159.94,1112.97,11435,23017,-66.20,5,93,-35.72,172.34,7.00,27.00,2,10,0.17,0.20,0.13,0.12,0.00,0.00,0,0, +1746044319176,19,2137,1071,659.50,2148.27,1093.78,14216,40403,-65.88,8,15,-43.32,22.81,25.50,27.00,1,8,0.06,0.07,0.13,0.12,0.00,0.00,0,0, +1746044320176,19,2137,1059,665.55,2148.17,1070.92,13085,23912,-65.88,8,5,-48.09,6.85,26.00,27.00,4,12,0.17,0.09,0.13,0.12,0.00,0.00,0,0, +1746044321176,19,2149,1083,515.17,2148.14,1097.89,11119,26969,-65.44,9,94,-34.92,176.16,7.00,26.00,3,11,0.06,0.11,0.13,0.12,0.00,0.00,0,0, +1746044322176,19,2137,1083,575.40,2160.06,1097.82,11856,23094,-65.71,7,106,-34.67,200.92,7.50,26.00,3,11,0.12,0.05,0.13,0.12,0.00,0.00,0,0, +1746044323176,19,2137,1047,733.63,2147.86,1061.79,11217,25884,-65.67,6,5,-47.89,6.86,25.50,26.00,4,8,0.05,0.14,0.13,0.12,0.00,0.00,0,0, +1746044324176,19,2149,1083,536.84,2148.09,1096.71,13988,20158,-65.67,6,106,-34.62,201.05,8.00,27.00,4,9,0.09,0.05,0.13,0.12,0.00,0.00,0,0, +1746044325176,19,2137,1083,594.14,2159.85,1098.78,10250,20794,-65.33,3,106,-34.29,201.97,8.00,27.00,4,11,0.17,0.16,0.13,0.12,0.00,0.00,0,0, +1746044326176,19,2137,1059,742.32,2147.98,1074.98,11488,27067,-65.20,5,106,-34.16,202.35,7.50,26.00,3,11,0.06,0.06,0.13,0.12,0.00,0.00,0,0, +1746044327176,19,2149,1071,594.81,2160.12,1088.23,10928,21807,-65.50,4,106,-34.46,201.51,7.50,26.00,4,12,0.10,0.18,0.13,0.12,0.00,0.00,0,0, +1746044328176,19,2137,1071,698.52,2148.09,1081.84,15854,20433,-65.20,5,90,-34.87,168.30,6.50,26.00,4,6,0.16,0.11,0.13,0.12,0.00,0.00,0,0, +1746044329176,19,2137,1095,595.38,2148.26,1106.78,18525,21160,-65.20,5,106,-34.16,202.35,7.00,28.00,4,7,0.08,0.05,0.13,0.11,0.00,0.00,0,0, +1746044330176,19,2149,1059,603.86,2160.09,1071.70,10935,21078,-65.75,4,66,-36.76,118.04,5.50,27.00,4,13,0.06,0.12,0.13,0.11,0.00,0.00,0,0, +1746044331176,19,2137,1083,586.80,2147.93,1100.78,12568,20960,-65.67,3,74,-36.18,134.30,6.00,25.00,3,10,0.14,0.08,0.13,0.11,0.00,0.00,0,0, +1746044332176,19,2137,1059,785.19,2147.98,1073.96,11675,27426,-66.25,4,106,-35.21,199.47,7.00,26.00,3,12,0.05,0.06,0.13,0.11,0.00,0.00,0,0, +1746044333176,19,2149,1083,547.10,2159.85,1103.51,9999,23548,-66.25,4,81,-36.37,147.53,6.00,27.00,2,12,0.12,0.11,0.13,0.11,0.00,0.00,0,0, +1746044334176,19,2137,1071,604.35,2147.65,1085.46,10027,31324,-66.00,8,54,-37.88,94.08,9.00,27.00,4,12,0.04,0.12,0.12,0.12,0.00,0.00,0,0, +1746044335176,19,2137,1059,759.32,2148.19,1067.34,11940,23258,-66.29,7,5,-48.50,6.83,25.50,27.00,2,8,0.11,0.13,0.12,0.12,0.00,0.00,0,0, +1746044336176,19,2149,1095,544.55,2159.90,1113.59,14026,30538,-66.20,5,5,-48.42,6.84,26.00,27.00,4,9,0.04,0.05,0.12,0.11,0.00,0.00,0,0, +1746044337176,19,2137,1059,718.79,2147.83,1084.58,10619,24515,-65.33,6,106,-34.29,201.97,6.50,28.00,2,12,0.11,0.12,0.12,0.12,0.00,0.00,0,0, +1746044338176,19,2137,1083,571.43,2147.85,1095.06,12375,30320,-65.33,6,106,-34.29,201.97,6.50,27.00,5,10,0.04,0.08,0.12,0.11,0.00,0.00,0,0, +1746044339176,19,2149,1071,572.17,2148.19,1085.44,11473,22138,-65.67,6,100,-34.87,188.29,6.50,27.00,3,13,0.10,0.06,0.12,0.11,0.00,0.00,0,0, +1746044340176,19,2137,1071,575.05,2160.14,1088.07,11106,24289,-66.00,3,90,-35.67,166.55,6.00,27.00,5,10,0.09,0.12,0.12,0.12,0.00,0.00,0,0, +1746044341176,19,2137,1059,678.00,2147.92,1083.41,12426,26616,-65.40,5,106,-34.36,201.79,7.00,26.00,2,12,0.09,0.04,0.12,0.11,0.00,0.00,0,0, +1746044342176,19,2149,1071,679.14,2159.82,1106.79,10008,26884,-65.40,5,105,-34.40,199.64,7.00,27.00,5,12,0.09,0.10,0.12,0.12,0.00,0.00,0,0, +1746044343176,19,2137,1095,538.89,2148.06,1084.66,11395,24918,-65.50,6,106,-34.46,201.51,7.00,27.00,3,10,0.08,0.11,0.12,0.12,0.00,0.00,0,0, +1746044344176,19,2137,1059,640.36,2147.94,1087.36,12550,23110,-66.00,3,6,-47.43,8.35,26.00,27.00,5,11,0.15,0.05,0.12,0.11,0.00,0.00,0,0, +1746044345176,19,2149,1071,549.71,2147.64,1066.29,10449,27955,-65.67,3,5,-47.89,6.86,24.50,27.00,2,8,0.08,0.22,0.12,0.12,0.00,0.00,0,0, +1746044346176,19,2137,1095,841.46,2164.86,1110.83,20802,27058,-66.00,3,66,-37.01,117.69,5.50,27.00,4,5,0.05,0.08,0.12,0.11,0.00,0.00,0,0, +1746044347176,19,2137,1059,743.60,2151.28,1080.50,18730,22989,-66.00,3,106,-34.96,200.14,7.00,27.00,3,10,0.10,0.03,0.12,0.11,0.00,0.00,0,0, +1746044348176,19,2149,1071,494.41,2160.06,1082.08,10538,23955,-65.33,3,90,-35.00,168.00,6.00,30.00,5,12,0.09,0.08,0.12,0.11,0.00,0.00,0,0, +1746044349176,19,2137,1083,476.25,2147.90,1094.08,11406,24775,-66.00,2,106,-34.96,200.14,6.50,27.00,3,11,0.08,0.09,0.12,0.11,0.00,0.00,0,0, +1746044350176,19,2137,1059,701.73,2148.11,1081.28,11260,23243,-65.60,5,58,-37.17,102.35,10.50,30.00,4,12,0.18,0.09,0.12,0.11,0.00,0.00,0,0, +1746044351176,19,2149,1083,634.55,2147.62,1095.58,10038,30177,-66.00,6,93,-35.52,172.79,6.00,27.00,2,11,0.07,0.16,0.12,0.11,0.00,0.00,0,0, +1746044352176,19,2137,1083,556.10,2160.02,1095.36,12784,23273,-66.00,6,106,-34.96,200.14,6.50,30.00,4,10,0.15,0.07,0.12,0.11,0.00,0.00,0,0, +1746044353176,19,2137,1047,691.00,2148.03,1067.82,11339,20465,-66.00,5,106,-34.96,200.14,7.00,27.00,4,12,0.12,0.13,0.12,0.11,0.00,0.00,0,0, +1746044354176,19,2149,1083,521.82,2147.95,1092.43,11573,21017,-65.33,3,5,-47.55,6.87,26.50,26.00,4,10,0.09,0.10,0.12,0.11,0.00,0.00,0,0, +1746044355176,19,2137,1083,720.90,2160.02,1094.66,12607,20490,-66.00,1,106,-34.96,200.14,6.50,27.00,4,12,0.11,0.04,0.12,0.11,0.00,0.00,0,0, +1746044356176,19,2137,1047,733.00,2147.65,1061.42,9979,20287,-66.00,1,5,-48.22,6.84,25.00,27.00,4,12,0.13,0.09,0.12,0.11,0.00,0.00,0,0, +1746044357176,19,2149,1083,694.00,2148.12,1096.66,10171,20561,-66.00,1,5,-48.22,6.84,26.00,26.00,4,12,0.10,0.09,0.12,0.11,0.00,0.00,0,0, +1746044362176,19,2137,1059,645.77,2147.82,1063.62,10156,20429,-65.00,1,5,-47.22,6.88,24.50,27.00,4,12,0.10,0.12,0.12,0.12,0.00,0.00,0,0, +1746044378176,19,2137,1083,672.10,2148.27,1086.97,10573,21086,-65.00,2,5,-47.22,6.88,25.50,29.00,4,12,0.09,0.10,0.12,0.12,0.00,0.00,0,0, +1746044379176,19,2149,1083,712.36,2160.16,1103.63,12957,21103,-65.00,2,5,-47.22,6.88,26.00,30.00,4,8,0.12,0.11,0.12,0.12,0.00,0.00,0,0, +1746044380176,19,2137,1083,511.62,2148.02,1107.65,13772,25399,-65.00,1,96,-34.39,181.47,5.50,29.00,3,10,0.08,0.04,0.12,0.12,0.00,0.00,0,0, +1746044381176,19,2137,1059,655.71,2148.40,1079.24,10938,23872,-65.00,1,5,-47.22,6.88,26.00,29.00,4,10,0.09,0.16,0.12,0.12,0.00,0.00,0,0, +1746044426176,19,2137,1119,670.25,2147.38,1136.62,10178,20388,-65.50,2,5,-47.72,6.86,26.00,28.00,4,12,0.10,0.17,0.12,0.11,0.00,0.00,0,0, +1746044427176,19,2149,1059,435.87,2159.62,1071.55,11609,17841,-66.00,2,106,-34.96,200.14,5.50,27.00,4,11,0.14,0.08,0.12,0.11,0.00,0.00,0,0, +1746044430176,19,2154,1214,659.63,2152.40,1232.03,13449,20189,-65.25,4,5,-47.47,6.87,27.00,29.00,4,11,0.10,0.04,0.12,0.11,0.00,0.00,0,0, +1746044431176,19,2137,1047,669.58,2159.88,1060.99,9985,17550,-66.00,4,5,-48.22,6.84,26.00,26.00,4,11,0.10,0.15,0.12,0.11,0.00,0.00,0,0, +1746044432176,19,2137,1083,744.62,2147.66,1090.54,11577,18680,-66.00,4,106,-34.96,200.14,5.50,27.00,4,11,0.07,0.11,0.12,0.11,0.00,0.00,0,0, +1746044433176,19,2149,1059,635.58,2147.66,1073.57,11579,17415,-66.00,2,5,-48.22,6.84,27.00,27.00,4,11,0.09,0.05,0.12,0.11,0.00,0.00,0,0, +1746044434176,19,2137,1071,443.05,2159.58,1089.14,10546,18564,-66.00,2,106,-34.96,200.14,5.50,27.00,4,12,0.08,0.08,0.12,0.11,0.00,0.00,0,0, +1746044435176,19,2137,1059,705.48,2147.90,1093.72,10278,18068,-66.00,1,106,-34.96,200.14,5.50,30.00,4,12,0.09,0.10,0.12,0.11,0.00,0.00,0,0, +1746044436176,19,2149,1083,686.44,2147.59,1065.40,10170,17786,-66.00,1,5,-48.22,6.84,27.00,27.00,4,12,0.07,0.10,0.12,0.11,0.00,0.00,0,0, +1746044439176,19,2149,1071,594.74,2147.66,1109.05,11267,23370,-65.00,1,94,-34.48,177.22,5.00,28.00,5,11,0.09,0.08,0.12,0.11,0.00,0.00,0,0, +1746044445176,19,2149,1083,867.23,2155.38,1106.22,33164,18706,-65.00,1,106,-33.96,202.91,5.50,26.00,4,3,0.08,0.06,0.12,0.11,0.00,0.00,0,0, +1746044446176,19,2137,1071,477.15,2163.02,1083.34,21162,18080,-65.00,1,106,-33.96,202.91,5.50,27.00,4,11,0.06,0.02,0.12,0.11,0.00,0.00,0,0, +1746044447176,19,2137,1083,643.00,2147.44,1096.15,9327,16240,-65.00,3,106,-33.96,202.91,5.50,28.00,4,12,0.17,0.19,0.12,0.11,0.00,0.00,0,0, +1746044448176,19,2149,1071,783.47,2149.95,1085.41,17112,28580,-65.00,3,106,-33.96,202.91,5.50,25.00,2,5,0.07,0.12,0.12,0.11,0.00,0.00,0,0, +1746044449176,19,2137,1095,703.89,2165.88,1107.41,22065,19724,-66.00,1,5,-48.22,6.84,26.50,27.00,5,5,0.13,0.05,0.12,0.11,0.00,0.00,0,0, +1746044450176,19,2137,1047,644.87,2148.01,1061.48,12806,17794,-65.00,1,5,-47.22,6.88,25.00,27.00,4,13,0.07,0.06,0.12,0.11,0.00,0.00,0,0, +1746044451176,19,2137,1083,758.32,2148.73,1090.75,14459,18027,-65.00,3,5,-47.22,6.88,27.00,27.00,4,5,0.05,0.14,0.12,0.11,0.00,0.00,0,0, +1746044452176,19,2149,1083,804.97,2165.91,1105.22,22375,19042,-65.00,3,106,-33.96,202.91,5.50,26.00,3,5,0.11,0.06,0.12,0.11,0.00,0.00,0,0, +1746044453176,19,2137,1047,650.15,2148.31,1058.16,13999,19901,-65.00,2,5,-47.22,6.88,26.50,28.00,5,12,0.07,0.06,0.12,0.11,0.00,0.00,0,0, +1746044469176,19,2137,1035,697.14,2147.90,1041.82,12264,17851,-65.00,3,5,-47.22,6.88,26.00,28.00,4,6,0.08,0.17,0.12,0.11,0.00,0.00,0,0, +1746044470176,19,2149,1107,693.14,2165.87,1126.66,21945,18441,-65.00,3,106,-33.96,202.91,5.50,27.00,4,5,0.09,0.07,0.12,0.11,0.00,0.00,0,0, +1746044472176,19,2137,1059,743.48,2147.62,1058.73,11347,17680,-65.57,7,5,-47.79,6.86,28.50,27.00,4,7,0.11,0.19,0.12,0.11,0.00,0.00,0,0, +1746044473176,19,2149,1059,762.41,2165.27,1081.22,21480,18230,-65.60,5,5,-47.82,6.86,27.50,27.00,4,5,0.10,0.07,0.12,0.11,0.00,0.00,0,0, +1746044474176,19,2137,1095,723.41,2151.25,1107.44,18733,18213,-65.50,2,5,-47.72,6.86,26.50,27.00,4,10,0.09,0.04,0.12,0.11,0.00,0.00,0,0, +1746044475176,19,2137,1083,657.43,2147.50,1091.38,10350,18157,-65.50,2,106,-34.46,201.51,5.50,26.00,4,9,0.10,0.24,0.12,0.11,0.00,0.00,0,0, +1746044476176,19,2149,1083,799.42,2164.05,1102.49,20171,18468,-65.33,3,106,-34.29,201.97,5.50,26.00,4,5,0.08,0.09,0.12,0.11,0.00,0.00,0,0, +1746044477176,19,2137,1035,719.10,2152.08,1046.94,20620,17762,-65.40,5,5,-47.62,6.87,26.50,27.00,4,7,0.13,0.05,0.12,0.11,0.00,0.00,0,0, +1746044479176,19,2149,1071,735.30,2159.79,1077.10,15000,18417,-66.00,1,106,-34.96,200.14,5.50,27.00,4,7,0.11,0.09,0.12,0.11,0.00,0.00,0,0, +1746044480176,19,2137,1083,487.26,2147.81,1101.57,15217,17774,-66.00,1,106,-34.96,200.14,5.50,26.00,4,10,0.11,0.04,0.12,0.11,0.00,0.00,0,0, +1746044482176,19,2149,1095,607.09,2159.74,1098.13,11443,17805,-65.00,2,106,-33.96,202.91,5.50,27.00,4,11,0.09,0.06,0.12,0.11,0.00,0.00,0,0, +1746044485176,19,2149,1095,594.78,2159.62,1104.10,11575,18092,-65.50,2,5,-47.72,6.86,26.50,27.00,4,12,0.09,0.07,0.12,0.11,0.00,0.00,0,0, +1746044488176,19,2149,1071,585.95,2159.46,1092.34,10661,17851,-66.00,2,5,-48.22,6.84,26.50,27.00,4,13,0.10,0.20,0.12,0.11,0.00,0.00,0,0, +1746044489176,19,2137,1083,737.10,2147.82,1092.33,14050,18089,-66.00,2,5,-48.22,6.84,26.50,27.00,4,7,0.10,0.12,0.12,0.11,0.00,0.00,0,0, +1746044490176,19,2137,1083,558.18,2148.14,1102.51,16326,18316,-66.00,1,106,-34.96,200.14,6.00,28.00,4,7,0.12,0.05,0.12,0.11,0.00,0.00,0,0, +1746044494176,19,2149,1023,727.74,2159.59,1037.00,11116,12833,-66.00,8,5,-48.22,6.84,26.00,27.00,11,7,0.03,0.19,0.12,0.11,0.00,0.00,0,0, +1746044495176,19,2137,1083,828.36,2153.10,1092.59,21598,5364,-66.19,16,5,-48.41,6.84,26.00,25.00,20,5,0.05,0.07,0.12,0.11,0.00,0.00,0,0, +1746044496176,19,2137,1095,653.95,2148.99,1114.34,15170,4208,-66.12,16,5,-48.34,6.84,27.00,27.00,19,13,0.12,0.03,0.12,0.11,0.00,0.00,0,0, +1746044497176,19,2149,1083,550.68,2147.73,1093.92,11832,4582,-65.94,16,5,-48.16,6.85,25.50,30.00,18,9,0.12,0.09,0.12,0.11,0.00,0.00,0,0, +1746044498176,19,2137,1083,733.53,2159.77,1092.30,12264,4768,-65.94,16,106,-34.89,200.31,25.00,27.00,19,12,0.05,0.10,0.12,0.11,0.00,0.00,0,0, +1746044499176,19,2137,1035,580.52,2147.82,1040.81,12523,4245,-66.12,16,5,-48.34,6.84,26.00,26.00,18,10,0.13,0.07,0.12,0.11,0.00,0.00,0,0, +1746044500176,19,2149,1131,702.19,2159.74,1150.54,10428,4996,-66.06,16,5,-48.28,6.84,26.00,26.00,19,11,0.05,0.23,0.12,0.11,0.00,0.00,0,0, +1746044501176,19,2137,1035,611.05,2147.82,1036.47,15138,4300,-65.94,16,5,-48.16,6.85,26.00,27.00,19,7,0.14,0.08,0.12,0.11,0.00,0.00,0,0, +1746044502176,19,2137,1071,695.14,2147.86,1092.09,13776,4726,-65.94,16,5,-48.16,6.85,25.50,28.00,18,13,0.08,0.04,0.12,0.11,0.00,0.00,0,0, +1746044503176,19,2149,1083,682.91,2159.85,1092.74,11271,4556,-66.00,16,106,-34.96,200.14,25.50,27.00,19,7,0.19,0.16,0.12,0.11,0.00,0.00,0,0, +1746044504176,19,2137,1083,820.84,2147.79,1089.61,15863,4926,-65.88,16,5,-48.09,6.85,27.00,27.00,16,7,0.08,0.05,0.12,0.11,0.00,0.00,0,0, +1746044505176,19,2137,1023,804.10,2147.68,1037.96,11389,4783,-66.31,16,12,-44.73,17.79,26.00,27.00,19,12,0.08,0.11,0.12,0.11,0.00,0.00,0,0, +1746044506176,19,2149,1143,690.13,2159.60,1148.94,10130,4506,-66.00,16,5,-48.22,6.84,26.50,27.00,19,12,0.14,0.12,0.12,0.11,0.00,0.00,0,0, +1746044507176,19,2137,1023,564.39,2147.54,1033.95,9895,4425,-66.00,16,5,-48.22,6.84,25.50,26.00,18,12,0.09,0.13,0.12,0.11,0.00,0.00,0,0, +1746044508176,19,2137,1071,678.90,2147.68,1092.13,10079,4671,-65.88,16,5,-48.09,6.85,26.50,26.00,19,12,0.11,0.12,0.12,0.11,0.00,0.00,0,0, +1746044509176,19,2149,1083,573.14,2147.72,1094.26,10588,4512,-66.00,16,5,-48.22,6.84,28.00,27.00,19,10,0.13,0.17,0.12,0.11,0.00,0.00,0,0, +1746044510176,19,2137,1083,620.45,2159.91,1094.51,12782,4527,-65.88,16,5,-48.09,6.85,27.00,27.00,19,9,0.09,0.06,0.12,0.11,0.00,0.00,0,0, +1746044511176,19,2137,1083,802.57,2147.41,1094.30,10497,4511,-66.38,16,106,-35.33,199.14,25.50,28.00,19,11,0.11,0.33,0.12,0.11,0.00,0.00,0,0, +1746044512176,19,2149,1023,796.11,2160.03,1034.01,20166,4711,-66.38,16,5,-48.59,6.83,25.50,26.00,18,4,0.08,0.12,0.12,0.11,0.00,0.00,0,0, +1746044513176,19,2137,1143,757.04,2156.82,1151.86,26224,4653,-66.12,16,5,-48.34,6.84,26.00,27.00,19,6,0.07,0.04,0.12,0.11,0.00,0.00,0,0, +1746044514176,19,2137,1023,715.91,2147.68,1035.50,11663,4306,-65.94,16,5,-48.16,6.85,25.50,28.00,19,13,0.10,0.09,0.12,0.11,0.00,0.00,0,0, +1746044515176,19,2149,1083,489.43,2159.62,1093.40,10635,4674,-66.06,16,5,-48.28,6.84,26.50,27.00,18,8,0.09,0.21,0.12,0.11,0.00,0.00,0,0, +1746044516176,19,2137,1083,815.03,2152.66,1097.34,21006,4612,-66.06,16,104,-35.10,195.74,25.50,27.00,20,5,0.10,0.07,0.12,0.11,0.00,0.00,0,0, +1746044517176,19,2137,1083,649.75,2149.83,1096.14,16381,4639,-65.88,16,5,-48.09,6.85,26.50,27.00,18,12,0.08,0.03,0.12,0.11,0.00,0.00,0,0, +1746044518176,19,2149,1023,589.86,2170.84,1035.11,11476,4653,-66.06,16,5,-48.28,6.84,26.50,28.00,19,10,0.13,0.10,0.12,0.11,0.00,0.00,0,0, +1746044519176,19,2137,1083,610.05,2147.67,1092.24,11392,4456,-66.06,16,5,-48.28,6.84,26.50,27.00,18,13,0.09,0.06,0.12,0.11,0.00,0.00,0,0, +1746044520176,19,2137,1083,642.19,2147.66,1092.77,11890,4662,-66.00,16,5,-48.22,6.84,26.00,26.00,19,9,0.10,0.09,0.12,0.11,0.00,0.00,0,0, +1746044521176,19,2149,1083,721.85,2147.60,1093.39,11988,4643,-66.00,16,5,-48.22,6.84,26.00,27.00,18,11,0.10,0.16,0.12,0.11,0.00,0.00,0,0, +1746044522176,19,2137,1083,647.73,2159.71,1092.44,12655,4713,-66.25,16,106,-35.21,199.47,25.50,28.00,19,10,0.08,0.06,0.12,0.11,0.00,0.00,0,0, +1746044523176,19,2137,1071,728.00,2147.71,1089.87,10661,4517,-66.00,16,106,-34.96,200.14,26.00,27.00,19,10,0.15,0.17,0.12,0.11,0.00,0.00,0,0, +1746044524176,19,2149,1035,668.89,2147.76,1038.42,12688,4802,-66.00,16,5,-48.22,6.84,25.50,27.00,18,10,0.07,0.06,0.12,0.11,0.00,0.00,0,0, +1746044525176,19,2137,1083,475.21,2159.74,1093.44,10480,4370,-66.00,16,5,-48.22,6.84,26.50,28.00,19,12,0.12,0.07,0.12,0.11,0.00,0.00,0,0, +1746044526176,19,2137,1083,661.71,2147.84,1094.19,10245,4564,-65.88,16,5,-48.09,6.85,25.00,27.00,18,12,0.14,0.09,0.12,0.11,0.00,0.00,0,0, +1746044527176,19,2149,1071,549.38,2147.78,1091.52,10433,4812,-66.06,16,5,-48.28,6.84,26.50,27.00,18,12,0.05,0.11,0.12,0.11,0.00,0.00,0,0, +1746044528176,19,2137,1083,608.30,2159.94,1094.55,10431,4542,-65.69,16,5,-47.91,6.86,26.00,28.00,19,12,0.13,0.10,0.12,0.11,0.00,0.00,0,0, +1746044529176,19,2137,1083,642.82,2147.68,1095.10,10279,4539,-65.62,16,5,-47.84,6.86,26.50,27.00,19,12,0.09,0.12,0.12,0.11,0.00,0.00,0,0, +1746044530176,19,2149,1083,494.55,2159.94,1083.94,12473,4620,-65.62,16,106,-34.58,201.16,25.50,28.00,18,10,0.13,0.08,0.12,0.11,0.00,0.00,0,0, +1746044531176,19,2137,1083,770.41,2147.57,1102.04,10888,4724,-66.00,16,5,-48.22,6.84,27.00,27.00,19,13,0.06,0.08,0.12,0.11,0.00,0.00,0,0, +1746044532176,19,2137,1023,673.30,2158.70,1036.48,12406,4530,-66.06,16,5,-48.28,6.84,27.00,28.00,19,9,0.14,0.08,0.12,0.11,0.00,0.00,0,0, +1746044533176,19,2149,1083,619.86,2147.54,1092.70,11198,4479,-66.06,16,5,-48.28,6.84,25.50,25.00,18,13,0.09,0.12,0.12,0.11,0.00,0.00,0,0, +1746044534176,19,2137,1083,586.50,2159.84,1092.85,12939,4702,-66.06,16,5,-48.28,6.84,26.00,28.00,19,8,0.09,0.10,0.12,0.11,0.00,0.00,0,0, +1746044535176,19,2137,1083,638.27,2147.90,1094.83,13274,4526,-66.19,16,106,-35.14,199.64,26.00,27.00,19,12,0.08,0.03,0.12,0.11,0.00,0.00,0,0, +1746044536176,19,2149,1083,628.86,2147.75,1095.02,9960,4549,-66.12,16,5,-48.34,6.84,26.00,26.00,18,11,0.16,0.13,0.12,0.11,0.00,0.00,0,0, +1746044537176,19,2137,1023,534.81,2159.83,1032.85,11408,4555,-66.00,16,5,-48.22,6.84,25.50,27.00,18,12,0.05,0.05,0.12,0.11,0.00,0.00,0,0, +1746044538176,19,2137,1143,563.22,2147.76,1153.00,10351,4770,-65.94,16,5,-48.16,6.85,27.50,27.00,19,12,0.13,0.10,0.12,0.11,0.00,0.00,0,0, +1746044539176,19,2137,1023,589.42,2147.65,1033.85,12812,4474,-65.94,16,5,-48.16,6.85,25.50,26.00,18,8,0.08,0.09,0.12,0.11,0.00,0.00,0,0, +1746044540176,19,2149,1083,547.50,2159.98,1093.30,13078,4671,-66.19,16,5,-48.41,6.84,26.00,27.00,19,13,0.09,0.04,0.12,0.11,0.00,0.00,0,0, +1746044541176,19,2137,1083,747.60,2147.76,1093.25,13181,4527,-66.44,16,5,-48.66,6.83,27.50,27.00,19,7,0.09,0.12,0.12,0.11,0.00,0.00,0,0, +1746044542176,19,2137,1083,625.45,2148.02,1094.41,15414,4515,-66.12,16,12,-44.54,17.81,26.00,28.00,19,10,0.09,0.04,0.12,0.11,0.00,0.00,0,0, +1746044543176,19,2149,1083,579.70,2159.58,1094.86,10236,4522,-66.38,16,13,-44.44,19.41,25.00,27.00,19,9,0.10,0.26,0.12,0.11,0.00,0.00,0,0, +1746044544176,19,2137,1023,838.48,2152.21,1036.14,23006,4288,-66.38,16,5,-48.59,6.83,27.00,26.00,19,4,0.10,0.09,0.13,0.11,0.00,0.00,0,0, +1746044545176,19,2137,1083,654.73,2151.83,1093.86,22105,4512,-66.25,16,5,-48.47,6.83,27.50,27.00,19,9,0.09,0.03,0.13,0.11,0.00,0.00,0,0, +1746044546176,19,2149,1083,662.05,2159.65,1095.14,10768,4527,-66.38,16,5,-48.59,6.83,28.00,28.00,19,12,0.14,0.12,0.13,0.11,0.00,0.00,0,0, +1746044547176,19,2137,1083,618.18,2147.68,1092.51,10176,4697,-66.12,16,5,-48.34,6.84,26.00,27.00,18,12,0.09,0.11,0.13,0.11,0.00,0.00,0,0, +1746044548176,19,2137,1071,537.00,2147.46,1093.10,10045,4652,-66.12,16,5,-48.34,6.84,27.00,27.00,19,12,0.08,0.10,0.13,0.11,0.00,0.00,0,0, +1746044549176,19,2149,1083,509.52,2159.54,1094.33,10001,4502,-66.00,16,106,-34.96,200.14,25.00,28.00,19,12,0.11,0.10,0.13,0.11,0.00,0.00,0,0, +1746044550176,19,2137,1035,568.73,2147.74,1085.18,10420,4512,-66.00,16,12,-44.42,17.83,25.50,27.00,19,12,0.14,0.12,0.13,0.11,0.00,0.00,0,0, +1746044551176,19,2137,1083,466.48,2147.79,1054.00,10117,4628,-66.00,16,5,-48.22,6.84,27.00,25.00,18,12,0.06,0.12,0.13,0.11,0.00,0.00,0,0, +1746044552176,19,2149,1083,623.59,2159.82,1093.81,10409,4619,-66.00,16,5,-48.22,6.84,26.50,27.00,19,12,0.06,0.13,0.13,0.11,0.00,0.00,0,0, +1746044553176,19,2137,1095,728.00,2147.46,1107.69,9888,4411,-66.00,16,5,-48.22,6.84,27.50,28.00,20,12,0.13,0.14,0.13,0.11,0.00,0.00,0,0, +1746044554176,19,2137,1095,555.65,2147.41,1099.54,10944,4492,-66.00,16,5,-48.22,6.84,26.50,26.00,19,9,0.14,0.13,0.13,0.11,0.00,0.00,0,0, +1746044555176,19,2149,1023,616.11,2159.69,1036.20,12532,4291,-66.50,16,5,-48.72,6.82,27.50,27.00,19,11,0.15,0.04,0.13,0.11,0.00,0.00,0,0, +1746044556176,19,2137,1083,619.95,2147.26,1094.68,9796,4520,-66.31,16,5,-48.53,6.83,27.00,27.00,19,12,0.10,0.10,0.13,0.11,0.00,0.00,0,0, +1746044557176,19,2137,1083,736.55,2147.74,1095.50,11479,4534,-66.31,16,5,-48.53,6.83,27.50,27.00,19,11,0.12,0.08,0.13,0.11,0.00,0.00,0,0, +1746044558176,19,2149,1023,604.86,2159.91,1035.58,11156,4531,-66.25,16,5,-48.47,6.83,28.00,27.00,19,12,0.12,0.09,0.13,0.11,0.00,0.00,0,0, +1746044559176,19,2137,1143,610.48,2147.71,1151.97,9995,4652,-66.19,16,28,-40.92,45.29,26.50,28.00,18,12,0.10,0.07,0.13,0.11,0.00,0.00,0,0, +1746044560176,19,2137,1083,645.22,2147.69,1092.58,10293,4693,-66.06,16,5,-48.28,6.84,26.00,27.00,19,12,0.07,0.13,0.13,0.11,0.00,0.00,0,0, +1746044561176,19,2149,1023,610.87,2159.74,1035.03,10147,4325,-66.19,16,5,-48.41,6.84,26.00,28.00,18,12,0.13,0.11,0.13,0.11,0.00,0.00,0,0, +1746044562176,19,2137,1083,647.10,2147.68,1092.54,10171,4765,-66.19,16,5,-48.41,6.84,26.50,27.00,19,12,0.07,0.08,0.13,0.11,0.00,0.00,0,0, +1746044563176,19,2137,1083,590.85,2147.64,1093.82,10088,4592,-65.94,16,5,-48.16,6.85,25.50,28.00,18,12,0.13,0.08,0.13,0.11,0.00,0.00,0,0, +1746044564176,19,2149,1083,643.50,2159.73,1094.50,10395,4724,-66.00,16,5,-48.22,6.84,26.50,27.00,20,12,0.04,0.12,0.13,0.11,0.00,0.00,0,0, +1746044565176,19,2137,1083,597.32,2147.99,1104.00,11567,4476,-66.12,16,28,-40.86,45.31,26.50,27.00,18,11,0.13,0.07,0.13,0.11,0.00,0.00,0,0, +1746044566176,19,2137,1023,680.62,2147.56,1033.30,10154,4554,-66.12,16,5,-48.34,6.84,25.50,27.00,19,12,0.05,0.18,0.13,0.11,0.00,0.00,0,0, +1746044567176,19,2149,1095,522.10,2159.97,1098.04,13567,4504,-66.06,16,5,-48.28,6.84,26.50,28.00,18,8,0.12,0.09,0.13,0.11,0.00,0.00,0,0, +1746044568176,19,2137,1071,635.77,2147.54,1092.25,12786,4763,-66.19,16,5,-48.41,6.84,26.00,26.00,20,12,0.05,0.08,0.13,0.11,0.00,0.00,0,0, +1746044569176,19,2137,1083,595.71,2147.60,1091.74,12490,4653,-65.94,16,5,-48.16,6.85,26.50,27.00,16,10,0.11,0.07,0.13,0.11,0.00,0.00,0,0, +1746044570176,19,2149,1023,761.38,2159.69,1031.30,11235,4948,-66.31,16,5,-48.53,6.83,26.50,27.00,19,12,0.04,0.09,0.13,0.11,0.00,0.00,0,0, +1746044571176,19,2137,1083,479.86,2147.95,1094.75,10859,4294,-66.31,16,5,-48.53,6.83,26.50,28.00,19,11,0.12,0.12,0.13,0.11,0.00,0.00,0,0, +1746044572176,19,2137,1083,683.87,2147.50,1093.22,11069,4627,-66.06,16,5,-48.28,6.84,27.00,26.00,18,12,0.10,0.06,0.13,0.11,0.00,0.00,0,0, +1746044573176,19,2149,1083,595.91,2159.74,1092.87,10119,4697,-66.19,16,5,-48.41,6.84,26.50,28.00,19,12,0.09,0.07,0.13,0.11,0.00,0.00,0,0, +1746044574176,19,2137,1083,498.70,2147.36,1093.68,9886,4675,-66.00,16,5,-48.22,6.84,26.00,27.00,18,12,0.10,0.07,0.13,0.11,0.00,0.00,0,0, +1746044575176,19,2137,1071,597.60,2147.57,1092.50,10118,4704,-66.19,16,5,-48.41,6.84,27.00,28.00,19,12,0.09,0.08,0.13,0.11,0.00,0.00,0,0, +1746044576176,19,2149,1083,648.05,2159.58,1094.05,10139,4580,-66.19,16,5,-48.41,6.84,26.50,27.00,18,12,0.12,0.10,0.13,0.11,0.00,0.00,0,0, +1746044577176,19,2137,1083,709.50,2147.70,1091.09,10106,4756,-66.19,16,5,-48.41,6.84,26.00,27.00,19,12,0.05,0.09,0.13,0.11,0.00,0.00,0,0, +1746044578176,19,2137,1023,634.50,2147.74,1040.69,10373,4531,-66.06,16,13,-44.13,19.46,25.00,26.00,19,12,0.14,0.09,0.13,0.11,0.00,0.00,0,0, +1746044579176,19,2137,1083,615.75,2147.40,1086.47,9828,4570,-66.00,16,5,-48.22,6.84,28.00,27.00,18,12,0.06,0.08,0.13,0.11,0.00,0.00,0,0, +1746044580176,19,2137,1083,691.45,2147.74,1094.09,10308,4597,-66.00,16,5,-48.22,6.84,26.00,26.00,19,12,0.10,0.10,0.13,0.11,0.00,0.00,0,0, +1746044581176,19,2137,1083,600.78,2147.83,1094.19,10351,4548,-65.94,16,5,-48.16,6.85,27.00,26.00,18,12,0.14,0.10,0.13,0.11,0.00,0.00,0,0, +1746044582176,19,2149,1083,618.10,2147.56,1092.04,10032,4794,-66.00,16,5,-48.22,6.84,27.00,27.00,19,12,0.05,0.10,0.13,0.11,0.00,0.00,0,0, +1746044583176,19,2137,1083,538.84,2159.67,1099.18,10159,4558,-66.00,16,13,-44.07,19.47,25.00,27.00,19,12,0.11,0.10,0.13,0.11,0.00,0.00,0,0, +1746044584176,19,2137,1083,619.65,2147.64,1092.65,10044,4669,-65.75,16,28,-40.49,45.47,25.50,27.00,18,12,0.10,0.07,0.13,0.11,0.00,0.00,0,0, +1746044585176,19,2149,1023,669.74,2147.81,1034.86,10177,4474,-65.75,16,5,-47.97,6.85,27.50,27.00,19,12,0.10,0.09,0.13,0.11,0.00,0.00,0,0, +1746044586176,19,2137,1083,635.47,2159.70,1093.68,10049,4537,-65.94,16,5,-48.16,6.85,27.00,27.00,18,12,0.14,0.09,0.13,0.11,0.00,0.00,0,0, +1746044587176,19,2137,1083,555.30,2147.67,1091.90,10032,4810,-65.88,16,5,-48.09,6.85,26.00,28.00,19,12,0.05,0.08,0.13,0.11,0.00,0.00,0,0, +1746044588176,19,2149,1083,666.90,2159.41,1094.66,9867,4536,-66.00,16,5,-48.22,6.84,26.00,27.00,19,12,0.09,0.08,0.13,0.11,0.00,0.00,0,0, +1746044589176,19,2137,1083,573.24,2147.75,1095.83,10056,4519,-66.00,16,5,-48.22,6.84,26.50,27.00,19,12,0.07,0.11,0.13,0.11,0.00,0.00,0,0, +1746044590176,19,2137,1083,646.77,2147.91,1093.55,10315,4507,-66.19,16,5,-48.41,6.84,27.50,27.00,19,12,0.13,0.11,0.13,0.11,0.00,0.00,0,0, +1746044591176,19,2149,1023,549.00,2159.82,1034.50,10208,4652,-65.94,16,5,-48.16,6.85,26.50,27.00,18,11,0.10,0.15,0.13,0.11,0.00,0.00,0,0, +1746044592176,19,2137,1131,533.73,2147.84,1151.44,11593,4690,-65.75,16,5,-47.97,6.85,26.50,28.00,19,11,0.06,0.05,0.13,0.11,0.00,0.00,0,0, +1746044593176,19,2137,1023,599.45,2147.55,1035.61,10369,4310,-65.88,16,5,-48.09,6.85,27.50,28.00,19,12,0.10,0.11,0.13,0.11,0.00,0.00,0,0, +1746044594176,19,2137,1083,580.83,2147.54,1092.87,9718,4645,-65.88,16,5,-48.09,6.85,27.50,27.00,18,12,0.10,0.08,0.13,0.11,0.00,0.00,0,0, +1746044595176,19,2149,1083,662.80,2159.78,1092.10,10215,4732,-65.94,16,5,-48.16,6.85,25.50,27.00,19,12,0.08,0.07,0.13,0.11,0.00,0.00,0,0, +1746044596176,19,2137,1083,668.59,2147.74,1094.40,10145,4521,-66.00,16,13,-44.07,19.47,25.00,28.00,19,12,0.12,0.09,0.13,0.11,0.00,0.00,0,0, +1746044597176,19,2149,1023,521.00,2159.77,1035.45,10483,4606,-66.00,16,5,-48.22,6.84,27.00,27.00,18,12,0.11,0.10,0.13,0.11,0.00,0.00,0,0, +1746044598176,19,2137,1083,661.81,2147.92,1091.74,11333,4525,-66.00,16,5,-48.22,6.84,27.00,27.00,19,11,0.06,0.08,0.13,0.11,0.00,0.00,0,0, +1746044599176,19,2137,1083,619.64,2147.57,1094.37,10826,4512,-66.19,16,5,-48.41,6.84,27.00,26.00,19,12,0.15,0.06,0.13,0.11,0.00,0.00,0,0, +1746044600176,19,2149,1083,577.40,2147.51,1092.18,9962,4748,-66.38,16,5,-48.59,6.83,26.50,26.00,18,12,0.08,0.09,0.13,0.11,0.00,0.00,0,0, +1746044601176,19,2137,1083,639.15,2159.73,1142.01,10157,4855,-66.19,16,13,-44.26,19.44,25.00,28.00,19,12,0.13,0.11,0.13,0.11,0.00,0.00,0,0, +1746044602176,19,2137,1083,690.85,2147.77,1044.78,10424,4395,-66.12,16,5,-48.34,6.84,27.00,27.00,18,12,0.12,0.13,0.13,0.12,0.00,0.00,0,0, +1746044603176,19,2149,1071,609.50,2147.71,1092.22,10175,4722,-66.12,16,12,-44.54,17.81,26.50,27.00,19,12,0.08,0.13,0.13,0.12,0.00,0.00,0,0, +1746044604176,19,2137,1083,645.60,2159.74,1093.84,10153,4522,-66.06,16,5,-48.28,6.84,27.00,26.00,19,12,0.09,0.13,0.13,0.12,0.00,0.00,0,0, +1746044605176,19,2137,1023,760.68,2147.66,1035.34,10505,4297,-66.12,16,5,-48.34,6.84,26.00,27.00,19,11,0.15,0.11,0.13,0.12,0.00,0.00,0,0, +1746044606176,19,2149,1083,614.06,2147.60,1091.50,11561,4779,-66.12,16,5,-48.34,6.84,27.00,27.00,18,11,0.06,0.14,0.13,0.12,0.00,0.00,0,0, +1746044607176,19,2137,1095,562.05,2159.75,1100.53,11411,4452,-66.19,16,104,-35.23,195.41,25.50,26.00,20,12,0.14,0.05,0.13,0.12,0.00,0.00,0,0, +1746044608176,19,2137,1071,623.41,2147.81,1089.99,10096,4890,-66.19,16,5,-48.41,6.84,27.00,26.00,17,10,0.07,0.14,0.13,0.12,0.00,0.00,0,0, +1746044609176,19,2137,1035,633.65,2147.75,1038.80,12736,4596,-65.94,16,104,-34.98,196.07,25.50,27.00,20,11,0.14,0.05,0.13,0.12,0.00,0.00,0,0, +1746044610176,19,2149,1083,599.11,2170.66,1094.30,9643,4277,-66.06,16,5,-48.28,6.84,26.50,27.00,19,12,0.14,0.21,0.13,0.12,0.00,0.00,0,0, +1746044611176,19,2137,1071,629.76,2147.77,1089.70,13356,5078,-66.06,16,5,-48.28,6.84,26.50,27.00,17,8,0.09,0.08,0.13,0.12,0.00,0.00,0,0, +1746044612176,19,2149,1083,571.55,2148.01,1091.58,12648,4553,-66.06,16,5,-48.28,6.84,25.50,27.00,19,12,0.08,0.13,0.13,0.12,0.00,0.00,0,0, +1746044613176,19,2137,1083,477.79,2159.81,1094.80,10426,4554,-66.12,16,5,-48.34,6.84,26.50,27.00,18,11,0.14,0.19,0.13,0.12,0.00,0.00,0,0, +1746044614176,19,2137,1083,606.68,2147.66,1091.35,12590,4802,-66.12,16,5,-48.34,6.84,27.00,28.00,18,9,0.06,0.07,0.13,0.12,0.00,0.00,0,0, +1746044615176,19,2149,1083,691.83,2147.90,1095.24,11302,4565,-66.06,16,27,-40.96,43.55,25.50,27.00,18,12,0.13,0.15,0.13,0.12,0.00,0.00,0,0, +1746044616176,19,2137,1083,749.10,2159.77,1091.34,12563,4757,-65.94,16,106,-34.89,200.31,26.00,27.00,19,10,0.05,0.07,0.13,0.12,0.00,0.00,0,0, +1746044617176,19,2137,1023,679.55,2147.39,1079.74,10060,4506,-65.94,16,106,-34.89,200.31,25.50,28.00,19,11,0.10,0.22,0.13,0.12,0.00,0.00,0,0, +1746044618176,19,2137,1083,569.18,2147.64,1049.23,13559,4644,-66.19,16,5,-48.41,6.84,26.50,26.00,18,8,0.10,0.08,0.13,0.12,0.00,0.00,0,0, +1746044619176,19,2149,1071,611.00,2159.82,1092.30,12071,4471,-66.19,16,5,-48.41,6.84,27.00,27.00,19,14,0.07,0.05,0.13,0.12,0.00,0.00,0,0, +1746044620176,19,2137,1083,526.09,2147.46,1093.71,11362,4624,-66.00,16,5,-48.22,6.84,26.00,28.00,18,9,0.11,0.10,0.13,0.12,0.00,0.00,0,0, +1746044621176,19,2137,1083,502.05,2147.74,1092.63,12001,4731,-66.00,16,5,-48.22,6.84,26.00,27.00,19,13,0.08,0.05,0.13,0.11,0.00,0.00,0,0, +1746044622176,19,2149,1083,624.45,2159.73,1094.66,10743,4523,-65.88,16,5,-48.09,6.85,25.50,27.00,18,8,0.16,0.16,0.13,0.12,0.00,0.00,0,0, +1746044623176,19,2137,1083,665.23,2147.95,1091.52,14171,4798,-65.94,16,5,-48.16,6.85,25.50,28.00,18,8,0.06,0.06,0.13,0.11,0.00,0.00,0,0, +1746044624176,19,2137,1083,740.32,2147.66,1094.20,10566,4526,-66.12,16,5,-48.34,6.84,27.00,26.00,19,11,0.11,0.21,0.13,0.12,0.00,0.00,0,0, +1746044625176,19,2149,1023,662.60,2159.98,1035.83,13910,4305,-66.19,16,5,-48.41,6.84,26.00,27.00,19,8,0.13,0.07,0.13,0.11,0.00,0.00,0,0, +1746044626176,19,2137,1083,617.04,2147.80,1095.26,12009,4544,-66.19,16,5,-48.41,6.84,26.00,29.00,19,12,0.09,0.22,0.13,0.12,0.00,0.00,0,0, +1746044627176,19,2137,1083,670.09,2147.85,1095.53,15503,4514,-66.31,16,5,-48.53,6.83,26.00,28.00,19,6,0.09,0.10,0.13,0.11,0.00,0.00,0,0, +1746044628176,19,2149,1083,583.55,2159.69,1090.14,17176,4738,-66.31,16,5,-48.53,6.83,27.50,27.00,16,9,0.11,0.04,0.13,0.11,0.00,0.00,0,0, +1746044629176,19,2137,1071,786.41,2147.81,1088.82,10222,4967,-66.00,16,5,-48.22,6.84,26.00,27.00,19,12,0.04,0.19,0.13,0.11,0.00,0.00,0,0, +1746044630176,19,2137,1023,770.00,2150.22,1041.30,17376,4535,-66.00,16,12,-44.42,17.83,25.50,28.00,19,5,0.11,0.11,0.13,0.11,0.00,0.00,0,0, +1746044631176,19,2149,1083,462.76,2164.11,1089.30,20268,4525,-66.12,16,5,-48.34,6.84,26.00,27.00,19,8,0.15,0.04,0.13,0.11,0.00,0.00,0,0, +1746044632176,19,2137,1083,715.10,2147.64,1092.23,10613,4535,-65.94,16,5,-48.16,6.85,26.00,27.00,18,11,0.07,0.21,0.13,0.11,0.00,0.00,0,0, +1746044633176,19,2137,1083,759.35,2148.08,1093.45,13975,4577,-65.94,16,5,-48.16,6.85,27.50,28.00,19,8,0.14,0.07,0.13,0.11,0.00,0.00,0,0, +1746044634176,19,2149,1083,600.20,2159.94,1092.73,12186,4718,-66.00,16,5,-48.22,6.84,26.50,27.00,18,12,0.08,0.07,0.13,0.11,0.00,0.00,0,0, +1746044635176,19,2137,1083,684.95,2147.58,1093.18,10132,4656,-66.00,16,12,-44.42,17.83,25.00,27.00,19,12,0.10,0.09,0.13,0.11,0.00,0.00,0,0, +1746044636176,19,2137,1083,565.25,2147.76,1093.43,10411,4687,-65.94,16,5,-48.16,6.85,26.50,28.00,18,12,0.10,0.13,0.13,0.11,0.00,0.00,0,0, +1746044637176,19,2149,1023,569.40,2159.71,1034.16,10259,4713,-66.06,16,5,-48.28,6.84,26.00,27.00,19,12,0.10,0.10,0.13,0.11,0.00,0.00,0,0, +1746044638176,19,2137,1131,603.23,2147.74,1151.92,10243,4692,-66.00,16,28,-40.74,45.36,26.00,27.00,18,12,0.10,0.09,0.13,0.11,0.00,0.00,0,0, +1746044639176,19,2137,1023,699.45,2147.83,1033.94,10253,4466,-66.00,16,5,-48.22,6.84,26.00,28.00,19,12,0.10,0.13,0.13,0.11,0.00,0.00,0,0, +1746044640176,19,2149,1083,659.33,2165.37,1092.76,10353,4642,-66.00,16,5,-48.22,6.84,26.50,28.00,18,11,0.10,0.18,0.13,0.12,0.00,0.00,0,0, +1746044641176,19,2137,1083,644.14,2147.76,1092.68,12653,4734,-66.19,16,5,-48.41,6.84,27.00,26.00,19,9,0.07,0.07,0.13,0.11,0.00,0.00,0,0, +1746044642176,19,2137,1083,654.95,2147.74,1093.78,11367,4608,-65.88,16,5,-48.09,6.85,26.50,32.00,18,11,0.11,0.23,0.13,0.12,0.00,0.00,0,0, +1746044643176,19,2149,1023,713.73,2159.99,1033.69,15283,4749,-66.06,16,5,-48.28,6.84,26.50,28.00,19,7,0.08,0.08,0.13,0.11,0.00,0.00,0,0, +1746044644176,19,2137,1143,660.00,2147.76,1152.11,13569,4664,-66.06,16,28,-40.80,45.34,26.50,27.00,18,13,0.11,0.04,0.13,0.11,0.00,0.00,0,0, +1746044645176,19,2137,1023,633.15,2147.78,1033.82,11177,4516,-65.75,16,5,-47.97,6.85,26.50,27.00,19,8,0.08,0.15,0.13,0.11,0.00,0.00,0,0, +1746044646176,19,2149,1083,619.15,2159.62,1092.88,13967,4709,-65.81,16,5,-48.03,6.85,24.50,27.00,18,8,0.08,0.05,0.13,0.11,0.00,0.00,0,0, +1746044647176,19,2137,1071,556.71,2147.74,1093.29,10899,4643,-66.06,16,5,-48.28,6.84,25.00,27.00,19,12,0.12,0.12,0.13,0.11,0.00,0.00,0,0, +1746044648176,19,2137,1083,817.43,2148.05,1092.22,12785,4718,-65.81,16,5,-48.03,6.85,26.50,29.00,18,8,0.08,0.11,0.13,0.11,0.00,0.00,0,0, +1746044649176,19,2149,1083,576.45,2159.54,1094.01,13357,4637,-65.81,16,5,-48.03,6.85,25.50,28.00,19,11,0.07,0.04,0.13,0.11,0.00,0.00,0,0, +1746044650176,19,2137,1083,585.70,2147.61,1094.25,10628,4526,-66.00,16,13,-44.07,19.47,25.00,27.00,19,11,0.08,0.09,0.13,0.11,0.00,0.00,0,0, +1746044651176,19,2137,1071,668.83,2147.54,1083.22,10726,4625,-66.06,16,106,-35.02,199.97,25.50,27.00,18,13,0.11,0.13,0.13,0.11,0.00,0.00,0,0, +1746044652176,19,2149,1035,664.22,2159.79,1043.82,12472,4518,-65.81,16,5,-48.03,6.85,26.00,27.00,19,10,0.08,0.08,0.13,0.11,0.00,0.00,0,0, +1746044653176,19,2137,1083,579.50,2147.61,1093.74,10553,4578,-65.81,16,5,-48.03,6.85,26.50,30.00,18,13,0.13,0.09,0.13,0.11,0.00,0.00,0,0, +1746044654176,19,2137,1083,638.75,2147.77,1091.45,11941,4772,-65.94,16,5,-48.16,6.85,26.50,26.00,19,6,0.06,0.18,0.13,0.11,0.00,0.00,0,0, +1746044655176,19,2149,1035,770.84,2165.74,1101.55,21978,4476,-66.19,16,12,-44.60,17.81,25.50,27.00,19,5,0.18,0.06,0.13,0.11,0.00,0.00,0,0, +1746044656176,19,2137,1083,538.48,2149.02,1040.34,15051,4684,-65.94,16,5,-48.16,6.85,27.00,27.00,16,13,0.07,0.03,0.13,0.11,0.00,0.00,0,0, +1746044657176,19,2137,1131,630.95,2147.55,1148.94,11743,4941,-66.06,16,5,-48.28,6.84,26.50,26.00,18,7,0.19,0.14,0.13,0.11,0.00,0.00,0,0, +1746044658176,19,2149,1023,617.76,2159.96,1030.43,16113,4718,-66.06,16,5,-48.28,6.84,25.50,27.00,16,8,0.07,0.05,0.13,0.11,0.00,0.00,0,0, +1746044659176,19,2137,1083,582.33,2147.83,1092.22,12414,4632,-65.94,16,5,-48.16,6.85,26.00,28.00,18,8,0.18,0.14,0.13,0.11,0.00,0.00,0,0, +1746044660176,19,2137,1071,675.13,2148.07,1089.24,14157,4952,-66.12,16,5,-48.34,6.84,26.50,26.00,17,9,0.07,0.05,0.13,0.11,0.00,0.00,0,0, +1746044661176,19,2149,1083,735.14,2159.77,1092.82,10807,4691,-66.12,16,5,-48.34,6.84,27.00,28.00,19,12,0.10,0.11,0.13,0.11,0.00,0.00,0,0, +1746044662176,19,2137,1083,539.95,2147.75,1093.11,11309,4589,-66.12,16,5,-48.34,6.84,27.00,29.00,18,10,0.17,0.12,0.13,0.11,0.00,0.00,0,0, +1746044663176,19,2137,1083,582.40,2147.75,1089.73,12469,4936,-65.94,16,5,-48.16,6.85,27.00,27.00,17,12,0.07,0.04,0.13,0.11,0.00,0.00,0,0, +1746044664176,19,2149,1023,673.33,2159.94,1084.03,9548,4625,-66.00,16,13,-44.07,19.47,26.00,27.00,19,12,0.11,0.21,0.13,0.11,0.00,0.00,0,0, +1746044665176,19,2137,1131,611.74,2147.91,1100.33,13378,4846,-66.06,16,5,-48.28,6.84,26.00,26.00,16,8,0.09,0.09,0.13,0.11,0.00,0.00,0,0, +1746044666176,19,2137,1023,656.53,2147.66,1031.62,12792,4818,-66.44,16,5,-48.66,6.83,26.50,26.00,19,12,0.08,0.10,0.13,0.11,0.00,0.00,0,0, +1746044667176,19,2149,1083,658.10,2159.98,1091.11,11142,4480,-66.44,16,5,-48.66,6.83,26.50,27.00,18,9,0.08,0.16,0.13,0.11,0.00,0.00,0,0, +1746044668176,19,2137,1083,605.73,2147.74,1099.82,12632,4666,-66.12,16,5,-48.34,6.84,27.00,26.00,19,9,0.19,0.06,0.13,0.11,0.00,0.00,0,0, +1746044669176,19,2137,1083,698.17,2147.70,1089.35,11418,4946,-65.94,16,5,-48.16,6.85,27.00,27.00,16,9,0.08,0.22,0.13,0.11,0.00,0.00,0,0, +1746044670176,19,2149,1083,568.43,2159.94,1091.90,17858,4787,-66.12,16,5,-48.34,6.84,25.00,27.00,19,6,0.11,0.08,0.13,0.11,0.00,0.00,0,0, +1746044671176,19,2137,1071,681.29,2147.98,1093.79,15242,4538,-65.94,16,5,-48.16,6.85,26.00,27.00,18,12,0.16,0.03,0.13,0.11,0.00,0.00,0,0, +1746044672176,19,2137,1083,680.91,2147.74,1091.93,11256,4801,-65.94,16,5,-48.16,6.85,26.00,31.00,18,7,0.06,0.17,0.13,0.11,0.00,0.00,0,0, +1746044673176,19,2149,1035,604.86,2159.86,1042.82,18547,4313,-66.06,16,5,-48.28,6.84,27.00,28.00,17,6,0.21,0.06,0.13,0.11,0.00,0.00,0,0, +1746044674176,19,2137,1071,570.62,2147.62,1082.16,13780,5345,-66.00,16,5,-48.22,6.84,26.00,30.00,14,11,0.08,0.18,0.13,0.11,0.00,0.00,0,0, +1746044675176,19,2137,1071,594.95,2147.39,1085.50,12357,5096,-66.06,16,5,-48.28,6.84,25.00,27.00,19,10,0.07,0.06,0.13,0.11,0.00,0.00,0,0, +1746044676176,19,2149,1083,603.83,2147.78,1089.31,10757,4892,-66.06,16,5,-48.28,6.84,27.00,27.00,15,11,0.13,0.25,0.13,0.11,0.00,0.00,0,0, +1746044677176,19,2137,1071,494.40,2160.04,1088.34,16664,5178,-66.44,16,5,-48.66,6.83,24.00,25.00,16,6,0.05,0.09,0.13,0.11,0.00,0.00,0,0, +1746044678176,19,2137,1083,818.25,2147.68,1093.32,16020,4855,-66.19,16,106,-35.14,199.64,25.50,26.00,19,11,0.12,0.03,0.13,0.11,0.00,0.00,0,0, +1746044679176,19,2149,1023,686.60,2147.76,1041.54,9596,4322,-65.81,16,5,-48.03,6.85,25.50,28.00,19,12,0.09,0.13,0.13,0.11,0.00,0.00,0,0, +1746044680176,19,2137,1143,603.39,2159.68,1145.69,11945,4656,-66.00,16,5,-48.22,6.84,25.00,28.00,17,10,0.15,0.08,0.13,0.11,0.00,0.00,0,0, +1746044681176,19,2137,1083,786.81,2147.64,1088.86,10940,4977,-66.00,16,5,-48.22,6.84,26.50,29.00,17,13,0.05,0.07,0.13,0.11,0.00,0.00,0,0, +1746044682176,19,2149,1023,574.48,2147.91,1034.70,13178,4647,-66.00,16,5,-48.22,6.84,27.00,30.00,16,6,0.15,0.15,0.13,0.11,0.00,0.00,0,0, +1746044683176,19,2137,1071,670.65,2160.10,1089.35,18792,4716,-66.38,16,5,-48.59,6.83,26.00,29.00,16,6,0.05,0.05,0.13,0.11,0.00,0.00,0,0, +1746044684176,19,2137,1131,674.55,2147.90,1137.59,11815,4816,-65.88,16,5,-48.09,6.85,26.00,29.00,19,13,0.13,0.09,0.13,0.11,0.00,0.00,0,0, +1746044685176,19,2149,1083,614.70,2159.98,1095.40,13241,4526,-65.88,16,5,-48.09,6.85,26.50,30.00,19,6,0.15,0.14,0.13,0.11,0.00,0.00,0,0, +1746044686176,19,2137,1023,643.35,2147.91,1033.42,18385,4562,-65.81,16,5,-48.03,6.85,26.00,31.00,18,7,0.06,0.05,0.13,0.11,0.00,0.00,0,0, +1746044687176,19,2137,1083,645.59,2147.67,1096.34,11211,4485,-66.06,16,5,-48.28,6.84,26.00,30.00,19,12,0.13,0.10,0.13,0.11,0.00,0.00,0,0, +1746044688176,19,2149,1023,494.53,2147.36,1084.94,9946,4534,-66.19,16,12,-44.60,17.81,25.00,31.00,19,12,0.12,0.12,0.13,0.11,0.00,0.00,0,0, +1746044689176,19,2137,1083,645.74,2159.89,1042.34,10237,4476,-66.00,16,5,-48.22,6.84,27.00,30.00,18,12,0.07,0.13,0.13,0.11,0.00,0.00,0,0, +1746044690176,19,2137,1083,619.24,2147.83,1098.66,10582,4846,-66.00,16,12,-44.42,17.83,24.50,27.00,19,10,0.12,0.18,0.13,0.11,0.00,0.00,0,0, +1746044691176,19,2149,1071,567.70,2147.66,1086.79,12850,4765,-66.12,16,5,-48.34,6.84,25.50,28.00,18,9,0.07,0.06,0.13,0.11,0.00,0.00,0,0, +1746044692176,19,2137,1083,604.19,2159.78,1093.89,12083,4354,-65.75,16,5,-47.97,6.85,25.00,31.00,19,9,0.13,0.17,0.13,0.11,0.00,0.00,0,0, +1746044693176,19,2137,1083,691.17,2148.22,1092.81,14323,4737,-66.19,16,5,-48.41,6.84,25.00,29.00,18,8,0.08,0.06,0.13,0.11,0.00,0.00,0,0, +1746044694176,19,2149,1083,654.94,2147.58,1092.96,11864,4604,-66.19,16,5,-48.41,6.84,25.50,29.00,20,9,0.09,0.14,0.13,0.11,0.00,0.00,0,0, +1746044695176,19,2137,1059,507.20,2159.56,1070.37,12654,5090,-66.00,16,5,-48.22,6.84,26.50,30.00,14,9,0.10,0.05,0.13,0.11,0.00,0.00,0,0, +1746044696177,19,2137,1071,747.09,2147.69,1084.01,11519,5333,-65.75,16,5,-47.97,6.85,26.50,27.00,18,10,0.03,0.13,0.13,0.11,0.00,0.00,0,0, +1746044697176,19,2149,1083,524.41,2159.59,1093.98,12601,4533,-65.75,16,5,-47.97,6.85,26.00,29.00,19,11,0.11,0.05,0.13,0.11,0.00,0.00,0,0, +1746044698176,19,2137,1083,563.30,2147.65,1094.26,10182,4517,-65.75,16,5,-47.97,6.85,25.50,27.00,19,12,0.07,0.09,0.13,0.11,0.00,0.00,0,0, +1746044699176,19,2137,1083,585.55,2147.53,1093.76,11351,4604,-65.75,16,5,-47.97,6.85,26.50,29.00,18,11,0.12,0.06,0.13,0.11,0.00,0.00,0,0, +1746044700176,19,2137,1083,634.89,2147.64,1091.78,10076,4745,-66.06,16,5,-48.28,6.84,26.00,27.00,19,11,0.07,0.19,0.13,0.11,0.00,0.00,0,0, +1746044701176,19,2149,1023,621.45,2159.86,1034.06,12869,4423,-65.88,16,5,-48.09,6.85,27.00,27.00,18,9,0.11,0.07,0.14,0.11,0.00,0.00,0,0, +1746044702176,19,2137,1083,657.70,2147.58,1092.82,11172,4695,-66.12,16,5,-48.34,6.84,26.00,27.00,20,10,0.07,0.22,0.14,0.11,0.00,0.00,0,0, +1746044703176,19,2137,1071,707.09,2147.66,1091.00,15301,4748,-66.12,16,5,-48.34,6.84,25.00,28.00,16,7,0.10,0.08,0.14,0.11,0.00,0.00,0,0, +1746044704176,19,2149,1083,501.05,2159.75,1090.32,12991,4878,-66.12,16,5,-48.34,6.84,27.00,27.00,19,12,0.06,0.06,0.14,0.11,0.00,0.00,0,0, +1746044705176,19,2137,1083,643.41,2147.65,1094.17,10032,4533,-66.12,16,106,-35.08,199.81,25.50,28.00,19,12,0.14,0.12,0.14,0.11,0.00,0.00,0,0, +1746044706176,19,2137,1083,556.53,2147.62,1092.78,10287,4720,-66.06,16,5,-48.28,6.84,26.50,26.00,18,12,0.08,0.11,0.14,0.11,0.00,0.00,0,0, +1746044707176,19,2149,1023,506.58,2159.71,1033.55,10305,4414,-66.00,16,5,-48.22,6.84,26.00,25.00,19,11,0.12,0.16,0.14,0.11,0.00,0.00,0,0, +1746044708176,19,2137,1131,629.90,2147.43,1150.69,12243,4961,-66.00,16,5,-48.22,6.84,25.50,26.00,17,10,0.10,0.06,0.14,0.11,0.00,0.00,0,0, +1746044709176,19,2137,1023,495.05,2147.80,1031.58,10481,4874,-66.12,16,5,-48.34,6.84,26.50,27.00,19,11,0.06,0.16,0.14,0.11,0.00,0.00,0,0, +1746044710176,19,2149,1083,527.86,2159.83,1093.01,11722,4373,-66.06,16,5,-48.28,6.84,26.50,28.00,18,11,0.12,0.06,0.14,0.11,0.00,0.00,0,0, +1746044711176,19,2137,1083,770.45,2147.80,1092.42,10631,4765,-65.75,16,5,-47.97,6.85,26.00,26.00,19,12,0.06,0.07,0.14,0.11,0.00,0.00,0,0, +1746044712176,19,2137,1083,641.60,2147.54,1093.43,10098,4602,-65.75,16,5,-47.97,6.85,26.00,26.00,18,12,0.13,0.07,0.14,0.11,0.00,0.00,0,0, +1746044713176,19,2149,1131,703.90,2159.78,1150.71,11279,5012,-65.75,16,5,-47.97,6.85,27.00,27.00,19,11,0.05,0.08,0.14,0.11,0.00,0.00,0,0, +1746044714176,19,2137,1035,714.45,2147.86,1041.06,10909,4413,-66.06,16,5,-48.28,6.84,26.50,28.00,17,12,0.12,0.08,0.14,0.11,0.00,0.00,0,0, +1746044715176,19,2137,1023,709.67,2147.72,1030.92,10733,4913,-66.12,16,5,-48.34,6.84,26.00,27.00,19,9,0.04,0.15,0.14,0.11,0.00,0.00,0,0, +1746044716176,19,2149,1083,596.96,2159.69,1102.68,12930,4179,-66.25,16,5,-48.47,6.83,25.50,27.00,17,9,0.16,0.05,0.14,0.11,0.00,0.00,0,0, +1746044717176,19,2137,1083,637.22,2147.82,1088.95,11289,4974,-66.25,16,5,-48.47,6.83,26.00,27.00,17,8,0.06,0.16,0.14,0.11,0.00,0.00,0,0, +1746044718176,19,2137,1083,720.95,2147.82,1098.85,14050,4510,-65.94,16,104,-34.98,196.07,25.50,27.00,20,8,0.12,0.05,0.14,0.11,0.00,0.00,0,0, +1746044719176,19,2149,1083,643.40,2159.80,1092.57,10808,4714,-65.94,16,5,-48.16,6.85,26.00,27.00,18,12,0.08,0.05,0.14,0.11,0.00,0.00,0,0, +1746044720176,19,2137,1083,652.10,2147.57,1093.46,10063,4631,-66.12,16,5,-48.34,6.84,25.50,27.00,19,12,0.11,0.12,0.14,0.11,0.00,0.00,0,0, +1746044721176,19,2137,1023,712.82,2147.83,1035.90,12613,4536,-65.81,16,5,-48.03,6.85,25.50,27.00,18,8,0.15,0.11,0.14,0.11,0.00,0.00,0,0, +1746044722176,19,2149,1083,623.52,2160.08,1091.30,14002,4554,-65.81,16,5,-48.03,6.85,25.50,27.00,18,11,0.05,0.04,0.14,0.11,0.00,0.00,0,0, +1746044723176,19,2137,1083,623.73,2147.72,1093.78,10971,4624,-66.12,16,5,-48.34,6.84,25.00,27.00,18,8,0.14,0.15,0.14,0.11,0.00,0.00,0,0, +1746044724176,19,2137,1083,620.24,2148.10,1091.55,14458,4794,-66.00,16,5,-48.22,6.84,26.50,28.00,19,8,0.05,0.05,0.14,0.11,0.00,0.00,0,0, +1746044725176,19,2149,1083,555.60,2159.62,1094.09,10370,4636,-66.00,16,5,-48.22,6.84,25.50,28.00,18,13,0.12,0.14,0.14,0.11,0.00,0.00,0,0, +1746044726176,19,2137,1011,691.55,2147.64,1038.25,10644,4747,-66.00,16,5,-48.22,6.84,25.50,27.00,19,9,0.06,0.14,0.14,0.11,0.00,0.00,0,0, +1746044727176,19,2137,1143,492.76,2147.58,1147.23,12543,4617,-65.81,16,5,-48.03,6.85,26.00,26.00,18,10,0.11,0.05,0.14,0.11,0.00,0.00,0,0, +1746044728176,19,2149,1083,628.43,2159.52,1091.22,10522,4767,-65.94,16,5,-48.16,6.85,25.50,27.00,20,9,0.05,0.18,0.14,0.11,0.00,0.00,0,0, +1746044729177,19,2137,1035,515.13,2147.91,1045.50,14015,4183,-65.81,16,5,-48.03,6.85,26.50,26.00,18,8,0.14,0.06,0.14,0.11,0.00,0.00,0,0, +1746044730176,19,2137,1083,704.38,2147.82,1091.95,11196,4783,-65.94,16,106,-34.89,200.31,25.00,27.00,19,13,0.05,0.09,0.14,0.11,0.00,0.00,0,0, +1746044731176,19,2149,1083,731.43,2159.65,1092.90,11078,4581,-65.94,16,5,-48.16,6.85,26.50,27.00,18,7,0.16,0.17,0.14,0.11,0.00,0.00,0,0, +1746044732176,19,2137,1071,566.32,2148.11,1091.46,18786,4810,-65.81,16,5,-48.03,6.85,26.00,28.00,18,6,0.05,0.06,0.14,0.11,0.00,0.00,0,0, +1746044733176,19,2137,1083,627.57,2147.78,1093.77,12574,4538,-66.25,16,5,-48.47,6.83,25.50,27.00,19,13,0.14,0.07,0.14,0.11,0.00,0.00,0,0, +1746044734176,19,2149,1023,566.00,2159.94,1034.52,12477,4345,-66.40,15,5,-48.62,6.83,26.50,28.00,18,6,0.12,0.17,0.14,0.11,0.00,0.00,0,0, +1746044735176,19,2137,1083,663.49,2153.84,1092.22,21957,4743,-66.31,16,5,-48.53,6.83,26.00,27.00,19,5,0.06,0.06,0.14,0.11,0.00,0.00,0,0, +1746044736176,19,2137,1083,623.20,2148.38,1093.95,13784,4539,-66.31,16,5,-48.53,6.83,26.50,26.00,18,12,0.15,0.12,0.14,0.11,0.00,0.00,0,0, +1746044737176,19,2149,1083,617.33,2159.71,1091.87,10569,4809,-66.12,16,5,-48.34,6.84,27.00,27.00,18,10,0.05,0.18,0.14,0.11,0.00,0.00,0,0, +1746044738176,19,2137,1083,542.58,2147.62,1094.18,12671,4742,-66.38,16,106,-35.33,199.14,25.50,28.00,19,9,0.11,0.06,0.14,0.11,0.00,0.00,0,0, +1746044739176,19,2137,1083,452.00,2147.30,1093.24,10319,4461,-66.19,16,5,-48.41,6.84,26.50,27.00,18,11,0.09,0.30,0.14,0.11,0.00,0.00,0,0, +1746044740176,19,2149,1023,720.72,2161.93,1033.98,18194,4641,-66.19,16,5,-48.41,6.84,27.00,27.00,20,5,0.12,0.11,0.14,0.11,0.00,0.00,0,0, +1746044741176,19,2137,1071,602.48,2153.35,1092.26,20392,4487,-66.25,16,5,-48.47,6.83,27.00,28.00,18,8,0.08,0.04,0.14,0.11,0.00,0.00,0,0, +1746044742176,19,2137,1083,745.14,2147.59,1093.20,10250,4595,-66.00,16,5,-48.22,6.84,26.50,26.00,18,13,0.17,0.14,0.14,0.11,0.00,0.00,0,0, +1746044743177,19,2149,1083,589.00,2159.89,1089.37,10836,4951,-66.06,16,5,-48.28,6.84,26.50,27.00,17,11,0.06,0.09,0.14,0.11,0.00,0.00,0,0, +1746044744176,19,2137,1083,633.00,2147.73,1093.05,11036,4622,-65.88,16,5,-48.09,6.85,27.00,27.00,19,12,0.11,0.05,0.14,0.11,0.00,0.00,0,0, +1746044745176,19,2137,1083,648.95,2147.79,1095.33,10264,4542,-65.88,16,5,-48.09,6.85,27.00,26.00,19,12,0.12,0.09,0.14,0.11,0.00,0.00,0,0, +1746044746177,19,2149,1023,733.29,2159.76,1036.46,10161,4540,-66.06,16,5,-48.28,6.84,27.50,27.00,19,12,0.10,0.10,0.14,0.11,0.00,0.00,0,0, +1746044747176,19,2137,1083,516.40,2147.66,1093.79,10111,4284,-66.00,16,5,-48.22,6.84,26.50,27.00,19,12,0.10,0.11,0.14,0.11,0.00,0.00,0,0, +1746044748176,19,2137,1143,585.14,2147.32,1152.90,9750,4733,-66.12,16,5,-48.34,6.84,27.50,27.00,19,12,0.13,0.12,0.14,0.11,0.00,0.00,0,0, +1746044749176,19,2149,1023,626.23,2170.93,1032.38,10408,4548,-66.12,16,5,-48.34,6.84,27.50,27.00,17,10,0.10,0.20,0.14,0.11,0.00,0.00,0,0, +1746044750176,19,2137,1131,664.32,2147.93,1148.29,13997,5061,-66.31,16,106,-35.27,199.31,25.00,25.00,19,8,0.07,0.07,0.14,0.11,0.00,0.00,0,0, +1746044751176,19,2137,1023,754.70,2147.77,1035.96,12253,4310,-66.31,16,106,-35.27,199.31,26.00,26.00,19,12,0.09,0.08,0.14,0.11,0.00,0.00,0,0, +1746044752176,19,2149,1083,600.76,2159.75,1095.16,10161,4524,-66.19,16,5,-48.41,6.84,27.00,29.00,19,12,0.07,0.12,0.14,0.11,0.00,0.00,0,0, +1746044753176,19,2137,1083,605.65,2147.48,1094.30,10912,4511,-66.00,16,106,-34.96,200.14,26.00,27.00,19,11,0.10,0.08,0.14,0.11,0.00,0.00,0,0, +1746044754176,19,2137,1083,781.24,2147.59,1094.43,10848,4520,-66.00,16,5,-48.22,6.84,26.00,28.00,19,12,0.13,0.06,0.14,0.11,0.00,0.00,0,0, +1746044755176,19,2149,1023,546.52,2159.98,1033.59,10431,4459,-66.19,16,5,-48.41,6.84,26.50,27.00,18,12,0.08,0.08,0.14,0.11,0.00,0.00,0,0, +1746044756176,19,2137,1083,580.95,2147.47,1093.22,10976,4651,-65.88,16,5,-48.09,6.85,25.50,27.00,19,9,0.06,0.14,0.14,0.11,0.00,0.00,0,0, +1746044757176,19,2137,1083,696.00,2147.76,1094.03,12760,4540,-66.25,16,5,-48.47,6.83,26.00,29.00,18,10,0.16,0.05,0.14,0.11,0.00,0.00,0,0, +1746044758176,19,2149,1083,526.95,2159.79,1092.02,11666,4793,-66.25,16,5,-48.47,6.83,25.00,28.00,18,7,0.05,0.16,0.14,0.11,0.00,0.00,0,0, +1746044759176,19,2137,1083,659.09,2148.06,1093.29,16142,4618,-65.94,16,5,-48.16,6.85,27.50,30.00,18,7,0.13,0.05,0.14,0.11,0.00,0.00,0,0, +1746044760176,19,2137,1023,487.29,2147.55,1038.86,11345,4760,-66.00,16,5,-48.22,6.84,26.50,26.00,19,12,0.07,0.07,0.14,0.11,0.00,0.00,0,0, +1746044761176,19,2149,1083,640.86,2159.85,1089.22,10117,4610,-66.19,16,5,-48.41,6.84,26.00,28.00,18,12,0.13,0.07,0.14,0.11,0.00,0.00,0,0, +1746044762176,19,2137,1131,564.55,2147.68,1150.21,10144,4760,-66.00,16,106,-34.96,200.14,26.00,27.00,19,12,0.06,0.08,0.14,0.11,0.00,0.00,0,0, +1746044763176,19,2137,1023,684.00,2147.66,1035.73,10266,4319,-66.00,16,5,-48.22,6.84,26.50,26.00,18,11,0.15,0.15,0.14,0.11,0.00,0.00,0,0, +1746044764176,19,2149,1083,519.59,2159.59,1091.43,11361,4796,-66.38,16,5,-48.59,6.83,26.00,28.00,18,11,0.05,0.05,0.14,0.11,0.00,0.00,0,0, +1746044765176,19,2137,1143,582.61,2147.62,1151.68,10137,4853,-66.12,16,28,-40.86,45.31,26.50,27.00,18,12,0.11,0.07,0.14,0.11,0.00,0.00,0,0, +1746044766176,19,2137,1023,709.48,2147.71,1033.49,11075,4501,-66.06,16,106,-35.02,199.97,26.00,27.00,19,11,0.07,0.08,0.14,0.11,0.00,0.00,0,0, +1746044767176,19,2149,1023,580.50,2159.71,1035.10,10422,4644,-66.12,16,5,-48.34,6.84,26.00,28.00,18,13,0.10,0.14,0.14,0.11,0.00,0.00,0,0, +1746044768176,19,2137,1083,530.94,2147.58,1092.06,11289,4711,-66.12,16,106,-35.08,199.81,26.00,28.00,19,11,0.08,0.07,0.14,0.11,0.00,0.00,0,0, +1746044769176,19,2137,1083,520.57,2147.71,1095.23,10628,4514,-66.12,16,5,-48.34,6.84,25.00,29.00,19,12,0.13,0.11,0.14,0.11,0.00,0.00,0,0, +1746044770177,19,2149,1071,650.75,2147.63,1091.88,11814,4378,-66.50,16,5,-48.72,6.82,25.00,27.00,16,9,0.18,0.09,0.14,0.11,0.00,0.00,0,0, +1746044771176,19,2137,1083,472.15,2159.70,1085.61,11820,5194,-66.19,16,5,-48.41,6.84,26.00,31.00,15,13,0.06,0.06,0.14,0.11,0.00,0.00,0,0, +1746044772176,19,2137,1083,929.28,2148.27,1093.10,13463,4756,-66.19,16,5,-48.41,6.84,26.50,26.00,19,5,0.10,0.15,0.14,0.11,0.00,0.00,0,0, +1746044773176,19,2149,1071,708.34,2165.26,1086.53,22301,4711,-65.94,16,106,-34.89,200.31,25.50,28.00,18,5,0.10,0.05,0.14,0.11,0.00,0.00,0,0, +1746044774176,19,2137,1035,617.79,2148.73,1044.31,12853,4478,-66.06,16,5,-48.28,6.84,26.50,27.00,19,12,0.08,0.09,0.14,0.11,0.00,0.00,0,0, +1746044775176,19,2137,1131,633.71,2147.99,1151.63,10735,4895,-66.00,16,5,-48.22,6.84,26.00,28.00,18,11,0.09,0.14,0.14,0.11,0.00,0.00,0,0, +1746044776176,19,2149,1083,515.90,2147.67,1092.65,11372,4668,-66.25,16,5,-48.47,6.83,26.00,27.00,19,11,0.07,0.06,0.14,0.11,0.00,0.00,0,0, +1746044777176,19,2137,1023,680.43,2159.43,1033.71,10513,4454,-66.25,16,5,-48.47,6.83,26.00,28.00,18,9,0.09,0.25,0.14,0.11,0.00,0.00,0,0, +1746044778176,19,2137,1083,870.92,2151.72,1092.25,20139,4750,-65.94,16,5,-48.16,6.85,25.50,26.00,19,5,0.09,0.09,0.14,0.11,0.00,0.00,0,0, +1746044779176,19,2149,1083,716.58,2151.00,1095.24,18420,4531,-66.06,16,5,-48.28,6.84,26.50,28.00,19,10,0.14,0.03,0.14,0.11,0.00,0.00,0,0, +1746044780176,19,2137,1083,651.57,2159.57,1092.17,10414,4718,-66.31,16,5,-48.53,6.83,26.50,27.00,18,9,0.08,0.17,0.14,0.11,0.00,0.00,0,0, +1746044781176,19,2137,1023,638.29,2147.96,1039.55,14093,4661,-66.31,16,5,-48.53,6.83,26.50,27.00,19,8,0.12,0.06,0.14,0.11,0.00,0.00,0,0, +1746044782176,19,2137,1083,486.42,2147.64,1087.10,10911,4726,-66.12,16,5,-48.34,6.84,26.50,26.00,18,12,0.08,0.18,0.14,0.11,0.00,0.00,0,0, +1746044783176,19,2149,1083,542.32,2159.53,1094.24,12593,4412,-66.12,16,5,-48.34,6.84,26.50,27.00,19,9,0.13,0.08,0.14,0.11,0.00,0.00,0,0, +1746044784176,19,2137,1071,550.91,2147.89,1092.42,11590,4752,-66.00,16,5,-48.22,6.84,25.50,27.00,18,12,0.07,0.05,0.14,0.11,0.00,0.00,0,0, +1746044785176,19,2149,1083,622.37,2147.40,1094.27,10120,4594,-66.12,16,5,-48.34,6.84,27.00,29.00,19,9,0.14,0.17,0.14,0.11,0.00,0.00,0,0, +1746044786176,19,2137,1083,576.38,2160.25,1092.46,14315,4734,-66.12,16,5,-48.34,6.84,25.00,27.00,18,8,0.07,0.06,0.14,0.11,0.00,0.00,0,0, +1746044787176,19,2137,1083,728.35,2147.53,1093.93,11378,4609,-65.81,16,106,-34.77,200.65,26.00,27.00,18,10,0.15,0.17,0.14,0.11,0.00,0.00,0,0, +1746044788176,19,2149,1083,749.05,2147.86,1091.62,12823,4802,-65.75,16,27,-40.64,43.68,26.00,27.00,18,9,0.06,0.06,0.14,0.11,0.00,0.00,0,0, +1746044789176,19,2137,1023,671.24,2159.71,1035.78,10637,4348,-66.00,16,5,-48.22,6.84,25.50,27.00,19,12,0.15,0.15,0.14,0.11,0.00,0.00,0,0, +1746044790176,19,2137,1083,733.20,2147.76,1091.95,11135,4774,-66.00,16,5,-48.22,6.84,26.50,28.00,18,11,0.06,0.09,0.14,0.11,0.00,0.00,0,0, +1746044791176,19,2149,1083,543.76,2147.44,1093.66,10132,4631,-65.69,16,5,-47.91,6.86,26.50,30.00,18,13,0.14,0.22,0.14,0.11,0.00,0.00,0,0, +1746044792176,19,2137,1083,595.29,2160.06,1091.74,13275,4785,-65.94,16,5,-48.16,6.85,26.00,27.00,19,8,0.05,0.09,0.14,0.11,0.00,0.00,0,0, +1746044793176,19,2137,1071,530.05,2147.75,1094.19,12743,4669,-65.81,16,5,-48.03,6.85,26.00,27.00,18,13,0.10,0.04,0.14,0.11,0.00,0.00,0,0, +1746044794176,19,2137,1023,539.35,2147.92,1039.22,10731,4708,-65.88,16,5,-48.09,6.85,25.50,26.00,19,10,0.09,0.13,0.14,0.11,0.00,0.00,0,0, +1746044795176,19,2149,1083,669.42,2159.85,1088.01,12339,4690,-65.88,16,5,-48.09,6.85,26.00,27.00,18,12,0.09,0.04,0.14,0.11,0.00,0.00,0,0, +1746044796176,19,2137,1083,704.50,2148.02,1091.95,12231,4695,-65.94,16,13,-44.01,19.48,24.00,27.00,19,9,0.11,0.10,0.14,0.11,0.00,0.00,0,0, +1746044797176,19,2137,1083,544.38,2147.92,1092.51,12343,4485,-66.06,16,5,-48.28,6.84,26.50,28.00,18,13,0.08,0.04,0.14,0.11,0.00,0.00,0,0, +1746044798176,19,2149,1083,669.05,2159.78,1093.57,11562,4639,-66.00,16,5,-48.22,6.84,26.50,26.00,19,9,0.11,0.10,0.14,0.11,0.00,0.00,0,0, +1746044799176,19,2137,1083,549.36,2147.82,1094.01,11915,4575,-66.00,16,5,-48.22,6.84,26.00,27.00,18,13,0.13,0.04,0.14,0.11,0.00,0.00,0,0, +1746044800176,19,2137,1083,572.11,2147.70,1091.81,10738,4777,-66.00,16,5,-48.22,6.84,26.00,30.00,19,11,0.05,0.08,0.14,0.11,0.00,0.00,0,0, +1746044801176,19,2149,1083,653.18,2159.70,1093.93,10766,4587,-65.94,16,5,-48.16,6.85,26.00,30.00,18,11,0.12,0.22,0.14,0.11,0.00,0.00,0,0, +1746044802176,19,2137,1071,546.26,2147.92,1091.94,14954,4763,-65.81,16,5,-48.03,6.85,27.00,28.00,19,7,0.05,0.08,0.14,0.11,0.00,0.00,0,0, +1746044803176,19,2137,1023,535.48,2147.81,1040.02,13656,4523,-66.19,16,12,-44.60,17.81,25.00,27.00,19,13,0.11,0.03,0.14,0.11,0.00,0.00,0,0, +1746044804176,19,2149,1083,632.27,2159.98,1087.14,11748,4520,-66.19,16,5,-48.41,6.84,25.50,28.00,18,8,0.07,0.13,0.14,0.11,0.00,0.00,0,0, +1746044805176,19,2137,1095,572.19,2148.09,1105.02,13945,4516,-65.94,16,5,-48.16,6.85,25.00,27.00,18,10,0.25,0.04,0.14,0.11,0.00,0.00,0,0, +1746044806176,19,2137,1071,675.32,2147.90,1084.29,12155,5288,-66.38,16,5,-48.59,6.83,26.50,26.00,14,9,0.09,0.10,0.14,0.11,0.00,0.00,0,0, +1746044807176,19,2149,1071,659.36,2159.69,1083.88,12156,5255,-66.12,16,5,-48.34,6.84,25.50,27.00,19,13,0.03,0.04,0.14,0.11,0.00,0.00,0,0, +1746044808176,19,2137,1107,708.32,2147.58,1114.12,11275,4591,-65.81,16,37,-39.34,61.90,26.00,26.00,17,8,0.13,0.13,0.14,0.11,0.00,0.00,0,0, +1746044809176,19,2137,1023,688.52,2147.93,1030.72,14099,4695,-65.81,16,5,-48.03,6.85,26.50,32.00,18,9,0.05,0.05,0.14,0.11,0.00,0.00,0,0, +1746044810176,19,2149,1071,434.52,2159.90,1089.21,10921,4757,-66.06,16,5,-48.28,6.84,26.00,27.00,15,11,0.12,0.13,0.14,0.11,0.00,0.00,0,0, +1746044811176,19,2137,1083,515.77,2147.78,1086.27,11356,5163,-65.81,16,5,-48.03,6.85,26.50,27.00,16,12,0.05,0.05,0.14,0.11,0.00,0.00,0,0, +1746044812176,19,2137,1071,644.18,2147.53,1093.52,10417,4622,-66.06,16,5,-48.28,6.84,26.50,28.00,18,10,0.16,0.16,0.14,0.11,0.00,0.00,0,0, +1746044813176,19,2149,1083,726.14,2159.75,1091.64,12923,4804,-66.06,16,5,-48.28,6.84,25.50,27.00,18,10,0.05,0.06,0.14,0.11,0.00,0.00,0,0, +1746044814176,19,2137,1083,715.75,2147.78,1094.68,10730,4553,-66.38,16,5,-48.59,6.83,26.50,29.00,19,10,0.12,0.15,0.14,0.11,0.00,0.00,0,0, +1746044815176,19,2137,1083,551.05,2147.70,1095.30,12670,4506,-66.12,16,13,-44.19,19.45,25.00,27.00,19,10,0.12,0.05,0.14,0.11,0.00,0.00,0,0, +1746044816176,19,2149,1023,555.37,2159.38,1035.84,11027,4555,-66.19,16,5,-48.41,6.84,26.00,28.00,18,11,0.15,0.09,0.14,0.11,0.00,0.00,0,0, +1746044817176,19,2137,1083,621.84,2147.61,1091.33,11342,4566,-66.25,16,5,-48.47,6.83,26.00,27.00,18,12,0.06,0.05,0.14,0.11,0.00,0.00,0,0, +1746044818176,19,2137,1083,748.82,2147.86,1093.75,13367,4550,-66.25,16,5,-48.47,6.83,25.50,27.00,19,6,0.11,0.14,0.14,0.11,0.00,0.00,0,0, +1746044819176,19,2149,1083,685.61,2160.18,1094.68,18620,4570,-66.12,16,5,-48.34,6.84,27.50,31.00,18,7,0.14,0.05,0.14,0.11,0.00,0.00,0,0, +1746044820176,19,2137,1083,554.00,2147.76,1091.58,11020,4791,-65.94,16,5,-48.16,6.85,26.00,27.00,19,12,0.05,0.19,0.14,0.11,0.00,0.00,0,0, +1746044821176,19,2137,1083,581.00,2147.74,1094.44,15756,4643,-65.81,16,5,-48.03,6.85,26.50,28.00,15,6,0.15,0.10,0.14,0.11,0.00,0.00,0,0, +1746044822176,19,2149,1071,666.33,2159.86,1087.60,16790,5199,-65.81,16,49,-38.12,84.60,26.00,27.00,15,10,0.05,0.04,0.14,0.11,0.00,0.00,0,0, +1746044823176,19,2137,1035,697.36,2147.59,1044.82,10309,4347,-65.94,16,5,-48.16,6.85,26.00,27.00,19,9,0.18,0.23,0.14,0.11,0.00,0.00,0,0, +1746044824176,19,2137,1083,909.97,2152.04,1089.78,20085,4912,-65.88,16,5,-48.09,6.85,26.00,28.00,16,5,0.07,0.08,0.14,0.11,0.00,0.00,0,0, +1746044825176,19,2149,1071,568.60,2162.58,1091.86,17823,4773,-66.12,16,5,-48.34,6.84,27.50,27.00,19,11,0.10,0.03,0.14,0.11,0.00,0.00,0,0, +1746044826176,19,2137,1083,536.10,2147.46,1092.90,10440,4596,-66.38,16,5,-48.59,6.83,26.50,27.00,18,8,0.12,0.26,0.14,0.11,0.00,0.00,0,0, +1746044827176,19,2137,1083,1080.17,2153.66,1092.02,27991,4752,-66.38,16,12,-44.79,17.78,25.50,27.00,19,3,0.06,0.09,0.14,0.11,0.00,0.00,0,0, +1746044828176,19,2149,1083,631.00,2165.47,1094.50,27329,4593,-66.00,16,27,-40.89,43.58,26.00,27.00,18,8,0.14,0.03,0.14,0.11,0.00,0.00,0,0, +1746044829176,19,2137,1083,586.95,2153.86,1092.14,10287,4774,-66.19,16,5,-48.41,6.84,27.50,26.00,19,11,0.05,0.33,0.14,0.11,0.00,0.00,0,0, +1746044830176,19,2137,1023,771.54,2150.87,1040.71,20012,4433,-66.00,16,5,-48.22,6.84,26.00,27.00,18,4,0.13,0.12,0.14,0.11,0.00,0.00,0,0, +1746044831176,19,2149,1083,763.62,2165.85,1091.32,26332,4569,-66.25,16,5,-48.47,6.83,26.50,27.00,19,6,0.05,0.04,0.14,0.11,0.00,0.00,0,0, +1746044832176,19,2137,1143,542.45,2147.73,1153.99,11876,4744,-66.25,16,5,-48.47,6.83,26.00,27.00,19,13,0.08,0.07,0.14,0.11,0.00,0.00,0,0, +1746044833176,19,2137,1023,667.09,2147.55,1035.18,10937,4275,-66.06,16,5,-48.28,6.84,26.50,27.00,19,11,0.10,0.10,0.14,0.11,0.00,0.00,0,0, +1746044834176,19,2149,1023,591.85,2160.04,1085.98,11178,4530,-66.12,16,12,-44.54,17.81,25.00,27.00,19,13,0.09,0.05,0.14,0.11,0.00,0.00,0,0, +1746044835176,19,2137,1083,635.95,2147.84,1094.31,11006,4501,-66.12,16,5,-48.34,6.84,26.50,28.00,19,8,0.07,0.17,0.14,0.11,0.00,0.00,0,0, +1746044836176,19,2137,1083,514.00,2147.94,1044.83,16145,4297,-66.12,16,5,-48.34,6.84,27.50,26.00,19,7,0.13,0.06,0.14,0.11,0.00,0.00,0,0, +1746044837176,19,2149,1083,545.65,2159.92,1091.32,11846,4778,-66.12,16,5,-48.34,6.84,26.00,26.00,18,13,0.06,0.13,0.14,0.11,0.00,0.00,0,0, +1746044838176,19,2137,1083,624.00,2147.76,1094.33,12366,4600,-66.00,16,5,-48.22,6.84,27.00,28.00,19,9,0.13,0.08,0.14,0.11,0.00,0.00,0,0, +1746044839176,19,2137,1083,736.91,2147.50,1092.30,11606,4672,-66.25,16,5,-48.47,6.83,26.50,27.00,17,11,0.12,0.17,0.14,0.11,0.00,0.00,0,0, +1746044840176,19,2149,1071,517.77,2159.94,1089.93,12715,4931,-66.12,16,5,-48.34,6.84,27.00,27.00,19,10,0.04,0.06,0.14,0.11,0.00,0.00,0,0, +1746044841176,19,2137,1083,589.26,2147.63,1093.86,10625,4508,-66.12,16,106,-35.08,199.81,25.50,27.00,19,12,0.12,0.14,0.14,0.11,0.00,0.00,0,0, +1746044842176,19,2137,1083,646.95,2147.60,1092.79,10151,4726,-66.38,16,5,-48.59,6.83,26.50,27.00,18,12,0.08,0.12,0.14,0.11,0.00,0.00,0,0, +1746044843176,19,2149,1023,565.29,2147.73,1034.10,10251,4407,-66.00,16,5,-48.22,6.84,27.50,27.00,19,12,0.11,0.12,0.14,0.11,0.00,0.00,0,0, +1746044844176,19,2137,1083,579.71,2159.60,1093.42,10080,4635,-66.06,16,5,-48.28,6.84,26.00,27.00,18,12,0.10,0.08,0.14,0.11,0.00,0.00,0,0, +1746044845176,19,2137,1083,561.76,2147.78,1091.98,10879,4741,-66.06,16,5,-48.28,6.84,27.00,26.00,19,11,0.10,0.11,0.14,0.11,0.00,0.00,0,0, +1746044846176,19,2149,1083,523.17,2159.71,1093.96,11260,4565,-65.88,16,5,-48.09,6.85,27.50,27.00,18,12,0.14,0.06,0.14,0.11,0.00,0.00,0,0, +1746044847176,19,2137,1083,672.80,2147.69,1091.18,11287,4809,-66.12,16,5,-48.34,6.84,27.00,30.00,19,11,0.05,0.09,0.14,0.11,0.00,0.00,0,0, +1746044848176,19,2137,1083,647.80,2147.70,1094.80,10945,4559,-66.12,16,5,-48.34,6.84,25.50,29.00,18,13,0.15,0.13,0.14,0.11,0.00,0.00,0,0, +1746044849176,19,2149,1071,605.70,2147.99,1091.51,12414,4790,-66.00,16,27,-40.89,43.58,26.00,30.00,18,10,0.06,0.07,0.14,0.11,0.00,0.00,0,0, +1746044850176,19,2137,1023,689.47,2170.62,1035.27,10783,4365,-66.00,16,5,-48.22,6.84,26.00,27.00,18,12,0.14,0.28,0.14,0.11,0.00,0.00,0,0, +1746044851176,19,2137,1083,629.14,2147.76,1091.59,15647,4796,-65.88,16,5,-48.09,6.85,26.50,27.00,19,6,0.05,0.10,0.14,0.11,0.00,0.00,0,0, +1746044852176,19,2149,1083,664.21,2147.90,1094.31,16840,4525,-66.00,16,5,-48.22,6.84,25.50,27.00,18,10,0.16,0.04,0.14,0.11,0.00,0.00,0,0, +1746044853176,19,2137,1083,547.09,2159.60,1091.78,9935,4801,-66.06,16,5,-48.28,6.84,25.00,27.00,18,11,0.06,0.17,0.14,0.11,0.00,0.00,0,0, +1746044854176,19,2137,1023,655.67,2147.54,1040.83,12384,4582,-66.06,16,5,-48.28,6.84,26.00,27.00,19,10,0.14,0.06,0.14,0.11,0.00,0.00,0,0, +1746044855176,19,2149,1143,584.63,2159.70,1145.73,9990,4723,-66.06,16,27,-40.96,43.55,26.00,27.00,18,13,0.08,0.15,0.14,0.11,0.00,0.00,0,0, +1746044856176,19,2137,1083,635.27,2147.87,1093.39,12371,4643,-65.81,16,5,-48.03,6.85,25.50,27.00,19,10,0.10,0.08,0.14,0.11,0.00,0.00,0,0, +1746044857176,19,2137,1071,581.05,2147.81,1093.40,11399,4690,-66.12,16,28,-40.86,45.31,26.00,27.00,18,12,0.09,0.09,0.14,0.11,0.00,0.00,0,0, +1746044858176,19,2149,1023,575.55,2147.78,1034.28,11092,4420,-66.06,16,5,-48.28,6.84,25.50,26.00,19,11,0.08,0.09,0.14,0.11,0.00,0.00,0,0, +1746044859176,19,2137,1083,560.09,2159.66,1093.77,11015,4531,-66.06,16,5,-48.28,6.84,26.50,28.00,19,12,0.15,0.07,0.14,0.11,0.00,0.00,0,0, +1746044860176,19,2137,1083,720.96,2147.95,1091.89,11134,4770,-65.81,16,5,-48.03,6.85,27.00,28.00,18,8,0.07,0.17,0.14,0.11,0.00,0.00,0,0, +1746044861176,19,2149,1023,512.95,2147.54,1034.16,15653,4635,-66.06,16,5,-48.28,6.84,27.00,27.00,19,7,0.11,0.06,0.14,0.11,0.00,0.00,0,0, +1746044862176,19,2137,1143,498.95,2159.55,1156.02,11869,5038,-66.25,16,5,-48.47,6.83,25.50,27.00,15,12,0.09,0.11,0.14,0.11,0.00,0.00,0,0, +1746044863176,19,2137,1023,590.48,2147.64,1028.31,10946,4802,-66.12,16,5,-48.34,6.84,27.00,26.00,20,9,0.05,0.14,0.14,0.11,0.00,0.00,0,0, +1746044864176,19,2149,1083,523.11,2147.40,1099.13,12524,4476,-66.12,16,5,-48.34,6.84,27.00,28.00,19,10,0.10,0.05,0.14,0.11,0.00,0.00,0,0, +1746044865176,19,2137,1083,622.10,2159.80,1093.29,9649,4644,-65.94,16,5,-48.16,6.85,26.00,27.00,18,13,0.10,0.14,0.14,0.11,0.00,0.00,0,0, +1746044866176,19,2137,1083,719.70,2148.02,1093.01,13208,4700,-66.12,16,5,-48.34,6.84,27.00,27.00,19,8,0.08,0.09,0.14,0.11,0.00,0.00,0,0, +1746044867176,19,2149,1083,639.22,2147.95,1093.85,12975,4651,-65.75,16,5,-47.97,6.85,26.50,27.00,18,13,0.10,0.04,0.14,0.11,0.00,0.00,0,0, +1746044868176,19,2137,1023,532.21,2159.77,1033.30,12019,4648,-65.75,16,5,-47.97,6.85,27.50,27.00,20,9,0.14,0.09,0.14,0.11,0.00,0.00,0,0, +1746044869176,19,2137,1131,616.05,2147.58,1150.98,11551,4854,-66.12,16,5,-48.34,6.84,26.50,27.00,17,14,0.08,0.05,0.14,0.11,0.00,0.00,0,0, +1746044870176,19,2137,1023,569.39,2147.58,1033.10,11906,4504,-66.19,16,5,-48.41,6.84,27.00,27.00,19,8,0.09,0.12,0.14,0.11,0.00,0.00,0,0, +1746044871176,19,2149,1083,691.79,2159.96,1092.85,13928,4651,-65.94,16,5,-48.16,6.85,26.50,28.00,18,10,0.10,0.04,0.14,0.11,0.00,0.00,0,0, +1746044872176,19,2137,1083,505.23,2156.06,1097.66,10441,4938,-66.00,16,5,-48.22,6.84,26.50,27.00,19,9,0.08,0.16,0.14,0.11,0.00,0.00,0,0, +1746044873176,19,2137,1083,636.90,2147.66,1089.07,12664,4301,-66.00,16,5,-48.22,6.84,26.00,27.00,19,9,0.14,0.05,0.14,0.11,0.00,0.00,0,0, +1746044874176,19,2149,1083,605.52,2159.70,1094.42,10810,4743,-66.00,16,106,-34.96,200.14,25.00,27.00,19,12,0.08,0.10,0.14,0.11,0.00,0.00,0,0, +1746044875176,19,2137,1083,575.64,2147.73,1094.07,11435,4299,-66.19,16,5,-48.41,6.84,27.00,27.00,19,11,0.13,0.08,0.14,0.11,0.00,0.00,0,0, +1746044876176,19,2149,1083,664.25,2147.58,1094.73,10382,4542,-66.06,16,5,-48.28,6.84,27.50,28.00,19,13,0.13,0.09,0.14,0.11,0.00,0.00,0,0, +1746044877176,19,2137,1023,496.25,2159.80,1035.80,11607,4337,-66.06,16,5,-48.28,6.84,27.50,27.00,18,9,0.15,0.10,0.14,0.11,0.00,0.00,0,0, +1746044878176,19,2137,1083,654.55,2147.76,1091.80,12131,4801,-66.00,16,5,-48.22,6.84,26.00,28.00,18,13,0.06,0.04,0.14,0.11,0.00,0.00,0,0, +1746044879176,19,2137,1083,597.75,2147.55,1101.07,11412,4476,-66.25,16,5,-48.47,6.83,27.00,28.00,19,10,0.14,0.10,0.14,0.11,0.00,0.00,0,0, +1746044880176,19,2149,1083,531.75,2159.77,1094.85,11770,4520,-66.12,16,5,-48.34,6.84,26.00,26.00,19,12,0.08,0.09,0.14,0.11,0.00,0.00,0,0, +1746044881176,19,2137,1023,668.09,2153.41,1083.64,11133,4517,-66.38,16,12,-44.79,17.78,25.50,26.00,19,8,0.11,0.17,0.14,0.11,0.00,0.00,0,0, +1746044882176,19,2137,1131,561.41,2147.74,1091.93,15727,4807,-66.38,16,106,-35.33,199.14,25.50,25.00,18,7,0.09,0.06,0.14,0.11,0.00,0.00,0,0, +1746044883176,19,2149,1035,647.05,2159.81,1043.74,12701,4476,-66.12,16,5,-48.34,6.84,26.50,25.00,19,9,0.08,0.17,0.14,0.11,0.00,0.00,0,0, +1746044884176,19,2137,1083,578.82,2147.91,1093.61,13914,4618,-66.38,16,5,-48.59,6.83,27.00,29.00,18,8,0.10,0.06,0.14,0.11,0.00,0.00,0,0, +1746044885176,19,2137,1083,608.05,2147.62,1092.47,11140,4707,-66.38,16,5,-48.59,6.83,26.50,26.00,19,12,0.07,0.10,0.14,0.11,0.00,0.00,0,0, +1746044886176,19,2149,1083,685.80,2159.94,1094.22,10967,4536,-66.38,16,5,-48.59,6.83,27.50,27.00,19,9,0.06,0.18,0.14,0.11,0.00,0.00,0,0, +1746044887176,19,2137,1083,722.95,2148.03,1094.93,14231,4495,-66.38,16,13,-44.44,19.41,25.50,27.00,19,8,0.10,0.06,0.15,0.11,0.00,0.00,0,0, +1746044888176,19,2137,1023,488.16,2147.56,1084.83,11209,4529,-66.12,16,13,-44.19,19.45,26.00,27.00,19,13,0.13,0.09,0.15,0.11,0.00,0.00,0,0, +1746044889176,19,2149,1083,547.30,2159.82,1045.65,10609,4302,-66.25,16,5,-48.47,6.83,27.50,27.00,19,10,0.11,0.13,0.15,0.11,0.00,0.00,0,0, +1746044890176,19,2137,1083,586.21,2147.71,1100.30,12250,4751,-66.38,16,5,-48.59,6.83,28.00,27.00,19,12,0.08,0.04,0.15,0.11,0.00,0.00,0,0, +1746044891176,19,2137,1083,560.95,2147.47,1138.49,10032,4540,-66.38,16,5,-48.59,6.83,26.50,27.00,19,12,0.11,0.12,0.15,0.11,0.00,0.00,0,0, +1746044892176,19,2149,1083,506.45,2159.82,1041.56,13531,4604,-66.44,16,5,-48.66,6.83,27.50,26.00,16,8,0.12,0.08,0.15,0.11,0.00,0.00,0,0, +1746044893176,19,2137,1071,631.68,2147.88,1089.94,12617,4916,-66.19,16,5,-48.41,6.84,26.50,27.00,19,12,0.04,0.06,0.15,0.11,0.00,0.00,0,0, +1746044894176,19,2137,1047,609.62,2147.51,1050.37,10056,4160,-66.00,16,5,-48.22,6.84,26.50,28.00,18,12,0.16,0.07,0.15,0.11,0.00,0.00,0,0, +1746044895176,19,2149,1071,559.23,2159.66,1091.31,10329,4798,-66.06,16,5,-48.28,6.84,27.00,27.00,18,12,0.06,0.10,0.15,0.11,0.00,0.00,0,0, +1746044896176,19,2137,1083,694.86,2147.78,1094.58,10234,4581,-66.06,16,5,-48.28,6.84,26.00,28.00,18,12,0.15,0.08,0.15,0.11,0.00,0.00,0,0, +1746044897176,19,2137,1083,819.26,2147.80,1091.38,10337,4793,-66.06,16,5,-48.28,6.84,26.00,27.00,18,12,0.06,0.09,0.15,0.11,0.00,0.00,0,0, +1746044898176,19,2149,1083,611.19,2159.36,1093.81,10090,4567,-66.06,16,5,-48.28,6.84,26.00,27.00,18,12,0.15,0.07,0.15,0.11,0.00,0.00,0,0, +1746044899176,19,2137,1083,569.40,2147.39,1091.46,9947,4796,-66.12,16,5,-48.34,6.84,26.50,27.00,18,12,0.06,0.12,0.15,0.11,0.00,0.00,0,0, +1746044900176,19,2137,1083,609.15,2147.71,1094.22,10114,4535,-66.12,16,5,-48.34,6.84,27.50,28.00,19,12,0.12,0.12,0.15,0.11,0.00,0.00,0,0, +1746044901176,19,2149,1023,627.91,2159.66,1035.49,10151,4309,-66.06,16,5,-48.28,6.84,26.00,27.00,19,12,0.14,0.10,0.15,0.11,0.00,0.00,0,0, +1746044902176,19,2137,1083,602.05,2147.80,1144.26,11556,4728,-66.19,16,5,-48.41,6.84,26.50,27.00,19,11,0.15,0.07,0.15,0.11,0.00,0.00,0,0, +1746044903176,19,2137,1083,610.27,2147.77,1042.02,9926,4531,-65.88,16,5,-48.09,6.85,26.00,28.00,18,13,0.06,0.13,0.15,0.11,0.00,0.00,0,0, +1746044904176,19,2149,1083,639.59,2159.94,1093.87,11680,4585,-66.06,16,5,-48.28,6.84,26.50,27.00,19,11,0.14,0.07,0.15,0.11,0.00,0.00,0,0, +1746044905176,19,2137,1071,644.15,2147.70,1091.78,9737,4806,-66.06,16,5,-48.28,6.84,26.50,28.00,18,12,0.06,0.20,0.15,0.11,0.00,0.00,0,0, +1746044906176,19,2137,1083,566.80,2147.79,1092.19,13616,4639,-66.12,16,5,-48.34,6.84,27.50,27.00,18,8,0.11,0.08,0.15,0.11,0.00,0.00,0,0, +1746044907176,19,2149,1023,618.62,2159.67,1036.72,12292,4683,-65.88,16,5,-48.09,6.85,26.00,27.00,20,12,0.05,0.11,0.15,0.11,0.00,0.00,0,0, +1746044908176,19,2137,1083,665.85,2147.63,1090.49,10575,4519,-66.19,16,5,-48.41,6.84,26.00,27.00,17,10,0.10,0.15,0.15,0.11,0.00,0.00,0,0, +1746044909176,19,2137,1083,647.76,2147.68,1090.50,12618,4852,-66.19,16,5,-48.41,6.84,26.00,28.00,19,10,0.08,0.05,0.15,0.11,0.00,0.00,0,0, +1746044910176,19,2149,1083,656.48,2159.51,1094.67,10182,4503,-65.88,16,5,-48.09,6.85,27.00,26.00,19,9,0.12,0.20,0.15,0.11,0.00,0.00,0,0, +1746044911176,19,2137,1083,607.10,2147.71,1142.94,15535,4747,-66.25,16,13,-44.32,19.43,25.50,27.00,19,7,0.11,0.07,0.15,0.11,0.00,0.00,0,0, +1746044912176,19,2137,1083,586.70,2147.82,1045.83,12934,4284,-66.19,16,13,-44.26,19.44,25.50,27.00,19,14,0.12,0.04,0.15,0.11,0.00,0.00,0,0, +1746044913176,19,2149,1071,654.38,2159.85,1092.54,12966,4731,-66.06,16,27,-40.96,43.55,26.50,27.00,18,6,0.07,0.14,0.15,0.11,0.00,0.00,0,0, +1746044914176,19,2137,1035,622.50,2147.82,1040.38,18318,4595,-66.06,16,5,-48.28,6.84,27.00,28.00,19,7,0.12,0.05,0.15,0.11,0.00,0.00,0,0, +1746044915176,19,2137,1071,774.05,2147.92,1087.13,10891,4697,-65.94,16,5,-48.16,6.85,26.50,28.00,18,13,0.09,0.10,0.15,0.11,0.00,0.00,0,0, +1746044916176,19,2149,1083,594.68,2159.71,1092.05,11623,4476,-66.00,16,5,-48.22,6.84,26.50,27.00,19,9,0.07,0.09,0.15,0.11,0.00,0.00,0,0, +1746044917176,19,2137,1083,753.71,2147.70,1094.34,11852,4584,-66.00,16,5,-48.22,6.84,27.00,27.00,18,13,0.14,0.10,0.15,0.11,0.00,0.00,0,0, +1746044918176,19,2137,1083,569.64,2147.70,1091.55,10041,4993,-66.00,16,106,-34.96,200.14,25.00,27.00,19,10,0.05,0.16,0.15,0.11,0.00,0.00,0,0, +1746044919176,19,2149,1083,633.15,2159.63,1094.36,12824,4391,-66.00,16,27,-40.89,43.58,25.50,27.00,18,10,0.13,0.05,0.15,0.11,0.00,0.00,0,0, +1746044920176,19,2137,1083,617.86,2147.91,1091.37,10552,4734,-65.88,16,5,-48.09,6.85,27.00,27.00,19,12,0.06,0.07,0.15,0.11,0.00,0.00,0,0, +1746044921176,19,2137,1023,700.86,2147.65,1035.63,10096,4528,-66.06,16,5,-48.28,6.84,26.00,27.00,19,12,0.13,0.08,0.15,0.11,0.00,0.00,0,0, +1746044922176,19,2149,1143,614.23,2159.71,1152.32,12334,4523,-65.94,16,5,-48.16,6.85,27.50,27.00,19,10,0.12,0.07,0.15,0.11,0.00,0.00,0,0, +1746044923176,19,2137,1023,575.47,2147.49,1040.83,10549,4526,-65.94,16,5,-48.16,6.85,26.50,27.00,19,12,0.14,0.30,0.15,0.11,0.00,0.00,0,0, +1746044924176,19,2137,1071,845.24,2150.31,1086.55,18675,4506,-66.31,16,5,-48.53,6.83,26.50,28.00,18,4,0.07,0.13,0.15,0.11,0.00,0.00,0,0, +1746044925176,19,2149,1083,790.23,2165.42,1093.59,26639,4609,-66.44,16,5,-48.66,6.83,26.00,27.00,19,5,0.08,0.05,0.15,0.11,0.00,0.00,0,0, +1746044926176,19,2137,1023,640.84,2148.63,1035.20,12704,4299,-66.31,16,5,-48.53,6.83,25.00,28.00,19,14,0.13,0.13,0.15,0.11,0.00,0.00,0,0, +1746044927176,19,2137,1143,924.57,2148.70,1150.52,14909,4994,-65.81,16,5,-48.03,6.85,26.00,25.00,18,4,0.07,0.17,0.15,0.11,0.00,0.00,0,0, +1746044928176,19,2149,1023,945.22,2163.42,1034.47,33715,4387,-65.81,16,5,-48.03,6.85,26.00,28.00,19,3,0.08,0.06,0.15,0.11,0.00,0.00,0,0, +1746044929176,19,2137,1083,655.23,2154.65,1098.16,18512,4624,-66.12,16,5,-48.34,6.84,25.50,27.00,18,12,0.14,0.02,0.15,0.11,0.00,0.00,0,0, +1746044930176,19,2137,1083,769.90,2158.67,1140.21,11349,5014,-66.38,16,5,-48.59,6.83,25.50,29.00,19,9,0.05,0.12,0.15,0.11,0.00,0.00,0,0, +1746044931176,19,2149,1083,615.87,2159.64,1045.99,12601,4303,-66.06,16,5,-48.28,6.84,26.50,27.00,19,11,0.14,0.04,0.15,0.11,0.00,0.00,0,0, +1746044932176,19,2137,1083,566.14,2147.45,1091.70,10526,4726,-66.06,16,5,-48.28,6.84,25.00,30.00,18,8,0.07,0.27,0.15,0.11,0.00,0.00,0,0, +1746044933176,19,2137,1083,980.73,2153.93,1097.70,28266,4715,-65.94,16,5,-48.16,6.85,26.50,30.00,18,3,0.15,0.09,0.15,0.11,0.00,0.00,0,0, +1746044934176,19,2149,1023,616.24,2165.39,1032.74,27090,4792,-66.12,16,5,-48.34,6.84,26.50,27.00,18,8,0.05,0.03,0.15,0.11,0.00,0.00,0,0, +1746044935176,19,2137,1083,595.59,2147.94,1093.98,11577,4286,-66.31,16,5,-48.53,6.83,26.50,27.00,19,10,0.15,0.15,0.15,0.11,0.00,0.00,0,0, +1746044936176,19,2137,1083,711.00,2147.70,1090.91,12785,4756,-66.25,16,5,-48.47,6.83,24.50,27.00,18,10,0.06,0.05,0.15,0.11,0.00,0.00,0,0, +1746044937176,19,2149,1083,671.85,2159.86,1093.47,10786,4554,-66.25,16,5,-48.47,6.83,26.50,27.00,19,10,0.14,0.19,0.15,0.11,0.00,0.00,0,0, +1746044938176,19,2137,1071,755.71,2148.13,1091.85,14234,4744,-66.06,16,5,-48.28,6.84,26.00,27.00,18,8,0.07,0.07,0.15,0.11,0.00,0.00,0,0, +1746044939176,19,2137,1095,552.57,2147.94,1097.45,11496,4540,-65.88,16,5,-48.09,6.85,25.50,27.00,18,13,0.16,0.12,0.15,0.11,0.00,0.00,0,0, +1746044940176,19,2149,1071,541.20,2159.71,1091.77,12824,4802,-65.88,16,27,-40.77,43.63,26.50,27.00,18,6,0.06,0.15,0.15,0.11,0.00,0.00,0,0, +1746044941176,19,2137,1035,690.90,2148.15,1040.02,18704,4260,-65.88,16,5,-48.09,6.85,26.50,27.00,17,6,0.15,0.05,0.15,0.11,0.00,0.00,0,0, +1746044942176,19,2137,1071,647.24,2147.90,1089.40,11796,4958,-65.81,16,5,-48.03,6.85,25.50,27.00,17,13,0.05,0.10,0.15,0.11,0.00,0.00,0,0, +1746044943176,19,2149,1143,564.60,2147.72,1152.41,12866,4781,-66.06,16,106,-35.02,199.97,25.00,27.00,19,6,0.11,0.14,0.15,0.11,0.00,0.00,0,0, +1746044944176,19,2137,1023,541.32,2160.10,1035.15,18570,4449,-65.94,16,5,-48.16,6.85,27.00,27.00,18,7,0.09,0.05,0.15,0.11,0.00,0.00,0,0, +1746044945176,19,2137,1083,626.64,2147.74,1092.14,11288,4721,-66.00,16,106,-34.96,200.14,26.00,27.00,19,12,0.11,0.07,0.15,0.11,0.00,0.00,0,0, +1746044946176,19,2149,1083,578.56,2147.60,1094.81,10713,4516,-66.00,16,5,-48.22,6.84,27.00,28.00,19,9,0.14,0.14,0.15,0.11,0.00,0.00,0,0, +1746044947176,19,2137,1023,574.14,2159.90,1034.08,12713,4489,-65.81,16,5,-48.03,6.85,26.00,27.00,18,10,0.09,0.05,0.15,0.11,0.00,0.00,0,0, +1746044948176,19,2137,1083,772.04,2147.68,1093.48,10804,4669,-65.88,16,5,-48.09,6.85,25.50,28.00,19,10,0.11,0.12,0.15,0.11,0.00,0.00,0,0, +1746044949176,19,2137,1083,646.05,2147.56,1092.03,12126,4713,-66.06,16,5,-48.28,6.84,27.00,27.00,18,12,0.08,0.04,0.15,0.11,0.00,0.00,0,0, +1746044950176,19,2149,1083,584.05,2159.61,1093.14,9958,4639,-66.06,16,5,-48.28,6.84,26.00,27.00,19,12,0.11,0.12,0.15,0.11,0.00,0.00,0,0, +1746044951176,19,2137,1083,700.57,2157.70,1094.14,11227,4518,-66.12,16,5,-48.34,6.84,26.50,25.00,19,8,0.14,0.16,0.15,0.11,0.00,0.00,0,0, +1746044952176,19,2149,1071,672.18,2147.98,1093.83,14079,4656,-65.88,16,5,-48.09,6.85,25.50,27.00,18,8,0.10,0.06,0.15,0.11,0.00,0.00,0,0, +1746044953176,19,2137,1023,707.40,2159.80,1039.58,10859,4695,-66.00,16,5,-48.22,6.84,25.00,27.00,19,13,0.10,0.07,0.15,0.11,0.00,0.00,0,0, +1746044954176,19,2137,1143,589.00,2147.94,1146.70,11309,4704,-65.56,16,28,-40.30,45.55,26.50,27.00,18,11,0.09,0.08,0.15,0.11,0.00,0.00,0,0, +1746044955176,19,2149,1023,585.53,2147.78,1034.26,10718,4444,-65.56,16,5,-47.78,6.86,26.00,27.00,19,12,0.09,0.17,0.15,0.11,0.00,0.00,0,0, +1746044956176,19,2137,1083,607.24,2159.78,1092.91,12696,4668,-65.88,16,5,-48.09,6.85,25.50,27.00,18,10,0.10,0.07,0.15,0.11,0.00,0.00,0,0, +1746044957176,19,2137,1083,738.90,2147.67,1092.78,10183,4704,-66.00,16,5,-48.22,6.84,26.00,27.00,19,12,0.11,0.24,0.15,0.11,0.00,0.00,0,0, +1746044958176,19,2149,1083,582.50,2147.78,1093.60,15880,4625,-65.81,16,5,-48.03,6.85,25.50,28.00,18,6,0.11,0.10,0.15,0.11,0.00,0.00,0,0, +1746044959176,19,2137,1023,570.95,2160.19,1033.53,17227,4725,-65.94,16,5,-48.16,6.85,27.50,27.00,19,10,0.07,0.03,0.15,0.11,0.00,0.00,0,0, +1746044960176,19,2137,1083,616.50,2147.86,1098.08,10197,4515,-65.94,16,12,-44.35,17.84,25.50,27.00,19,12,0.14,0.06,0.15,0.11,0.00,0.00,0,0, +1746044961176,19,2149,1131,552.79,2147.83,1143.15,10346,4923,-66.12,16,36,-39.77,59.86,26.00,27.00,17,12,0.07,0.11,0.15,0.11,0.00,0.00,0,0, +1746044962176,19,2137,1023,705.20,2159.73,1033.35,10180,4451,-65.88,16,5,-48.09,6.85,26.50,27.00,19,12,0.10,0.10,0.15,0.11,0.00,0.00,0,0, +1746044963176,19,2137,1083,684.95,2147.76,1093.82,11587,4615,-65.94,16,5,-48.16,6.85,25.50,28.00,18,10,0.12,0.10,0.15,0.11,0.00,0.00,0,0, +1746044964176,19,2137,1083,592.00,2147.75,1091.68,11974,4762,-65.94,16,5,-48.16,6.85,26.50,27.00,20,13,0.04,0.04,0.15,0.11,0.00,0.00,0,0, +1746044965176,19,2149,1095,574.00,2159.73,1104.35,11489,4385,-65.88,16,5,-48.09,6.85,26.50,27.00,18,9,0.14,0.10,0.15,0.11,0.00,0.00,0,0, +1746044966176,19,2137,1071,657.05,2147.90,1091.59,12509,4804,-66.06,16,5,-48.28,6.84,28.00,28.00,18,12,0.06,0.04,0.15,0.11,0.00,0.00,0,0, +1746044967176,19,2137,1023,594.32,2153.30,1084.90,10748,4538,-66.12,16,12,-44.54,17.81,25.50,27.00,19,9,0.11,0.16,0.15,0.11,0.00,0.00,0,0, +1746044968176,19,2149,1143,567.35,2159.75,1103.55,12806,4521,-66.19,16,5,-48.41,6.84,26.50,27.00,19,9,0.13,0.05,0.15,0.11,0.00,0.00,0,0, +1746044969176,19,2137,1023,634.41,2147.58,1033.58,10134,4531,-66.19,16,5,-48.41,6.84,27.00,28.00,18,11,0.07,0.18,0.15,0.11,0.00,0.00,0,0, +1746044970176,19,2137,1083,583.05,2147.71,1091.37,12597,4720,-66.12,16,5,-48.34,6.84,27.00,28.00,18,10,0.11,0.06,0.15,0.11,0.00,0.00,0,0, +1746044971176,19,2149,1083,429.33,2159.79,1092.01,10930,4735,-66.06,16,5,-48.28,6.84,27.50,26.00,19,10,0.07,0.15,0.15,0.11,0.00,0.00,0,0, +1746044972176,19,2137,1083,549.50,2147.70,1094.42,12548,4524,-66.31,16,5,-48.53,6.83,26.50,26.00,19,10,0.14,0.05,0.15,0.11,0.00,0.00,0,0, +1746044973176,19,2137,1083,541.65,2147.48,1093.78,9459,4557,-66.31,16,28,-41.05,45.23,25.50,28.00,18,13,0.14,0.11,0.15,0.11,0.00,0.00,0,0, +1746044974176,19,2149,1023,714.29,2159.77,1033.56,13187,4794,-66.25,16,5,-48.47,6.83,27.00,27.00,18,8,0.05,0.09,0.15,0.11,0.00,0.00,0,0, +1746044975176,19,2137,1083,616.81,2147.74,1098.90,12827,4361,-66.44,16,5,-48.66,6.83,27.50,27.00,17,12,0.12,0.12,0.15,0.11,0.00,0.00,0,0, +1746044976176,19,2137,1071,658.80,2147.73,1089.18,12477,4932,-66.19,16,5,-48.41,6.84,28.50,27.00,19,10,0.04,0.07,0.15,0.11,0.00,0.00,0,0, +1746044977176,19,2149,1083,715.57,2159.50,1093.61,10995,4512,-66.19,16,5,-48.41,6.84,26.50,26.00,19,10,0.08,0.18,0.15,0.11,0.00,0.00,0,0, +1746044978176,19,2137,1083,616.09,2147.56,1099.64,12709,4764,-66.19,16,13,-44.26,19.44,26.00,27.00,19,9,0.11,0.06,0.15,0.11,0.00,0.00,0,0, +1746044979176,19,2137,1083,506.26,2147.55,1087.86,11273,4420,-65.88,16,5,-48.09,6.85,27.00,26.00,18,10,0.10,0.20,0.15,0.11,0.00,0.00,0,0, +1746044980176,19,2149,1023,671.81,2159.91,1039.10,13873,4685,-65.94,16,13,-44.01,19.48,25.50,27.00,19,8,0.07,0.07,0.15,0.11,0.00,0.00,0,0, +1746044981176,19,2137,1083,618.62,2147.50,1089.65,11217,4293,-66.38,16,5,-48.59,6.83,26.50,26.00,19,14,0.11,0.13,0.15,0.11,0.00,0.00,0,0, +1746044982176,19,2137,1083,666.95,2147.84,1094.78,12750,4521,-66.38,16,5,-48.59,6.83,27.00,27.00,18,8,0.16,0.10,0.15,0.11,0.00,0.00,0,0, +1746044983176,19,2149,1083,566.60,2159.75,1091.43,13252,4796,-66.12,16,5,-48.34,6.84,26.00,28.00,18,12,0.07,0.04,0.15,0.11,0.00,0.00,0,0, +1746044984176,19,2137,1083,699.05,2147.49,1098.40,11375,4589,-66.12,16,5,-48.34,6.84,25.50,27.00,18,9,0.16,0.11,0.15,0.11,0.00,0.00,0,0, +1746044985176,19,2137,1083,592.40,2147.65,1091.77,12509,4788,-66.19,16,5,-48.41,6.84,26.00,27.00,18,12,0.06,0.04,0.15,0.11,0.00,0.00,0,0, +1746044986176,19,2149,1023,564.09,2159.85,1035.10,10425,4551,-66.00,16,5,-48.22,6.84,26.00,27.00,19,12,0.14,0.11,0.15,0.11,0.00,0.00,0,0, +1746044987176,19,2137,1083,790.80,2147.36,1092.50,10082,4446,-66.00,16,5,-48.22,6.84,27.50,27.00,18,11,0.09,0.21,0.15,0.11,0.00,0.00,0,0, +1746044988176,19,2137,1083,777.00,2147.80,1092.36,13843,4701,-66.00,16,5,-48.22,6.84,27.00,27.00,19,8,0.10,0.08,0.15,0.11,0.00,0.00,0,0, +1746044989176,19,2149,1083,543.26,2159.82,1092.74,12067,4703,-65.94,16,5,-48.16,6.85,25.50,27.00,18,12,0.08,0.17,0.15,0.11,0.00,0.00,0,0, +1746044990176,19,2137,1071,571.05,2147.97,1092.65,11454,4702,-66.00,16,5,-48.22,6.84,26.00,25.00,19,11,0.11,0.06,0.15,0.11,0.00,0.00,0,0, +1746044991176,19,2137,1083,761.86,2147.56,1094.39,9795,4501,-65.88,16,12,-44.29,17.85,25.50,27.00,19,13,0.13,0.12,0.15,0.11,0.00,0.00,0,0, +1746044992176,19,2149,1071,525.15,2160.01,1081.53,11697,4756,-65.88,16,27,-40.77,43.63,26.00,27.00,18,9,0.07,0.10,0.15,0.11,0.00,0.00,0,0, +1746044993176,19,2137,1035,662.60,2147.52,1093.65,12051,4640,-66.19,16,5,-48.41,6.84,27.50,27.00,19,13,0.09,0.05,0.15,0.11,0.00,0.00,0,0, +1746044994176,19,2137,1143,634.42,2147.94,1103.51,11405,4520,-66.12,16,5,-48.34,6.84,26.50,28.00,19,7,0.14,0.17,0.15,0.11,0.00,0.00,0,0, +1746044995176,19,2149,1023,649.23,2160.04,1033.50,18573,4572,-66.06,16,5,-48.28,6.84,27.00,28.00,18,6,0.06,0.06,0.15,0.11,0.00,0.00,0,0, +1746044996176,19,2137,1083,681.48,2147.94,1094.54,12613,4569,-66.06,16,5,-48.28,6.84,26.50,27.00,19,13,0.11,0.09,0.15,0.11,0.00,0.00,0,0, +1746044997176,19,2137,1083,703.81,2147.66,1093.49,10052,4592,-65.88,16,5,-48.09,6.85,26.00,28.00,17,10,0.14,0.14,0.15,0.11,0.00,0.00,0,0, +1746044998176,19,2149,1071,705.74,2159.86,1089.23,12534,4973,-65.81,16,5,-48.03,6.85,26.50,28.00,18,11,0.05,0.05,0.15,0.11,0.00,0.00,0,0, +1746044999176,19,2137,1083,499.14,2147.89,1084.41,9953,4498,-65.94,16,5,-48.16,6.85,26.50,26.00,19,11,0.11,0.26,0.15,0.11,0.00,0.00,0,0, +1746045000176,19,2137,1071,785.96,2147.67,1092.78,16412,4722,-66.31,16,5,-48.53,6.83,26.00,26.00,18,6,0.08,0.10,0.15,0.11,0.00,0.00,0,0, +1746045001176,19,2149,1083,524.61,2160.04,1093.14,16897,4648,-66.31,16,5,-48.53,6.83,26.50,27.00,19,10,0.10,0.03,0.15,0.11,0.00,0.00,0,0, +1746045002176,19,2137,1035,646.35,2147.30,1036.39,10006,4520,-66.06,16,5,-48.28,6.84,26.00,27.00,19,9,0.13,0.17,0.15,0.11,0.00,0.00,0,0, +1746045003176,19,2137,1071,629.41,2147.82,1093.93,12694,4292,-66.06,16,5,-48.28,6.84,27.00,28.00,19,9,0.10,0.06,0.15,0.11,0.00,0.00,0,0, +1746045004176,19,2149,1083,507.14,2159.71,1094.12,10214,4554,-66.19,16,5,-48.41,6.84,26.50,27.00,18,13,0.14,0.11,0.15,0.11,0.00,0.00,0,0, +1746045005176,19,2137,1143,607.30,2147.82,1151.01,12631,5008,-66.19,16,5,-48.41,6.84,26.00,27.00,19,7,0.05,0.13,0.15,0.11,0.00,0.00,0,0, +1746045006176,19,2137,975,652.62,2147.94,1035.03,15719,4205,-66.19,16,27,-41.08,43.50,26.50,27.00,18,9,0.14,0.04,0.15,0.11,0.00,0.00,0,0, +1746045007176,19,2149,1083,613.82,2159.82,1041.78,10005,4785,-66.00,16,5,-48.22,6.84,26.50,27.00,18,13,0.05,0.13,0.15,0.11,0.00,0.00,0,0, +1746045008176,19,2137,1083,546.16,2147.66,1094.28,10906,4319,-65.81,16,5,-48.03,6.85,25.50,27.00,18,11,0.14,0.08,0.15,0.11,0.00,0.00,0,0, +1746045009176,19,2137,1083,682.52,2147.79,1092.09,10972,4790,-65.88,16,5,-48.09,6.85,27.00,26.00,18,12,0.05,0.06,0.15,0.11,0.00,0.00,0,0, +1746045010176,19,2149,1083,635.52,2159.86,1097.46,12029,4531,-65.88,16,5,-48.09,6.85,26.00,27.00,18,8,0.12,0.13,0.15,0.11,0.00,0.00,0,0, +1746045011176,19,2137,1083,543.19,2147.69,1095.85,13880,4803,-65.75,16,106,-34.71,200.82,25.00,27.00,19,10,0.12,0.04,0.15,0.11,0.00,0.00,0,0, +1746045012176,19,2137,1083,491.89,2147.56,1094.38,11558,4596,-66.19,16,5,-48.41,6.84,27.00,26.00,18,10,0.14,0.10,0.15,0.11,0.00,0.00,0,0, +1746045013176,19,2149,1023,618.35,2159.90,1033.22,12077,4778,-66.00,16,5,-48.22,6.84,27.00,27.00,19,12,0.05,0.07,0.15,0.11,0.00,0.00,0,0, +1746045014176,19,2137,1083,498.20,2147.62,1093.66,10109,4309,-66.00,16,5,-48.22,6.84,26.00,28.00,16,12,0.12,0.10,0.15,0.11,0.00,0.00,0,0, +1746045015176,19,2137,1071,692.65,2147.62,1089.69,10229,4959,-66.19,16,5,-48.41,6.84,27.50,27.00,18,11,0.04,0.15,0.15,0.11,0.00,0.00,0,0, +1746045016176,19,2149,1083,583.18,2159.85,1091.55,11635,4710,-66.19,16,5,-48.41,6.84,28.00,27.00,16,11,0.11,0.07,0.15,0.11,0.00,0.00,0,0, +1746045017176,19,2137,1083,539.68,2147.87,1089.41,11029,4953,-66.00,16,5,-48.22,6.84,26.00,28.00,18,9,0.04,0.16,0.15,0.11,0.00,0.00,0,0, +1746045018176,19,2137,1083,708.91,2147.40,1092.91,12526,4662,-66.62,16,5,-48.84,6.82,27.00,27.00,17,9,0.13,0.06,0.15,0.11,0.00,0.00,0,0, +1746045019176,19,2149,1011,556.00,2159.90,1036.26,11350,4916,-66.62,16,5,-48.84,6.82,26.50,26.00,19,9,0.04,0.23,0.15,0.11,0.00,0.00,0,0, +1746045020176,19,2137,1143,643.63,2148.06,1148.22,17929,4521,-66.44,16,12,-44.85,17.77,26.00,26.00,19,6,0.12,0.08,0.15,0.11,0.00,0.00,0,0, +1746045021176,19,2137,1083,583.47,2147.92,1091.73,15425,4777,-66.19,16,28,-40.92,45.29,26.00,25.00,18,12,0.08,0.03,0.15,0.11,0.00,0.00,0,0, +1746045022176,19,2149,1023,578.48,2159.72,1034.51,10255,4441,-66.12,16,5,-48.34,6.84,25.50,26.00,19,9,0.10,0.18,0.15,0.11,0.00,0.00,0,0, +1746045023176,19,2137,1083,628.37,2147.98,1092.61,14230,4699,-66.12,16,5,-48.34,6.84,26.00,27.00,18,8,0.08,0.06,0.15,0.11,0.00,0.00,0,0, +1746045024176,19,2137,1083,748.86,2147.82,1092.74,11248,4699,-66.12,16,5,-48.34,6.84,26.00,29.00,19,12,0.11,0.20,0.15,0.11,0.00,0.00,0,0, +1746045025176,19,2149,1071,562.73,2159.98,1092.90,12702,4646,-66.00,16,5,-48.22,6.84,26.00,27.00,18,9,0.10,0.08,0.15,0.11,0.00,0.00,0,0, +1746045026176,19,2137,1083,535.52,2147.62,1092.53,11306,4703,-65.81,16,5,-48.03,6.85,24.50,30.00,19,12,0.10,0.07,0.15,0.11,0.00,0.00,0,0, +1746045027176,19,2137,1083,734.09,2147.87,1093.67,10133,4650,-65.75,16,5,-47.97,6.85,25.50,30.00,18,12,0.10,0.09,0.15,0.11,0.00,0.00,0,0, +1746045028176,19,2149,1023,622.67,2159.71,1038.95,10155,4711,-65.75,16,12,-44.17,17.86,25.00,28.00,19,12,0.10,0.09,0.15,0.11,0.00,0.00,0,0, +1746045029176,19,2137,1083,680.33,2147.92,1087.16,10761,4514,-65.69,16,5,-47.91,6.86,25.50,27.00,18,11,0.07,0.14,0.15,0.11,0.00,0.00,0,0, +1746045030176,19,2137,1083,692.22,2147.70,1094.09,11527,4620,-65.75,16,5,-47.97,6.85,25.50,27.00,19,11,0.13,0.05,0.15,0.11,0.00,0.00,0,0, +1746045031176,19,2149,1083,612.10,2147.66,1091.79,10654,4752,-65.94,16,5,-48.16,6.85,25.50,28.00,18,8,0.07,0.19,0.15,0.11,0.00,0.00,0,0, +1746045032176,19,2137,1083,607.05,2160.10,1093.66,18369,4621,-66.06,16,5,-48.28,6.84,25.00,27.00,19,6,0.14,0.07,0.15,0.11,0.00,0.00,0,0, +1746045033176,19,2137,1071,801.67,2147.82,1092.72,13477,4648,-66.06,16,5,-48.28,6.84,24.50,27.00,18,13,0.10,0.05,0.15,0.11,0.00,0.00,0,0, +1746045034176,19,2149,1083,706.44,2147.54,1092.87,11695,4684,-66.06,16,5,-48.28,6.84,26.50,28.00,19,9,0.11,0.09,0.15,0.11,0.00,0.00,0,0, +1746045035176,19,2137,1023,660.95,2159.73,1034.62,11854,4426,-66.00,16,5,-48.22,6.84,27.00,28.00,18,13,0.13,0.13,0.15,0.11,0.00,0.00,0,0, +1746045036176,19,2137,1083,955.57,2147.84,1091.99,13917,4766,-65.81,16,5,-48.03,6.85,26.00,30.00,19,7,0.06,0.10,0.15,0.11,0.00,0.00,0,0, +1746045037176,19,2149,1083,576.74,2159.91,1093.42,14924,4625,-65.81,16,5,-48.03,6.85,26.00,27.00,18,11,0.12,0.03,0.15,0.11,0.00,0.00,0,0, +1746045038176,19,2137,1083,587.20,2147.52,1091.60,10671,4804,-65.69,16,5,-47.91,6.86,26.00,27.00,19,8,0.05,0.16,0.15,0.11,0.00,0.00,0,0, +1746045039176,19,2137,1083,810.09,2147.79,1094.57,14117,4581,-65.88,16,5,-48.09,6.85,25.50,27.00,18,8,0.13,0.05,0.15,0.11,0.00,0.00,0,0, +1746045040176,19,2149,1083,647.95,2159.47,1092.30,10540,4775,-65.88,16,12,-44.29,17.85,25.50,27.00,19,11,0.05,0.18,0.15,0.11,0.00,0.00,0,0, +1746045041177,19,2137,1023,596.80,2148.03,1036.20,12786,4355,-66.00,16,5,-48.22,6.84,26.00,27.00,18,10,0.13,0.06,0.15,0.11,0.00,0.00,0,0, +1746045042176,19,2137,1131,554.29,2147.96,1150.65,10842,4986,-66.00,16,5,-48.22,6.84,26.00,28.00,19,12,0.07,0.08,0.15,0.11,0.00,0.00,0,0, +1746045043176,19,2149,1035,400.48,2147.48,1036.13,10143,4519,-66.12,16,5,-48.34,6.84,27.00,27.00,19,12,0.14,0.13,0.15,0.11,0.00,0.00,0,0, +1746045044176,19,2137,1071,611.52,2166.08,1093.07,11748,4413,-66.25,16,5,-48.47,6.83,27.50,27.00,18,10,0.09,0.10,0.15,0.11,0.00,0.00,0,0, +1746045045176,19,2137,1083,705.55,2147.53,1093.13,11578,4697,-66.19,16,5,-48.41,6.84,26.50,27.00,19,13,0.10,0.07,0.15,0.11,0.00,0.00,0,0, +1746045046176,19,2137,1083,715.62,2147.83,1093.71,12576,4562,-66.19,16,5,-48.41,6.84,26.00,26.00,18,8,0.12,0.10,0.15,0.11,0.00,0.00,0,0, +1746045047176,19,2149,1083,527.71,2159.83,1091.88,13348,4757,-66.12,16,106,-35.08,199.81,25.00,27.00,19,12,0.07,0.04,0.15,0.11,0.00,0.00,0,0, +1746045048176,19,2137,1023,578.67,2147.54,1041.73,9850,4537,-66.19,16,5,-48.41,6.84,26.00,28.00,19,10,0.13,0.18,0.15,0.11,0.00,0.00,0,0, +1746045049176,19,2149,1083,584.00,2147.64,1086.78,12620,4748,-66.12,16,5,-48.34,6.84,26.00,27.00,18,9,0.06,0.06,0.15,0.11,0.00,0.00,0,0, +1746045050176,19,2137,1083,644.00,2159.59,1093.33,10808,4371,-66.00,16,5,-48.22,6.84,26.50,27.00,19,11,0.09,0.17,0.15,0.11,0.00,0.00,0,0, +1746045051176,19,2137,1083,664.20,2147.74,1092.47,12715,4690,-66.00,16,5,-48.22,6.84,26.50,26.00,18,10,0.08,0.06,0.15,0.11,0.00,0.00,0,0, +1746045052176,19,2137,1083,604.14,2147.90,1093.13,10570,4671,-66.00,16,5,-48.22,6.84,26.50,27.00,19,12,0.10,0.16,0.15,0.11,0.00,0.00,0,0, +1746045053176,19,2149,1083,595.38,2159.97,1094.46,11868,4519,-66.00,16,5,-48.22,6.84,25.50,27.00,19,11,0.12,0.07,0.15,0.11,0.00,0.00,0,0, +1746045054176,19,2137,1071,612.26,2147.30,1093.90,10134,4567,-65.88,16,5,-48.09,6.85,26.50,27.00,18,13,0.14,0.11,0.15,0.11,0.00,0.00,0,0, +1746045055176,19,2137,1083,468.61,2147.93,1091.74,12004,4809,-65.94,16,5,-48.16,6.85,26.50,26.00,18,9,0.05,0.09,0.15,0.11,0.00,0.00,0,0, +1746045056176,19,2149,1023,663.71,2159.74,1035.58,11911,4301,-65.94,16,5,-48.16,6.85,27.00,27.00,19,13,0.12,0.09,0.15,0.11,0.00,0.00,0,0, +1746045057176,19,2137,1083,637.00,2147.94,1094.86,14052,4533,-66.19,16,5,-48.41,6.84,28.00,27.00,19,7,0.11,0.11,0.15,0.11,0.00,0.00,0,0, +1746045058176,19,2137,1083,586.73,2147.75,1092.90,15192,4689,-66.00,16,5,-48.22,6.84,27.50,27.00,18,10,0.08,0.04,0.15,0.11,0.00,0.00,0,0, +1746045059176,19,2149,1083,675.80,2159.84,1093.05,10997,4667,-66.19,16,5,-48.41,6.84,26.50,27.00,19,9,0.09,0.14,0.15,0.11,0.00,0.00,0,0, +1746045060176,19,2137,1083,550.80,2147.79,1093.58,12950,4562,-66.19,16,5,-48.41,6.84,26.50,26.00,18,10,0.14,0.05,0.15,0.11,0.00,0.00,0,0, +1746045061176,19,2137,1023,554.40,2147.75,1038.33,10918,4786,-65.88,16,5,-48.09,6.85,26.00,28.00,19,9,0.05,0.14,0.15,0.11,0.00,0.00,0,0, +1746045062176,19,2149,1083,586.62,2159.74,1088.18,12632,4592,-65.94,16,5,-48.16,6.85,27.00,27.00,19,9,0.12,0.05,0.15,0.11,0.00,0.00,0,0, +1746045063176,19,2137,1083,877.32,2147.56,1092.74,10474,4438,-66.06,16,5,-48.28,6.84,27.00,27.00,18,12,0.09,0.06,0.15,0.11,0.00,0.00,0,0, +1746045064176,19,2137,1131,667.95,2147.75,1151.05,10256,4883,-65.94,16,5,-48.16,6.85,26.50,27.00,19,12,0.09,0.09,0.15,0.11,0.00,0.00,0,0, +1746045065176,19,2149,1035,571.95,2159.42,1036.44,9998,4291,-65.94,16,5,-48.16,6.85,26.50,27.00,19,12,0.14,0.10,0.15,0.11,0.00,0.00,0,0, +1746045066176,19,2137,1071,572.45,2147.62,1093.42,10044,4680,-66.06,16,5,-48.28,6.84,26.50,27.00,18,12,0.08,0.13,0.15,0.11,0.00,0.00,0,0, +1746045067176,19,2137,1083,732.41,2147.61,1092.86,10975,4658,-65.94,16,5,-48.16,6.85,28.00,26.00,19,10,0.10,0.13,0.15,0.11,0.00,0.00,0,0, +1746045068176,19,2149,1023,558.14,2159.70,1036.10,12362,4545,-66.00,16,5,-48.22,6.84,25.50,26.00,18,12,0.15,0.04,0.15,0.11,0.00,0.00,0,0, +1746045069176,19,2137,1083,654.47,2147.47,1091.38,9193,4554,-66.00,16,5,-48.22,6.84,27.00,27.00,18,13,0.06,0.13,0.15,0.11,0.00,0.00,0,0, +1746045070176,19,2137,1143,682.95,2147.76,1152.19,10028,4827,-66.06,16,5,-48.28,6.84,25.50,29.00,19,11,0.12,0.18,0.15,0.11,0.00,0.00,0,0, +1746045071176,19,2149,1011,555.14,2159.68,1028.56,12635,4780,-65.94,16,5,-48.16,6.85,28.00,27.00,14,10,0.11,0.06,0.15,0.11,0.00,0.00,0,0, +1746045072176,19,2137,1083,621.00,2158.83,1082.94,11563,5410,-65.94,16,5,-48.16,6.85,25.50,28.00,16,13,0.04,0.13,0.15,0.11,0.00,0.00,0,0, +1746045073176,19,2137,1071,794.42,2147.87,1091.16,13933,4695,-66.12,16,5,-48.34,6.84,26.50,26.00,15,7,0.16,0.11,0.15,0.11,0.00,0.00,0,0, +1746045074176,19,2149,1083,731.59,2159.91,1085.33,15261,5196,-66.12,16,5,-48.34,6.84,27.50,25.00,15,10,0.06,0.04,0.15,0.11,0.00,0.00,0,0, +1746045075176,19,2137,1083,672.35,2147.86,1103.86,10684,4671,-66.38,16,5,-48.59,6.83,27.00,23.00,19,12,0.16,0.14,0.15,0.11,0.00,0.00,0,0, +1746045076176,19,2137,1083,598.36,2147.64,1091.59,10811,4768,-66.19,16,5,-48.41,6.84,27.50,24.00,18,9,0.06,0.14,0.15,0.11,0.00,0.00,0,0, +1746045077176,19,2149,1095,470.30,2159.73,1101.21,12676,4492,-66.38,16,5,-48.59,6.83,26.50,25.00,19,10,0.15,0.05,0.15,0.11,0.00,0.00,0,0, +1746045078176,19,2137,1023,537.48,2147.96,1035.76,11707,4293,-66.38,16,5,-48.59,6.83,28.00,24.00,19,7,0.10,0.16,0.15,0.11,0.00,0.00,0,0, +1746045079176,19,2137,1083,527.22,2147.90,1093.86,15867,4526,-66.25,16,5,-48.47,6.83,26.50,26.00,19,7,0.07,0.06,0.15,0.11,0.00,0.00,0,0, +1746045080176,19,2149,1035,597.05,2159.61,1095.54,11489,4372,-66.50,16,5,-48.72,6.82,27.50,26.00,19,13,0.16,0.20,0.16,0.11,0.00,0.00,0,0, +1746045081176,19,2137,1131,507.45,2148.06,1101.36,12615,4782,-66.38,16,5,-48.59,6.83,26.50,26.00,18,9,0.06,0.08,0.16,0.11,0.00,0.00,0,0, +1746045082176,19,2137,1035,553.95,2147.93,1040.66,11492,4256,-66.25,16,5,-48.47,6.83,26.50,26.00,19,13,0.17,0.06,0.16,0.11,0.00,0.00,0,0, +1746045083176,19,2149,1083,730.10,2159.66,1089.90,11164,4886,-66.25,16,5,-48.47,6.83,27.50,27.00,17,7,0.07,0.16,0.16,0.11,0.00,0.00,0,0, +1746045084176,19,2137,1083,558.71,2148.10,1102.10,16442,4594,-66.19,16,5,-48.41,6.84,27.00,27.00,20,7,0.11,0.05,0.16,0.11,0.00,0.00,0,0, +1746045085176,19,2137,1095,702.80,2147.61,1099.92,10818,4562,-66.44,16,5,-48.66,6.83,27.00,26.00,18,13,0.12,0.10,0.16,0.11,0.00,0.00,0,0, +1746045086176,19,2149,1071,554.35,2159.81,1091.85,11431,4754,-66.25,16,12,-44.67,17.80,26.00,27.00,19,10,0.06,0.09,0.16,0.11,0.00,0.00,0,0, +1746045087176,19,2137,1023,626.32,2147.80,1033.14,11748,4396,-66.31,16,5,-48.53,6.83,27.50,27.00,18,14,0.11,0.05,0.16,0.11,0.00,0.00,0,0, +1746045088176,19,2137,1083,603.59,2147.42,1094.90,11236,4711,-66.31,16,5,-48.53,6.83,25.00,27.00,20,9,0.07,0.11,0.16,0.11,0.00,0.00,0,0, +1746045089176,19,2149,1083,598.17,2159.78,1090.97,12385,4666,-66.12,16,5,-48.34,6.84,25.00,27.00,16,12,0.11,0.04,0.16,0.11,0.00,0.00,0,0, +1746045090176,19,2137,1083,714.57,2147.78,1089.37,9496,4915,-66.06,16,5,-48.28,6.84,26.50,27.00,19,11,0.04,0.16,0.16,0.11,0.00,0.00,0,0, +1746045091176,19,2137,1083,568.05,2147.50,1093.69,11403,4603,-66.19,16,5,-48.41,6.84,26.00,27.00,18,11,0.12,0.06,0.16,0.11,0.00,0.00,0,0, +1746045092176,19,2149,1011,641.90,2159.61,1038.34,10128,4753,-66.19,16,5,-48.41,6.84,25.50,27.00,19,12,0.05,0.08,0.16,0.11,0.00,0.00,0,0, +1746045093176,19,2137,1143,600.71,2147.78,1147.54,11193,4536,-65.88,16,12,-44.29,17.85,26.00,27.00,19,10,0.12,0.12,0.16,0.11,0.00,0.00,0,0, +1746045094176,19,2137,1083,676.05,2147.87,1091.98,12274,4747,-66.12,16,28,-40.86,45.31,26.50,27.00,18,12,0.07,0.05,0.16,0.11,0.00,0.00,0,0, +1746045095176,19,2149,1035,594.10,2159.82,1046.34,12234,4260,-66.25,16,5,-48.47,6.83,25.50,27.00,20,8,0.14,0.11,0.16,0.11,0.00,0.00,0,0, +1746045096176,19,2137,1083,643.26,2147.50,1094.02,13354,4747,-66.00,16,5,-48.22,6.84,28.00,25.00,18,11,0.07,0.04,0.16,0.11,0.00,0.00,0,0, +1746045097176,19,2137,1083,672.00,2147.79,1093.51,10264,4587,-66.00,16,106,-34.96,200.14,26.00,27.00,19,11,0.11,0.13,0.16,0.11,0.00,0.00,0,0, +1746045098176,19,2149,1083,696.75,2159.61,1094.39,11390,4595,-66.19,16,27,-41.08,43.50,26.50,27.00,18,12,0.12,0.05,0.16,0.11,0.00,0.00,0,0, +1746045099176,19,2137,1083,440.80,2147.68,1091.62,10045,4763,-66.38,16,5,-48.59,6.83,26.50,27.00,19,12,0.06,0.13,0.16,0.11,0.00,0.00,0,0, +1746045100176,19,2137,1023,671.17,2147.64,1036.68,12313,4295,-66.44,16,5,-48.66,6.83,26.50,28.00,19,10,0.08,0.07,0.16,0.11,0.00,0.00,0,0, +1746045101176,19,2149,1083,631.05,2159.55,1093.49,10953,4501,-66.44,16,5,-48.66,6.83,27.00,27.00,19,12,0.15,0.08,0.16,0.11,0.00,0.00,0,0, +1746045102176,19,2137,1083,636.29,2147.75,1099.31,10971,4729,-66.19,16,5,-48.41,6.84,25.00,26.00,19,9,0.15,0.15,0.16,0.11,0.00,0.00,0,0, +1746045103176,19,2137,1071,660.61,2147.71,1086.86,12508,4565,-66.19,16,5,-48.41,6.84,26.50,27.00,18,9,0.06,0.05,0.16,0.11,0.00,0.00,0,0, +1746045104176,19,2149,1059,629.74,2159.91,1062.28,10709,4248,-66.31,16,5,-48.53,6.83,27.00,28.00,20,12,0.13,0.12,0.16,0.11,0.00,0.00,0,0, +1746045105176,19,2137,1083,506.22,2147.50,1090.87,11173,4776,-66.12,16,5,-48.34,6.84,26.50,28.00,17,10,0.08,0.11,0.16,0.11,0.00,0.00,0,0, +1746045106176,19,2137,1071,625.00,2147.48,1091.91,11915,4787,-66.12,16,5,-48.34,6.84,27.50,28.00,19,13,0.11,0.05,0.16,0.11,0.00,0.00,0,0, +1746045107176,19,2149,1083,703.68,2159.53,1093.95,9393,4525,-65.94,16,5,-48.16,6.85,27.00,27.00,19,12,0.11,0.14,0.16,0.11,0.00,0.00,0,0, +1746045108176,19,2137,1083,649.16,2147.49,1095.06,10365,4512,-65.94,16,5,-48.16,6.85,27.50,26.00,19,11,0.13,0.13,0.16,0.11,0.00,0.00,0,0, +1746045109176,19,2137,1035,800.52,2147.65,1045.44,11265,4998,-66.06,16,5,-48.28,6.84,24.50,27.00,16,11,0.08,0.05,0.16,0.11,0.00,0.00,0,0, +1746045110176,19,2149,1083,532.71,2159.38,1093.77,10467,4514,-66.06,16,5,-48.28,6.84,27.00,27.00,20,8,0.11,0.22,0.16,0.11,0.00,0.00,0,0, +1746045111176,19,2137,1083,827.25,2152.42,1097.01,20812,4642,-66.31,16,5,-48.53,6.83,28.00,27.00,17,5,0.10,0.08,0.16,0.11,0.00,0.00,0,0, +1746045112176,19,2137,1083,581.90,2149.90,1090.28,16577,4859,-66.12,16,106,-35.08,199.81,25.50,24.00,19,12,0.12,0.03,0.16,0.11,0.00,0.00,0,0, +1746045113176,19,2149,1083,604.58,2147.60,1089.68,10296,4892,-65.94,16,5,-48.16,6.85,25.00,27.00,15,10,0.11,0.18,0.16,0.11,0.00,0.00,0,0, +1746045114176,19,2137,1071,477.71,2159.70,1085.67,12475,5117,-65.94,16,5,-48.16,6.85,26.00,28.00,18,9,0.04,0.06,0.16,0.11,0.00,0.00,0,0, +1746045115176,19,2137,1083,628.38,2147.81,1094.35,10955,4587,-65.94,16,5,-48.16,6.85,25.00,27.00,18,13,0.14,0.14,0.16,0.11,0.00,0.00,0,0, +1746045116176,19,2149,1023,642.09,2159.60,1032.98,12163,4778,-65.94,16,5,-48.16,6.85,27.00,27.00,19,9,0.05,0.08,0.16,0.11,0.00,0.00,0,0, +1746045117176,19,2137,1083,376.39,2147.52,1093.40,11155,4405,-65.75,16,5,-47.97,6.85,26.50,27.00,18,14,0.10,0.12,0.16,0.11,0.00,0.00,0,0, +1746045118176,19,2137,1071,556.90,2147.65,1092.62,11779,4718,-65.81,16,5,-48.03,6.85,25.00,27.00,19,9,0.07,0.09,0.16,0.11,0.00,0.00,0,0, +1746045119176,19,2149,1083,551.70,2147.68,1093.19,11731,4597,-65.75,16,5,-47.97,6.85,25.50,28.00,18,13,0.13,0.06,0.16,0.11,0.00,0.00,0,0, +1746045120176,19,2137,1083,551.89,2165.53,1091.66,14086,4764,-65.75,16,5,-47.97,6.85,26.50,27.00,19,6,0.07,0.13,0.16,0.11,0.00,0.00,0,0, +1746045121176,19,2137,1083,735.61,2148.33,1092.00,18716,4719,-66.06,16,5,-48.28,6.84,25.50,28.00,17,7,0.11,0.05,0.16,0.11,0.00,0.00,0,0, +1746045122176,19,2149,1023,608.15,2147.70,1036.86,10785,4901,-66.19,16,5,-48.41,6.84,25.00,31.00,19,12,0.06,0.23,0.16,0.11,0.00,0.00,0,0, +1746045123176,19,2137,1083,608.10,2159.74,1089.70,13570,4530,-66.00,16,5,-48.22,6.84,27.00,27.00,19,8,0.15,0.08,0.16,0.11,0.00,0.00,0,0, +1746045124176,19,2137,1131,774.00,2147.75,1152.21,12214,4662,-66.00,16,28,-40.74,45.36,26.00,27.00,18,13,0.11,0.06,0.16,0.11,0.00,0.00,0,0, +1746045125176,19,2149,1023,517.62,2147.84,1034.56,14035,4459,-66.25,16,5,-48.47,6.83,28.00,27.00,20,6,0.07,0.13,0.16,0.11,0.00,0.00,0,0, +1746045126176,19,2137,1095,645.18,2159.94,1096.76,18543,4741,-66.31,16,5,-48.53,6.83,27.00,27.00,15,7,0.12,0.05,0.16,0.11,0.00,0.00,0,0, +1746045127176,19,2137,1071,597.30,2147.74,1086.11,11628,5172,-66.19,16,5,-48.41,6.84,26.00,27.00,17,10,0.04,0.19,0.16,0.11,0.00,0.00,0,0, +1746045128176,19,2149,1083,655.41,2147.75,1093.49,13920,4790,-66.19,16,106,-35.14,199.64,25.00,27.00,19,8,0.12,0.07,0.16,0.11,0.00,0.00,0,0, +1746045129176,19,2137,1023,655.85,2159.77,1032.80,11780,4618,-66.19,16,5,-48.41,6.84,26.00,26.00,18,12,0.07,0.13,0.16,0.11,0.00,0.00,0,0, +1746045130176,19,2137,1131,736.95,2170.99,1149.30,11265,4658,-66.12,16,5,-48.34,6.84,26.00,27.00,16,8,0.16,0.18,0.16,0.11,0.00,0.00,0,0, +1746045131176,19,2149,1083,465.78,2147.52,1089.56,15650,4969,-66.38,16,36,-40.02,59.71,26.00,27.00,16,7,0.06,0.06,0.16,0.11,0.00,0.00,0,0, +1746045132176,19,2137,1035,556.95,2159.74,1042.58,11943,4256,-66.31,16,5,-48.53,6.83,28.00,27.00,20,12,0.15,0.08,0.16,0.11,0.00,0.00,0,0, +1746045133176,19,2137,1071,635.64,2147.76,1092.29,10336,4719,-66.31,16,5,-48.53,6.83,26.00,26.00,18,11,0.06,0.16,0.16,0.11,0.00,0.00,0,0, +1746045134176,19,2137,1083,561.89,2147.53,1093.66,12373,4591,-66.19,16,5,-48.41,6.84,26.50,27.00,19,10,0.13,0.06,0.16,0.11,0.00,0.00,0,0, +1746045135176,19,2149,1083,660.10,2159.70,1091.86,10525,4791,-66.00,16,5,-48.22,6.84,27.00,27.00,17,11,0.10,0.26,0.16,0.11,0.00,0.00,0,0, +1746045136176,19,2137,1083,598.42,2147.89,1090.18,16569,4842,-65.81,16,5,-48.03,6.85,25.50,27.00,19,6,0.05,0.10,0.16,0.11,0.00,0.00,0,0, +1746045137176,19,2137,1083,540.25,2147.75,1093.89,16665,4594,-66.06,16,27,-40.96,43.55,25.50,27.00,18,10,0.12,0.03,0.16,0.11,0.00,0.00,0,0, +1746045138176,19,2149,1023,612.75,2159.78,1033.76,9995,4744,-66.06,16,5,-48.28,6.84,26.00,27.00,19,12,0.06,0.14,0.16,0.11,0.00,0.00,0,0, +1746045139176,19,2137,1071,829.67,2147.72,1093.78,10307,4393,-66.00,16,5,-48.22,6.84,27.00,28.00,18,12,0.12,0.10,0.16,0.11,0.00,0.00,0,0, +1746045140176,19,2137,1083,664.75,2147.82,1091.91,10182,4792,-66.00,16,5,-48.22,6.84,26.50,27.00,19,12,0.07,0.09,0.16,0.11,0.00,0.00,0,0, +1746045141176,19,2149,1083,612.70,2159.64,1093.64,10211,4616,-65.88,16,5,-48.09,6.85,26.50,27.00,18,12,0.12,0.08,0.16,0.11,0.00,0.00,0,0, +1746045142176,19,2137,1083,747.67,2147.56,1091.66,9950,4776,-65.88,16,5,-48.09,6.85,26.00,27.00,19,12,0.07,0.10,0.16,0.11,0.00,0.00,0,0, +1746045143176,19,2137,1083,548.16,2147.66,1094.38,10023,4514,-65.94,16,5,-48.16,6.85,26.00,28.00,19,12,0.14,0.13,0.16,0.11,0.00,0.00,0,0, +1746045144176,19,2149,1083,622.05,2159.58,1093.99,10899,4521,-65.81,16,5,-48.03,6.85,25.50,26.00,19,11,0.14,0.10,0.16,0.11,0.00,0.00,0,0, +1746045145176,19,2137,1023,733.14,2147.66,1033.86,11065,4521,-66.19,16,5,-48.41,6.84,26.00,28.00,18,13,0.08,0.05,0.16,0.11,0.00,0.00,0,0, +1746045146176,19,2137,1083,736.91,2147.64,1092.42,10774,4645,-66.12,16,5,-48.34,6.84,27.00,29.00,19,10,0.12,0.12,0.16,0.11,0.00,0.00,0,0, +1746045147176,19,2149,1083,606.00,2159.81,1092.73,12412,4720,-66.12,16,5,-48.34,6.84,27.00,27.00,18,12,0.07,0.04,0.16,0.11,0.00,0.00,0,0, +1746045148176,19,2137,1071,532.27,2147.82,1093.51,10021,4614,-66.00,16,5,-48.22,6.84,27.50,27.00,19,11,0.11,0.12,0.16,0.11,0.00,0.00,0,0, +1746045149176,19,2137,1083,595.00,2147.74,1093.06,11197,4647,-66.12,16,5,-48.34,6.84,27.50,27.00,18,12,0.10,0.06,0.16,0.11,0.00,0.00,0,0, +1746045150176,19,2149,1083,741.95,2159.61,1092.73,10084,4727,-66.06,16,5,-48.28,6.84,27.50,27.00,19,12,0.08,0.14,0.16,0.11,0.00,0.00,0,0, +1746045151176,19,2137,1083,747.57,2147.93,1094.27,11300,4529,-66.19,16,5,-48.41,6.84,26.00,27.00,19,8,0.13,0.16,0.16,0.11,0.00,0.00,0,0, +1746045152176,19,2137,1023,585.38,2147.70,1035.78,13901,4537,-66.19,16,5,-48.41,6.84,27.00,27.00,18,8,0.17,0.06,0.16,0.11,0.00,0.00,0,0, +1746045153176,19,2149,1083,596.62,2159.66,1091.18,11379,4574,-65.81,16,5,-48.03,6.85,27.00,27.00,18,10,0.06,0.19,0.16,0.11,0.00,0.00,0,0, +1746045154176,19,2137,1083,624.20,2148.09,1094.45,14230,4581,-65.88,16,5,-48.09,6.85,27.50,27.00,19,8,0.14,0.07,0.16,0.11,0.00,0.00,0,0, +1746045155176,19,2137,1083,535.84,2147.54,1090.97,10838,4798,-65.81,16,5,-48.03,6.85,25.50,27.00,18,13,0.06,0.22,0.16,0.11,0.00,0.00,0,0, +1746045156176,19,2149,1083,516.60,2159.88,1093.62,12353,4554,-65.81,16,5,-48.03,6.85,26.00,27.00,18,9,0.15,0.08,0.16,0.11,0.00,0.00,0,0, +1746045157176,19,2137,1071,613.94,2147.66,1091.41,11255,4793,-65.75,16,5,-47.97,6.85,25.00,28.00,18,13,0.06,0.08,0.16,0.11,0.00,0.00,0,0, +1746045158176,19,2137,1035,602.00,2147.74,1041.77,12241,4751,-65.88,16,5,-48.09,6.85,26.50,27.00,15,9,0.14,0.09,0.16,0.11,0.00,0.00,0,0, +1746045159176,19,2149,1071,495.73,2159.77,1087.94,11780,5197,-65.81,16,5,-48.03,6.85,25.00,27.00,15,13,0.05,0.14,0.16,0.11,0.00,0.00,0,0, +1746045160176,19,2137,1143,670.32,2147.83,1150.74,13876,4683,-66.31,16,5,-48.53,6.83,26.00,28.00,19,7,0.11,0.10,0.16,0.11,0.00,0.00,0,0, +1746045161176,19,2137,1023,758.67,2147.78,1033.84,15141,4453,-66.31,16,5,-48.53,6.83,26.00,28.00,18,9,0.12,0.05,0.16,0.11,0.00,0.00,0,0, +1746045162176,19,2149,1083,561.57,2159.78,1091.75,11439,4810,-66.31,16,5,-48.53,6.83,27.00,27.00,18,12,0.05,0.13,0.16,0.11,0.00,0.00,0,0, +1746045163176,19,2137,1083,726.00,2147.58,1093.75,10242,4551,-66.00,16,106,-34.96,200.14,26.00,26.00,19,10,0.11,0.16,0.16,0.11,0.00,0.00,0,0, +1746045164176,19,2137,1083,690.45,2147.54,1092.68,12591,4733,-66.19,16,5,-48.41,6.84,27.00,26.00,18,10,0.07,0.06,0.16,0.11,0.00,0.00,0,0, +1746045165176,19,2149,1023,710.09,2159.78,1083.70,10499,4623,-66.19,16,12,-44.60,17.81,25.50,27.00,19,12,0.11,0.09,0.16,0.11,0.00,0.00,0,0, +1746045166176,19,2137,1071,667.25,2147.42,1042.83,11547,4408,-66.12,16,5,-48.34,6.84,26.50,27.00,17,10,0.12,0.08,0.16,0.11,0.00,0.00,0,0, +1746045167176,19,2137,1083,730.00,2147.52,1089.68,10666,4944,-66.31,16,5,-48.53,6.83,27.00,27.00,19,13,0.04,0.20,0.16,0.11,0.00,0.00,0,0, +1746045168176,19,2149,1083,850.69,2158.94,1092.03,17379,4606,-66.31,16,5,-48.53,6.83,25.50,27.00,18,4,0.11,0.14,0.16,0.11,0.00,0.00,0,0, +1746045169176,19,2137,1131,879.95,2157.25,1151.49,27045,4931,-65.93,15,5,-48.15,6.85,25.00,27.00,19,4,0.08,0.05,0.16,0.11,0.00,0.00,0,0, +1746045170176,19,2137,1035,777.43,2148.35,1035.41,13798,4390,-65.93,15,5,-48.15,6.85,27.00,27.00,18,13,0.11,0.10,0.16,0.11,0.00,0.00,0,0, +1746045171176,19,2149,1023,614.15,2160.02,1036.69,10721,4701,-66.19,16,5,-48.41,6.84,26.00,27.00,20,8,0.06,0.16,0.16,0.11,0.00,0.00,0,0, +1746045172176,19,2137,1083,671.35,2147.74,1101.06,14140,4352,-66.12,16,5,-48.34,6.84,26.50,27.00,16,8,0.13,0.06,0.16,0.11,0.00,0.00,0,0, +1746045173176,19,2137,1083,722.48,2147.59,1089.42,10516,4963,-66.12,16,5,-48.34,6.84,26.50,27.00,17,12,0.05,0.30,0.16,0.11,0.00,0.00,0,0, +1746045174176,19,2149,1095,787.83,2161.29,1102.82,17151,4522,-66.12,16,5,-48.34,6.84,25.00,27.00,17,5,0.15,0.11,0.16,0.11,0.00,0.00,0,0, +1746045175176,19,2137,1071,597.16,2153.22,1089.43,20556,4962,-66.19,16,5,-48.41,6.84,26.50,28.00,17,8,0.05,0.04,0.16,0.11,0.00,0.00,0,0, +1746045176176,19,2137,1023,600.29,2147.74,1040.19,10794,4549,-66.06,16,5,-48.28,6.84,26.00,26.00,19,12,0.13,0.17,0.16,0.11,0.00,0.00,0,0, +1746045177176,19,2149,1131,616.00,2159.70,1135.42,14277,4755,-66.12,16,106,-35.08,199.81,25.50,27.00,18,7,0.08,0.09,0.16,0.11,0.00,0.00,0,0, +1746045178176,19,2137,1035,562.95,2147.97,1043.26,14407,4405,-65.88,16,5,-48.09,6.85,25.50,27.00,19,12,0.12,0.03,0.16,0.11,0.00,0.00,0,0, +1746045179176,19,2137,1131,496.40,2147.61,1151.94,10875,4938,-65.88,16,28,-40.61,45.42,25.50,26.00,18,11,0.09,0.09,0.16,0.11,0.00,0.00,0,0, +1746045180176,19,2149,1023,626.80,2147.50,1033.51,10752,4457,-66.12,16,5,-48.34,6.84,26.00,29.00,19,13,0.08,0.13,0.16,0.11,0.00,0.00,0,0, +1746045181176,19,2137,1083,519.60,2159.82,1092.82,11597,4700,-66.06,16,5,-48.28,6.84,27.00,27.00,17,11,0.12,0.07,0.16,0.11,0.00,0.00,0,0, +1746045182176,19,2137,1083,506.67,2147.66,1138.62,11058,5138,-65.75,16,13,-43.82,19.51,25.00,27.00,19,10,0.04,0.17,0.16,0.11,0.00,0.00,0,0, +1746045183176,19,2149,1083,597.50,2147.60,1042.10,12567,4511,-66.06,16,5,-48.28,6.84,27.00,27.00,18,9,0.10,0.06,0.16,0.11,0.00,0.00,0,0, +1746045184176,19,2137,1071,501.95,2159.78,1092.16,11057,4711,-66.06,16,5,-48.28,6.84,26.00,27.00,19,12,0.08,0.12,0.16,0.11,0.00,0.00,0,0, +1746045185176,19,2137,1023,782.75,2147.78,1084.86,11967,4522,-65.94,16,12,-44.35,17.84,25.50,28.00,19,8,0.07,0.13,0.16,0.11,0.00,0.00,0,0, +1746045186176,19,2149,1143,635.28,2147.65,1104.00,13807,4506,-66.31,16,5,-48.53,6.83,26.00,27.00,19,9,0.10,0.05,0.16,0.11,0.00,0.00,0,0, +1746045187176,19,2137,1023,560.32,2159.67,1035.05,10799,4348,-66.00,16,5,-48.22,6.84,26.00,27.00,18,12,0.14,0.13,0.16,0.11,0.00,0.00,0,0, +1746045188176,19,2137,1083,675.05,2147.42,1092.13,10552,4793,-66.00,16,5,-48.22,6.84,26.00,28.00,18,11,0.05,0.10,0.16,0.11,0.00,0.00,0,0, +1746045189176,19,2149,1083,656.68,2147.72,1094.03,11273,4577,-65.94,16,5,-48.16,6.85,26.00,26.00,18,12,0.16,0.06,0.16,0.11,0.00,0.00,0,0, +1746045190176,19,2137,1083,482.00,2159.87,1091.62,10429,4798,-66.00,16,5,-48.22,6.84,26.00,27.00,18,12,0.06,0.10,0.16,0.11,0.00,0.00,0,0, +1746045191176,19,2137,1023,690.68,2147.74,1084.74,10303,4549,-65.88,16,12,-44.29,17.85,25.50,27.00,19,12,0.11,0.15,0.16,0.11,0.00,0.00,0,0, +1746045192176,19,2149,1131,517.38,2159.74,1092.17,11543,4691,-66.12,16,106,-35.08,199.81,26.00,27.00,18,11,0.09,0.06,0.16,0.11,0.00,0.00,0,0, +1746045193176,19,2137,1035,632.65,2147.66,1045.26,10365,4434,-66.12,16,5,-48.34,6.84,26.00,27.00,19,11,0.09,0.25,0.16,0.11,0.00,0.00,0,0, +1746045194176,19,2137,1083,651.81,2147.89,1092.40,14961,4672,-66.06,16,5,-48.28,6.84,27.50,25.00,18,7,0.09,0.09,0.16,0.11,0.00,0.00,0,0, +1746045195176,19,2149,1083,648.33,2147.98,1096.22,14408,4619,-65.69,16,5,-47.91,6.86,26.50,27.00,20,12,0.10,0.03,0.16,0.11,0.00,0.00,0,0, +1746045196176,19,2137,1083,666.71,2159.45,1091.53,10976,4697,-66.00,16,5,-48.22,6.84,27.50,27.00,17,8,0.09,0.14,0.16,0.11,0.00,0.00,0,0, +1746045197176,19,2137,1071,645.15,2147.53,1090.53,13713,4810,-66.00,16,5,-48.22,6.84,26.50,27.00,19,9,0.07,0.05,0.16,0.11,0.00,0.00,0,0, +1746045198176,19,2137,1023,740.85,2147.71,1084.98,10415,4506,-65.88,16,5,-48.09,6.85,27.50,27.00,19,10,0.09,0.21,0.16,0.11,0.00,0.00,0,0, +1746045199176,19,2149,1083,505.05,2159.57,1045.66,15233,4294,-66.12,16,5,-48.34,6.84,27.00,25.00,19,7,0.11,0.07,0.16,0.11,0.00,0.00,0,0, +1746045200176,19,2137,1083,611.45,2147.80,1091.72,12699,4751,-66.12,16,5,-48.34,6.84,26.50,26.00,18,14,0.07,0.04,0.16,0.11,0.00,0.00,0,0, +1746045201176,19,2149,1095,730.91,2147.70,1103.25,12896,4471,-66.44,16,5,-48.66,6.83,26.50,25.00,19,6,0.16,0.14,0.16,0.11,0.00,0.00,0,0, +1746045202176,19,2137,1083,579.30,2160.17,1092.06,19114,4761,-66.44,16,5,-48.66,6.83,28.00,26.00,18,6,0.07,0.05,0.16,0.11,0.00,0.00,0,0, +1746045203176,19,2137,1035,678.86,2147.66,1054.72,11620,4293,-66.31,16,5,-48.53,6.83,27.50,26.00,20,13,0.12,0.09,0.16,0.11,0.00,0.00,0,0, +1746045204176,19,2137,1083,796.59,2147.88,1091.76,11003,4746,-66.31,16,5,-48.53,6.83,27.00,24.00,18,10,0.07,0.13,0.16,0.11,0.00,0.00,0,0, +1746045205176,19,2149,1083,635.15,2159.89,1093.32,12578,4639,-66.31,16,5,-48.53,6.83,28.00,27.00,19,12,0.08,0.04,0.16,0.11,0.00,0.00,0,0, +1746045206176,19,2137,1083,649.63,2147.46,1095.23,9221,4543,-66.31,16,5,-48.53,6.83,28.50,29.00,19,11,0.08,0.29,0.16,0.11,0.00,0.00,0,0, +1746045207176,19,2137,1083,818.35,2150.68,1088.47,18082,4680,-66.31,16,5,-48.53,6.83,26.50,26.00,18,5,0.09,0.10,0.16,0.11,0.00,0.00,0,0, +1746045208176,19,2149,1071,621.71,2163.66,1092.34,19300,4657,-66.12,16,5,-48.34,6.84,28.00,27.00,19,9,0.07,0.04,0.16,0.11,0.00,0.00,0,0, +1746045209176,19,2137,1095,675.25,2147.77,1096.81,10606,4686,-65.94,16,37,-39.46,61.82,26.00,27.00,17,12,0.13,0.14,0.16,0.11,0.00,0.00,0,0, +1746045210176,19,2137,1071,482.17,2147.52,1088.88,12485,4922,-66.19,16,12,-44.60,17.81,26.00,28.00,19,9,0.04,0.07,0.16,0.11,0.00,0.00,0,0, +1746045211176,19,2149,1023,551.95,2159.78,1035.03,10983,4286,-66.19,16,5,-48.41,6.84,27.00,28.00,16,13,0.15,0.13,0.16,0.11,0.00,0.00,0,0, +1746045212176,19,2137,1083,526.19,2147.66,1089.36,12233,4959,-66.25,16,5,-48.47,6.83,26.00,27.00,16,9,0.06,0.08,0.16,0.11,0.00,0.00,0,0, +1746045213176,19,2137,1083,628.85,2147.95,1097.23,12059,4637,-66.44,16,5,-48.66,6.83,26.00,26.00,19,12,0.15,0.09,0.16,0.11,0.00,0.00,0,0, +1746045214176,19,2149,1083,556.14,2159.79,1091.88,12031,4790,-66.56,16,5,-48.78,6.82,26.50,25.00,18,10,0.06,0.10,0.16,0.11,0.00,0.00,0,0, +1746045215176,19,2137,1083,720.33,2147.61,1095.76,11575,4490,-66.38,16,5,-48.59,6.83,27.00,25.00,19,13,0.14,0.05,0.16,0.11,0.00,0.00,0,0, +1746045216176,19,2137,1083,757.40,2147.77,1094.72,12321,4523,-66.38,16,5,-48.59,6.83,28.00,25.00,19,6,0.10,0.17,0.16,0.11,0.00,0.00,0,0, +1746045217176,19,2149,1023,825.71,2165.81,1035.77,22090,4313,-66.50,16,5,-48.72,6.82,27.00,26.00,19,5,0.07,0.06,0.16,0.11,0.00,0.00,0,0, +1746045218176,19,2137,1083,617.57,2148.26,1094.75,13725,4510,-66.62,16,5,-48.84,6.82,27.50,26.00,19,13,0.06,0.11,0.16,0.11,0.00,0.00,0,0, +1746045219176,19,2137,1083,759.52,2147.76,1093.90,12318,4506,-66.31,16,5,-48.53,6.83,27.00,25.00,19,9,0.11,0.08,0.16,0.11,0.00,0.00,0,0, +1746045220176,19,2149,1083,635.35,2159.74,1094.32,11486,4520,-66.31,16,5,-48.53,6.83,27.00,26.00,19,13,0.07,0.14,0.16,0.11,0.00,0.00,0,0, +1746045221176,19,2137,1083,466.38,2147.68,1094.70,12251,4516,-66.19,16,13,-44.26,19.44,25.50,26.00,19,9,0.14,0.08,0.16,0.11,0.00,0.00,0,0, +1746045222176,19,2137,1083,510.67,2147.89,1094.42,12400,4614,-66.12,16,28,-40.86,45.31,27.00,27.00,18,11,0.13,0.12,0.16,0.11,0.00,0.00,0,0, +1746045223176,19,2149,1083,493.00,2159.70,1091.55,11527,4760,-66.12,16,5,-48.34,6.84,27.00,26.00,19,11,0.07,0.13,0.16,0.11,0.00,0.00,0,0, +1746045224176,19,2137,1023,589.48,2147.73,1036.30,11776,4300,-66.19,16,5,-48.41,6.84,27.50,27.00,19,11,0.14,0.11,0.16,0.11,0.00,0.00,0,0, +1746045225176,19,2137,1083,689.71,2147.54,1092.94,11550,4612,-66.19,16,5,-48.41,6.84,27.50,27.00,18,11,0.11,0.05,0.16,0.11,0.00,0.00,0,0, +1746045226176,19,2149,1083,679.00,2159.89,1095.02,10431,4696,-66.12,16,5,-48.34,6.84,26.50,28.00,20,12,0.07,0.09,0.16,0.11,0.00,0.00,0,0, +1746045227176,19,2137,1083,609.30,2147.71,1097.38,11075,4611,-66.00,16,5,-48.22,6.84,27.00,27.00,17,11,0.11,0.08,0.16,0.11,0.00,0.00,0,0, +1746045228176,19,2137,1083,614.62,2147.68,1089.65,10498,4885,-66.12,16,5,-48.34,6.84,26.50,28.00,19,11,0.06,0.18,0.16,0.11,0.00,0.00,0,0, +1746045229176,19,2149,1023,758.57,2159.54,1036.36,12505,4303,-66.12,16,5,-48.34,6.84,26.50,27.00,19,10,0.12,0.06,0.16,0.11,0.00,0.00,0,0, +1746045230176,19,2137,1083,597.75,2147.85,1093.50,10617,4682,-66.00,16,5,-48.22,6.84,26.50,27.00,18,13,0.08,0.12,0.16,0.11,0.00,0.00,0,0, +1746045231176,19,2137,1083,650.38,2147.94,1093.42,10882,4655,-66.25,16,5,-48.47,6.83,27.00,28.00,19,11,0.09,0.09,0.16,0.11,0.00,0.00,0,0, +1746045232176,19,2149,1083,561.41,2159.67,1096.88,10945,4766,-66.19,16,5,-48.41,6.84,26.00,27.00,18,12,0.08,0.07,0.16,0.11,0.00,0.00,0,0, +1746045233176,19,2137,1083,562.53,2147.55,1092.91,9909,4651,-66.06,16,12,-44.48,17.82,26.00,27.00,19,12,0.08,0.11,0.16,0.11,0.00,0.00,0,0, +1746045234176,19,2137,1071,674.53,2147.78,1093.22,11265,4695,-66.06,16,5,-48.28,6.84,25.50,27.00,18,11,0.09,0.09,0.16,0.11,0.00,0.00,0,0, +1746045235176,19,2149,1023,678.14,2159.90,1034.47,10908,4657,-66.12,16,5,-48.34,6.84,26.50,27.00,19,12,0.09,0.06,0.16,0.11,0.00,0.00,0,0, +1746045236176,19,2137,1083,591.19,2147.83,1094.00,10667,4295,-66.44,16,5,-48.66,6.83,26.50,26.00,19,11,0.12,0.10,0.16,0.11,0.00,0.00,0,0, +1746045237176,19,2137,1083,685.27,2147.76,1091.87,11555,4769,-66.12,16,5,-48.34,6.84,27.00,27.00,18,12,0.07,0.05,0.16,0.11,0.00,0.00,0,0, +1746045238177,19,2149,1083,461.41,2159.79,1142.99,10223,4823,-66.12,16,5,-48.34,6.84,26.00,27.00,19,12,0.15,0.08,0.16,0.11,0.00,0.00,0,0, +1746045239176,19,2137,1083,556.68,2147.71,1042.98,10237,4509,-65.88,16,5,-48.09,6.85,26.50,28.00,18,11,0.07,0.15,0.16,0.11,0.00,0.00,0,0, +1746045240176,19,2137,1083,725.68,2147.70,1093.26,11446,4609,-66.06,16,12,-44.48,17.82,26.00,27.00,19,11,0.09,0.06,0.16,0.11,0.00,0.00,0,0, +1746045241176,19,2149,1023,695.00,2165.23,1037.41,10174,4833,-66.00,16,5,-48.22,6.84,26.00,27.00,18,12,0.07,0.14,0.16,0.11,0.00,0.00,0,0, +1746045242176,19,2137,1083,567.68,2147.84,1092.87,10300,4396,-66.25,16,5,-48.47,6.83,26.00,27.00,19,12,0.11,0.14,0.16,0.11,0.00,0.00,0,0, +1746045243176,19,2137,1083,437.05,2147.26,1093.57,9623,4650,-66.25,16,5,-48.47,6.83,26.00,25.00,18,12,0.10,0.09,0.16,0.11,0.00,0.00,0,0, +1746045244176,19,2149,1143,581.15,2159.85,1151.13,10499,4932,-65.94,16,13,-44.01,19.48,26.00,27.00,19,11,0.07,0.20,0.16,0.11,0.00,0.00,0,0, +1746045245176,19,2137,1023,735.18,2148.06,1035.51,13873,4375,-65.69,16,5,-47.91,6.86,26.00,28.00,18,8,0.13,0.07,0.16,0.11,0.00,0.00,0,0, +1746045246176,19,2137,1071,544.55,2147.65,1091.96,11852,4766,-66.00,16,106,-34.96,200.14,25.50,28.00,19,12,0.05,0.16,0.16,0.11,0.00,0.00,0,0, +1746045247176,19,2149,1083,626.67,2160.00,1094.68,13720,4518,-66.31,16,13,-44.38,19.42,25.00,27.00,19,8,0.10,0.08,0.16,0.11,0.00,0.00,0,0, +1746045248176,19,2137,1023,537.15,2153.26,1034.50,12432,4719,-66.31,16,5,-48.53,6.83,24.50,25.00,18,12,0.08,0.14,0.16,0.11,0.00,0.00,0,0, +1746045249176,19,2137,1083,604.35,2147.46,1093.58,12347,4624,-66.31,16,5,-48.53,6.83,27.00,27.00,19,9,0.08,0.08,0.16,0.11,0.00,0.00,0,0, +1746045250176,19,2149,1083,499.45,2147.51,1093.56,11250,4309,-66.31,16,5,-48.53,6.83,26.50,28.00,19,12,0.15,0.19,0.16,0.11,0.00,0.00,0,0, +1746045251176,19,2137,1083,604.10,2159.87,1094.69,12743,4538,-66.00,16,5,-48.22,6.84,25.50,27.00,19,10,0.09,0.07,0.16,0.11,0.00,0.00,0,0, +1746045252176,19,2137,1083,610.00,2147.81,1092.98,11043,4641,-66.00,16,5,-48.22,6.84,26.50,27.00,18,11,0.10,0.20,0.16,0.11,0.00,0.00,0,0, +1746045253176,19,2149,1023,661.50,2147.60,1082.69,12504,4703,-65.94,16,12,-44.35,17.84,25.50,27.00,19,9,0.08,0.07,0.16,0.11,0.00,0.00,0,0, +1746045254176,19,2137,1083,591.33,2159.61,1093.37,12043,4582,-65.94,16,12,-44.35,17.84,26.00,27.00,19,10,0.14,0.14,0.16,0.11,0.00,0.00,0,0, +1746045255176,19,2137,1083,711.26,2147.70,1044.17,12677,4628,-66.06,16,5,-48.28,6.84,25.50,27.00,18,10,0.10,0.05,0.16,0.11,0.00,0.00,0,0, +1746045256176,19,2149,1083,682.85,2147.62,1091.40,10265,4787,-66.44,16,5,-48.66,6.83,27.50,27.00,18,9,0.06,0.20,0.16,0.11,0.00,0.00,0,0, +1746045257176,19,2137,1083,475.95,2160.03,1094.13,15882,4319,-66.44,16,5,-48.66,6.83,26.50,27.00,19,7,0.13,0.07,0.16,0.11,0.00,0.00,0,0, +1746045258176,19,2137,1071,633.95,2147.73,1092.69,12932,4693,-65.88,16,5,-48.09,6.85,25.50,28.00,18,13,0.09,0.06,0.16,0.11,0.00,0.00,0,0, +1746045259176,19,2149,1095,524.76,2147.88,1097.90,13411,4702,-65.94,16,5,-48.16,6.85,26.00,27.00,19,7,0.08,0.11,0.16,0.11,0.00,0.00,0,0, +1746045260176,19,2137,1023,659.45,2159.55,1035.35,14997,4371,-66.19,16,5,-48.41,6.84,26.50,28.00,18,10,0.13,0.04,0.16,0.11,0.00,0.00,0,0, +1746045261176,19,2137,1071,662.71,2152.58,1097.26,10157,5001,-66.19,16,5,-48.41,6.84,24.50,27.00,19,11,0.05,0.16,0.16,0.11,0.00,0.00,0,0, +1746045262176,19,2149,1083,659.58,2147.77,1087.54,11532,4652,-66.12,16,5,-48.34,6.84,25.50,27.00,18,11,0.10,0.06,0.16,0.11,0.00,0.00,0,0, +1746045263176,19,2137,1083,630.43,2159.91,1092.48,10612,4490,-66.19,16,5,-48.41,6.84,25.50,27.00,19,12,0.07,0.10,0.16,0.11,0.00,0.00,0,0, +1746045264176,19,2137,1083,596.62,2147.83,1094.10,11606,4538,-66.12,16,5,-48.34,6.84,25.50,27.00,19,11,0.08,0.07,0.16,0.11,0.00,0.00,0,0, +1746045265176,19,2149,1083,649.67,2147.62,1092.77,10578,4678,-66.12,16,5,-48.34,6.84,25.50,27.00,18,12,0.09,0.09,0.16,0.11,0.00,0.00,0,0, +1746045266176,19,2137,1083,501.57,2165.46,1092.48,11797,4680,-66.12,16,106,-35.08,199.81,25.50,27.00,19,9,0.08,0.11,0.16,0.11,0.00,0.00,0,0, +1746045267176,19,2137,1083,704.71,2147.64,1093.86,12128,4668,-66.00,16,5,-48.22,6.84,26.50,27.00,18,12,0.10,0.04,0.16,0.11,0.00,0.00,0,0, +1746045268176,19,2149,1023,730.84,2147.80,1033.30,13202,4682,-66.12,16,5,-48.34,6.84,26.00,28.00,19,6,0.07,0.14,0.16,0.11,0.00,0.00,0,0, +1746045269176,19,2137,1083,572.14,2159.87,1094.15,18397,4395,-66.00,16,5,-48.22,6.84,25.50,26.00,18,7,0.12,0.05,0.16,0.11,0.00,0.00,0,0, +1746045270176,19,2137,1071,635.59,2147.43,1092.25,10842,4767,-66.00,16,5,-48.22,6.84,27.00,30.00,20,12,0.05,0.24,0.16,0.11,0.00,0.00,0,0, +1746045271176,19,2137,1095,708.38,2147.70,1098.97,13336,4494,-65.94,16,5,-48.16,6.85,26.50,27.00,18,8,0.12,0.09,0.16,0.11,0.00,0.00,0,0, +1746045272176,19,2149,1083,724.25,2160.13,1091.70,13183,4770,-65.94,16,5,-48.16,6.85,25.50,27.00,19,12,0.05,0.07,0.16,0.11,0.00,0.00,0,0, +1746045273176,19,2137,1023,700.65,2147.89,1084.69,10812,4531,-65.88,16,12,-44.29,17.85,25.50,27.00,19,9,0.12,0.19,0.16,0.11,0.00,0.00,0,0, +1746045274176,19,2137,1131,496.89,2147.70,1102.21,15526,4744,-66.38,16,27,-41.27,43.42,26.00,27.00,18,7,0.08,0.07,0.16,0.11,0.00,0.00,0,0, +1746045275176,19,2149,1023,564.67,2159.65,1035.00,12340,4647,-66.38,16,5,-48.59,6.83,25.50,27.00,19,12,0.09,0.12,0.16,0.11,0.00,0.00,0,0, +1746045276176,19,2137,1083,464.95,2147.59,1095.19,10757,4296,-66.19,16,5,-48.41,6.84,26.50,27.00,19,9,0.08,0.14,0.16,0.11,0.00,0.00,0,0, +1746045277176,19,2137,1143,647.95,2147.56,1152.21,12451,4734,-66.00,16,106,-34.96,200.14,25.50,27.00,19,10,0.15,0.05,0.16,0.11,0.00,0.00,0,0, +1746045278176,19,2149,1023,464.55,2159.65,1033.84,10974,4502,-66.31,16,5,-48.53,6.83,25.00,27.00,18,8,0.07,0.21,0.16,0.11,0.00,0.00,0,0, +1746045279176,19,2137,1083,986.89,2152.73,1093.41,21020,4639,-65.94,16,106,-34.89,200.31,25.50,28.00,19,5,0.14,0.07,0.16,0.11,0.00,0.00,0,0, +1746045280176,19,2137,1083,545.74,2149.72,1092.10,16308,4772,-65.94,16,27,-40.83,43.60,26.00,27.00,18,12,0.07,0.03,0.16,0.11,0.00,0.00,0,0, +1746045281176,19,2149,1023,608.90,2159.63,1035.03,10820,4382,-66.06,16,5,-48.28,6.84,26.50,31.00,19,9,0.15,0.13,0.16,0.11,0.00,0.00,0,0, +1746045282176,19,2137,1083,671.71,2147.64,1091.66,12600,4773,-66.06,16,5,-48.28,6.84,26.00,25.00,18,10,0.06,0.05,0.16,0.11,0.00,0.00,0,0, +1746045283176,19,2137,1095,674.50,2147.58,1109.85,10218,4438,-65.81,16,106,-34.77,200.65,25.00,30.00,19,10,0.16,0.17,0.16,0.11,0.00,0.00,0,0, +1746045284176,19,2149,1083,683.86,2159.73,1091.29,12812,4786,-65.81,16,5,-48.03,6.85,27.00,27.00,18,9,0.06,0.06,0.16,0.11,0.00,0.00,0,0, +1746045285176,19,2137,1023,614.68,2147.60,1040.69,11219,4575,-66.06,16,5,-48.28,6.84,25.50,26.00,19,9,0.08,0.19,0.16,0.11,0.00,0.00,0,0, +1746045286176,19,2137,1083,648.14,2147.85,1089.42,15696,4525,-65.94,16,5,-48.16,6.85,25.50,27.00,19,7,0.11,0.07,0.16,0.11,0.00,0.00,0,0, +1746045287176,19,2149,1083,521.05,2159.98,1091.90,12431,4514,-66.12,16,5,-48.34,6.84,26.00,27.00,17,13,0.10,0.08,0.16,0.11,0.00,0.00,0,0, +1746045288176,19,2137,1071,769.35,2147.58,1091.06,10246,4836,-66.25,16,5,-48.47,6.83,26.50,27.00,19,8,0.06,0.15,0.16,0.11,0.00,0.00,0,0, +1746045289176,19,2137,1083,636.73,2147.91,1093.94,14243,4524,-66.25,16,5,-48.47,6.83,26.00,26.00,19,8,0.13,0.05,0.16,0.11,0.00,0.00,0,0, +1746045290176,19,2149,1083,708.79,2159.60,1095.10,11093,4528,-66.12,16,5,-48.34,6.84,25.50,27.00,19,9,0.12,0.17,0.16,0.11,0.00,0.00,0,0, +1746045291176,19,2137,1083,685.50,2147.70,1094.54,13796,4524,-66.31,16,5,-48.53,6.83,27.00,28.00,19,8,0.14,0.06,0.16,0.11,0.00,0.00,0,0, +1746045292176,19,2137,1023,659.75,2147.75,1085.82,11364,4518,-66.25,16,5,-48.47,6.83,26.00,26.00,19,12,0.14,0.07,0.16,0.11,0.00,0.00,0,0, +1746045293176,19,2149,1083,703.26,2159.51,1043.42,9929,4443,-66.25,16,5,-48.47,6.83,26.50,27.00,18,12,0.10,0.10,0.16,0.11,0.00,0.00,0,0, +1746045294176,19,2137,1083,577.32,2147.84,1092.91,10403,4698,-66.19,16,5,-48.41,6.84,26.50,27.00,19,12,0.10,0.11,0.16,0.11,0.00,0.00,0,0, +1746045295176,19,2137,1083,776.27,2147.56,1092.78,10281,4697,-65.75,16,5,-47.97,6.85,27.50,31.00,18,12,0.08,0.14,0.16,0.11,0.00,0.00,0,0, +1746045296176,19,2149,1083,697.05,2159.79,1093.09,10539,4661,-65.69,16,5,-47.91,6.86,26.50,28.00,19,10,0.10,0.19,0.16,0.11,0.00,0.00,0,0, +1746045297176,19,2137,1083,608.04,2147.76,1089.89,14047,4815,-66.44,16,5,-48.66,6.83,25.50,27.00,17,8,0.08,0.07,0.16,0.11,0.00,0.00,0,0, +1746045298176,19,2137,1071,623.64,2147.63,1091.38,11548,4749,-66.44,16,5,-48.66,6.83,25.50,27.00,19,11,0.07,0.28,0.16,0.11,0.00,0.00,0,0, +1746045299176,19,2149,1023,782.75,2162.66,1034.74,17945,4669,-66.31,16,5,-48.53,6.83,26.00,25.00,18,5,0.10,0.10,0.16,0.11,0.00,0.00,0,0, +1746045300176,19,2137,1083,593.65,2151.64,1091.95,19739,4510,-65.88,16,5,-48.09,6.85,25.50,27.00,19,9,0.08,0.04,0.16,0.11,0.00,0.00,0,0, +1746045301176,19,2137,1083,619.59,2147.67,1095.06,12156,4566,-66.25,16,5,-48.47,6.83,25.50,25.00,18,8,0.14,0.12,0.16,0.11,0.00,0.00,0,0, +1746045302176,19,2149,1083,621.48,2159.67,1091.41,13752,4793,-66.25,16,5,-48.47,6.83,26.00,30.00,19,10,0.05,0.04,0.16,0.11,0.00,0.00,0,0, +1746045303176,19,2137,1083,707.09,2147.95,1095.09,12701,4565,-65.94,16,5,-48.16,6.85,24.50,27.00,18,8,0.14,0.12,0.16,0.11,0.00,0.00,0,0, +1746045304176,19,2137,1083,744.05,2147.99,1091.70,13941,4781,-66.31,16,5,-48.53,6.83,27.00,31.00,18,10,0.06,0.04,0.16,0.11,0.00,0.00,0,0, +1746045305176,19,2149,1035,604.90,2159.70,1048.12,11892,4417,-66.06,16,5,-48.28,6.84,26.00,27.00,20,9,0.15,0.10,0.16,0.11,0.00,0.00,0,0, +1746045306176,19,2137,1083,589.11,2147.64,1094.14,12338,4519,-65.94,16,5,-48.16,6.85,26.00,26.00,18,12,0.07,0.04,0.16,0.11,0.00,0.00,0,0, +1746045307176,19,2137,1083,647.78,2147.91,1093.35,13113,4620,-65.94,16,5,-48.16,6.85,27.00,28.00,19,8,0.09,0.09,0.16,0.11,0.00,0.00,0,0, +1746045308176,19,2149,1083,603.17,2159.66,1093.27,13310,4667,-66.38,16,5,-48.59,6.83,26.00,29.00,18,12,0.09,0.03,0.16,0.11,0.00,0.00,0,0, +1746045309176,19,2137,1071,624.95,2147.70,1091.97,10107,4698,-65.88,16,5,-48.09,6.85,25.50,27.00,19,12,0.09,0.13,0.16,0.11,0.00,0.00,0,0, +1746045310176,19,2137,1083,588.80,2147.62,1094.35,9914,4519,-66.00,16,106,-34.96,200.14,25.50,27.00,19,12,0.14,0.12,0.16,0.11,0.00,0.00,0,0, +1746045311176,19,2149,1023,518.15,2159.73,1033.30,11658,4771,-66.12,16,5,-48.34,6.84,25.50,27.00,18,9,0.07,0.11,0.16,0.11,0.00,0.00,0,0, +1746045312176,19,2137,1083,507.16,2147.62,1093.10,12361,4358,-66.12,16,5,-48.34,6.84,27.00,28.00,19,12,0.14,0.04,0.16,0.11,0.00,0.00,0,0, +1746045313176,19,2137,1083,649.58,2147.94,1094.51,12091,4564,-65.94,16,5,-48.16,6.85,26.50,27.00,18,7,0.14,0.15,0.16,0.11,0.00,0.00,0,0, +1746045314176,19,2149,1083,601.65,2159.99,1091.41,16073,4793,-66.19,16,5,-48.41,6.84,26.00,26.00,19,7,0.05,0.05,0.16,0.11,0.00,0.00,0,0, +1746045315176,19,2137,1083,563.00,2147.59,1094.69,10873,4556,-65.94,16,5,-48.16,6.85,25.50,27.00,18,12,0.14,0.21,0.16,0.11,0.00,0.00,0,0, +1746045316176,19,2137,1083,651.86,2147.87,1091.97,15656,4782,-65.94,16,5,-48.16,6.85,26.00,27.00,18,6,0.06,0.10,0.16,0.11,0.00,0.00,0,0, +1746045317176,19,2149,1083,632.25,2159.98,1094.78,16875,4549,-66.38,16,27,-41.27,43.42,26.00,27.00,18,10,0.16,0.04,0.16,0.11,0.00,0.00,0,0, +1746045318176,19,2137,1071,618.85,2147.70,1091.60,10242,4796,-66.00,16,5,-48.22,6.84,25.50,27.00,18,10,0.06,0.18,0.16,0.11,0.00,0.00,0,0, +1746045319176,19,2137,1023,803.43,2183.66,1035.18,12595,4528,-66.00,16,5,-48.22,6.84,25.50,28.00,19,9,0.10,0.10,0.17,0.11,0.00,0.00,0,0, +1746045320176,19,2149,1083,568.19,2159.86,1093.46,12536,4302,-66.12,16,5,-48.34,6.84,26.50,28.00,19,12,0.12,0.04,0.17,0.11,0.00,0.00,0,0, +1746045321176,19,2137,1083,622.91,2147.82,1091.54,11935,4759,-66.12,16,5,-48.34,6.84,26.00,27.00,18,7,0.06,0.14,0.17,0.11,0.00,0.00,0,0, +1746045322176,19,2137,1023,681.60,2148.16,1045.18,16206,4581,-65.88,16,5,-48.09,6.85,25.00,25.00,18,8,0.16,0.05,0.17,0.11,0.00,0.00,0,0, +1746045323176,19,2149,1143,600.55,2147.90,1138.51,11414,4934,-66.25,16,5,-48.47,6.83,27.50,28.00,16,11,0.10,0.12,0.17,0.11,0.00,0.00,0,0, +1746045324176,19,2137,1071,531.90,2159.91,1095.05,11538,5097,-66.25,16,13,-44.32,19.43,25.50,28.00,19,12,0.05,0.05,0.17,0.11,0.00,0.00,0,0, +1746045325176,19,2137,1083,641.76,2147.77,1088.49,10656,4407,-66.25,16,5,-48.47,6.83,26.50,27.00,18,9,0.14,0.14,0.17,0.11,0.00,0.00,0,0, +1746045326176,19,2149,1023,554.59,2147.75,1032.99,12636,4802,-66.25,16,5,-48.47,6.83,26.50,27.00,18,10,0.05,0.05,0.17,0.11,0.00,0.00,0,0, +1746045327176,19,2137,1083,568.05,2159.86,1093.66,10643,4322,-65.94,16,5,-48.16,6.85,26.50,28.00,18,10,0.17,0.22,0.17,0.11,0.00,0.00,0,0, +1746045328176,19,2137,1083,774.27,2147.88,1089.24,15225,5210,-66.00,16,5,-48.22,6.84,25.50,28.00,17,7,0.06,0.08,0.17,0.11,0.00,0.00,0,0, +1746045329176,19,2149,1071,612.55,2147.74,1090.49,13746,4541,-66.00,16,5,-48.22,6.84,24.50,27.00,17,12,0.12,0.12,0.17,0.11,0.00,0.00,0,0, +1746045330176,19,2137,1083,582.78,2165.17,1089.14,12293,4947,-66.00,16,5,-48.22,6.84,26.00,27.00,19,10,0.04,0.07,0.17,0.11,0.00,0.00,0,0, +1746045331176,19,2137,1083,685.96,2147.60,1101.62,10585,4547,-66.25,16,5,-48.47,6.83,25.50,26.00,16,12,0.14,0.19,0.17,0.11,0.00,0.00,0,0, +1746045332176,19,2149,1083,606.24,2147.68,1089.28,12353,4964,-65.88,16,36,-39.52,60.01,26.00,28.00,16,9,0.05,0.07,0.17,0.11,0.00,0.00,0,0, +1746045333176,19,2137,1083,465.05,2159.78,1093.68,11138,4580,-65.94,16,5,-48.16,6.85,26.00,27.00,19,13,0.09,0.11,0.17,0.11,0.00,0.00,0,0, +1746045334176,19,2137,1023,745.70,2147.79,1036.32,12159,4530,-65.94,16,5,-48.16,6.85,26.00,26.00,19,6,0.14,0.18,0.17,0.11,0.00,0.00,0,0, +1746045335176,19,2149,1083,899.95,2153.74,1092.31,21851,4516,-65.81,16,5,-48.03,6.85,26.50,27.00,18,5,0.08,0.06,0.17,0.11,0.00,0.00,0,0, +1746045336176,19,2137,1083,670.22,2161.36,1093.26,15466,4676,-66.00,16,5,-48.22,6.84,26.50,27.00,19,13,0.11,0.03,0.17,0.11,0.00,0.00,0,0, +1746045337176,19,2137,1083,777.10,2147.56,1095.04,10918,4504,-66.00,16,5,-48.22,6.84,26.50,28.00,19,11,0.08,0.08,0.17,0.11,0.00,0.00,0,0, +1746045338176,19,2149,1083,586.18,2147.65,1094.03,10810,4516,-65.94,16,12,-44.35,17.84,26.00,27.00,19,11,0.09,0.17,0.17,0.11,0.00,0.00,0,0, +1746045339176,19,2137,1023,531.40,2159.71,1035.88,11689,4294,-65.94,16,5,-48.16,6.85,27.00,26.00,19,11,0.09,0.07,0.17,0.11,0.00,0.00,0,0, +1746045340176,19,2137,1143,759.55,2147.94,1151.50,11221,4873,-66.19,16,5,-48.41,6.84,26.00,26.00,18,9,0.09,0.18,0.17,0.11,0.00,0.00,0,0, +1746045341176,19,2149,1011,526.40,2159.90,1033.40,14099,4712,-65.94,16,5,-48.16,6.85,26.50,27.00,19,8,0.09,0.06,0.17,0.11,0.00,0.00,0,0, +1746045342176,19,2137,1143,666.26,2147.82,1153.58,11868,4522,-66.38,16,5,-48.59,6.83,26.50,27.00,19,12,0.13,0.13,0.17,0.11,0.00,0.00,0,0, +1746045343176,19,2137,1023,682.45,2147.76,1040.71,10986,4527,-66.25,16,13,-44.32,19.43,24.50,28.00,19,11,0.09,0.10,0.17,0.11,0.00,0.00,0,0, +1746045344176,19,2137,1083,512.29,2147.98,1089.33,11699,4287,-66.25,16,5,-48.47,6.83,27.00,26.00,19,12,0.11,0.05,0.17,0.11,0.00,0.00,0,0, +1746045345176,19,2149,1083,604.67,2160.01,1094.06,10370,4516,-66.31,16,5,-48.53,6.83,27.00,27.00,19,12,0.11,0.13,0.17,0.11,0.00,0.00,0,0, +1746045346177,19,2137,1083,597.23,2147.60,1093.78,11382,4592,-66.19,16,5,-48.41,6.84,27.00,28.00,18,11,0.13,0.08,0.17,0.11,0.00,0.00,0,0, +1746045347176,19,2137,1023,484.21,2147.53,1032.98,10538,4724,-65.94,16,5,-48.16,6.85,27.00,28.00,20,13,0.04,0.10,0.17,0.11,0.00,0.00,0,0, +1746045348176,19,2149,1095,635.75,2159.82,1103.92,12333,4322,-65.94,16,5,-48.16,6.85,27.00,27.00,18,9,0.11,0.09,0.17,0.11,0.00,0.00,0,0, +1746045349176,19,2137,1047,641.91,2147.98,1053.73,12178,4727,-66.38,16,104,-35.41,194.93,25.50,25.00,20,12,0.11,0.08,0.17,0.11,0.00,0.00,0,0, +1746045350176,19,2137,1131,643.37,2147.50,1148.26,11120,4878,-66.06,16,36,-39.71,59.89,26.00,23.00,17,10,0.08,0.12,0.17,0.11,0.00,0.00,0,0, +1746045351176,19,2149,1023,591.38,2159.89,1033.39,12596,4458,-66.62,16,5,-48.84,6.82,27.00,23.00,21,12,0.14,0.04,0.17,0.11,0.00,0.00,0,0, +1746045352176,19,2137,1083,696.70,2147.54,1089.77,11026,4982,-66.31,16,5,-48.53,6.83,27.50,24.00,14,7,0.12,0.22,0.17,0.11,0.00,0.00,0,0, +1746045353176,19,2137,1071,791.84,2153.47,1081.10,25421,5675,-66.31,16,5,-48.53,6.83,27.50,22.00,16,4,0.04,0.08,0.17,0.11,0.00,0.00,0,0, +1746045354176,19,2149,1083,602.11,2162.41,1095.78,19053,4320,-66.25,16,5,-48.47,6.83,27.50,24.00,18,11,0.14,0.03,0.17,0.11,0.00,0.00,0,0, +1746045355176,19,2137,1131,680.81,2147.87,1150.14,11802,5000,-66.44,16,13,-44.51,19.41,26.00,26.00,19,8,0.05,0.12,0.17,0.11,0.00,0.00,0,0, +1746045356176,19,2137,1047,557.32,2147.72,1054.04,13798,4303,-66.25,16,36,-39.90,59.78,26.00,28.00,17,10,0.14,0.04,0.17,0.11,0.00,0.00,0,0, +1746045357176,19,2149,1023,512.70,2159.71,1030.11,10873,4725,-66.25,16,5,-48.47,6.83,28.50,28.00,18,10,0.05,0.15,0.17,0.11,0.00,0.00,0,0, +1746045358176,19,2137,1071,584.67,2147.52,1093.14,12536,4541,-66.62,16,5,-48.84,6.82,27.50,28.00,19,10,0.11,0.05,0.17,0.11,0.00,0.00,0,0, +1746045359176,19,2137,1083,665.32,2147.74,1091.55,10305,4691,-66.62,16,5,-48.84,6.82,27.50,26.00,17,11,0.12,0.21,0.17,0.11,0.00,0.00,0,0, +1746045360176,19,2149,1083,668.09,2159.75,1089.55,13485,4903,-66.12,16,5,-48.34,6.84,27.50,26.00,19,8,0.05,0.07,0.17,0.11,0.00,0.00,0,0, +1746045361176,19,2137,1083,616.23,2147.58,1094.62,11922,4537,-66.31,16,5,-48.53,6.83,27.00,28.00,19,12,0.10,0.09,0.17,0.11,0.00,0.00,0,0, +1746045362176,19,2137,1083,617.91,2147.60,1094.32,9979,4515,-66.31,16,5,-48.53,6.83,28.00,26.00,19,12,0.11,0.14,0.17,0.11,0.00,0.00,0,0, +1746045363176,19,2149,1023,691.77,2159.69,1034.00,11783,4468,-66.25,16,5,-48.47,6.83,26.00,26.00,18,10,0.08,0.10,0.17,0.11,0.00,0.00,0,0, +1746045364176,19,2137,1083,564.84,2147.75,1093.00,11899,4648,-66.50,16,5,-48.72,6.82,27.50,28.00,19,14,0.08,0.05,0.17,0.11,0.00,0.00,0,0, +1746045365176,19,2137,1143,738.41,2148.02,1153.94,13007,4758,-66.31,16,5,-48.53,6.83,27.00,29.00,19,5,0.15,0.16,0.17,0.11,0.00,0.00,0,0, +1746045366176,19,2149,1023,816.46,2166.08,1035.56,22051,4367,-66.31,16,5,-48.53,6.83,27.00,28.00,18,5,0.13,0.06,0.17,0.11,0.00,0.00,0,0, +1746045367176,19,2137,1071,625.10,2147.94,1092.02,12721,4758,-66.06,16,5,-48.28,6.84,26.50,27.00,19,13,0.05,0.14,0.17,0.11,0.00,0.00,0,0, +1746045368176,19,2137,1083,572.05,2147.70,1094.43,13058,4515,-66.38,16,55,-38.18,95.62,26.00,25.00,19,8,0.10,0.09,0.17,0.11,0.00,0.00,0,0, +1746045369176,19,2149,1083,729.33,2159.74,1094.38,12928,4511,-66.31,16,5,-48.53,6.83,26.50,24.00,19,13,0.09,0.05,0.17,0.11,0.00,0.00,0,0, +1746045370176,19,2137,1035,595.32,2147.69,1084.91,11579,4524,-66.38,16,12,-44.79,17.78,26.00,25.00,19,10,0.09,0.09,0.17,0.11,0.00,0.00,0,0, +1746045371176,19,2137,1131,536.64,2147.57,1104.13,11577,4515,-66.38,16,5,-48.59,6.83,27.50,24.00,19,12,0.07,0.06,0.17,0.11,0.00,0.00,0,0, +1746045372176,19,2149,1023,517.29,2159.45,1034.66,9938,4276,-66.31,16,5,-48.53,6.83,27.50,25.00,19,12,0.07,0.10,0.17,0.11,0.00,0.00,0,0, +1746045373176,19,2137,1095,527.95,2147.62,1143.91,10240,4755,-66.44,16,13,-44.51,19.41,26.50,25.00,19,12,0.07,0.11,0.17,0.11,0.00,0.00,0,0, +1746045374176,19,2137,1083,550.57,2147.35,1046.40,9817,4291,-66.31,16,12,-44.73,17.79,26.50,26.00,19,12,0.08,0.12,0.17,0.11,0.00,0.00,0,0, +1746045375176,19,2149,1023,596.57,2159.58,1085.31,10069,4505,-66.00,16,13,-44.07,19.47,26.00,27.00,19,12,0.13,0.11,0.17,0.11,0.00,0.00,0,0, +1746045376176,19,2137,1083,599.55,2147.54,1045.17,9886,4280,-66.00,16,5,-48.22,6.84,28.50,25.00,19,12,0.14,0.10,0.17,0.11,0.00,0.00,0,0, +1746045377176,19,2137,1083,686.36,2147.54,1095.20,10160,4543,-66.06,16,5,-48.28,6.84,28.00,26.00,19,12,0.14,0.10,0.17,0.11,0.00,0.00,0,0, +1746045378176,19,2149,1083,657.80,2159.66,1094.26,10271,4503,-66.00,16,5,-48.22,6.84,27.00,27.00,19,12,0.12,0.10,0.17,0.11,0.00,0.00,0,0, +1746045379176,19,2137,1083,556.71,2147.62,1143.54,10040,4761,-65.94,16,13,-44.01,19.48,25.50,28.00,19,12,0.13,0.10,0.17,0.11,0.00,0.00,0,0, +1746045380176,19,2137,1023,691.09,2147.62,1035.94,11585,4301,-65.94,16,5,-48.16,6.85,27.50,27.00,19,11,0.11,0.07,0.17,0.11,0.00,0.00,0,0, +1746045381176,19,2149,1083,586.09,2159.55,1044.10,10370,4602,-66.06,16,5,-48.28,6.84,26.00,30.00,18,12,0.12,0.08,0.17,0.11,0.00,0.00,0,0, +1746045382176,19,2137,1083,551.95,2147.68,1091.91,10171,4744,-66.06,16,5,-48.28,6.84,26.00,27.00,19,12,0.07,0.10,0.17,0.11,0.00,0.00,0,0, +1746045383176,19,2137,1083,764.57,2147.44,1094.34,10896,4503,-66.12,16,5,-48.34,6.84,26.00,28.00,19,11,0.15,0.09,0.17,0.11,0.00,0.00,0,0, +1746045384176,19,2149,1071,638.90,2147.82,1090.53,11147,4641,-65.94,16,5,-48.16,6.85,26.50,27.00,17,13,0.07,0.06,0.17,0.11,0.00,0.00,0,0, +1746045385176,19,2137,1083,535.30,2160.02,1097.67,13059,4663,-65.94,16,5,-48.16,6.85,26.00,27.00,20,6,0.13,0.15,0.17,0.11,0.00,0.00,0,0, +1746045386176,19,2137,1083,658.43,2147.66,1092.98,18530,4764,-66.19,16,5,-48.41,6.84,26.00,28.00,16,6,0.10,0.05,0.17,0.11,0.00,0.00,0,0, +1746045387176,19,2149,1023,741.14,2159.63,1036.46,11540,4869,-66.12,16,5,-48.34,6.84,25.50,26.00,19,13,0.06,0.21,0.17,0.11,0.00,0.00,0,0, +1746045388176,19,2137,1143,815.84,2149.59,1147.29,15886,4640,-65.69,16,5,-47.91,6.86,26.00,30.00,18,5,0.11,0.13,0.17,0.11,0.00,0.00,0,0, +1746045389176,19,2137,1035,729.67,2153.48,1043.75,21581,4503,-65.69,16,5,-47.91,6.86,26.50,31.00,20,6,0.07,0.05,0.17,0.11,0.00,0.00,0,0, +1746045390176,19,2149,1083,518.90,2167.89,1096.72,11409,4672,-65.88,16,5,-48.09,6.85,25.00,28.00,18,13,0.10,0.21,0.17,0.11,0.00,0.00,0,0, +1746045391176,19,2137,1083,620.05,2148.07,1092.62,14790,4702,-66.06,16,5,-48.28,6.84,26.00,31.00,19,6,0.07,0.11,0.17,0.11,0.00,0.00,0,0, +1746045392176,19,2137,1083,605.86,2147.81,1094.58,17467,4586,-66.00,16,5,-48.22,6.84,26.50,27.00,18,9,0.13,0.04,0.17,0.11,0.00,0.00,0,0, +1746045393176,19,2149,1083,733.75,2147.83,1092.41,10957,4748,-66.19,16,13,-44.26,19.44,25.50,27.00,19,9,0.06,0.23,0.17,0.11,0.00,0.00,0,0, +1746045394176,19,2137,1023,841.05,2164.10,1041.05,20080,4526,-66.19,16,5,-48.41,6.84,26.50,26.00,19,5,0.15,0.08,0.17,0.11,0.00,0.00,0,0, +1746045395176,19,2137,1071,841.85,2150.77,1086.09,17799,4788,-65.94,16,5,-48.16,6.85,25.50,28.00,18,11,0.06,0.03,0.17,0.11,0.00,0.00,0,0, +1746045396176,19,2149,1143,663.39,2147.80,1152.50,11725,4539,-66.12,16,5,-48.34,6.84,27.00,27.00,19,8,0.10,0.12,0.17,0.11,0.00,0.00,0,0, +1746045397176,19,2137,1023,504.18,2159.69,1084.90,13757,4519,-66.25,16,5,-48.47,6.83,26.00,27.00,19,10,0.12,0.04,0.17,0.11,0.00,0.00,0,0, +1746045398176,19,2137,1083,658.55,2147.86,1044.96,10529,4321,-66.25,16,5,-48.47,6.83,26.00,27.00,18,12,0.16,0.13,0.17,0.11,0.00,0.00,0,0, +1746045399176,19,2149,1083,523.83,2147.76,1091.39,12675,4806,-66.38,16,27,-41.27,43.42,26.00,27.00,18,10,0.06,0.07,0.17,0.11,0.00,0.00,0,0, +1746045400176,19,2137,1083,584.32,2159.59,1094.14,10682,4564,-66.44,16,5,-48.66,6.83,26.50,27.00,19,12,0.12,0.25,0.17,0.11,0.00,0.00,0,0, +1746045401176,19,2137,1023,649.86,2147.91,1034.60,15531,4681,-66.06,16,5,-48.28,6.84,27.00,28.00,18,6,0.09,0.10,0.17,0.11,0.00,0.00,0,0, +1746045402176,19,2149,1083,512.73,2159.65,1092.19,16610,4440,-66.25,16,5,-48.47,6.83,27.50,28.00,19,10,0.08,0.04,0.17,0.11,0.00,0.00,0,0, +1746045403176,19,2137,1083,527.36,2147.74,1094.79,10692,4557,-66.25,16,5,-48.47,6.83,27.00,28.00,18,9,0.14,0.14,0.17,0.11,0.00,0.00,0,0, +1746045404176,19,2137,1083,673.36,2147.75,1091.75,12504,4800,-65.88,16,5,-48.09,6.85,26.00,28.00,19,10,0.05,0.05,0.17,0.11,0.00,0.00,0,0, +1746045405176,19,2149,1083,664.24,2147.66,1094.92,11035,4512,-65.88,16,5,-48.09,6.85,25.50,26.00,19,8,0.11,0.17,0.17,0.11,0.00,0.00,0,0, +1746045406176,19,2137,1083,637.95,2159.98,1094.03,16010,4738,-66.19,16,106,-35.14,199.64,25.00,27.00,19,7,0.13,0.06,0.17,0.11,0.00,0.00,0,0, +1746045407176,19,2137,1023,550.43,2147.42,1036.34,11272,4312,-66.06,16,5,-48.28,6.84,26.50,27.00,19,13,0.15,0.20,0.17,0.11,0.00,0.00,0,0, +1746045408176,19,2149,1071,491.60,2147.91,1091.82,12358,4790,-66.06,16,5,-48.28,6.84,27.50,27.00,18,10,0.06,0.08,0.17,0.11,0.00,0.00,0,0, +1746045409176,19,2137,1095,598.86,2159.92,1104.22,11341,4193,-66.31,16,5,-48.53,6.83,27.00,27.00,19,13,0.16,0.15,0.17,0.11,0.00,0.00,0,0, +1746045410176,19,2137,1083,706.75,2147.65,1093.20,11122,4604,-66.12,16,5,-48.34,6.84,26.50,28.00,18,11,0.13,0.08,0.17,0.11,0.00,0.00,0,0, +1746045411176,19,2149,1083,644.16,2147.70,1091.92,10859,4779,-66.38,16,12,-44.79,17.78,26.00,27.00,19,12,0.05,0.13,0.17,0.11,0.00,0.00,0,0, +1746045412176,19,2137,1023,561.95,2159.79,1035.02,10531,4352,-66.38,16,5,-48.59,6.83,26.50,27.00,18,10,0.12,0.20,0.17,0.11,0.00,0.00,0,0, +1746045413176,19,2137,1083,733.71,2147.87,1091.52,13968,5001,-66.38,16,5,-48.59,6.83,25.50,26.00,19,8,0.05,0.07,0.17,0.11,0.00,0.00,0,0, +1746045414176,19,2149,1071,543.63,2147.67,1091.05,12320,4809,-66.06,16,5,-48.28,6.84,26.50,28.00,16,10,0.10,0.17,0.17,0.11,0.00,0.00,0,0, +1746045415176,19,2137,1083,695.82,2159.90,1090.34,12897,4637,-66.00,16,5,-48.22,6.84,27.00,26.00,19,9,0.06,0.06,0.17,0.11,0.00,0.00,0,0, +1746045416176,19,2137,1071,731.50,2147.62,1086.73,10489,4807,-66.25,16,5,-48.47,6.83,27.00,28.00,15,11,0.11,0.23,0.17,0.11,0.00,0.00,0,0, +1746045417176,19,2137,1083,665.27,2147.80,1086.62,14957,5142,-66.25,16,5,-48.47,6.83,27.50,25.00,18,7,0.04,0.08,0.17,0.11,0.00,0.00,0,0, +1746045418176,19,2149,1083,666.32,2159.59,1091.39,14216,4671,-66.31,16,5,-48.53,6.83,27.50,26.00,16,12,0.13,0.03,0.17,0.11,0.00,0.00,0,0, +1746045419176,19,2137,1071,758.09,2147.59,1089.32,10270,4956,-66.06,16,5,-48.28,6.84,27.50,22.00,17,11,0.05,0.09,0.17,0.11,0.00,0.00,0,0, +1746045420176,19,2137,1095,535.81,2147.44,1100.99,10616,4509,-66.25,16,5,-48.47,6.83,29.00,25.00,17,12,0.15,0.07,0.17,0.11,0.00,0.00,0,0, +1746045421177,19,2149,1071,661.85,2159.77,1089.42,10148,4956,-66.25,16,5,-48.47,6.83,28.50,24.00,17,12,0.05,0.12,0.17,0.11,0.00,0.00,0,0, +1746045422176,19,2137,1083,555.32,2147.68,1093.07,10274,4595,-66.38,16,5,-48.59,6.83,27.50,24.00,19,11,0.06,0.14,0.17,0.11,0.00,0.00,0,0, +1746045423176,19,2137,1083,647.57,2147.83,1094.30,11639,4525,-66.38,16,5,-48.59,6.83,28.00,27.00,19,11,0.12,0.06,0.17,0.11,0.00,0.00,0,0, +1746045424176,19,2149,1023,735.30,2159.60,1035.82,10026,4317,-66.44,16,5,-48.66,6.83,27.50,26.00,19,13,0.11,0.13,0.17,0.11,0.00,0.00,0,0, +1746045425176,19,2137,1083,483.74,2147.88,1094.74,11529,4532,-66.06,16,5,-48.28,6.84,27.50,28.00,19,10,0.13,0.10,0.17,0.11,0.00,0.00,0,0, +1746045426176,19,2137,1083,693.05,2147.88,1092.88,11966,4691,-66.06,16,5,-48.28,6.84,25.00,27.00,18,13,0.08,0.06,0.17,0.11,0.00,0.00,0,0, +1746045427176,19,2149,1083,479.70,2159.61,1092.97,9122,4649,-65.81,16,13,-43.88,19.50,26.00,27.00,19,13,0.10,0.11,0.17,0.11,0.00,0.00,0,0, +1746045428176,19,2137,1083,576.59,2147.87,1093.90,10116,4526,-66.00,16,5,-48.22,6.84,28.50,27.00,19,9,0.14,0.15,0.17,0.11,0.00,0.00,0,0, +1746045429176,19,2137,1023,685.67,2147.82,1034.18,12701,4483,-66.00,16,5,-48.22,6.84,27.00,27.00,18,9,0.07,0.05,0.17,0.11,0.00,0.00,0,0, +1746045430176,19,2149,1083,628.78,2159.54,1093.58,10339,4617,-66.00,16,5,-48.22,6.84,26.50,27.00,19,10,0.12,0.18,0.17,0.11,0.00,0.00,0,0, +1746045431176,19,2137,1083,679.00,2147.56,1099.72,12535,4742,-65.94,16,5,-48.16,6.85,27.00,27.00,19,9,0.12,0.06,0.17,0.11,0.00,0.00,0,0, +1746045432176,19,2137,1071,627.20,2147.76,1083.35,10685,4730,-65.94,16,5,-48.16,6.85,27.00,29.00,15,13,0.11,0.11,0.17,0.11,0.00,0.00,0,0, +1746045433176,19,2149,1083,530.32,2159.70,1086.97,9811,5124,-65.81,16,5,-48.03,6.85,25.50,27.00,18,10,0.04,0.16,0.17,0.11,0.00,0.00,0,0, +1746045434176,19,2137,1071,666.04,2147.85,1090.02,12509,4783,-66.12,16,68,-37.01,121.50,25.50,27.00,14,10,0.15,0.06,0.17,0.11,0.00,0.00,0,0, +1746045435176,19,2137,1071,675.04,2147.52,1081.14,10667,5481,-66.12,16,68,-37.01,121.50,25.50,25.00,14,10,0.06,0.16,0.17,0.11,0.00,0.00,0,0, +1746045436176,19,2149,1095,610.23,2159.71,1100.09,12587,4726,-66.06,16,106,-35.02,199.97,25.50,25.00,20,10,0.11,0.06,0.17,0.11,0.00,0.00,0,0, +1746045437176,19,2137,1023,633.57,2147.61,1034.54,10043,4583,-65.94,16,5,-48.16,6.85,27.00,25.00,17,11,0.08,0.21,0.17,0.11,0.00,0.00,0,0, +1746045438176,19,2137,1071,639.14,2147.82,1091.58,13753,4969,-66.12,16,5,-48.34,6.84,26.50,24.00,19,8,0.08,0.08,0.17,0.11,0.00,0.00,0,0, +1746045439176,19,2149,1083,713.96,2159.69,1090.64,12042,4466,-66.19,16,5,-48.41,6.84,26.50,28.00,18,12,0.09,0.18,0.17,0.11,0.00,0.00,0,0, +1746045440176,19,2137,1083,641.90,2147.55,1090.77,12465,4702,-66.19,16,5,-48.41,6.84,26.50,27.00,20,10,0.14,0.07,0.17,0.11,0.00,0.00,0,0, +1746045441176,19,2137,1071,692.00,2147.49,1090.51,10565,4837,-66.25,16,5,-48.47,6.83,26.50,26.00,16,12,0.08,0.27,0.17,0.11,0.00,0.00,0,0, +1746045442176,19,2149,1083,988.54,2162.52,1089.67,19574,4816,-66.31,16,104,-35.35,195.09,25.50,26.00,20,3,0.03,0.14,0.17,0.11,0.00,0.00,0,0, +1746045443177,19,2137,1083,778.35,2155.59,1094.24,32829,4731,-66.44,16,5,-48.66,6.83,26.50,26.00,18,4,0.08,0.05,0.17,0.11,0.00,0.00,0,0, +1746045444176,19,2137,1023,595.25,2148.50,1039.43,14343,4627,-66.44,16,5,-48.66,6.83,27.50,26.00,19,12,0.07,0.08,0.17,0.11,0.00,0.00,0,0, +1746045445176,19,2149,1083,628.00,2159.82,1089.78,10781,4547,-66.38,16,5,-48.59,6.83,27.00,24.00,19,11,0.12,0.13,0.17,0.11,0.00,0.00,0,0, +1746045446176,19,2137,1083,471.57,2147.74,1094.71,11583,4303,-66.25,16,5,-48.47,6.83,27.50,25.00,19,11,0.10,0.06,0.17,0.11,0.00,0.00,0,0, +1746045447176,19,2137,1083,628.26,2147.90,1095.18,12017,4522,-66.44,16,5,-48.66,6.83,28.00,26.00,19,9,0.09,0.10,0.17,0.11,0.00,0.00,0,0, +1746045448176,19,2149,1143,643.37,2159.65,1151.54,12463,4844,-66.31,16,28,-41.05,45.23,26.00,25.00,18,12,0.15,0.04,0.17,0.11,0.00,0.00,0,0, +1746045449176,19,2137,1023,567.95,2147.66,1032.78,12466,4574,-66.31,16,5,-48.53,6.83,27.50,27.00,18,7,0.05,0.12,0.17,0.11,0.00,0.00,0,0, +1746045450176,19,2137,1083,701.95,2147.82,1093.95,15651,4531,-66.31,16,5,-48.53,6.83,25.50,25.00,19,9,0.09,0.04,0.17,0.11,0.00,0.00,0,0, +1746045451176,19,2149,1023,686.11,2159.37,1033.74,10243,4599,-66.38,16,5,-48.59,6.83,28.50,28.00,18,10,0.12,0.25,0.17,0.11,0.00,0.00,0,0, +1746045452176,19,2137,1071,677.90,2147.94,1097.11,16892,4765,-66.44,16,13,-44.51,19.41,25.50,27.00,19,6,0.07,0.09,0.17,0.11,0.00,0.00,0,0, +1746045453176,19,2137,1083,611.75,2147.73,1088.49,16224,4297,-66.44,16,5,-48.66,6.83,26.50,28.00,19,11,0.14,0.03,0.17,0.11,0.00,0.00,0,0, +1746045454176,19,2149,1083,620.86,2159.47,1092.13,10583,4760,-66.06,16,5,-48.28,6.84,26.50,27.00,18,9,0.06,0.14,0.17,0.11,0.00,0.00,0,0, +1746045455176,19,2137,1083,622.15,2147.66,1093.70,12740,4598,-65.81,16,5,-48.03,6.85,26.50,27.00,18,10,0.14,0.05,0.17,0.11,0.00,0.00,0,0, +1746045456176,19,2137,1083,666.43,2147.68,1091.46,10095,4796,-65.75,16,5,-47.97,6.85,26.50,27.00,18,11,0.05,0.21,0.17,0.11,0.00,0.00,0,0, +1746045457176,19,2149,1023,628.29,2159.98,1036.06,13770,4587,-66.06,16,5,-48.28,6.84,25.00,26.00,18,8,0.14,0.08,0.17,0.11,0.00,0.00,0,0, +1746045458176,19,2137,1143,611.05,2147.61,1149.60,11735,4796,-66.06,16,13,-44.13,19.46,24.50,27.00,19,12,0.05,0.18,0.17,0.11,0.00,0.00,0,0, +1746045459176,19,2137,1071,603.76,2147.78,1094.43,12372,4585,-66.12,16,27,-41.02,43.52,25.50,26.00,18,10,0.12,0.07,0.17,0.11,0.00,0.00,0,0, +1746045460176,19,2149,1083,550.24,2159.43,1091.71,11048,4754,-66.00,16,5,-48.22,6.84,26.50,28.00,19,11,0.08,0.14,0.17,0.11,0.00,0.00,0,0, +1746045461176,19,2137,1023,597.62,2147.83,1035.30,11396,4329,-65.94,16,5,-48.16,6.85,26.00,27.00,18,12,0.15,0.05,0.17,0.11,0.00,0.00,0,0, +1746045462176,19,2137,1083,744.43,2147.80,1091.30,10293,4793,-65.94,16,5,-48.16,6.85,26.00,27.00,18,12,0.06,0.07,0.17,0.11,0.00,0.00,0,0, +1746045463176,19,2149,1083,705.25,2159.71,1093.77,11193,4598,-65.81,16,5,-48.03,6.85,26.50,27.00,18,11,0.14,0.07,0.17,0.11,0.00,0.00,0,0, +1746045464177,19,2137,1083,501.53,2147.38,1091.72,10097,4781,-66.25,16,13,-44.32,19.43,25.00,27.00,19,13,0.05,0.20,0.17,0.11,0.00,0.00,0,0, +1746045465176,19,2137,1071,791.65,2147.98,1094.20,13169,4614,-66.00,16,28,-40.74,45.36,26.00,27.00,18,8,0.13,0.09,0.17,0.11,0.00,0.00,0,0, +1746045466176,19,2149,1035,579.41,2158.72,1033.52,12961,4794,-66.00,16,5,-48.22,6.84,25.50,28.00,18,13,0.05,0.04,0.17,0.11,0.00,0.00,0,0, +1746045467176,19,2137,1083,605.55,2148.83,1094.06,10797,4287,-66.00,16,5,-48.22,6.84,27.50,27.00,19,11,0.12,0.09,0.17,0.11,0.00,0.00,0,0, +1746045468176,19,2137,1071,722.04,2147.93,1091.49,11215,4768,-65.94,16,5,-48.16,6.85,27.00,30.00,18,12,0.07,0.06,0.17,0.11,0.00,0.00,0,0, +1746045469176,19,2149,1083,497.80,2159.62,1093.65,9870,4599,-65.88,16,5,-48.09,6.85,26.00,26.00,19,12,0.14,0.07,0.17,0.11,0.00,0.00,0,0, +1746045470177,19,2137,1083,601.80,2147.51,1092.11,9795,4716,-66.00,16,5,-48.22,6.84,25.50,27.00,18,12,0.09,0.06,0.17,0.11,0.00,0.00,0,0, +1746045471176,19,2137,1083,605.15,2147.68,1093.33,10300,4656,-65.94,16,13,-44.01,19.48,25.00,27.00,19,12,0.10,0.09,0.17,0.11,0.00,0.00,0,0, +1746045472176,19,2149,1023,494.71,2157.46,1034.31,10162,4712,-65.94,16,5,-48.16,6.85,25.50,27.00,18,12,0.09,0.10,0.17,0.11,0.00,0.00,0,0, +1746045473176,19,2137,1083,588.71,2149.87,1091.98,10043,4456,-66.00,16,5,-48.22,6.84,25.50,28.00,19,12,0.07,0.11,0.17,0.11,0.00,0.00,0,0, +1746045474176,19,2137,1083,570.05,2147.58,1094.61,10978,4508,-65.94,16,5,-48.16,6.85,25.50,26.00,19,10,0.08,0.11,0.17,0.11,0.00,0.00,0,0, +1746045475176,19,2149,1083,580.61,2147.50,1094.20,12428,4518,-65.88,16,5,-48.09,6.85,26.00,28.00,19,12,0.08,0.04,0.17,0.11,0.00,0.00,0,0, +1746045476176,19,2137,1071,609.33,2159.75,1090.66,11281,4830,-65.88,16,5,-48.09,6.85,27.00,30.00,15,10,0.13,0.10,0.17,0.11,0.00,0.00,0,0, +1746045477176,19,2137,1083,686.55,2147.79,1086.22,12020,5158,-65.81,16,5,-48.03,6.85,25.50,27.00,17,12,0.04,0.06,0.17,0.11,0.00,0.00,0,0, +1746045478176,19,2149,1083,632.16,2147.93,1095.90,10393,4556,-66.00,16,27,-40.89,43.58,26.00,27.00,18,12,0.13,0.10,0.17,0.11,0.00,0.00,0,0, +1746045479176,19,2137,1023,640.40,2159.62,1038.90,10575,4759,-66.06,16,5,-48.28,6.84,26.50,27.00,19,11,0.05,0.13,0.17,0.11,0.00,0.00,0,0, +1746045480176,19,2137,1083,678.29,2147.70,1092.32,11536,4716,-66.38,16,5,-48.59,6.83,27.00,26.00,18,12,0.10,0.05,0.17,0.11,0.00,0.00,0,0, +1746045481176,19,2149,1083,492.70,2147.55,1092.86,9969,4464,-66.38,16,5,-48.59,6.83,26.00,28.00,19,12,0.11,0.12,0.17,0.11,0.00,0.00,0,0, +1746045482176,19,2137,1083,687.95,2159.65,1091.78,10166,4711,-66.12,16,5,-48.34,6.84,26.50,27.00,18,12,0.08,0.12,0.17,0.11,0.00,0.00,0,0, +1746045483176,19,2137,1071,618.32,2147.52,1093.07,9847,4633,-66.06,16,5,-48.28,6.84,26.50,27.00,19,12,0.13,0.09,0.17,0.11,0.00,0.00,0,0, +1746045484176,19,2149,1083,636.05,2155.08,1093.81,12241,4513,-65.81,16,5,-48.03,6.85,26.00,27.00,18,10,0.16,0.07,0.17,0.11,0.00,0.00,0,0, +1746045485176,19,2137,1083,585.80,2152.28,1091.06,10520,4808,-65.81,16,5,-48.03,6.85,27.50,27.00,18,13,0.07,0.08,0.17,0.11,0.00,0.00,0,0, +1746045486176,19,2137,1071,751.18,2147.90,1077.81,12570,4503,-65.94,16,5,-48.16,6.85,26.50,27.00,17,7,0.23,0.12,0.17,0.11,0.00,0.00,0,0, +1746045487176,19,2149,1071,644.38,2147.83,1082.28,15643,5732,-66.19,16,5,-48.41,6.84,27.00,28.00,13,9,0.08,0.04,0.17,0.11,0.00,0.00,0,0, +1746045488176,19,2137,1071,678.75,2159.99,1082.00,10249,5681,-66.06,16,13,-44.13,19.46,25.50,27.00,19,12,0.03,0.15,0.17,0.11,0.00,0.00,0,0, +1746045489176,19,2137,1083,614.88,2147.43,1095.74,11308,4305,-66.19,16,5,-48.41,6.84,27.00,25.00,19,10,0.09,0.11,0.17,0.11,0.00,0.00,0,0, +1746045490176,19,2137,1083,548.15,2147.63,1093.71,11899,4518,-66.19,16,5,-48.41,6.84,26.50,25.00,19,13,0.12,0.05,0.17,0.11,0.00,0.00,0,0, +1746045491176,19,2149,1023,688.24,2159.77,1036.24,11493,4299,-66.19,16,5,-48.41,6.84,27.50,26.00,19,8,0.09,0.13,0.17,0.11,0.00,0.00,0,0, +1746045492176,19,2137,1083,511.70,2147.95,1093.55,13944,4582,-66.38,16,5,-48.59,6.83,28.00,26.00,19,9,0.12,0.05,0.17,0.11,0.00,0.00,0,0, +1746045493176,19,2137,1083,573.55,2147.42,1094.14,10273,4587,-66.25,16,5,-48.47,6.83,28.00,28.00,18,10,0.13,0.30,0.17,0.11,0.00,0.00,0,0, +1746045494176,19,2149,1083,816.27,2163.42,1091.14,21296,4784,-66.25,16,5,-48.47,6.83,26.50,27.00,19,4,0.05,0.10,0.17,0.11,0.00,0.00,0,0, +1746045495176,19,2137,1083,685.25,2152.76,1098.83,23836,4618,-66.31,16,5,-48.53,6.83,26.00,27.00,17,8,0.12,0.04,0.17,0.11,0.00,0.00,0,0, +1746045496176,19,2137,1023,734.45,2147.70,1036.30,10261,4921,-66.06,16,12,-44.48,17.82,25.00,28.00,19,13,0.04,0.13,0.17,0.11,0.00,0.00,0,0, +1746045497176,19,2149,1083,531.25,2159.69,1088.76,9711,4341,-66.06,16,5,-48.28,6.84,26.50,26.00,18,12,0.12,0.13,0.17,0.11,0.00,0.00,0,0, +1746045498176,19,2137,1071,666.00,2147.72,1091.87,10102,5028,-66.06,16,5,-48.28,6.84,28.00,26.00,18,12,0.05,0.11,0.17,0.11,0.00,0.00,0,0, +1746045499176,19,2137,1083,664.90,2147.64,1094.17,9980,4311,-66.06,16,5,-48.28,6.84,26.50,28.00,19,12,0.15,0.10,0.17,0.11,0.00,0.00,0,0, +1746045500176,19,2149,1083,565.62,2159.71,1091.34,10155,4797,-66.12,16,5,-48.34,6.84,26.50,27.00,18,12,0.06,0.12,0.17,0.11,0.00,0.00,0,0, +1746045501176,19,2137,1083,539.91,2147.78,1093.66,10164,4792,-66.25,16,106,-35.21,199.47,25.00,26.00,19,12,0.09,0.11,0.17,0.11,0.00,0.00,0,0, +1746045502176,19,2137,1071,640.05,2147.62,1084.40,10185,4253,-66.19,16,5,-48.41,6.84,27.00,27.00,19,12,0.15,0.12,0.17,0.11,0.00,0.00,0,0, +1746045503176,19,2149,1083,718.10,2159.66,1094.97,11162,4499,-66.12,16,12,-44.54,17.81,25.50,27.00,19,11,0.13,0.09,0.17,0.11,0.00,0.00,0,0, +1746045504176,19,2137,1023,614.14,2147.53,1035.81,11309,4512,-66.12,16,5,-48.34,6.84,28.50,25.00,19,11,0.15,0.07,0.17,0.11,0.00,0.00,0,0, +1746045505176,19,2137,1083,601.90,2147.78,1093.70,10916,4986,-66.06,16,5,-48.28,6.84,27.50,26.00,16,12,0.07,0.08,0.17,0.11,0.00,0.00,0,0, +1746045506176,19,2149,1095,742.76,2159.50,1108.49,9821,4480,-66.31,16,5,-48.53,6.83,28.00,27.00,20,12,0.10,0.08,0.17,0.11,0.00,0.00,0,0, +1746045507176,19,2137,1083,615.48,2147.69,1093.10,10233,4620,-66.12,16,5,-48.34,6.84,26.50,26.00,18,12,0.09,0.09,0.17,0.11,0.00,0.00,0,0, +1746045508176,19,2137,1023,857.47,2147.51,1034.56,10126,4642,-66.12,16,5,-48.34,6.84,26.00,27.00,20,12,0.08,0.12,0.17,0.11,0.00,0.00,0,0, +1746045509176,19,2149,1095,685.45,2159.70,1099.54,10575,4358,-66.12,16,5,-48.34,6.84,25.50,27.00,18,10,0.11,0.18,0.17,0.11,0.00,0.00,0,0, +1746045510176,19,2137,1083,599.74,2147.73,1092.56,12746,4964,-66.00,16,5,-48.22,6.84,26.00,27.00,19,9,0.07,0.06,0.17,0.11,0.00,0.00,0,0, +1746045511176,19,2137,1131,520.43,2147.64,1152.84,11091,4532,-66.19,16,5,-48.41,6.84,26.00,26.00,19,11,0.08,0.14,0.17,0.11,0.00,0.00,0,0, +1746045512176,19,2149,1023,642.27,2159.58,1035.42,11150,4284,-66.00,16,5,-48.22,6.84,27.00,27.00,19,12,0.09,0.05,0.17,0.11,0.00,0.00,0,0, +1746045513176,19,2137,1083,659.57,2147.60,1094.45,10048,4537,-66.00,16,5,-48.22,6.84,26.50,27.00,19,12,0.07,0.09,0.17,0.11,0.00,0.00,0,0, +1746045514176,19,2137,1083,608.19,2147.63,1093.30,11582,4505,-66.06,16,5,-48.28,6.84,26.00,27.00,19,10,0.09,0.09,0.17,0.11,0.00,0.00,0,0, +1746045515176,19,2149,1035,517.23,2159.71,1035.86,12282,4293,-66.19,16,5,-48.41,6.84,28.00,27.00,19,11,0.13,0.08,0.17,0.11,0.00,0.00,0,0, +1746045516176,19,2137,1083,491.68,2147.50,1094.86,10641,4510,-66.12,16,5,-48.34,6.84,27.00,27.00,19,12,0.15,0.08,0.17,0.11,0.00,0.00,0,0, +1746045517176,19,2137,1071,710.33,2147.82,1092.01,10127,4799,-66.12,16,5,-48.34,6.84,26.00,25.00,18,12,0.06,0.13,0.17,0.11,0.00,0.00,0,0, +1746045518176,19,2149,1143,606.05,2159.81,1151.50,13179,4821,-66.38,16,106,-35.33,199.14,25.00,28.00,19,8,0.09,0.09,0.17,0.11,0.00,0.00,0,0, +1746045519176,19,2137,1023,670.55,2147.98,1032.22,12864,4519,-66.62,16,5,-48.84,6.82,27.00,26.00,18,13,0.07,0.04,0.17,0.11,0.00,0.00,0,0, +1746045520176,19,2137,1083,894.57,2148.96,1093.41,14488,4603,-66.31,16,55,-38.12,95.68,26.00,27.00,19,5,0.10,0.14,0.17,0.11,0.00,0.00,0,0, +1746045521176,19,2149,1023,745.46,2165.16,1034.34,21865,4404,-66.25,16,5,-48.47,6.83,26.50,27.00,18,5,0.10,0.05,0.17,0.11,0.00,0.00,0,0, +1746045522176,19,2137,1083,675.22,2148.66,1141.27,12603,4925,-66.25,16,12,-44.67,17.80,25.50,28.00,19,14,0.10,0.12,0.17,0.11,0.00,0.00,0,0, +1746045523176,19,2137,1083,660.19,2147.89,1045.79,12587,4505,-66.12,16,5,-48.34,6.84,26.50,27.00,19,8,0.12,0.10,0.17,0.11,0.00,0.00,0,0, +1746045524176,19,2149,1071,642.79,2159.71,1093.22,13172,4396,-66.06,16,5,-48.28,6.84,27.00,27.00,18,12,0.11,0.04,0.17,0.11,0.00,0.00,0,0, +1746045525176,19,2137,1083,529.52,2147.61,1097.65,9879,4981,-66.06,16,13,-44.13,19.46,25.50,27.00,19,10,0.06,0.21,0.17,0.11,0.00,0.00,0,0, +1746045526176,19,2137,1083,589.83,2147.59,1093.38,15367,4592,-66.06,16,13,-44.13,19.46,25.50,27.00,19,7,0.15,0.07,0.17,0.11,0.00,0.00,0,0, +1746045527176,19,2149,1083,661.62,2159.73,1086.34,13266,4558,-66.31,16,5,-48.53,6.83,26.00,28.00,18,11,0.06,0.19,0.17,0.11,0.00,0.00,0,0, +1746045528176,19,2137,1083,567.57,2147.77,1092.53,12842,4551,-66.31,16,5,-48.53,6.83,26.50,28.00,19,9,0.14,0.07,0.17,0.11,0.00,0.00,0,0, +1746045529176,19,2137,1023,698.26,2147.71,1035.64,11140,4518,-66.00,16,5,-48.22,6.84,26.00,25.00,19,10,0.13,0.22,0.17,0.11,0.00,0.00,0,0, +1746045530176,19,2149,1083,675.36,2159.83,1093.70,15290,4297,-66.12,16,5,-48.34,6.84,26.00,27.00,19,7,0.10,0.08,0.17,0.11,0.00,0.00,0,0, +1746045531176,19,2137,1083,489.60,2147.60,1100.23,13735,4747,-66.12,16,5,-48.34,6.84,25.50,27.00,19,12,0.10,0.06,0.17,0.11,0.00,0.00,0,0, +1746045532176,19,2137,1083,626.05,2147.72,1088.14,10367,4422,-66.19,16,5,-48.41,6.84,26.00,26.00,18,12,0.11,0.08,0.17,0.11,0.00,0.00,0,0, +1746045533176,19,2149,1083,586.10,2147.54,1092.70,10058,4719,-66.19,16,106,-35.14,199.64,25.50,27.00,19,12,0.08,0.12,0.17,0.11,0.00,0.00,0,0, +1746045534176,19,2137,1071,531.39,2159.44,1092.66,10017,4732,-65.94,16,5,-48.16,6.85,26.00,28.00,18,12,0.09,0.10,0.17,0.11,0.00,0.00,0,0, +1746045535176,19,2137,1035,735.48,2147.83,1039.85,12980,4601,-66.06,16,5,-48.28,6.84,26.00,27.00,20,8,0.11,0.09,0.17,0.11,0.00,0.00,0,0, +1746045536176,19,2149,1083,649.17,2158.78,1097.69,12984,4505,-66.06,16,5,-48.28,6.84,24.50,26.00,17,13,0.09,0.04,0.17,0.11,0.00,0.00,0,0, +1746045537176,19,2137,1083,765.00,2148.89,1095.97,10732,5050,-66.06,16,5,-48.28,6.84,27.00,25.00,19,11,0.10,0.10,0.17,0.11,0.00,0.00,0,0, +1746045538176,19,2137,1083,758.87,2147.82,1087.81,11537,4451,-66.00,16,5,-48.22,6.84,26.50,27.00,18,12,0.10,0.06,0.17,0.11,0.00,0.00,0,0, +1746045539176,19,2149,1083,581.28,2147.34,1092.78,9832,4669,-66.00,16,5,-48.22,6.84,25.00,26.00,19,12,0.11,0.07,0.17,0.11,0.00,0.00,0,0, +1746045540177,19,2137,1071,652.68,2159.73,1090.54,10217,4635,-66.00,16,5,-48.22,6.84,26.00,30.00,18,12,0.08,0.08,0.17,0.11,0.00,0.00,0,0, +1746045541177,19,2137,1023,630.95,2147.50,1084.19,10081,4636,-66.00,16,5,-48.22,6.84,26.00,28.00,19,12,0.13,0.08,0.17,0.11,0.00,0.00,0,0, +1746045541177,20,0,0,0.00,0.00,0.00,10,65,-76.93,15,5,-59.15,6.50,32.00,33.00,0,0,0.01,0.06,0.00,0.00,nan,0.00,0,0, +1746045542177,19,2149,1095,524.17,2157.43,1056.70,10268,4606,-66.06,16,5,-48.28,6.84,26.00,27.00,17,12,0.10,0.09,0.17,0.11,0.00,0.00,0,0, +1746045542177,20,0,0,0.00,0.00,0.00,5,50,-83.25,16,5,-65.47,6.36,37.00,35.00,0,0,0.00,0.05,0.00,0.00,nan,0.00,0,0, +1746045543177,19,2137,1083,513.05,2149.92,1090.56,10048,4880,-65.75,16,5,-47.97,6.85,26.00,27.00,19,12,0.09,0.09,0.17,0.11,0.00,0.00,0,0, +1746045543177,20,0,0,0.00,0.00,0.00,5,50,-59.81,16,5,-42.03,7.12,32.50,34.00,0,0,0.00,0.05,0.00,0.00,nan,0.00,0,0, +1746045544177,19,2137,1095,772.95,2147.48,1107.23,10024,4808,-65.81,16,5,-48.03,6.85,27.00,27.00,18,12,0.09,0.10,0.17,0.11,0.00,0.00,0,0, +1746045544177,20,0,0,0.00,0.00,0.00,5,50,-69.56,16,5,-51.78,6.72,36.00,34.00,0,0,0.00,0.04,0.00,0.00,nan,0.00,0,0, +1746045545177,19,2149,1023,731.63,2147.91,1039.53,11598,4655,-65.81,16,13,-43.88,19.50,25.00,27.00,19,11,0.09,0.07,0.17,0.11,0.00,0.00,0,0, +1746045545177,20,0,0,0.00,0.00,0.00,5,50,-69.56,16,5,-51.78,6.72,30.50,33.00,0,0,0.00,0.04,0.00,0.00,nan,0.00,0,0, +1746045546177,19,2137,1083,525.11,2159.61,1087.42,10467,4471,-66.00,16,5,-48.22,6.84,27.00,27.00,18,12,0.09,0.12,0.17,0.11,0.00,0.00,0,0, +1746045546177,20,0,0,0.00,0.00,0.00,5,50,-68.25,16,5,-50.47,6.76,35.00,33.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045547177,19,2137,1095,776.53,2147.63,1107.26,10463,4817,-65.69,16,5,-47.91,6.86,26.00,27.00,19,10,0.10,0.16,0.17,0.11,0.00,0.00,0,0, +1746045547177,20,0,0,0.00,0.00,0.00,5,50,-62.44,16,5,-44.66,6.99,31.00,33.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045548177,19,2149,1083,552.35,2147.81,1094.52,12847,4510,-66.00,16,5,-48.22,6.84,25.50,28.00,19,10,0.10,0.06,0.17,0.11,0.00,0.00,0,0, +1746045548177,20,0,0,0.00,0.00,0.00,5,50,-72.19,16,5,-54.41,6.63,34.50,34.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045549177,19,2137,1083,587.05,2159.66,1093.16,11166,4689,-66.00,16,5,-48.22,6.84,25.00,27.00,18,9,0.10,0.17,0.17,0.11,0.00,0.00,0,0, +1746045549177,20,0,0,0.00,0.00,0.00,5,50,-72.19,16,5,-54.41,6.63,31.00,32.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045550177,19,2137,1035,694.43,2147.81,1048.35,14067,4611,-66.00,16,5,-48.22,6.84,26.00,27.00,19,8,0.09,0.06,0.17,0.11,0.00,0.00,0,0, +1746045550177,20,0,0,0.00,0.00,0.00,5,50,-76.00,15,5,-58.22,6.53,33.00,34.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045551177,19,2149,1083,580.60,2159.45,1092.59,11012,4666,-66.00,16,5,-48.22,6.84,24.50,27.00,18,12,0.09,0.11,0.17,0.11,0.00,0.00,0,0, +1746045551177,20,0,0,0.00,0.00,0.00,5,50,-78.19,16,5,-60.41,6.47,30.50,30.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045552177,19,2137,1083,534.68,2147.41,1093.62,9695,4678,-66.00,16,5,-48.22,6.84,26.50,27.00,19,12,0.13,0.11,0.17,0.11,0.00,0.00,0,0, +1746045552177,20,0,0,0.00,0.00,0.00,5,50,-72.23,13,5,-54.45,6.63,33.00,29.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045553177,19,2137,1071,638.10,2147.76,1091.11,10242,4771,-66.12,16,5,-48.34,6.84,25.50,27.00,18,12,0.07,0.10,0.17,0.11,0.00,0.00,0,0, +1746045553177,20,0,0,0.00,0.00,0.00,5,50,-72.06,16,5,-54.28,6.64,31.00,32.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045554177,19,2137,1047,524.26,2147.51,1054.69,10088,4735,-66.12,16,5,-48.34,6.84,25.50,27.00,19,12,0.14,0.10,0.17,0.11,0.00,0.00,0,0, +1746045554177,20,0,0,0.00,0.00,0.00,5,50,-72.06,16,5,-54.28,6.64,34.00,31.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045555177,19,2149,1071,529.48,2159.70,1086.52,10105,4551,-66.00,16,5,-48.22,6.84,26.00,26.00,18,12,0.06,0.08,0.17,0.11,0.00,0.00,0,0, +1746045555177,20,0,0,0.00,0.00,0.00,5,50,-75.56,16,5,-57.78,6.54,30.00,30.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045556177,19,2137,1143,660.61,2147.66,1153.24,10171,4804,-66.00,16,5,-48.22,6.84,26.50,28.00,19,12,0.14,0.08,0.17,0.11,0.00,0.00,0,0, +1746045556177,20,0,0,0.00,0.00,0.00,5,50,-71.62,16,5,-53.84,6.65,33.50,30.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045557177,19,2137,1023,538.33,2147.78,1033.30,10109,4489,-66.12,16,5,-48.34,6.84,27.50,27.00,18,12,0.07,0.11,0.17,0.11,0.00,0.00,0,0, +1746045557177,20,0,0,0.00,0.00,0.00,5,50,-73.69,16,5,-55.91,6.59,30.50,30.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045558177,19,2149,1083,686.95,2159.65,1093.71,10155,4834,-66.12,16,106,-35.08,199.81,25.00,26.00,19,12,0.13,0.10,0.17,0.11,0.00,0.00,0,0, +1746045558177,20,0,0,0.00,0.00,0.00,5,50,-73.69,16,5,-55.91,6.59,34.00,31.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045559177,19,2137,1095,598.67,2147.58,1107.69,9914,4547,-65.94,16,5,-48.16,6.85,27.00,26.00,18,12,0.11,0.12,0.17,0.11,0.00,0.00,0,0, +1746045559177,20,0,0,0.00,0.00,0.00,5,50,-72.94,16,5,-55.16,6.61,30.50,32.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045560177,19,2137,1023,613.77,2147.54,1034.03,10103,4703,-66.25,16,5,-48.47,6.83,27.00,28.00,19,12,0.08,0.11,0.17,0.11,0.00,0.00,0,0, +1746045560177,20,0,0,0.00,0.00,0.00,5,50,-72.56,16,5,-54.78,6.62,34.50,30.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045561177,19,2149,1143,652.55,2159.52,1152.81,9878,4516,-65.94,16,5,-48.16,6.85,26.50,27.00,19,12,0.12,0.10,0.17,0.11,0.00,0.00,0,0, +1746045561177,20,0,0,0.00,0.00,0.00,5,50,-83.58,12,5,-65.80,6.35,29.00,31.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045562177,19,2137,1023,681.81,2147.43,1033.77,10005,4505,-65.94,16,5,-48.16,6.85,26.00,26.00,18,12,0.07,0.10,0.17,0.11,0.00,0.00,0,0, +1746045562177,20,0,0,0.00,0.00,0.00,5,50,-77.93,15,5,-60.15,6.48,33.00,31.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045563177,19,2149,1083,579.25,2147.82,1094.05,10187,4648,-65.94,16,5,-48.16,6.85,27.50,27.00,19,12,0.14,0.09,0.17,0.11,0.00,0.00,0,0, +1746045563177,20,0,0,0.00,0.00,0.00,5,50,-77.93,15,5,-60.15,6.48,31.50,33.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045564177,19,2137,1083,666.17,2159.77,1091.39,12227,4714,-66.19,16,5,-48.41,6.84,26.50,27.00,17,9,0.11,0.09,0.17,0.11,0.00,0.00,0,0, +1746045564177,20,0,0,0.00,0.00,0.00,5,50,-71.57,14,5,-53.79,6.65,34.50,34.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045565177,19,2137,1071,858.35,2147.34,1089.71,11475,4883,-66.12,16,106,-35.08,199.81,25.00,26.00,19,13,0.05,0.09,0.17,0.11,0.00,0.00,0,0, +1746045565177,20,0,0,0.00,0.00,0.00,5,50,-65.70,10,5,-47.92,6.86,31.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045566177,19,2137,1083,578.68,2147.87,1092.18,14031,4691,-65.75,16,27,-40.64,43.68,26.00,27.00,18,6,0.11,0.13,0.17,0.11,0.00,0.00,0,0, +1746045566177,20,0,0,0.00,0.00,0.00,5,50,-71.67,9,5,-53.89,6.65,38.50,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045567177,19,2149,1023,559.25,2159.66,1032.86,18267,4543,-65.81,16,5,-48.03,6.85,26.00,27.00,19,7,0.05,0.05,0.17,0.11,0.00,0.00,0,0, +1746045567177,20,0,0,0.00,0.00,0.00,5,50,-73.50,14,5,-55.72,6.60,31.00,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045568177,19,2137,1095,839.41,2147.86,1109.74,11730,4654,-65.81,16,5,-48.03,6.85,26.50,26.00,19,10,0.10,0.17,0.17,0.11,0.00,0.00,0,0, +1746045568177,20,0,0,0.00,0.00,0.00,5,50,-73.50,14,5,-55.72,6.60,35.00,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045569177,19,2137,1083,746.76,2147.66,1092.29,12555,4747,-65.75,16,5,-47.97,6.85,26.50,26.00,18,9,0.08,0.06,0.17,0.11,0.00,0.00,0,0, +1746045569177,20,0,0,0.00,0.00,0.00,5,50,-74.20,15,5,-56.42,6.58,30.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045570177,19,2149,1083,725.19,2171.94,1092.39,12032,4660,-66.12,16,106,-35.08,199.81,25.50,27.00,19,10,0.08,0.11,0.17,0.11,0.00,0.00,0,0, +1746045570177,20,0,0,0.00,0.00,0.00,5,50,-71.54,13,5,-53.76,6.65,34.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045571177,19,2137,1035,728.70,2147.56,1050.40,11912,4619,-66.14,14,5,-48.36,6.84,25.00,26.00,19,12,0.12,0.06,0.17,0.11,0.00,0.00,0,0, +1746045571177,20,0,0,0.00,0.00,0.00,5,50,-68.79,14,5,-51.00,6.74,29.50,29.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045572177,19,2137,1083,561.05,2147.50,1094.06,11271,4321,-66.14,14,5,-48.36,6.84,26.50,25.00,18,10,0.16,0.10,0.17,0.11,0.00,0.00,0,0, +1746045572177,20,0,0,0.00,0.00,0.00,5,50,-68.79,14,5,-51.00,6.74,35.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045573177,19,2149,1083,623.19,2159.35,1091.04,11532,4833,-66.12,16,5,-48.34,6.84,27.00,28.00,18,13,0.05,0.06,0.17,0.11,0.00,0.00,0,0, +1746045573177,20,0,0,0.00,0.00,0.00,5,50,-75.00,15,5,-57.22,6.55,31.50,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045574177,19,2137,1083,778.38,2148.89,1094.36,14336,4752,-66.31,16,106,-35.27,199.31,25.00,27.00,19,5,0.12,0.14,0.17,0.11,0.00,0.00,0,0, +1746045574177,20,0,0,0.00,0.00,0.00,5,50,-69.20,15,5,-51.42,6.73,34.50,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045575177,19,2137,1083,755.88,2153.46,1093.18,21724,4398,-66.00,16,5,-48.22,6.84,26.00,27.00,18,6,0.12,0.05,0.17,0.11,0.00,0.00,0,0, +1746045575177,20,0,0,0.00,0.00,0.00,5,50,-77.00,13,5,-59.22,6.50,30.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045576177,19,2149,1071,633.95,2159.90,1091.66,11824,4778,-66.06,16,106,-35.02,199.97,25.00,27.00,19,13,0.05,0.20,0.17,0.11,0.00,0.00,0,0, +1746045576177,20,0,0,0.00,0.00,0.00,5,50,-73.47,15,5,-55.69,6.60,37.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045577177,19,2137,1035,629.40,2147.98,1046.11,14011,4423,-66.06,16,5,-48.28,6.84,27.50,29.00,19,7,0.13,0.10,0.17,0.11,0.00,0.00,0,0, +1746045577177,20,0,0,0.00,0.00,0.00,5,50,-73.47,15,5,-55.69,6.60,30.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045578177,19,2137,1083,693.90,2147.59,1092.94,14568,4400,-66.19,16,5,-48.41,6.84,26.00,26.00,18,11,0.10,0.04,0.17,0.11,0.00,0.00,0,0, +1746045578177,20,0,0,0.00,0.00,0.00,5,50,-77.62,16,5,-59.84,6.49,37.50,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045579177,19,2149,1083,622.90,2159.50,1091.47,10115,4723,-66.06,16,5,-48.28,6.84,26.00,27.00,19,12,0.07,0.14,0.17,0.11,0.00,0.00,0,0, +1746045579177,20,0,0,0.00,0.00,0.00,5,50,-73.86,14,5,-56.08,6.59,31.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045580177,19,2137,1083,657.52,2147.53,1093.65,10029,4634,-66.19,16,5,-48.41,6.84,28.00,27.00,18,12,0.11,0.11,0.17,0.11,0.00,0.00,0,0, +1746045580177,20,0,0,0.00,0.00,0.00,5,50,-71.06,16,5,-53.28,6.67,33.50,29.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045581177,19,2137,1083,704.52,2147.65,1092.50,11276,4715,-66.19,16,13,-44.26,19.44,25.50,27.00,19,9,0.07,0.12,0.17,0.11,0.00,0.00,0,0, +1746045581177,20,0,0,0.00,0.00,0.00,5,50,-71.06,16,5,-53.28,6.67,31.00,29.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045582177,19,2149,1035,569.15,2159.62,1051.22,12521,4407,-65.88,16,5,-48.09,6.85,26.50,27.00,18,11,0.14,0.04,0.17,0.11,0.00,0.00,0,0, +1746045582177,20,0,0,0.00,0.00,0.00,5,50,-77.08,13,5,-59.30,6.50,33.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045583177,19,2137,1083,545.95,2147.79,1091.42,11379,4802,-66.06,16,5,-48.28,6.84,26.00,27.00,18,9,0.05,0.12,0.17,0.11,0.00,0.00,0,0, +1746045583177,20,0,0,0.00,0.00,0.00,5,50,-71.54,13,5,-53.76,6.65,31.50,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045584177,19,2137,1083,733.18,2147.60,1094.41,12731,4551,-66.12,16,5,-48.34,6.84,25.00,27.00,19,11,0.13,0.04,0.17,0.11,0.00,0.00,0,0, +1746045584177,20,0,0,0.00,0.00,0.00,5,50,-70.31,16,5,-52.53,6.69,34.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045585177,19,2149,1083,499.52,2159.76,1091.85,10269,4728,-66.00,16,5,-48.22,6.84,25.00,27.00,18,12,0.07,0.11,0.17,0.11,0.00,0.00,0,0, +1746045585177,20,0,0,0.00,0.00,0.00,5,50,-76.88,16,5,-59.09,6.50,32.50,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045586177,19,2137,1071,517.95,2147.54,1093.37,9921,4622,-66.00,16,106,-34.96,200.14,25.50,27.00,19,12,0.12,0.11,0.17,0.11,0.00,0.00,0,0, +1746045586177,20,0,0,0.00,0.00,0.00,5,50,-76.88,16,5,-59.09,6.50,32.50,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045587177,19,2137,1083,707.86,2147.64,1092.64,10079,4684,-66.25,16,5,-48.47,6.83,26.00,26.00,18,12,0.09,0.11,0.17,0.11,0.00,0.00,0,0, +1746045587177,20,0,0,0.00,0.00,0.00,5,50,-74.25,16,5,-56.47,6.57,31.50,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045588177,19,2149,1023,683.45,2159.83,1039.18,10224,4655,-65.88,16,13,-43.94,19.49,25.00,27.00,19,12,0.08,0.11,0.17,0.11,0.00,0.00,0,0, +1746045588177,20,0,0,0.00,0.00,0.00,5,50,-76.57,14,5,-58.79,6.51,37.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045589177,19,2137,1095,607.23,2147.29,1102.59,9974,4566,-66.19,16,5,-48.41,6.84,26.50,26.00,18,12,0.09,0.10,0.17,0.11,0.00,0.00,0,0, +1746045589177,20,0,0,0.00,0.00,0.00,5,50,-77.44,16,5,-59.66,6.49,29.50,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045590177,19,2137,1035,647.80,2147.55,1046.64,11160,4705,-66.19,16,104,-35.23,195.41,25.50,27.00,20,10,0.13,0.11,0.17,0.11,0.00,0.00,0,0, +1746045590177,20,0,0,0.00,0.00,0.00,5,50,-77.44,16,5,-59.66,6.49,33.00,34.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045591177,19,2149,1143,507.27,2159.92,1148.52,12129,4871,-66.19,16,5,-48.41,6.84,26.50,27.00,17,13,0.07,0.05,0.17,0.11,0.00,0.00,0,0, +1746045591177,20,0,0,0.00,0.00,0.00,5,50,-73.69,13,5,-55.91,6.59,31.50,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045592177,19,2137,1023,465.52,2147.62,1040.18,10823,4623,-66.12,16,5,-48.34,6.84,26.00,28.00,20,8,0.12,0.14,0.17,0.11,0.00,0.00,0,0, +1746045592177,20,0,0,0.00,0.00,0.00,5,50,-75.19,16,5,-57.41,6.55,34.50,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045593177,19,2137,1095,747.87,2147.62,1098.09,13769,4351,-66.31,16,5,-48.53,6.83,26.00,27.00,18,9,0.09,0.05,0.17,0.11,0.00,0.00,0,0, +1746045593177,20,0,0,0.00,0.00,0.00,5,50,-69.00,16,5,-51.22,6.74,33.00,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045594177,19,2149,1071,583.05,2147.75,1092.80,10791,4686,-66.25,16,5,-48.47,6.83,27.00,27.00,19,11,0.10,0.12,0.17,0.11,0.00,0.00,0,0, +1746045594177,20,0,0,0.00,0.00,0.00,5,50,-69.00,16,5,-51.22,6.74,33.50,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045595177,19,2137,1095,631.37,2159.62,1094.71,11094,4557,-66.25,16,5,-48.47,6.83,27.00,26.00,18,12,0.14,0.06,0.17,0.11,0.00,0.00,0,0, +1746045595177,20,0,0,0.00,0.00,0.00,5,50,-69.00,16,5,-51.22,6.74,31.50,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045596177,19,2137,1011,674.76,2147.71,1082.50,10033,4774,-66.31,16,5,-48.53,6.83,26.50,27.00,19,12,0.05,0.14,0.17,0.11,0.00,0.00,0,0, +1746045596177,20,0,0,0.00,0.00,0.00,5,50,-70.31,16,5,-52.53,6.69,33.50,34.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045597177,19,2149,1143,675.52,2159.66,1103.99,12203,4522,-66.06,16,5,-48.28,6.84,25.50,25.00,19,10,0.12,0.06,0.17,0.11,0.00,0.00,0,0, +1746045597177,20,0,0,0.00,0.00,0.00,5,50,-74.80,15,5,-57.02,6.56,32.50,35.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045598177,19,2137,1083,681.78,2147.62,1093.32,10496,4660,-65.88,16,28,-40.61,45.42,26.00,28.00,18,12,0.10,0.22,0.17,0.11,0.00,0.00,0,0, +1746045598177,20,0,0,0.00,0.00,0.00,5,50,-77.75,12,5,-59.97,6.48,38.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045599177,19,2137,1035,653.65,2147.97,1047.83,14799,4568,-66.06,16,106,-35.02,199.97,25.00,27.00,19,7,0.08,0.09,0.17,0.11,0.00,0.00,0,0, +1746045599177,20,0,0,0.00,0.00,0.00,5,50,-76.88,16,5,-59.09,6.50,31.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045600177,19,2149,1083,681.85,2159.77,1093.28,14088,4693,-66.06,16,5,-48.28,6.84,28.00,27.00,18,12,0.09,0.03,0.17,0.11,0.00,0.00,0,0, +1746045600177,20,0,0,0.00,0.00,0.00,5,50,-76.88,16,5,-59.09,6.50,37.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045601177,19,2137,1083,569.30,2147.84,1091.76,10391,4680,-66.25,16,5,-48.47,6.83,26.00,27.00,19,11,0.06,0.12,0.17,0.11,0.00,0.00,0,0, +1746045601177,20,0,0,0.00,0.00,0.00,5,50,-72.94,16,5,-55.16,6.61,29.00,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045602177,19,2137,1095,766.24,2147.70,1108.18,11291,4622,-66.12,16,5,-48.34,6.84,26.50,26.00,19,12,0.09,0.09,0.17,0.11,0.00,0.00,0,0, +1746045602177,20,0,0,0.00,0.00,0.00,5,50,-77.07,14,5,-59.29,6.50,35.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045603177,19,2149,1023,618.41,2159.67,1035.79,10333,4323,-66.12,16,5,-48.34,6.84,26.00,27.00,18,12,0.16,0.12,0.17,0.11,0.00,0.00,0,0, +1746045603177,20,0,0,0.00,0.00,0.00,5,50,-79.62,13,5,-61.83,6.44,30.00,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045604177,19,2137,1083,590.00,2147.60,1091.30,10351,4812,-66.12,16,5,-48.34,6.84,26.50,25.00,18,10,0.06,0.18,0.17,0.11,0.00,0.00,0,0, +1746045604177,20,0,0,0.00,0.00,0.00,5,50,-79.62,13,5,-61.83,6.44,35.00,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045605177,19,2137,1083,581.60,2147.64,1093.42,12772,4567,-66.19,16,12,-44.60,17.81,25.50,29.00,19,9,0.11,0.06,0.17,0.11,0.00,0.00,0,0, +1746045605177,20,0,0,0.00,0.00,0.00,5,50,-76.94,16,5,-59.16,6.50,31.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045606177,19,2149,1083,654.30,2159.82,1092.30,11115,4692,-66.06,16,5,-48.28,6.84,27.00,27.00,18,11,0.10,0.18,0.17,0.11,0.00,0.00,0,0, +1746045606177,20,0,0,0.00,0.00,0.00,5,50,-84.33,12,5,-66.55,6.34,34.00,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045607177,19,2137,1083,637.21,2147.80,1092.96,12587,4916,-66.12,16,106,-35.08,199.81,25.50,26.00,19,10,0.09,0.06,0.17,0.11,0.00,0.00,0,0, +1746045607177,20,0,0,0.00,0.00,0.00,5,50,-72.50,12,5,-54.72,6.62,31.50,29.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045608177,19,2137,1035,606.27,2147.57,1048.87,10281,4275,-66.19,16,5,-48.41,6.84,26.50,26.00,18,13,0.12,0.10,0.17,0.11,0.00,0.00,0,0, +1746045608177,20,0,0,0.00,0.00,0.00,5,50,-92.19,16,5,-74.41,6.19,35.00,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045609177,19,2149,1071,611.64,2155.21,1091.67,11212,4785,-66.19,16,5,-48.41,6.84,26.00,27.00,20,10,0.05,0.10,0.17,0.11,0.00,0.00,0,0, +1746045609177,20,0,0,0.00,0.00,0.00,5,50,-92.19,16,5,-74.41,6.19,27.00,29.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045610177,19,2137,1095,624.11,2152.26,1104.02,11913,4409,-66.25,16,5,-48.47,6.83,26.50,27.00,19,13,0.12,0.07,0.17,0.11,0.00,0.00,0,0, +1746045610177,20,0,0,0.00,0.00,0.00,5,50,-100.69,16,5,-82.91,6.07,34.00,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045611177,19,2137,1083,790.00,2147.69,1094.38,11303,4518,-66.00,16,59,-37.50,103.84,25.50,27.00,19,9,0.11,0.12,0.17,0.11,0.00,0.00,0,0, +1746045611177,20,0,0,0.00,0.00,0.00,5,50,-93.81,16,5,-76.03,6.17,30.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045612177,19,2149,1023,602.10,2156.01,1036.41,12707,4285,-66.06,16,5,-48.28,6.84,26.50,27.00,19,11,0.13,0.04,0.17,0.11,0.00,0.00,0,0, +1746045612177,20,0,0,0.00,0.00,0.00,5,50,-106.19,16,5,-88.41,6.01,37.50,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045613177,19,2137,1083,587.84,2151.34,1094.49,10355,4525,-66.06,16,5,-48.28,6.84,26.50,27.00,19,12,0.13,0.09,0.17,0.11,0.00,0.00,0,0, +1746045613177,20,0,0,0.00,0.00,0.00,5,50,-106.19,16,5,-88.41,6.01,30.50,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045614177,19,2137,1083,709.00,2147.75,1091.70,10354,4687,-66.19,16,5,-48.41,6.84,26.50,28.00,18,12,0.09,0.09,0.17,0.11,0.00,0.00,0,0, +1746045614177,20,0,0,0.00,0.00,0.00,5,50,-103.00,14,5,-85.22,6.04,33.50,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045615177,19,2149,1083,577.24,2157.41,1092.58,10208,4680,-66.00,16,5,-48.22,6.84,27.00,25.00,19,12,0.07,0.09,0.17,0.11,0.00,0.00,0,0, +1746045615177,20,0,0,0.00,0.00,0.00,5,50,-95.88,16,5,-78.09,6.14,30.00,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045616177,19,2137,1083,530.24,2149.86,1094.05,10039,4529,-66.19,16,5,-48.41,6.84,27.00,26.00,19,12,0.09,0.11,0.17,0.11,0.00,0.00,0,0, +1746045616177,20,0,0,0.00,0.00,0.00,5,50,-94.38,16,5,-76.59,6.16,35.50,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045617177,19,2137,1023,697.55,2147.60,1085.42,11129,4519,-66.12,16,5,-48.34,6.84,28.00,26.00,19,11,0.11,0.08,0.17,0.11,0.00,0.00,0,0, +1746045617177,20,0,0,0.00,0.00,0.00,5,50,-102.77,13,5,-84.99,6.05,30.00,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045618177,19,2149,1143,613.41,2159.85,1103.90,11283,4527,-66.12,16,28,-40.86,45.31,26.50,27.00,18,12,0.16,0.07,0.18,0.11,0.00,0.00,0,0, +1746045618177,20,0,0,0.00,0.00,0.00,5,50,-102.77,13,5,-84.99,6.05,38.50,34.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045619177,19,2137,1023,514.37,2147.68,1032.42,10171,4569,-66.19,16,5,-48.41,6.84,26.50,27.00,18,12,0.05,0.09,0.17,0.11,0.00,0.00,0,0, +1746045619177,20,0,0,0.00,0.00,0.00,5,50,-98.23,13,5,-80.45,6.11,31.00,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045620177,19,2137,1083,681.86,2147.75,1093.18,10061,4546,-66.25,16,5,-48.47,6.83,26.50,25.00,19,12,0.14,0.11,0.18,0.11,0.00,0.00,0,0, +1746045620177,20,0,0,0.00,0.00,0.00,5,50,-107.81,16,5,-90.03,5.99,35.50,35.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045621177,19,2149,1083,501.70,2156.98,1095.13,9897,4538,-66.06,16,5,-48.28,6.84,28.50,25.00,19,12,0.08,0.10,0.18,0.11,0.00,0.00,0,0, +1746045621177,20,0,0,0.00,0.00,0.00,5,50,-102.31,13,5,-84.53,6.05,30.00,35.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045622177,19,2137,1095,471.00,2149.74,1108.91,9832,4641,-66.06,16,5,-48.28,6.84,27.50,25.00,19,12,0.08,0.09,0.18,0.11,0.00,0.00,0,0, +1746045622177,20,0,0,0.00,0.00,0.00,5,50,-102.31,13,5,-84.53,6.05,33.50,35.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045623177,19,2137,1023,538.35,2147.51,1084.03,9968,4526,-66.06,16,12,-44.48,17.82,27.00,24.00,19,12,0.12,0.10,0.18,0.11,0.00,0.00,0,0, +1746045623177,20,0,0,0.00,0.00,0.00,5,50,-75.27,11,5,-57.49,6.55,31.00,35.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045624177,19,2149,1083,632.67,2147.45,1045.81,10497,4287,-66.00,16,5,-48.22,6.84,27.50,25.00,19,10,0.12,0.16,0.18,0.11,0.00,0.00,0,0, +1746045624177,20,0,0,0.00,0.00,0.00,5,50,-75.27,11,5,-57.49,6.55,36.50,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045625177,19,2137,1083,782.55,2159.86,1092.40,12633,4721,-66.25,16,5,-48.47,6.83,28.50,23.00,18,10,0.08,0.06,0.18,0.11,0.00,0.00,0,0, +1746045625177,20,0,0,0.00,0.00,0.00,5,50,-75.80,10,5,-58.02,6.53,29.50,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045626177,19,2137,1083,606.33,2147.84,1091.43,10861,4654,-66.50,16,5,-48.72,6.82,26.50,24.00,19,10,0.06,0.19,0.18,0.11,0.00,0.00,0,0, +1746045626177,20,0,0,0.00,0.00,0.00,5,50,-91.11,9,5,-73.33,6.21,35.00,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045627177,19,2149,1083,631.50,2147.79,1095.22,13971,4516,-66.50,16,5,-48.72,6.82,27.00,23.00,19,8,0.11,0.06,0.18,0.11,0.00,0.00,0,0, +1746045627177,20,0,0,0.00,0.00,0.00,5,50,-91.11,9,5,-73.33,6.21,29.00,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045628177,19,2137,1083,606.81,2159.50,1094.39,11080,4522,-66.31,16,13,-44.38,19.42,25.50,26.00,19,13,0.13,0.20,0.18,0.11,0.00,0.00,0,0, +1746045628177,20,0,0,0.00,0.00,0.00,5,50,-105.00,13,5,-87.22,6.02,36.00,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045629177,19,2137,1071,709.26,2147.86,1092.02,14915,4766,-66.38,16,5,-48.59,6.83,26.00,27.00,18,6,0.06,0.11,0.18,0.11,0.00,0.00,0,0, +1746045629177,20,0,0,0.00,0.00,0.00,5,50,-114.69,16,5,-96.91,5.92,31.00,26.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045630177,19,2149,1035,605.33,2147.72,1035.47,17207,4579,-66.06,16,5,-48.28,6.84,26.50,27.00,19,9,0.14,0.04,0.18,0.11,0.00,0.00,0,0, +1746045630177,20,0,0,0.00,0.00,0.00,5,50,-118.36,11,5,-100.58,5.88,38.00,29.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045631177,19,2137,1071,713.70,2159.66,1092.19,10630,4391,-66.25,16,5,-48.47,6.83,27.00,27.00,18,12,0.11,0.11,0.18,0.11,0.00,0.00,0,0, +1746045631177,20,0,0,0.00,0.00,0.00,5,50,-81.92,12,5,-64.14,6.39,31.00,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045632177,19,2137,1083,706.21,2147.80,1094.17,11540,4736,-66.25,16,5,-48.47,6.83,26.50,26.00,20,11,0.07,0.06,0.18,0.11,0.00,0.00,0,0, +1746045632177,20,0,0,0.00,0.00,0.00,5,50,-81.92,12,5,-64.14,6.39,35.50,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045633177,19,2149,1095,576.58,2147.70,1103.91,10586,4579,-66.31,16,5,-48.53,6.83,26.50,27.00,16,9,0.14,0.15,0.18,0.11,0.00,0.00,0,0, +1746045633177,20,0,0,0.00,0.00,0.00,5,50,-76.79,14,5,-59.00,6.51,31.00,29.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045634177,19,2137,1083,675.19,2159.78,1088.88,12687,4976,-66.19,16,5,-48.41,6.84,26.00,27.00,17,9,0.05,0.05,0.18,0.11,0.00,0.00,0,0, +1746045634177,20,0,0,0.00,0.00,0.00,5,50,-75.50,14,5,-57.72,6.54,35.00,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045635177,19,2137,1023,829.38,2147.57,1040.12,10357,4582,-66.06,16,12,-44.48,17.82,24.50,27.00,19,12,0.09,0.12,0.18,0.11,0.00,0.00,0,0, +1746045635177,20,0,0,0.00,0.00,0.00,5,50,-72.40,15,5,-54.62,6.63,31.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045636177,19,2149,1095,618.24,2147.55,1103.21,9786,4481,-66.06,16,5,-48.28,6.84,26.50,27.00,18,12,0.13,0.11,0.18,0.11,0.00,0.00,0,0, +1746045636177,20,0,0,0.00,0.00,0.00,5,50,-72.40,15,5,-54.62,6.63,29.50,29.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045637177,19,2137,1083,705.90,2159.74,1091.23,11846,4780,-65.94,16,5,-48.16,6.85,27.00,28.00,18,9,0.08,0.09,0.18,0.11,0.00,0.00,0,0, +1746045637177,20,0,0,0.00,0.00,0.00,5,50,-76.07,14,5,-58.29,6.53,31.50,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045638177,19,2137,1071,709.80,2147.94,1093.19,11788,4656,-66.31,16,5,-48.53,6.83,26.50,27.00,19,13,0.06,0.08,0.18,0.11,0.00,0.00,0,0, +1746045638177,20,0,0,0.00,0.00,0.00,5,50,-71.33,12,5,-53.55,6.66,37.50,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045639177,19,2137,1047,606.36,2147.70,1051.22,13769,4538,-65.94,16,5,-48.16,6.85,26.00,28.00,18,6,0.14,0.13,0.18,0.11,0.00,0.00,0,0, +1746045639177,20,0,0,0.00,0.00,0.00,5,50,-69.80,15,5,-52.02,6.71,31.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045640177,19,2149,1083,745.81,2160.02,1090.94,18224,4547,-66.00,16,5,-48.22,6.84,25.50,27.00,18,8,0.05,0.04,0.18,0.11,0.00,0.00,0,0, +1746045640177,20,0,0,0.00,0.00,0.00,5,50,-79.50,16,5,-61.72,6.44,35.00,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045641177,19,2137,1095,631.17,2147.82,1108.26,10997,4734,-66.00,16,5,-48.22,6.84,26.00,27.00,18,10,0.13,0.17,0.18,0.11,0.00,0.00,0,0, +1746045641177,20,0,0,0.00,0.00,0.00,5,50,-79.50,16,5,-61.72,6.44,30.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045642177,19,2137,1071,651.57,2147.61,1092.09,12364,4785,-66.00,16,5,-48.22,6.84,26.00,27.00,19,9,0.07,0.06,0.18,0.11,0.00,0.00,0,0, +1746045642177,20,0,0,0.00,0.00,0.00,5,50,-72.94,16,5,-55.16,6.61,37.00,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045643177,19,2149,1047,749.48,2159.62,1049.98,11304,4459,-66.00,16,5,-48.22,6.84,27.00,27.00,18,9,0.15,0.20,0.18,0.11,0.00,0.00,0,0, +1746045643177,20,0,0,0.00,0.00,0.00,5,50,-76.88,16,5,-59.09,6.50,30.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045644177,19,2137,1083,719.80,2147.98,1091.94,15629,5043,-66.25,16,5,-48.47,6.83,25.50,27.00,18,7,0.05,0.07,0.18,0.11,0.00,0.00,0,0, +1746045644177,20,0,0,0.00,0.00,0.00,5,50,-72.94,16,5,-55.16,6.61,35.00,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045645177,19,2137,1071,688.24,2147.78,1094.06,12995,4304,-66.25,16,5,-48.47,6.83,26.50,28.00,19,13,0.12,0.08,0.18,0.11,0.00,0.00,0,0, +1746045645177,20,0,0,0.00,0.00,0.00,5,50,-72.94,16,5,-55.16,6.61,29.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045646177,19,2149,1083,652.32,2160.48,1093.26,13486,4520,-66.00,16,5,-48.22,6.84,26.50,27.00,19,5,0.15,0.15,0.18,0.11,0.00,0.00,0,0, +1746045646177,20,0,0,0.00,0.00,0.00,5,50,-80.85,13,5,-63.06,6.41,35.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045647177,19,2137,1083,724.19,2153.91,1091.13,21842,4769,-66.31,16,5,-48.53,6.83,26.00,27.00,18,5,0.06,0.05,0.18,0.11,0.00,0.00,0,0, +1746045647177,20,0,0,0.00,0.00,0.00,5,50,-73.87,15,5,-56.09,6.59,29.00,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045648177,19,2137,1095,810.77,2147.84,1101.35,12740,4439,-66.12,16,5,-48.34,6.84,26.50,28.00,18,12,0.15,0.17,0.18,0.11,0.00,0.00,0,0, +1746045648177,20,0,0,0.00,0.00,0.00,5,50,-69.60,10,5,-51.82,6.72,36.00,29.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045649177,19,2149,1023,533.45,2159.91,1032.98,13425,4571,-66.19,16,5,-48.41,6.84,25.00,27.00,18,8,0.05,0.09,0.18,0.11,0.00,0.00,0,0, +1746045649177,20,0,0,0.00,0.00,0.00,5,50,-71.09,11,5,-53.31,6.67,31.00,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045650176,19,2137,1083,568.84,2147.87,1094.90,12946,4765,-66.19,16,5,-48.41,6.84,26.00,27.00,19,12,0.09,0.05,0.18,0.11,0.00,0.00,0,0, +1746045651176,19,2137,1083,626.64,2154.52,1095.41,10671,4300,-66.25,16,5,-48.47,6.83,27.00,27.00,19,10,0.11,0.17,0.18,0.11,0.00,0.00,0,0, +1746045652176,19,2149,1083,686.00,2159.68,1095.01,12560,4519,-67.81,16,5,-50.03,6.78,27.00,27.00,19,9,0.08,0.06,0.18,0.11,0.00,0.00,0,0, +1746045653176,19,2137,1083,550.43,2147.85,1094.49,11466,4529,-66.06,16,12,-44.48,17.82,26.00,26.00,19,10,0.11,0.14,0.18,0.11,0.00,0.00,0,0, +1746045654176,19,2137,1023,651.05,2147.84,1036.16,12647,4517,-66.06,16,5,-48.28,6.84,25.50,26.00,19,11,0.12,0.05,0.18,0.11,0.00,0.00,0,0, +1746045655176,19,2149,1143,671.57,2159.53,1152.93,10976,4531,-66.12,16,106,-35.08,199.81,25.00,27.00,19,10,0.09,0.11,0.18,0.11,0.00,0.00,0,0, +1746045656176,19,2137,1023,568.43,2147.41,1036.77,11788,4291,-66.19,16,5,-48.41,6.84,27.00,27.00,19,12,0.13,0.06,0.18,0.11,0.00,0.00,0,0, +1746045657176,19,2137,1083,515.00,2147.76,1092.26,10224,4711,-66.19,16,5,-48.41,6.84,26.00,29.00,18,11,0.09,0.17,0.18,0.11,0.00,0.00,0,0, +1746045658176,19,2149,1083,530.86,2159.97,1092.70,12842,4933,-66.19,16,106,-35.14,199.64,25.00,27.00,19,10,0.09,0.06,0.18,0.11,0.00,0.00,0,0, +1746045659176,19,2137,1083,547.87,2147.82,1095.66,10371,4300,-66.19,16,13,-44.26,19.44,26.00,27.00,19,12,0.12,0.19,0.18,0.11,0.00,0.00,0,0, +1746045660176,19,2137,1023,578.76,2147.76,1084.60,13433,4507,-66.31,16,13,-44.38,19.42,26.50,27.00,19,8,0.12,0.08,0.18,0.11,0.00,0.00,0,0, +1746045661176,19,2149,1143,596.85,2159.71,1103.92,12298,4517,-66.31,16,5,-48.53,6.83,25.50,28.00,19,13,0.11,0.06,0.18,0.11,0.00,0.00,0,0, +1746045662176,19,2137,1023,497.86,2147.92,1034.77,13316,4300,-66.25,16,5,-48.47,6.83,27.00,27.00,19,7,0.11,0.11,0.18,0.11,0.00,0.00,0,0, +1746045663176,19,2137,1083,628.90,2147.75,1093.80,15022,4534,-66.12,16,5,-48.34,6.84,27.50,26.00,18,10,0.16,0.04,0.18,0.11,0.00,0.00,0,0, +1746045664176,19,2149,1071,611.50,2159.55,1091.42,10773,4797,-66.12,16,5,-48.34,6.84,26.00,25.00,18,9,0.05,0.15,0.18,0.11,0.00,0.00,0,0, +1746045665176,19,2137,1083,468.81,2147.62,1094.78,12591,4544,-66.25,16,5,-48.47,6.83,28.00,25.00,19,9,0.08,0.05,0.18,0.11,0.00,0.00,0,0, +1746045666176,19,2137,1083,673.43,2147.60,1093.94,10499,4515,-66.25,16,13,-44.32,19.43,26.00,25.00,19,12,0.11,0.11,0.18,0.11,0.00,0.00,0,0, +1746045667176,19,2149,1023,567.27,2159.59,1040.83,10013,4519,-66.12,16,12,-44.54,17.81,26.00,26.00,19,12,0.11,0.11,0.18,0.11,0.00,0.00,0,0, +1746045668176,19,2137,1095,655.45,2147.91,1090.54,11444,4520,-66.12,16,5,-48.34,6.84,27.50,27.00,19,11,0.11,0.09,0.18,0.11,0.00,0.00,0,0, +1746045669176,19,2137,1083,683.79,2147.55,1094.93,10447,4312,-66.00,16,5,-48.22,6.84,27.50,28.00,19,13,0.06,0.06,0.18,0.11,0.00,0.00,0,0, +1746045670176,19,2149,1083,625.16,2159.79,1094.77,10956,4489,-66.00,16,5,-48.22,6.84,27.00,27.00,20,9,0.07,0.12,0.18,0.11,0.00,0.00,0,0, +1746045671176,19,2137,1083,623.62,2147.74,1100.77,12649,4525,-66.00,16,5,-48.22,6.84,27.00,27.00,17,11,0.12,0.04,0.18,0.11,0.00,0.00,0,0, +1746045672176,19,2137,1083,723.90,2147.62,1088.84,9788,4932,-66.00,16,12,-44.42,17.83,25.50,27.00,19,11,0.04,0.15,0.18,0.11,0.00,0.00,0,0, +1746045673176,19,2149,1023,599.60,2159.81,1039.83,11646,4280,-66.00,16,5,-48.22,6.84,26.00,27.00,18,11,0.13,0.05,0.18,0.11,0.00,0.00,0,0, +1746045674176,19,2137,1083,536.19,2147.49,1092.22,9778,4744,-66.00,16,5,-48.22,6.84,26.50,27.00,19,10,0.06,0.19,0.18,0.11,0.00,0.00,0,0, +1746045675176,19,2137,1083,720.24,2147.63,1099.70,13836,4765,-65.88,16,5,-48.09,6.85,26.50,28.00,19,8,0.11,0.07,0.18,0.11,0.00,0.00,0,0, +1746045676176,19,2149,1083,592.10,2159.46,1085.71,11641,4513,-66.12,16,5,-48.34,6.84,26.00,27.00,18,12,0.07,0.13,0.18,0.11,0.00,0.00,0,0, +1746045677176,19,2137,1071,578.71,2147.82,1093.42,11167,4608,-66.12,16,5,-48.34,6.84,26.50,27.00,19,9,0.08,0.14,0.18,0.11,0.00,0.00,0,0, +1746045678176,19,2137,1035,644.86,2147.69,1085.00,12794,4502,-66.12,16,5,-48.34,6.84,27.00,28.00,19,9,0.11,0.05,0.18,0.11,0.00,0.00,0,0, +1746045679176,19,2149,1083,725.91,2159.74,1045.33,11047,4320,-66.00,16,5,-48.22,6.84,27.00,26.00,19,10,0.12,0.14,0.18,0.11,0.00,0.00,0,0, +1746045680176,19,2137,1083,559.29,2147.68,1094.08,12667,4507,-66.19,16,5,-48.41,6.84,26.50,28.00,19,10,0.12,0.05,0.18,0.11,0.00,0.00,0,0, +1746045681176,19,2137,1071,687.68,2147.78,1092.30,10490,4696,-66.00,16,5,-48.22,6.84,26.50,28.00,15,12,0.16,0.10,0.18,0.11,0.00,0.00,0,0, +1746045682176,19,2149,1083,492.14,2159.66,1085.54,12363,5199,-66.00,16,5,-48.22,6.84,26.50,28.00,15,10,0.05,0.07,0.18,0.11,0.00,0.00,0,0, +1746045683176,19,2137,1083,645.64,2147.82,1096.38,10927,4731,-66.38,16,5,-48.59,6.83,26.50,27.00,17,13,0.18,0.09,0.18,0.11,0.00,0.00,0,0, +1746045684176,19,2137,1071,561.95,2147.79,1089.98,12196,4953,-66.12,16,5,-48.34,6.84,27.50,27.00,16,10,0.06,0.07,0.18,0.11,0.00,0.00,0,0, +1746045685176,19,2149,1035,614.68,2156.22,1038.82,11097,4621,-66.12,16,104,-35.16,195.58,25.50,27.00,20,11,0.11,0.18,0.18,0.11,0.00,0.00,0,0, +1746045686176,19,2137,1131,642.79,2151.37,1148.92,12614,4766,-66.12,16,5,-48.34,6.84,27.50,26.00,16,10,0.11,0.06,0.18,0.11,0.00,0.00,0,0, +1746045687176,19,2137,1023,576.38,2147.88,1031.19,11141,4889,-66.31,16,5,-48.53,6.83,27.50,27.00,19,10,0.04,0.23,0.18,0.11,0.00,0.00,0,0, +1746045688176,19,2149,1083,499.91,2159.77,1095.14,16953,4305,-66.19,16,5,-48.41,6.84,27.00,27.00,19,6,0.11,0.08,0.18,0.11,0.00,0.00,0,0, +1746045689176,19,2137,1095,486.62,2147.78,1108.54,15337,4738,-66.06,16,13,-44.13,19.46,25.50,28.00,19,12,0.10,0.03,0.18,0.11,0.00,0.00,0,0, +1746045690176,19,2137,1071,619.00,2147.52,1079.64,9341,4322,-66.31,16,5,-48.53,6.83,27.00,28.00,18,11,0.14,0.27,0.18,0.11,0.00,0.00,0,0, +1746045691176,19,2149,1083,533.80,2152.66,1091.32,16267,4802,-66.31,16,5,-48.53,6.83,26.00,27.00,19,6,0.05,0.10,0.18,0.11,0.00,0.00,0,0, +1746045692176,19,2137,1035,644.33,2155.02,1046.71,16823,4147,-66.44,16,5,-48.66,6.83,26.50,27.00,19,10,0.14,0.03,0.18,0.11,0.00,0.00,0,0, +1746045693176,19,2137,1083,641.48,2147.80,1092.00,11286,5014,-66.25,16,5,-48.47,6.83,27.00,27.00,18,10,0.07,0.12,0.18,0.11,0.00,0.00,0,0, +1746045694176,19,2149,1083,653.82,2157.34,1099.13,12460,4240,-66.31,16,5,-48.53,6.83,25.50,27.00,20,12,0.11,0.04,0.18,0.11,0.00,0.00,0,0, +1746045695176,19,2137,1083,572.19,2149.97,1088.69,11130,4931,-66.19,16,5,-48.41,6.84,27.00,27.00,15,11,0.10,0.11,0.18,0.11,0.00,0.00,0,0, +1746045696176,19,2137,1071,587.57,2147.66,1087.16,11491,5052,-66.19,16,106,-35.14,199.64,26.00,27.00,19,12,0.03,0.05,0.18,0.11,0.00,0.00,0,0, +1746045697176,19,2149,1083,515.73,2154.45,1097.55,12097,4534,-66.62,16,5,-48.84,6.82,26.50,27.00,18,8,0.10,0.11,0.18,0.11,0.00,0.00,0,0, +1746045698176,19,2137,1083,546.15,2153.20,1092.53,13514,4711,-66.12,16,5,-48.34,6.84,26.50,26.00,19,11,0.07,0.04,0.18,0.11,0.00,0.00,0,0, +1746045699176,19,2137,1083,725.62,2147.67,1094.67,10172,4502,-66.06,16,5,-48.28,6.84,26.50,26.00,19,12,0.10,0.11,0.18,0.11,0.00,0.00,0,0, +1746045700176,19,2149,1023,566.83,2147.50,1035.54,10219,4312,-66.06,16,5,-48.28,6.84,27.50,28.00,19,12,0.15,0.14,0.18,0.11,0.00,0.00,0,0, +1746045701176,19,2137,1083,497.71,2159.75,1095.10,11728,4552,-66.06,16,5,-48.28,6.84,27.00,26.00,19,10,0.11,0.09,0.18,0.11,0.00,0.00,0,0, +1746045702176,19,2137,1083,642.15,2147.51,1094.30,11270,4513,-66.19,16,5,-48.41,6.84,27.50,27.00,19,13,0.11,0.06,0.18,0.11,0.00,0.00,0,0, +1746045703176,19,2149,1023,579.11,2147.87,1085.16,11467,4525,-66.31,16,12,-44.73,17.79,26.50,27.00,19,10,0.12,0.10,0.18,0.11,0.00,0.00,0,0, +1746045704176,19,2137,1083,642.45,2159.54,1045.49,11613,4505,-66.19,16,5,-48.41,6.84,27.00,26.00,19,14,0.13,0.05,0.18,0.11,0.00,0.00,0,0, +1746045705176,19,2137,1083,676.62,2147.54,1094.66,12651,4522,-66.19,16,5,-48.41,6.84,26.50,29.00,19,6,0.10,0.15,0.18,0.11,0.00,0.00,0,0, +1746045706176,19,2149,1083,584.29,2152.90,1094.50,18720,4306,-66.06,16,5,-48.28,6.84,26.50,27.00,19,6,0.15,0.05,0.18,0.11,0.00,0.00,0,0, +1746045707176,19,2137,1083,676.95,2154.85,1092.14,11851,4778,-66.31,16,5,-48.53,6.83,26.50,27.00,18,13,0.06,0.11,0.18,0.11,0.00,0.00,0,0, +1746045708176,19,2137,1083,672.55,2147.74,1094.10,11460,4581,-66.12,16,5,-48.34,6.84,26.50,27.00,19,9,0.14,0.10,0.18,0.11,0.00,0.00,0,0, +1746045709176,19,2149,1083,495.05,2157.54,1091.85,12567,4783,-66.12,16,27,-41.02,43.52,26.00,28.00,18,12,0.06,0.04,0.18,0.11,0.00,0.00,0,0, +1746045710176,19,2137,1083,651.65,2149.90,1093.39,10882,4590,-65.94,16,5,-48.16,6.85,26.50,27.00,18,7,0.15,0.20,0.18,0.11,0.00,0.00,0,0, +1746045711176,19,2137,1071,791.72,2153.11,1091.29,21467,4812,-65.94,16,5,-48.16,6.85,25.50,28.00,18,5,0.05,0.07,0.18,0.11,0.00,0.00,0,0, +1746045712176,19,2149,1035,651.32,2149.83,1035.66,16724,4353,-66.31,16,5,-48.53,6.83,25.50,26.00,18,12,0.13,0.02,0.18,0.11,0.00,0.00,0,0, +1746045713176,19,2137,1071,584.43,2159.76,1092.38,10127,4758,-66.06,16,5,-48.28,6.84,28.00,27.00,19,9,0.06,0.23,0.18,0.11,0.00,0.00,0,0, +1746045714176,19,2137,1083,713.97,2152.03,1092.82,20040,4657,-66.06,16,5,-48.28,6.84,26.50,28.00,17,5,0.12,0.08,0.18,0.11,0.00,0.00,0,0, +1746045715176,19,2137,1083,648.55,2150.42,1089.86,17516,4956,-65.94,16,5,-48.16,6.85,25.50,27.00,19,11,0.04,0.03,0.18,0.11,0.00,0.00,0,0, +1746045716176,19,2149,1083,668.61,2159.79,1094.24,10704,4534,-65.75,16,106,-34.71,200.82,25.50,27.00,18,8,0.16,0.15,0.18,0.11,0.00,0.00,0,0, +1746045717176,19,2137,1083,583.73,2147.79,1091.98,14214,4790,-66.00,16,5,-48.22,6.84,26.00,27.00,18,8,0.06,0.05,0.18,0.11,0.00,0.00,0,0, +1746045718176,19,2137,1023,644.45,2147.49,1035.67,10168,4566,-66.00,16,5,-48.22,6.84,25.50,27.00,19,11,0.15,0.18,0.18,0.11,0.00,0.00,0,0, +1746045719176,19,2149,1071,434.47,2159.78,1091.10,12594,4562,-65.88,16,5,-48.09,6.85,25.00,27.00,18,10,0.06,0.06,0.18,0.11,0.00,0.00,0,0, +1746045720176,19,2137,1083,633.48,2147.90,1093.90,11127,4607,-66.00,16,5,-48.22,6.84,24.50,27.00,19,12,0.12,0.09,0.18,0.11,0.00,0.00,0,0, +1746045721176,19,2137,1083,653.81,2147.76,1091.74,11438,4747,-66.00,16,5,-48.22,6.84,25.50,27.00,18,9,0.07,0.11,0.18,0.11,0.00,0.00,0,0, +1746045722176,19,2149,1083,517.68,2159.89,1093.92,12532,4594,-66.12,16,5,-48.34,6.84,26.50,27.00,19,12,0.13,0.04,0.18,0.11,0.00,0.00,0,0, +1746045723176,19,2137,1083,660.60,2147.66,1094.14,12594,4527,-66.12,16,5,-48.34,6.84,25.50,28.00,19,7,0.14,0.13,0.18,0.11,0.00,0.00,0,0, +1746045724176,19,2137,1083,600.95,2147.78,1092.22,15641,4761,-65.94,16,27,-40.83,43.60,26.00,27.00,18,9,0.08,0.04,0.18,0.11,0.00,0.00,0,0, +1746045725176,19,2149,1023,550.70,2159.36,1034.68,10075,4357,-66.38,16,5,-48.59,6.83,26.50,27.00,19,10,0.14,0.21,0.18,0.11,0.00,0.00,0,0, +1746045726176,19,2137,1131,545.20,2147.94,1150.46,15207,4972,-66.25,16,27,-41.14,43.47,25.50,27.00,18,7,0.08,0.08,0.18,0.11,0.00,0.00,0,0, +1746045727176,19,2137,1023,643.10,2147.91,1034.22,13756,4457,-66.06,16,5,-48.28,6.84,26.00,26.00,19,13,0.12,0.04,0.18,0.11,0.00,0.00,0,0, +1746045728176,19,2149,1083,566.30,2159.71,1093.06,9696,4680,-66.06,16,5,-48.28,6.84,25.50,28.00,18,11,0.10,0.19,0.18,0.11,0.00,0.00,0,0, +1746045729176,19,2137,1095,716.70,2147.64,1097.46,12517,4631,-65.88,16,5,-48.09,6.85,27.00,26.00,20,9,0.09,0.07,0.18,0.11,0.00,0.00,0,0, +1746045730176,19,2137,1071,747.90,2160.14,1090.69,12068,4815,-66.06,16,5,-48.28,6.84,25.50,26.00,16,9,0.09,0.16,0.18,0.11,0.00,0.00,0,0, +1746045731176,19,2149,1023,643.18,2159.73,1030.79,12671,4793,-66.31,16,104,-35.35,195.09,25.00,27.00,20,9,0.11,0.06,0.18,0.11,0.00,0.00,0,0, +1746045732176,19,2137,1131,674.20,2147.76,1146.73,11523,4956,-66.31,16,5,-48.53,6.83,26.00,27.00,15,10,0.11,0.13,0.18,0.11,0.00,0.00,0,0, +1746045733176,19,2137,1023,663.26,2147.66,1029.31,12466,5102,-66.06,16,5,-48.28,6.84,26.00,27.00,18,11,0.04,0.05,0.18,0.11,0.00,0.00,0,0, +1746045734176,19,2149,1083,652.13,2159.91,1093.04,10453,4293,-65.81,16,5,-48.03,6.85,25.50,27.00,19,9,0.12,0.17,0.18,0.11,0.00,0.00,0,0, +1746045735176,19,2137,1083,563.95,2147.83,1094.66,13970,4534,-66.12,16,5,-48.34,6.84,26.50,28.00,19,8,0.14,0.06,0.18,0.11,0.00,0.00,0,0, +1746045736176,19,2137,1083,550.00,2147.69,1091.96,10687,4759,-66.25,16,5,-48.47,6.83,25.50,27.00,18,13,0.08,0.08,0.18,0.11,0.00,0.00,0,0, +1746045737176,19,2149,1071,574.76,2159.83,1093.86,12470,4643,-66.25,16,5,-48.47,6.83,27.00,27.00,19,8,0.12,0.10,0.18,0.11,0.00,0.00,0,0, +1746045738176,19,2137,1083,602.10,2148.04,1094.85,13460,4522,-66.12,16,106,-35.08,199.81,26.00,28.00,19,12,0.09,0.03,0.18,0.11,0.00,0.00,0,0, +1746045739176,19,2137,1083,513.15,2147.81,1093.32,10065,4682,-66.31,16,27,-41.21,43.45,26.00,27.00,18,12,0.08,0.11,0.18,0.11,0.00,0.00,0,0, +1746045740176,19,2149,1023,626.86,2159.57,1034.65,11717,4430,-66.25,16,5,-48.47,6.83,27.00,27.00,19,9,0.08,0.10,0.18,0.11,0.00,0.00,0,0, +1746045741176,19,2137,1083,564.38,2147.64,1093.66,11703,4758,-66.25,16,5,-48.47,6.83,27.00,27.00,18,13,0.17,0.04,0.18,0.11,0.00,0.00,0,0, +1746045742176,19,2137,1083,724.87,2156.05,1088.86,11459,4722,-65.94,16,5,-48.16,6.85,26.00,27.00,17,8,0.06,0.13,0.18,0.11,0.00,0.00,0,0, +1746045743176,19,2149,1083,722.00,2159.98,1093.82,13922,4592,-66.06,16,5,-48.28,6.84,26.00,28.00,19,9,0.11,0.05,0.18,0.11,0.00,0.00,0,0, +1746045744176,19,2137,1095,535.29,2147.74,1106.34,10963,4623,-66.25,16,5,-48.47,6.83,26.50,28.00,19,10,0.13,0.14,0.18,0.11,0.00,0.00,0,0, +1746045745176,19,2137,1023,669.22,2148.02,1035.74,13093,4308,-66.00,16,5,-48.22,6.84,26.00,27.00,18,10,0.16,0.05,0.18,0.11,0.00,0.00,0,0, +1746045746176,19,2149,1083,600.10,2159.59,1091.70,10514,4796,-66.00,16,5,-48.22,6.84,27.50,27.00,18,9,0.06,0.17,0.18,0.11,0.00,0.00,0,0, +1746045747176,19,2137,1083,647.65,2147.80,1093.71,13927,4840,-66.19,16,5,-48.41,6.84,27.00,26.00,15,8,0.16,0.06,0.18,0.11,0.00,0.00,0,0, +1746045748176,19,2137,1071,793.00,2147.75,1085.25,10914,4938,-65.94,16,5,-48.16,6.85,27.00,27.00,15,12,0.06,0.21,0.18,0.11,0.00,0.00,0,0, +1746045749176,19,2149,1083,677.52,2160.02,1092.16,13598,4734,-66.00,16,5,-48.22,6.84,26.50,27.00,19,8,0.06,0.08,0.18,0.11,0.00,0.00,0,0, +1746045750176,19,2137,1083,540.79,2147.90,1095.19,12637,4531,-66.00,16,5,-48.22,6.84,25.50,27.00,19,12,0.05,0.09,0.18,0.11,0.00,0.00,0,0, +1746045751176,19,2137,1035,667.18,2147.77,1048.02,10360,4168,-66.00,16,5,-48.22,6.84,27.50,26.00,19,12,0.14,0.10,0.18,0.11,0.00,0.00,0,0, +1746045752176,19,2149,1071,420.70,2159.94,1090.58,11115,4844,-66.00,16,5,-48.22,6.84,27.00,27.00,17,10,0.08,0.14,0.18,0.11,0.00,0.00,0,0, +1746045753176,19,2137,1095,609.35,2147.65,1098.70,12711,4680,-66.25,16,5,-48.47,6.83,26.50,27.00,20,11,0.09,0.05,0.18,0.11,0.00,0.00,0,0, +1746045754176,19,2137,1095,665.61,2147.66,1104.08,10254,4678,-66.25,16,106,-35.21,199.47,25.00,27.00,19,10,0.13,0.14,0.18,0.11,0.00,0.00,0,0, +1746045755176,19,2149,1083,581.50,2159.64,1093.45,12569,4402,-66.25,16,5,-48.47,6.83,28.00,27.00,18,11,0.12,0.05,0.18,0.11,0.00,0.00,0,0, +1746045756176,19,2137,1071,582.67,2147.64,1092.19,11002,4752,-66.12,16,5,-48.34,6.84,27.00,26.00,19,9,0.06,0.13,0.18,0.11,0.00,0.00,0,0, +1746045757176,19,2137,1023,598.85,2147.48,1036.02,12401,4300,-66.00,16,5,-48.22,6.84,26.50,26.00,19,10,0.14,0.05,0.18,0.11,0.00,0.00,0,0, +1746045758176,19,2149,1083,591.65,2154.95,1092.14,10299,4695,-66.25,16,5,-48.47,6.83,26.50,27.00,18,9,0.08,0.20,0.18,0.11,0.00,0.00,0,0, +1746045759176,19,2137,1083,650.32,2152.64,1092.76,15838,4639,-65.88,16,5,-48.09,6.85,27.00,27.00,19,7,0.11,0.07,0.18,0.11,0.00,0.00,0,0, +1746045760177,19,2137,1083,681.14,2147.47,1093.02,12525,4557,-65.88,16,5,-48.09,6.85,26.00,27.00,18,13,0.10,0.07,0.18,0.11,0.00,0.00,0,0, +1746045760177,21,0,0,0.00,0.00,0.00,-449,-5382,-69.00,1,5,-51.22,6.74,31.00,30.00,5,0,0.03,0.07,0.00,0.00,nan,0.00,0,0, +1746045761177,19,2149,1083,664.86,2165.28,1091.82,9216,4707,-66.19,16,5,-48.41,6.84,26.00,27.00,19,12,0.11,0.18,0.18,0.11,0.00,0.00,0,0, +1746045761177,21,0,0,0.00,0.00,0.00,5,50,-73.21,14,5,-55.43,6.60,31.00,30.00,0,0,0.01,0.06,0.00,0.00,nan,0.00,0,0, +1746045762177,19,2137,1083,657.32,2148.07,1092.98,14768,4699,-66.00,16,5,-48.22,6.84,26.50,27.00,18,7,0.09,0.09,0.18,0.11,0.00,0.00,0,0, +1746045762177,21,0,0,0.00,0.00,0.00,5,50,-72.57,14,5,-54.79,6.62,30.00,29.00,0,0,0.00,0.05,0.00,0.00,nan,0.00,0,0, +1746045763177,19,2137,1071,666.55,2147.90,1092.57,14257,4669,-66.06,16,5,-48.28,6.84,25.50,27.00,18,12,0.15,0.03,0.18,0.11,0.00,0.00,0,0, +1746045763177,21,0,0,0.00,0.00,0.00,5,50,-70.81,16,5,-53.03,6.68,31.00,30.00,0,0,0.00,0.05,0.00,0.00,nan,0.00,0,0, +1746045764177,19,2149,1023,568.00,2159.90,1032.98,12734,4556,-66.06,16,5,-48.28,6.84,26.50,27.00,18,8,0.05,0.11,0.18,0.11,0.00,0.00,0,0, +1746045764177,21,0,0,0.00,0.00,0.00,5,50,-70.81,16,5,-53.03,6.68,31.00,31.00,0,0,0.00,0.04,0.00,0.00,nan,0.00,0,0, +1746045765177,19,2137,1083,437.80,2147.87,1091.05,13536,4687,-66.25,16,5,-48.47,6.83,26.50,27.00,18,11,0.09,0.04,0.18,0.11,0.00,0.00,0,0, +1746045765177,21,0,0,0.00,0.00,0.00,5,50,-75.46,13,5,-57.68,6.54,30.00,33.00,0,0,0.00,0.04,0.00,0.00,nan,0.00,0,0, +1746045766177,19,2137,1095,813.62,2147.76,1105.37,12081,4679,-66.44,16,5,-48.66,6.83,27.00,26.00,20,9,0.08,0.09,0.18,0.11,0.00,0.00,0,0, +1746045766177,21,0,0,0.00,0.00,0.00,5,50,-80.12,16,5,-62.34,6.43,30.00,33.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045767177,19,2149,1035,512.45,2158.45,1046.66,11795,4994,-66.44,16,5,-48.66,6.83,27.00,28.00,13,13,0.15,0.05,0.18,0.11,0.00,0.00,0,0, +1746045767177,21,0,0,0.00,0.00,0.00,5,50,-81.47,15,5,-63.69,6.40,31.50,34.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045768177,19,2137,1119,598.60,2148.75,1136.24,11048,6129,-66.38,16,5,-48.59,6.83,27.00,27.00,13,7,0.05,0.19,0.18,0.11,0.00,0.00,0,0, +1746045768177,21,0,0,0.00,0.00,0.00,5,50,-79.50,16,5,-61.72,6.44,30.50,33.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045769177,19,2137,1035,977.22,2153.24,1039.80,21604,4717,-66.38,16,5,-48.59,6.83,27.00,26.00,20,5,0.12,0.07,0.18,0.11,0.00,0.00,0,0, +1746045769177,21,0,0,0.00,0.00,0.00,5,50,-79.50,16,5,-61.72,6.44,30.50,32.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045770177,19,2149,1083,590.52,2160.22,1090.59,15289,4651,-66.06,16,5,-48.28,6.84,26.50,27.00,17,13,0.08,0.03,0.18,0.11,0.00,0.00,0,0, +1746045770177,21,0,0,0.00,0.00,0.00,5,50,-77.19,16,5,-59.41,6.50,30.00,32.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045771177,19,2137,1071,713.50,2148.54,1091.75,11691,4690,-66.44,16,5,-48.66,6.83,27.50,28.00,20,6,0.12,0.17,0.18,0.11,0.00,0.00,0,0, +1746045771177,21,0,0,0.00,0.00,0.00,5,50,-76.00,12,5,-58.22,6.53,30.00,31.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045772177,19,2137,1083,821.65,2153.79,1091.73,21684,4722,-66.25,16,5,-48.47,6.83,25.50,26.00,18,5,0.08,0.06,0.18,0.11,0.00,0.00,0,0, +1746045772177,21,0,0,0.00,0.00,0.00,5,50,-72.45,11,5,-54.67,6.63,29.50,30.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045773177,19,2149,1083,543.79,2160.22,1093.87,13718,4654,-66.25,16,5,-48.47,6.83,27.00,27.00,19,14,0.10,0.05,0.18,0.11,0.00,0.00,0,0, +1746045773177,21,0,0,0.00,0.00,0.00,5,50,-72.45,11,5,-54.67,6.63,30.00,32.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045774177,19,2137,1083,815.62,2148.19,1094.66,13158,4531,-66.27,15,5,-48.49,6.83,27.00,26.00,19,5,0.12,0.16,0.18,0.11,0.00,0.00,0,0, +1746045774177,21,0,0,0.00,0.00,0.00,5,50,-72.31,13,5,-54.53,6.63,32.00,30.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045775177,19,2137,1083,757.11,2153.90,1093.83,21908,4620,-66.75,16,5,-48.97,6.82,26.50,27.00,18,5,0.12,0.05,0.18,0.11,0.00,0.00,0,0, +1746045775177,21,0,0,0.00,0.00,0.00,5,50,-73.00,12,5,-55.22,6.61,30.50,30.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045776177,19,2149,1035,607.00,2159.87,1042.69,12765,4478,-66.25,16,5,-48.47,6.83,26.50,26.00,20,12,0.12,0.20,0.18,0.11,0.00,0.00,0,0, +1746045776177,21,0,0,0.00,0.00,0.00,5,50,-72.45,11,5,-54.67,6.63,31.00,30.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045777177,19,2137,1071,578.85,2160.12,1089.68,14705,4839,-66.33,15,5,-48.55,6.83,26.00,27.00,16,7,0.08,0.09,0.18,0.11,0.00,0.00,0,0, +1746045777177,21,0,0,0.00,0.00,0.00,5,50,-75.71,14,5,-57.93,6.53,31.50,29.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045778177,19,2137,1083,683.75,2148.04,1091.72,14625,4765,-66.33,15,5,-48.55,6.83,27.50,25.00,21,12,0.09,0.03,0.18,0.11,0.00,0.00,0,0, +1746045778177,21,0,0,0.00,0.00,0.00,5,50,-75.71,14,5,-57.93,6.53,30.00,30.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045779177,19,2149,1083,524.71,2147.62,1094.33,10344,4643,-66.44,16,5,-48.66,6.83,28.00,24.00,17,11,0.11,0.14,0.18,0.11,0.00,0.00,0,0, +1746045779177,21,0,0,0.00,0.00,0.00,5,50,-83.77,13,5,-65.99,6.35,30.00,31.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045780177,19,2137,1083,629.05,2159.84,1090.19,11768,4882,-66.06,16,5,-48.28,6.84,28.00,26.00,19,11,0.06,0.06,0.18,0.11,0.00,0.00,0,0, +1746045780177,21,0,0,0.00,0.00,0.00,5,50,-78.36,14,5,-60.58,6.47,30.00,31.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045781177,19,2137,1083,606.00,2147.54,1095.38,10438,4512,-66.50,16,13,-44.57,19.40,25.00,26.00,19,12,0.11,0.08,0.18,0.11,0.00,0.00,0,0, +1746045781177,21,0,0,0.00,0.00,0.00,5,50,-83.93,15,5,-66.15,6.34,30.50,32.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045782177,19,2149,1083,537.67,2154.37,1092.38,11951,4723,-66.50,16,27,-41.39,43.38,26.50,27.00,18,8,0.07,0.13,0.18,0.11,0.00,0.00,0,0, +1746045782177,21,0,0,0.00,0.00,0.00,5,50,-83.93,15,5,-66.15,6.34,30.00,32.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045783177,19,2137,1023,527.67,2153.31,1042.23,13945,4339,-66.00,16,5,-48.22,6.84,26.50,27.00,20,9,0.12,0.05,0.18,0.11,0.00,0.00,0,0, +1746045783177,21,0,0,0.00,0.00,0.00,5,50,-67.07,14,5,-49.29,6.80,30.00,31.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045784177,19,2137,1083,678.41,2147.51,1097.10,9778,4472,-66.31,16,5,-48.53,6.83,26.50,26.00,19,13,0.14,0.13,0.18,0.11,0.00,0.00,0,0, +1746045784177,21,0,0,0.00,0.00,0.00,5,50,-73.00,14,5,-55.22,6.61,29.50,32.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045785177,19,2137,1083,673.82,2147.78,1095.38,11539,4524,-66.19,16,5,-48.41,6.84,26.50,27.00,19,9,0.08,0.10,0.18,0.11,0.00,0.00,0,0, +1746045785177,21,0,0,0.00,0.00,0.00,5,50,-83.36,14,5,-65.58,6.36,30.00,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045786177,19,2149,1083,724.15,2159.72,1094.86,11906,4520,-66.19,16,5,-48.41,6.84,26.00,27.00,19,12,0.07,0.05,0.18,0.11,0.00,0.00,0,0, +1746045786177,21,0,0,0.00,0.00,0.00,5,50,-77.62,13,5,-59.83,6.49,30.00,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045787177,19,2137,1047,650.36,2147.74,1051.74,10224,4421,-66.19,16,5,-48.41,6.84,27.50,27.00,19,12,0.12,0.12,0.18,0.11,0.00,0.00,0,0, +1746045787177,21,0,0,0.00,0.00,0.00,5,50,-77.62,13,5,-59.83,6.49,30.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045788177,19,2149,1083,491.33,2147.58,1093.11,9947,4589,-66.19,16,5,-48.41,6.84,28.00,28.00,18,12,0.12,0.10,0.18,0.11,0.00,0.00,0,0, +1746045788177,21,0,0,0.00,0.00,0.00,5,50,-77.19,16,5,-59.41,6.50,31.00,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045789177,19,2137,1083,770.38,2159.80,1092.31,10367,4754,-66.19,16,5,-48.41,6.84,27.00,27.00,19,12,0.06,0.11,0.18,0.11,0.00,0.00,0,0, +1746045789177,21,0,0,0.00,0.00,0.00,5,50,-76.23,13,5,-58.45,6.52,30.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045790177,19,2137,1095,588.32,2147.80,1108.35,10184,4750,-65.94,16,5,-48.16,6.85,27.50,27.00,18,12,0.11,0.10,0.18,0.11,0.00,0.00,0,0, +1746045790177,21,0,0,0.00,0.00,0.00,5,50,-73.71,14,5,-55.93,6.59,30.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045791177,19,2137,1023,631.90,2157.30,1035.43,10251,4517,-66.19,16,5,-48.41,6.84,25.00,27.00,20,12,0.08,0.10,0.18,0.11,0.00,0.00,0,0, +1746045791177,21,0,0,0.00,0.00,0.00,5,50,-70.00,11,5,-52.22,6.70,30.00,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045792177,19,2149,1095,473.86,2159.77,1109.42,10321,4811,-66.19,16,5,-48.41,6.84,26.50,25.00,17,12,0.10,0.13,0.18,0.11,0.00,0.00,0,0, +1746045792177,21,0,0,0.00,0.00,0.00,5,50,-70.00,11,5,-52.22,6.70,30.50,29.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045793177,19,2137,1083,560.89,2147.82,1090.15,10408,4832,-66.12,16,12,-44.54,17.81,26.00,26.00,19,12,0.08,0.12,0.18,0.11,0.00,0.00,0,0, +1746045793177,21,0,0,0.00,0.00,0.00,5,50,-64.58,12,5,-46.80,6.90,29.50,34.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045794177,19,2137,1023,640.40,2147.64,1041.26,11327,4542,-66.31,16,5,-48.53,6.83,27.00,26.00,19,11,0.12,0.07,0.18,0.11,0.00,0.00,0,0, +1746045794177,21,0,0,0.00,0.00,0.00,5,50,-74.17,12,5,-56.39,6.58,30.00,35.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045795177,19,2149,1131,586.85,2159.69,1144.15,10807,4837,-66.19,16,36,-39.83,59.82,26.00,25.00,16,12,0.09,0.07,0.18,0.11,0.00,0.00,0,0, +1746045795177,21,0,0,0.00,0.00,0.00,5,50,-75.71,14,5,-57.93,6.53,29.50,35.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045796177,19,2137,1083,569.85,2147.59,1089.93,12187,4844,-66.19,16,5,-48.41,6.84,26.00,25.00,19,8,0.07,0.11,0.18,0.11,0.00,0.00,0,0, +1746045796177,21,0,0,0.00,0.00,0.00,5,50,-75.71,14,5,-57.93,6.53,29.50,35.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045797177,19,2137,1023,659.29,2148.34,1039.85,14117,4459,-66.19,16,5,-48.41,6.84,27.50,26.00,20,11,0.14,0.04,0.18,0.11,0.00,0.00,0,0, +1746045797177,21,0,0,0.00,0.00,0.00,5,50,-73.92,12,5,-56.14,6.58,29.50,34.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045798177,19,2149,1095,611.35,2159.70,1097.34,10159,4292,-66.44,16,5,-48.66,6.83,27.50,26.00,19,12,0.13,0.11,0.18,0.11,0.00,0.00,0,0, +1746045798177,21,0,0,0.00,0.00,0.00,5,50,-68.40,15,5,-50.62,6.76,30.00,34.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045799177,19,2137,1083,516.30,2147.58,1094.96,10116,4536,-66.19,16,5,-48.41,6.84,28.50,25.00,19,11,0.06,0.15,0.18,0.11,0.00,0.00,0,0, +1746045799177,21,0,0,0.00,0.00,0.00,5,50,-69.18,11,5,-51.40,6.73,31.00,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045800177,19,2137,1023,719.09,2147.94,1085.48,11720,4527,-66.19,16,12,-44.60,17.81,26.50,24.00,19,11,0.09,0.06,0.18,0.11,0.00,0.00,0,0, +1746045800177,21,0,0,0.00,0.00,0.00,5,50,-69.23,13,5,-51.45,6.73,30.50,34.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045801177,19,2149,1143,520.05,2159.46,1103.80,10272,4509,-66.19,16,5,-48.41,6.84,27.00,24.00,19,12,0.07,0.10,0.18,0.11,0.00,0.00,0,0, +1746045801177,21,0,0,0.00,0.00,0.00,5,50,-69.23,13,5,-51.45,6.73,30.00,37.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045802177,19,2137,1023,557.85,2147.63,1036.18,10171,4531,-66.31,16,5,-48.53,6.83,28.50,24.00,19,12,0.09,0.13,0.18,0.11,0.00,0.00,0,0, +1746045802177,21,0,0,0.00,0.00,0.00,5,50,-65.85,13,5,-48.06,6.85,30.50,35.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045803177,19,2137,1083,619.14,2147.56,1094.49,10543,4294,-66.56,16,5,-48.78,6.82,28.00,24.00,19,11,0.08,0.12,0.18,0.11,0.00,0.00,0,0, +1746045803177,21,0,0,0.00,0.00,0.00,5,50,-67.00,11,5,-49.22,6.81,31.50,35.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045804177,19,2149,1083,580.87,2159.77,1094.87,11754,4550,-66.62,16,5,-48.84,6.82,28.00,24.00,19,11,0.09,0.06,0.18,0.11,0.00,0.00,0,0, +1746045804177,21,0,0,0.00,0.00,0.00,5,50,-72.58,12,5,-54.80,6.62,30.00,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045805177,19,2137,1083,588.90,2147.82,1094.54,10573,4750,-66.62,16,106,-35.58,198.49,25.50,25.00,19,12,0.11,0.10,0.18,0.11,0.00,0.00,0,0, +1746045805177,21,0,0,0.00,0.00,0.00,5,50,-72.58,12,5,-54.80,6.62,30.00,34.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045806177,19,2137,1023,782.95,2147.74,1084.75,12591,4286,-66.50,16,12,-44.92,17.77,26.00,26.00,19,8,0.14,0.10,0.18,0.11,0.00,0.00,0,0, +1746045806177,21,0,0,0.00,0.00,0.00,5,50,-63.08,12,5,-45.30,6.96,30.00,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045807177,19,2149,1083,731.74,2159.80,1094.60,13274,4501,-66.69,16,5,-48.91,6.82,27.00,25.00,19,12,0.14,0.04,0.18,0.11,0.00,0.00,0,0, +1746045807177,21,0,0,0.00,0.00,0.00,5,50,-69.21,14,5,-51.43,6.73,30.00,35.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045808177,19,2137,1143,610.50,2147.73,1104.51,12560,4523,-66.50,16,5,-48.72,6.82,27.50,26.00,19,8,0.12,0.10,0.18,0.11,0.00,0.00,0,0, +1746045808177,21,0,0,0.00,0.00,0.00,5,50,-74.15,13,5,-56.37,6.58,30.00,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045809177,19,2137,1023,758.12,2148.05,1036.36,13887,4308,-66.31,16,5,-48.53,6.83,26.00,26.00,19,11,0.14,0.04,0.18,0.11,0.00,0.00,0,0, +1746045809177,21,0,0,0.00,0.00,0.00,5,50,-78.33,15,5,-60.55,6.47,30.00,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045810177,19,2149,1095,829.50,2159.72,1109.45,10189,4750,-66.31,16,5,-48.53,6.83,27.00,26.00,19,12,0.11,0.08,0.18,0.11,0.00,0.00,0,0, +1746045810177,21,0,0,0.00,0.00,0.00,5,50,-78.33,15,5,-60.55,6.47,31.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045811177,19,2137,1071,520.19,2147.84,1079.46,9985,4286,-66.25,16,5,-48.47,6.83,26.50,27.00,19,12,0.11,0.12,0.18,0.11,0.00,0.00,0,0, +1746045811177,21,0,0,0.00,0.00,0.00,5,50,-88.93,15,5,-71.15,6.25,30.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045812177,19,2137,1083,655.82,2147.76,1093.24,10043,4670,-66.12,16,27,-41.02,43.52,26.00,27.00,18,12,0.10,0.11,0.18,0.11,0.00,0.00,0,0, +1746045812177,21,0,0,0.00,0.00,0.00,5,50,-79.93,15,5,-62.15,6.43,30.00,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045813177,19,2149,1023,634.09,2159.71,1083.25,10155,4684,-66.12,16,13,-44.19,19.45,25.50,27.00,19,12,0.09,0.10,0.18,0.11,0.00,0.00,0,0, +1746045813177,21,0,0,0.00,0.00,0.00,5,50,-74.56,16,5,-56.78,6.57,30.50,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045814177,19,2137,1083,457.62,2147.77,1045.23,10430,4543,-66.12,16,5,-48.34,6.84,26.00,27.00,18,12,0.14,0.12,0.18,0.11,0.00,0.00,0,0, +1746045814177,21,0,0,0.00,0.00,0.00,5,50,-74.56,16,5,-56.78,6.57,31.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045815177,19,2137,1083,629.45,2147.65,1090.85,10255,4558,-66.12,16,5,-48.34,6.84,26.50,27.00,19,12,0.05,0.13,0.18,0.11,0.00,0.00,0,0, +1746045815177,21,0,0,0.00,0.00,0.00,5,50,-73.25,16,5,-55.47,6.60,31.50,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045816177,19,2149,1083,586.85,2159.55,1095.06,9977,4538,-66.25,16,5,-48.47,6.83,26.50,27.00,18,11,0.17,0.15,0.18,0.11,0.00,0.00,0,0, +1746045816177,21,0,0,0.00,0.00,0.00,5,50,-73.25,16,5,-55.47,6.60,32.50,34.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045817176,19,2137,1071,716.70,2147.83,1090.80,11476,4773,-66.06,16,5,-48.28,6.84,26.50,27.00,18,11,0.06,0.06,0.18,0.11,0.00,0.00,0,0, +1746045818176,19,2137,1083,687.55,2147.62,1093.80,10367,4564,-66.19,16,5,-48.41,6.84,26.00,27.00,18,12,0.15,0.07,0.18,0.11,0.00,0.00,0,0, +1746045819176,19,2149,1083,535.29,2159.82,1091.06,10423,4801,-66.19,16,5,-48.41,6.84,26.00,27.00,18,12,0.05,0.09,0.18,0.11,0.00,0.00,0,0, +1746045820176,19,2137,1023,766.95,2157.47,1085.04,11814,4551,-65.88,16,5,-48.09,6.85,26.50,28.00,19,10,0.15,0.10,0.18,0.11,0.00,0.00,0,0, +1746045821176,19,2137,1083,571.20,2147.93,1042.88,11839,4781,-66.25,16,5,-48.47,6.83,26.00,27.00,18,13,0.06,0.06,0.18,0.11,0.00,0.00,0,0, +1746045822177,19,2149,1083,559.45,2159.96,1093.62,12851,4328,-66.19,16,5,-48.41,6.84,26.50,30.00,19,8,0.12,0.10,0.18,0.11,0.00,0.00,0,0, +1746045823176,19,2137,1083,517.20,2147.73,1092.88,12958,4687,-66.19,16,5,-48.41,6.84,25.50,26.00,18,12,0.09,0.04,0.18,0.11,0.00,0.00,0,0, +1746045824176,19,2137,1083,541.37,2147.50,1092.94,10587,4675,-66.19,16,5,-48.41,6.84,26.50,26.00,19,10,0.06,0.12,0.18,0.11,0.00,0.00,0,0, +1746045825176,19,2149,1083,564.84,2159.78,1094.79,12328,4538,-66.31,16,5,-48.53,6.83,25.50,26.00,19,12,0.14,0.05,0.18,0.11,0.00,0.00,0,0, +1746045826176,19,2137,1023,546.11,2147.46,1036.07,10881,4534,-66.25,16,5,-48.47,6.83,25.50,26.00,19,9,0.12,0.14,0.18,0.11,0.00,0.00,0,0, +1746045827176,19,2137,1083,572.62,2147.92,1092.57,12830,4738,-66.38,16,5,-48.59,6.83,27.00,28.00,18,10,0.07,0.05,0.18,0.11,0.00,0.00,0,0, +1746045828176,19,2149,1083,682.65,2159.84,1102.84,11570,4305,-66.38,16,5,-48.59,6.83,27.00,28.00,20,8,0.14,0.14,0.18,0.11,0.00,0.00,0,0, +1746045829176,19,2137,1095,608.33,2147.88,1099.56,14067,4652,-66.00,16,5,-48.22,6.84,27.50,27.00,18,8,0.09,0.05,0.18,0.11,0.00,0.00,0,0, +1746045830176,19,2137,1083,688.29,2147.79,1093.68,10895,4684,-65.88,16,5,-48.09,6.85,25.50,26.00,19,12,0.08,0.09,0.18,0.11,0.00,0.00,0,0, +1746045831176,19,2149,1083,655.36,2159.97,1093.59,10320,4578,-65.94,16,5,-48.16,6.85,27.00,27.00,18,12,0.12,0.10,0.18,0.11,0.00,0.00,0,0, +1746045832177,19,2137,1011,518.48,2147.65,1082.00,10195,4781,-65.88,16,5,-48.09,6.85,25.50,27.00,19,12,0.05,0.10,0.18,0.11,0.00,0.00,0,0, +1746045833176,19,2137,1083,637.09,2147.75,1044.94,10201,4288,-65.88,16,5,-48.09,6.85,25.50,27.00,19,12,0.11,0.14,0.18,0.11,0.00,0.00,0,0, +1746045834176,19,2149,1083,658.23,2156.16,1093.23,10669,4639,-65.94,16,5,-48.16,6.85,27.00,27.00,18,11,0.10,0.12,0.18,0.11,0.00,0.00,0,0, +1746045835176,19,2137,1143,549.05,2151.29,1150.68,11506,4930,-66.00,16,59,-37.50,103.84,26.00,27.00,19,12,0.09,0.05,0.18,0.11,0.00,0.00,0,0, +1746045836176,19,2137,1023,754.55,2147.39,1030.87,9863,4570,-66.06,16,5,-48.28,6.84,26.00,28.00,17,12,0.09,0.14,0.18,0.11,0.00,0.00,0,0, +1746045837176,19,2149,1071,636.24,2156.30,1091.59,10344,4807,-66.06,16,5,-48.28,6.84,27.00,27.00,19,11,0.11,0.16,0.18,0.11,0.00,0.00,0,0, +1746045838176,19,2137,1083,623.35,2151.34,1091.93,11489,4681,-66.12,16,5,-48.34,6.84,26.50,26.00,17,11,0.11,0.06,0.18,0.11,0.00,0.00,0,0, +1746045839177,19,2137,1023,750.14,2147.78,1036.33,9744,4901,-66.00,16,12,-44.42,17.83,24.50,28.00,19,12,0.04,0.16,0.18,0.11,0.00,0.00,0,0, +1746045840176,19,2149,1083,534.65,2159.55,1088.80,11392,4300,-65.69,16,5,-47.91,6.86,26.00,27.00,18,11,0.16,0.06,0.18,0.11,0.00,0.00,0,0, +1746045841176,19,2137,1131,565.83,2147.68,1150.54,10566,5040,-65.81,16,28,-40.55,45.44,25.50,28.00,18,12,0.05,0.08,0.18,0.11,0.00,0.00,0,0, +1746045842177,19,2137,1035,603.86,2147.61,1034.96,10036,4359,-65.81,16,5,-48.03,6.85,25.50,27.00,18,12,0.13,0.09,0.18,0.11,0.00,0.00,0,0, +1746045843176,19,2149,1071,563.16,2147.74,1092.44,10363,4753,-66.06,16,5,-48.28,6.84,26.00,30.00,19,12,0.06,0.11,0.18,0.11,0.00,0.00,0,0, +1746045844176,19,2137,1083,557.00,2159.68,1094.54,10277,4531,-66.00,16,5,-48.22,6.84,26.00,27.00,18,12,0.17,0.12,0.18,0.11,0.00,0.00,0,0, +1746045845176,19,2137,1083,745.05,2147.56,1089.22,10771,4939,-65.94,16,5,-48.16,6.85,25.50,26.00,17,9,0.07,0.17,0.18,0.11,0.00,0.00,0,0, +1746045846176,19,2149,1083,517.20,2159.85,1092.82,14220,4679,-65.94,16,5,-48.16,6.85,25.00,29.00,19,8,0.11,0.06,0.18,0.11,0.00,0.00,0,0, +1746045847176,19,2137,1083,519.52,2147.70,1092.94,11403,4672,-66.06,16,27,-40.96,43.55,26.00,27.00,18,10,0.10,0.21,0.18,0.11,0.00,0.00,0,0, +1746045848176,19,2137,1023,789.40,2147.85,1038.90,15295,4724,-65.94,16,12,-44.35,17.84,24.50,28.00,19,7,0.11,0.07,0.18,0.11,0.00,0.00,0,0, +1746045849176,19,2149,1071,601.90,2157.52,1088.54,13474,4374,-66.19,16,5,-48.41,6.84,25.50,26.00,18,12,0.10,0.08,0.18,0.11,0.00,0.00,0,0, +1746045850176,19,2137,1083,585.95,2150.20,1092.90,14100,4722,-65.75,16,5,-47.97,6.85,25.50,27.00,19,7,0.09,0.10,0.18,0.11,0.00,0.00,0,0, +1746045851176,19,2137,1083,676.85,2147.70,1091.38,14822,4688,-65.75,16,5,-47.97,6.85,26.00,26.00,18,11,0.09,0.04,0.18,0.11,0.00,0.00,0,0, +1746045852176,19,2149,1083,480.10,2159.87,1092.66,10301,4893,-66.38,16,106,-35.33,199.14,25.50,26.00,19,12,0.09,0.08,0.18,0.11,0.00,0.00,0,0, +1746045853176,19,2137,1083,615.55,2147.55,1092.61,11972,4422,-66.19,16,5,-48.41,6.84,26.00,26.00,18,9,0.12,0.10,0.18,0.11,0.00,0.00,0,0, +1746045854176,19,2137,1023,735.55,2147.82,1081.99,12342,4751,-66.19,16,5,-48.41,6.84,26.50,28.00,19,13,0.05,0.03,0.18,0.11,0.00,0.00,0,0, +1746045855177,19,2149,1131,588.40,2147.63,1101.73,11980,4444,-66.12,16,5,-48.34,6.84,27.00,27.00,19,6,0.14,0.15,0.18,0.11,0.00,0.00,0,0, +1746045855177,22,0,0,0.00,0.00,0.00,-332,-3135,-84.69,13,5,-66.91,6.33,31.00,32.00,2,0,0.04,0.07,0.00,0.00,nan,0.00,0,0, +1746045856177,19,2137,1023,645.67,2159.85,1033.32,18515,4543,-66.12,16,5,-48.34,6.84,25.50,27.00,18,6,0.06,0.05,0.18,0.11,0.00,0.00,0,0, +1746045856177,22,0,0,0.00,0.00,0.00,5,50,-84.69,13,5,-66.91,6.33,34.00,32.00,0,0,0.01,0.07,0.00,0.00,nan,0.00,0,0, +1746045857177,19,2137,1095,623.33,2147.70,1107.78,11741,4723,-65.94,16,5,-48.16,6.85,26.50,26.00,19,13,0.13,0.13,0.18,0.11,0.00,0.00,0,0, +1746045857177,22,0,0,0.00,0.00,0.00,5,50,-83.06,16,5,-65.28,6.36,29.50,34.00,0,0,0.01,0.06,0.00,0.00,nan,0.00,0,0, +1746045858177,19,2149,1083,543.47,2147.57,1093.10,10878,4655,-66.00,16,5,-48.22,6.84,26.00,27.00,18,11,0.09,0.08,0.18,0.11,0.00,0.00,0,0, +1746045858177,22,0,0,0.00,0.00,0.00,5,50,-86.00,16,5,-68.22,6.30,38.00,33.00,0,0,0.00,0.05,0.00,0.00,nan,0.00,0,0, +1746045859177,19,2137,1083,614.59,2160.06,1091.50,11214,4700,-65.94,16,5,-48.16,6.85,25.50,27.00,18,12,0.16,0.08,0.18,0.11,0.00,0.00,0,0, +1746045859177,22,0,0,0.00,0.00,0.00,5,50,-102.44,16,5,-84.66,6.05,30.50,31.00,0,0,0.00,0.05,0.00,0.00,nan,0.00,0,0, +1746045860177,19,2137,1083,640.14,2147.89,1091.24,10385,4820,-65.94,16,27,-40.83,43.60,26.00,27.00,18,12,0.06,0.09,0.18,0.11,0.00,0.00,0,0, +1746045860177,22,0,0,0.00,0.00,0.00,5,50,-102.44,16,5,-84.66,6.05,35.00,30.00,0,0,0.00,0.04,0.00,0.00,nan,0.00,0,0, +1746045861177,19,2137,1023,446.00,2147.68,1035.77,10548,4297,-65.88,16,5,-48.09,6.85,28.00,26.00,19,11,0.10,0.13,0.18,0.11,0.00,0.00,0,0, +1746045861177,22,0,0,0.00,0.00,0.00,5,50,-91.67,15,5,-73.89,6.20,30.50,33.00,0,0,0.00,0.04,0.00,0.00,nan,0.00,0,0, +1746045862177,19,2149,1083,696.57,2159.73,1099.93,11484,4708,-65.88,16,5,-48.09,6.85,26.50,27.00,17,12,0.12,0.05,0.18,0.11,0.00,0.00,0,0, +1746045862177,22,0,0,0.00,0.00,0.00,5,50,-91.27,11,5,-73.49,6.21,36.00,32.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045863177,19,2137,1083,643.35,2147.82,1089.06,10370,4922,-66.25,16,106,-35.21,199.47,25.50,28.00,19,12,0.04,0.09,0.18,0.11,0.00,0.00,0,0, +1746045863177,22,0,0,0.00,0.00,0.00,5,50,-79.50,16,5,-61.72,6.44,32.00,29.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045864177,19,2137,1083,595.52,2147.82,1094.00,10235,4530,-66.00,16,106,-34.96,200.14,25.50,27.00,18,12,0.16,0.13,0.18,0.11,0.00,0.00,0,0, +1746045864177,22,0,0,0.00,0.00,0.00,5,50,-78.71,14,5,-60.93,6.46,36.00,32.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045865177,19,2149,1071,781.23,2159.78,1091.84,13358,4805,-66.00,16,5,-48.22,6.84,26.00,27.00,18,8,0.06,0.09,0.18,0.11,0.00,0.00,0,0, +1746045865177,22,0,0,0.00,0.00,0.00,5,50,-78.71,14,5,-60.93,6.46,30.50,31.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045866177,19,2137,1047,589.63,2147.64,1049.76,12784,4434,-66.31,16,5,-48.53,6.83,26.00,27.00,19,12,0.12,0.06,0.18,0.11,0.00,0.00,0,0, +1746045866177,22,0,0,0.00,0.00,0.00,5,50,-70.17,12,5,-52.39,6.70,37.00,29.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045867177,19,2137,1083,651.00,2147.90,1093.50,10501,4592,-65.88,16,5,-48.09,6.85,26.00,27.00,18,11,0.12,0.16,0.18,0.11,0.00,0.00,0,0, +1746045867177,22,0,0,0.00,0.00,0.00,5,50,-73.56,9,5,-55.77,6.59,31.50,31.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045868177,19,2149,1071,519.81,2159.81,1141.62,11710,4973,-66.12,16,5,-48.34,6.84,26.00,26.00,19,11,0.06,0.06,0.18,0.11,0.00,0.00,0,0, +1746045868177,22,0,0,0.00,0.00,0.00,5,50,-65.40,10,5,-47.62,6.87,33.50,31.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045869177,19,2137,1059,717.90,2147.72,1016.01,10529,4510,-66.12,16,5,-48.34,6.84,25.50,24.00,19,9,0.14,0.19,0.18,0.11,0.00,0.00,0,0, +1746045869177,22,0,0,0.00,0.00,0.00,5,50,-65.40,10,5,-47.62,6.87,29.50,30.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045870177,19,2137,1083,701.82,2147.88,1091.19,15684,4517,-66.38,16,5,-48.59,6.83,27.00,26.00,18,7,0.07,0.07,0.18,0.11,0.00,0.00,0,0, +1746045870177,22,0,0,0.00,0.00,0.00,5,50,-66.64,11,5,-48.85,6.82,36.00,31.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746045871177,19,2149,1095,624.80,2159.69,1111.90,12244,4637,-66.06,16,104,-35.10,195.74,25.50,27.00,20,13,0.14,0.08,0.18,0.11,0.00,0.00,0,0, +1746045871177,22,0,0,0.00,0.00,0.00,5,50,-74.60,15,5,-56.82,6.56,30.00,30.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045872177,19,2137,1083,618.40,2147.79,1092.31,13068,4763,-66.06,16,5,-48.28,6.84,27.00,28.00,18,7,0.07,0.11,0.18,0.11,0.00,0.00,0,0, +1746045872177,22,0,0,0.00,0.00,0.00,5,50,-74.47,15,5,-56.69,6.57,34.50,35.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045873177,19,2137,1083,677.00,2147.80,1093.94,15232,4584,-66.25,16,13,-44.32,19.43,25.00,27.00,19,10,0.08,0.04,0.18,0.11,0.00,0.00,0,0, +1746045873177,22,0,0,0.00,0.00,0.00,5,50,-80.36,14,5,-62.58,6.42,29.50,33.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045874177,19,2149,1023,617.70,2159.45,1036.58,10337,4307,-66.25,16,5,-48.47,6.83,28.00,25.00,19,9,0.11,0.17,0.18,0.11,0.00,0.00,0,0, +1746045874177,22,0,0,0.00,0.00,0.00,5,50,-80.36,14,5,-62.58,6.42,34.50,35.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045875177,19,2137,1083,662.05,2148.02,1094.18,14207,4551,-66.31,16,5,-48.53,6.83,27.50,26.00,19,8,0.10,0.06,0.18,0.11,0.00,0.00,0,0, +1746045875177,22,0,0,0.00,0.00,0.00,5,50,-83.00,16,5,-65.22,6.36,31.00,34.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045876177,19,2137,1083,721.39,2155.80,1094.26,10422,4516,-66.06,16,5,-48.28,6.84,27.00,23.00,19,12,0.12,0.21,0.18,0.11,0.00,0.00,0,0, +1746045876177,22,0,0,0.00,0.00,0.00,5,50,-81.25,16,5,-63.47,6.40,34.00,32.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045877177,19,2149,1083,607.75,2159.78,1094.06,13594,4533,-66.38,16,55,-38.18,95.62,25.50,27.00,19,8,0.14,0.08,0.18,0.11,0.00,0.00,0,0, +1746045877177,22,0,0,0.00,0.00,0.00,5,50,-86.23,13,5,-68.45,6.30,30.50,34.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045878177,19,2137,1083,518.62,2147.85,1092.82,12297,4668,-66.38,16,5,-48.59,6.83,27.00,25.00,18,14,0.09,0.04,0.18,0.11,0.00,0.00,0,0, +1746045878177,22,0,0,0.00,0.00,0.00,5,50,-86.23,13,5,-68.45,6.30,34.50,34.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045879177,19,2137,1023,527.05,2147.66,1034.62,11931,4666,-66.19,16,5,-48.41,6.84,26.50,25.00,19,8,0.05,0.12,0.18,0.11,0.00,0.00,0,0, +1746045879177,22,0,0,0.00,0.00,0.00,5,50,-81.00,14,5,-63.22,6.41,31.50,32.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045880177,19,2149,1083,758.15,2159.82,1094.54,13619,4302,-66.12,16,5,-48.34,6.84,28.00,25.00,19,11,0.07,0.04,0.18,0.11,0.00,0.00,0,0, +1746045880177,22,0,0,0.00,0.00,0.00,5,50,-81.25,16,5,-63.47,6.40,35.00,30.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746045881177,19,2137,1083,676.55,2147.50,1094.61,10809,4543,-66.25,16,5,-48.47,6.83,28.00,26.00,19,8,0.07,0.18,0.18,0.11,0.00,0.00,0,0, +1746045881177,22,0,0,0.00,0.00,0.00,5,50,-86.50,16,5,-68.72,6.29,31.00,27.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045882177,19,2137,1083,771.74,2147.88,1094.90,16112,4527,-66.31,16,5,-48.53,6.83,27.00,24.00,19,7,0.08,0.06,0.18,0.11,0.00,0.00,0,0, +1746045882177,22,0,0,0.00,0.00,0.00,5,50,-90.00,16,5,-72.22,6.23,40.00,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045883177,19,2149,1083,536.09,2160.04,1094.41,12607,4523,-66.31,16,5,-48.53,6.83,27.50,26.00,19,12,0.08,0.17,0.18,0.11,0.00,0.00,0,0, +1746045883177,22,0,0,0.00,0.00,0.00,5,50,-90.00,16,5,-72.22,6.23,30.50,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045884177,19,2137,1035,624.62,2147.70,1099.39,12358,4636,-66.19,16,13,-44.26,19.44,25.50,26.00,19,10,0.11,0.07,0.18,0.11,0.00,0.00,0,0, +1746045884177,22,0,0,0.00,0.00,0.00,5,50,-97.00,16,5,-79.22,6.12,35.50,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045885177,19,2137,1143,597.50,2147.54,1103.78,10363,4509,-66.25,16,5,-48.47,6.83,27.00,25.00,19,11,0.12,0.15,0.18,0.11,0.00,0.00,0,0, +1746045885177,22,0,0,0.00,0.00,0.00,5,50,-82.07,15,5,-64.29,6.38,30.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045886177,19,2149,1023,502.64,2159.61,1036.10,11318,4303,-66.38,16,5,-48.59,6.83,27.50,26.00,19,11,0.10,0.07,0.18,0.11,0.00,0.00,0,0, +1746045886177,22,0,0,0.00,0.00,0.00,5,50,-83.00,16,5,-65.22,6.36,35.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045887177,19,2137,1083,586.10,2147.58,1095.14,10311,4535,-66.25,16,5,-48.47,6.83,26.00,25.00,19,12,0.11,0.09,0.18,0.11,0.00,0.00,0,0, +1746045887177,22,0,0,0.00,0.00,0.00,5,50,-83.38,13,5,-65.60,6.36,30.50,35.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045888177,19,2137,1035,515.37,2147.80,1085.77,12053,4513,-66.25,16,5,-48.47,6.83,26.50,26.00,19,10,0.10,0.08,0.18,0.11,0.00,0.00,0,0, +1746045888177,22,0,0,0.00,0.00,0.00,5,50,-83.38,13,5,-65.60,6.36,35.50,33.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045889177,19,2149,1131,577.80,2159.60,1103.72,10923,4535,-66.50,16,55,-38.30,95.48,25.50,27.00,19,13,0.11,0.08,0.18,0.11,0.00,0.00,0,0, +1746045889177,22,0,0,0.00,0.00,0.00,5,50,-72.25,12,5,-54.47,6.63,30.00,34.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045890177,19,2137,1083,637.80,2147.76,1094.95,12528,4524,-66.38,16,13,-44.44,19.41,25.00,27.00,19,8,0.11,0.10,0.18,0.11,0.00,0.00,0,0, +1746045890177,22,0,0,0.00,0.00,0.00,5,50,-69.85,13,5,-52.06,6.71,35.00,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045891177,19,2137,1047,585.30,2147.80,1051.08,13330,4428,-66.25,16,5,-48.47,6.83,27.00,25.00,19,12,0.09,0.04,0.18,0.11,0.00,0.00,0,0, +1746045891177,22,0,0,0.00,0.00,0.00,5,50,-68.94,16,5,-51.16,6.74,31.00,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045892177,19,2149,1083,611.10,2165.40,1093.60,10373,4729,-66.25,16,106,-35.21,199.47,25.00,27.00,19,12,0.08,0.15,0.18,0.11,0.00,0.00,0,0, +1746045892177,22,0,0,0.00,0.00,0.00,5,50,-68.94,16,5,-51.16,6.74,42.00,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045893177,19,2137,1023,643.52,2147.54,1085.18,10529,4297,-66.56,16,5,-48.78,6.82,26.00,26.00,19,10,0.11,0.14,0.18,0.11,0.00,0.00,0,0, +1746045893177,22,0,0,0.00,0.00,0.00,5,50,-63.38,16,5,-45.59,6.95,28.50,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045894177,19,2137,1083,440.38,2147.80,1043.24,12619,4712,-66.19,16,5,-48.41,6.84,26.50,24.00,18,10,0.08,0.05,0.18,0.11,0.00,0.00,0,0, +1746045894177,22,0,0,0.00,0.00,0.00,5,50,-73.12,16,5,-55.34,6.61,33.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045895177,19,2149,1083,595.14,2160.10,1095.46,11255,4354,-66.31,16,5,-48.53,6.83,27.00,26.00,18,8,0.16,0.17,0.18,0.11,0.00,0.00,0,0, +1746045895177,22,0,0,0.00,0.00,0.00,5,50,-69.69,16,5,-51.91,6.71,28.50,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045896177,19,2137,1083,595.72,2147.98,1091.83,16077,4800,-66.19,16,5,-48.41,6.84,26.50,27.00,18,7,0.06,0.06,0.18,0.11,0.00,0.00,0,0, +1746045896177,22,0,0,0.00,0.00,0.00,5,50,-67.58,12,5,-49.80,6.79,32.00,32.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045897177,19,2137,1083,735.00,2147.62,1095.60,11621,4700,-66.19,16,5,-48.41,6.84,27.50,26.00,16,13,0.19,0.20,0.18,0.11,0.00,0.00,0,0, +1746045897177,22,0,0,0.00,0.00,0.00,5,50,-67.58,12,5,-49.80,6.79,29.50,31.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045898177,19,2149,1071,554.14,2160.02,1081.54,13201,5419,-66.19,16,5,-48.41,6.84,26.50,26.00,14,8,0.07,0.09,0.18,0.11,0.00,0.00,0,0, +1746045898177,22,0,0,0.00,0.00,0.00,5,190,-68.38,8,5,-50.59,6.76,35.50,30.00,0,0,0.00,0.00,0.00,0.00,nan,0.00,0,0, +1746045899176,19,2137,1011,673.70,2148.11,1077.69,13070,4898,-66.38,16,5,-48.59,6.83,27.50,27.00,19,13,0.21,0.04,0.18,0.11,0.00,0.00,0,0, +1746045900176,19,2137,1131,715.95,2147.81,1096.74,11217,5018,-66.12,16,5,-48.34,6.84,28.00,27.00,15,7,0.09,0.19,0.18,0.11,0.00,0.00,0,0, +1746045901176,19,2149,1083,838.81,2164.32,1088.74,21557,4942,-66.12,16,104,-35.16,195.58,25.50,27.00,20,5,0.04,0.07,0.18,0.11,0.00,0.00,0,0, +1746045902176,19,2137,1083,642.40,2149.94,1092.56,15419,4681,-66.06,16,5,-48.28,6.84,27.00,28.00,16,13,0.12,0.03,0.18,0.11,0.00,0.00,0,0, +1746045903176,19,2137,1071,720.76,2147.90,1089.86,9889,4945,-66.00,16,27,-40.89,43.58,26.00,27.00,18,10,0.04,0.17,0.18,0.11,0.00,0.00,0,0, +1746045904176,19,2149,1023,555.43,2159.85,1036.13,12887,4598,-66.06,16,5,-48.28,6.84,25.50,27.00,16,9,0.10,0.06,0.18,0.11,0.00,0.00,0,0, +1746045905176,19,2137,1083,624.72,2147.64,1090.58,10579,5119,-66.19,16,5,-48.41,6.84,26.50,28.00,19,11,0.05,0.32,0.18,0.11,0.00,0.00,0,0, +1746045906176,19,2137,1083,884.82,2150.82,1093.90,19807,4301,-66.19,16,5,-48.41,6.84,26.00,25.00,18,4,0.15,0.11,0.18,0.11,0.00,0.00,0,0, +1746045907176,19,2149,1083,664.09,2165.28,1088.97,25239,4967,-66.00,16,5,-48.22,6.84,25.50,28.00,17,7,0.06,0.04,0.18,0.11,0.00,0.00,0,0, +1746045908176,19,2137,1083,717.45,2147.62,1093.44,10989,4622,-65.94,16,5,-48.16,6.85,25.50,28.00,19,12,0.10,0.29,0.18,0.11,0.00,0.00,0,0, +1746045909176,19,2137,1071,780.37,2150.31,1089.89,17178,4825,-66.06,16,5,-48.28,6.84,26.00,27.00,16,5,0.10,0.12,0.18,0.11,0.00,0.00,0,0, +1746045910176,19,2149,1083,517.95,2164.97,1092.03,21159,4865,-66.06,16,106,-35.02,199.97,25.50,27.00,20,7,0.03,0.04,0.18,0.11,0.00,0.00,0,0, +1746045911176,19,2137,1035,518.25,2147.48,1044.10,10905,4411,-66.25,16,5,-48.47,6.83,26.50,27.00,18,12,0.15,0.15,0.18,0.11,0.00,0.00,0,0, +1746045912176,19,2137,1083,634.95,2147.91,1091.81,12645,4558,-66.19,16,5,-48.41,6.84,25.50,31.00,18,10,0.05,0.07,0.18,0.11,0.00,0.00,0,0, +1746045913176,19,2149,1083,620.85,2157.50,1094.63,10799,4555,-66.19,16,5,-48.41,6.84,26.00,25.00,19,12,0.13,0.16,0.18,0.11,0.00,0.00,0,0, +1746045914176,19,2137,1071,651.68,2155.87,1093.31,14595,4643,-66.00,16,5,-48.22,6.84,27.00,29.00,18,7,0.10,0.09,0.18,0.11,0.00,0.00,0,0, +1746045915176,19,2137,1083,748.55,2147.81,1092.83,14172,4716,-66.00,16,106,-34.96,200.14,25.50,28.00,19,12,0.08,0.04,0.18,0.11,0.00,0.00,0,0, +1746045916176,19,2149,1083,552.42,2154.15,1093.95,11081,4584,-66.00,16,5,-48.22,6.84,26.00,29.00,18,8,0.13,0.16,0.18,0.11,0.00,0.00,0,0, +1746045917176,19,2137,1083,590.05,2153.22,1091.60,13959,4786,-65.88,16,27,-40.77,43.63,26.50,30.00,18,8,0.06,0.06,0.18,0.11,0.00,0.00,0,0, +1746045918176,19,2137,1023,706.24,2147.62,1035.70,11964,4528,-66.25,16,5,-48.47,6.83,26.00,31.00,19,10,0.14,0.13,0.18,0.11,0.00,0.00,0,0, +1746045919176,19,2149,1083,537.09,2155.43,1091.74,12922,4514,-65.81,16,5,-48.03,6.85,26.00,31.00,18,10,0.07,0.05,0.18,0.11,0.00,0.00,0,0, +1746045920176,19,2137,1083,567.70,2152.22,1093.61,10810,4658,-65.81,16,5,-48.03,6.85,26.50,27.00,19,11,0.12,0.11,0.18,0.11,0.00,0.00,0,0, +1746045921176,19,2137,1071,721.80,2147.67,1091.45,11178,4800,-65.75,16,5,-47.97,6.85,26.50,27.00,18,13,0.06,0.05,0.18,0.11,0.00,0.00,0,0, +1746045922176,19,2149,1083,510.19,2166.24,1098.74,11889,4773,-65.88,16,13,-43.94,19.49,24.50,28.00,19,9,0.12,0.10,0.18,0.11,0.00,0.00,0,0, +1746045923176,19,2137,1083,563.90,2152.08,1087.71,12282,4470,-66.06,16,5,-48.28,6.84,25.50,27.00,18,12,0.09,0.06,0.18,0.11,0.00,0.00,0,0, +1746045924176,19,2137,1023,756.74,2147.56,1034.77,10451,4639,-66.06,16,104,-35.10,195.74,25.50,27.00,20,10,0.07,0.20,0.18,0.11,0.00,0.00,0,0, +1746045925176,19,2149,1095,503.33,2154.05,1103.34,13584,4226,-66.25,16,5,-48.47,6.83,25.50,27.00,18,8,0.13,0.07,0.18,0.11,0.00,0.00,0,0, +1746045926176,19,2137,1083,614.67,2153.24,1091.74,11923,4810,-66.25,16,5,-48.47,6.83,27.00,27.00,19,13,0.05,0.07,0.18,0.11,0.00,0.00,0,0, +1746045927176,19,2137,1083,557.67,2147.67,1142.54,11507,4732,-66.25,16,13,-44.32,19.43,26.00,27.00,19,10,0.09,0.10,0.18,0.11,0.00,0.00,0,0, +1746045928176,19,2149,1083,638.83,2157.37,1045.06,12001,4281,-66.44,16,106,-35.39,198.98,26.00,27.00,19,12,0.14,0.06,0.18,0.11,0.00,0.00,0,0, +1746045929176,19,2137,1023,634.48,2149.74,1085.06,9843,4516,-66.44,16,5,-48.66,6.83,27.00,27.00,19,12,0.12,0.10,0.18,0.11,0.00,0.00,0,0, +1746045930176,19,2137,1131,802.14,2147.72,1101.26,10448,4533,-66.25,16,27,-41.14,43.47,25.50,28.00,18,12,0.14,0.12,0.18,0.11,0.00,0.00,0,0, +1746045931176,19,2149,1083,588.40,2147.50,1090.98,10052,4763,-66.25,16,5,-48.47,6.83,28.50,26.00,19,12,0.05,0.11,0.18,0.11,0.00,0.00,0,0, +1746045932176,19,2137,1035,615.73,2159.57,1038.42,10119,4245,-66.38,16,5,-48.59,6.83,27.50,27.00,18,11,0.12,0.18,0.18,0.11,0.00,0.00,0,0, +1746045933176,19,2137,1071,593.80,2147.81,1091.15,12642,4753,-66.38,16,5,-48.59,6.83,26.00,26.00,19,9,0.06,0.07,0.18,0.11,0.00,0.00,0,0, +1746045934176,19,2137,1083,610.05,2154.89,1095.14,10884,4523,-66.44,16,5,-48.66,6.83,25.50,27.00,19,11,0.09,0.17,0.18,0.11,0.00,0.00,0,0, +1746045935176,19,2149,1083,708.27,2159.75,1094.81,12716,4531,-66.19,16,5,-48.41,6.84,27.50,26.00,19,10,0.08,0.06,0.18,0.11,0.00,0.00,0,0, +1746045936176,19,2137,1023,646.90,2147.49,1040.47,10142,4518,-66.12,16,12,-44.54,17.81,25.50,26.00,19,13,0.12,0.07,0.18,0.11,0.00,0.00,0,0, +1746045937176,19,2137,1143,605.53,2147.33,1148.58,11382,4514,-66.25,16,5,-48.47,6.83,25.50,27.00,19,10,0.14,0.09,0.18,0.11,0.00,0.00,0,0, +1746045938176,19,2149,1023,697.64,2159.72,1031.92,11595,4607,-66.25,16,5,-48.47,6.83,27.50,26.00,17,13,0.10,0.12,0.18,0.11,0.00,0.00,0,0, +1746045939176,19,2137,1083,606.13,2148.07,1090.64,13977,4817,-66.38,16,5,-48.59,6.83,27.50,27.00,19,7,0.09,0.11,0.18,0.11,0.00,0.00,0,0, +1746045940176,19,2137,1083,536.25,2147.76,1095.63,15250,4536,-66.44,16,5,-48.66,6.83,27.00,27.00,19,10,0.10,0.04,0.18,0.11,0.00,0.00,0,0, +1746045941176,19,2149,1083,641.89,2159.62,1094.09,10654,4534,-66.00,16,5,-48.22,6.84,27.00,27.00,19,11,0.10,0.12,0.18,0.11,0.00,0.00,0,0, +1746045942176,19,2137,1083,640.25,2147.70,1093.79,11459,4642,-66.00,16,5,-48.22,6.84,26.50,28.00,18,12,0.10,0.05,0.18,0.11,0.00,0.00,0,0, +1746045943176,19,2137,1023,609.29,2147.38,1033.70,10850,4705,-66.31,16,5,-48.53,6.83,26.00,27.00,19,7,0.06,0.16,0.18,0.11,0.00,0.00,0,0, +1746045944176,19,2149,1143,803.14,2160.00,1152.90,16145,4514,-66.19,16,5,-48.41,6.84,27.00,27.00,19,7,0.14,0.06,0.18,0.11,0.00,0.00,0,0, +1746045945176,19,2137,1023,584.27,2147.97,1033.64,11896,4509,-66.25,16,5,-48.47,6.83,27.00,27.00,18,13,0.07,0.19,0.18,0.11,0.00,0.00,0,0, +1746045946176,19,2137,1071,581.70,2147.41,1092.94,11780,4619,-66.06,16,5,-48.28,6.84,27.00,28.00,19,10,0.09,0.08,0.18,0.11,0.00,0.00,0,0, +1746045947176,19,2149,1143,627.70,2159.92,1153.62,11576,4736,-66.06,16,13,-44.13,19.46,25.00,27.00,19,12,0.08,0.06,0.18,0.11,0.00,0.00,0,0, +1746045948176,19,2137,1023,564.90,2147.66,1035.81,12693,4288,-66.31,16,106,-35.27,199.31,25.50,27.00,19,8,0.09,0.11,0.18,0.11,0.00,0.00,0,0, +1746045949176,19,2137,1023,584.40,2147.68,1034.87,13535,4649,-66.38,16,5,-48.59,6.83,28.00,27.00,18,11,0.10,0.04,0.18,0.11,0.00,0.00,0,0, +1746045950176,19,2149,1083,729.22,2159.86,1091.50,10731,4511,-66.25,16,5,-48.47,6.83,26.50,26.00,19,10,0.05,0.13,0.18,0.11,0.00,0.00,0,0, +1746045951176,19,2137,1083,630.95,2147.70,1094.45,12572,4525,-66.25,16,5,-48.47,6.83,27.00,28.00,19,11,0.09,0.05,0.18,0.11,0.00,0.00,0,0, +1746045952176,19,2137,1083,775.45,2147.54,1093.96,10146,4514,-66.25,16,5,-48.47,6.83,27.50,28.00,19,12,0.11,0.11,0.18,0.11,0.00,0.00,0,0, +1746045953176,19,2149,1083,680.18,2159.68,1094.76,10623,4749,-66.25,16,106,-35.21,199.47,25.00,28.00,19,11,0.07,0.13,0.18,0.11,0.00,0.00,0,0, +1746045954176,19,2137,1083,696.05,2147.78,1093.88,11594,4511,-66.31,16,106,-35.27,199.31,25.00,28.00,19,12,0.11,0.05,0.18,0.11,0.00,0.00,0,0, +1746045955176,19,2137,1023,612.10,2147.57,1036.82,10029,4321,-66.19,16,5,-48.41,6.84,26.50,27.00,19,12,0.12,0.07,0.18,0.11,0.00,0.00,0,0, +1746045956176,19,2149,1083,678.26,2159.53,1094.35,10082,4513,-66.19,16,5,-48.41,6.84,26.00,27.00,19,12,0.13,0.10,0.18,0.11,0.00,0.00,0,0, +1746045957176,19,2137,1083,654.32,2147.73,1094.34,10428,4344,-66.31,16,5,-48.53,6.83,27.00,27.00,18,10,0.15,0.15,0.18,0.11,0.00,0.00,0,0, +1746045958176,19,2137,1083,768.23,2147.72,1091.28,12729,4793,-66.19,16,5,-48.41,6.84,26.50,28.00,18,10,0.05,0.05,0.18,0.11,0.00,0.00,0,0, +1746045959176,19,2149,1083,507.05,2159.76,1094.15,10214,4524,-66.12,16,5,-48.34,6.84,27.50,27.00,19,12,0.15,0.16,0.18,0.11,0.00,0.00,0,0, +1746045960176,19,2137,1083,603.62,2147.58,1092.03,12078,4798,-66.19,16,5,-48.41,6.84,26.00,28.00,18,9,0.06,0.07,0.18,0.11,0.00,0.00,0,0, +1746045961176,19,2137,1023,571.95,2147.74,1036.19,11205,4564,-66.19,16,5,-48.41,6.84,26.00,28.00,19,12,0.14,0.15,0.18,0.11,0.00,0.00,0,0, +1746045962176,19,2149,1083,766.95,2159.71,1091.85,11497,4512,-65.94,16,5,-48.16,6.85,26.00,27.00,18,11,0.07,0.06,0.18,0.11,0.00,0.00,0,0, +1746045963176,19,2137,1083,570.70,2147.70,1098.94,10335,4844,-66.06,16,13,-44.13,19.46,24.50,27.00,19,12,0.09,0.07,0.18,0.11,0.00,0.00,0,0, +1746045964176,19,2137,1083,832.19,2147.65,1088.85,10157,4329,-66.00,16,5,-48.22,6.84,26.00,28.00,18,12,0.14,0.07,0.18,0.11,0.00,0.00,0,0, +1746045965176,19,2149,1071,643.90,2160.05,1091.26,11840,4791,-66.00,16,5,-48.22,6.84,26.00,27.00,18,9,0.05,0.10,0.18,0.11,0.00,0.00,0,0, +1746045966176,19,2137,1095,459.20,2147.87,1098.59,12396,4489,-65.94,16,5,-48.16,6.85,26.50,27.00,18,12,0.15,0.05,0.18,0.11,0.00,0.00,0,0, +1746045967176,19,2137,1071,774.16,2147.77,1091.82,10102,4794,-66.38,16,5,-48.59,6.83,27.00,26.00,18,12,0.05,0.08,0.18,0.11,0.00,0.00,0,0, +1746045968176,19,2149,1083,583.36,2159.82,1094.51,10441,4518,-66.00,16,12,-44.42,17.83,25.50,27.00,19,11,0.12,0.15,0.18,0.11,0.00,0.00,0,0, +1746045969176,19,2137,1083,690.05,2148.03,1091.83,11820,4733,-66.25,16,28,-40.99,45.26,26.50,26.00,18,11,0.09,0.05,0.18,0.11,0.00,0.00,0,0, +1746045970176,19,2137,1023,728.77,2147.58,1034.11,10454,4433,-66.25,16,5,-48.47,6.83,25.50,27.00,19,8,0.10,0.17,0.18,0.11,0.00,0.00,0,0, +1746045971176,19,2149,1083,546.17,2159.91,1093.86,14135,4600,-66.12,16,5,-48.34,6.84,25.00,27.00,18,8,0.12,0.06,0.18,0.11,0.00,0.00,0,0, +1746045972176,19,2137,1083,724.90,2147.74,1091.86,11537,4733,-66.06,16,5,-48.28,6.84,27.00,31.00,19,10,0.06,0.19,0.18,0.11,0.00,0.00,0,0, +1746045973176,19,2137,1023,766.29,2147.78,1041.44,13689,4517,-66.00,16,5,-48.22,6.84,25.50,28.00,19,8,0.10,0.07,0.18,0.11,0.00,0.00,0,0, +1746045974176,19,2149,1143,532.77,2159.71,1145.53,11558,4737,-66.00,16,5,-48.22,6.84,26.50,28.00,17,12,0.11,0.16,0.19,0.11,0.00,0.00,0,0, +1746045975176,19,2137,1071,613.09,2147.79,1090.44,11686,4868,-65.81,16,12,-44.23,17.86,25.00,28.00,19,11,0.06,0.06,0.18,0.11,0.00,0.00,0,0, +1746045976176,19,2137,1023,563.80,2147.74,1034.86,10393,4667,-66.06,16,5,-48.28,6.84,26.50,28.00,18,11,0.10,0.19,0.19,0.11,0.00,0.00,0,0, +1746045977176,19,2149,1083,643.57,2159.62,1092.46,12360,4482,-65.94,16,5,-48.16,6.85,25.50,27.00,19,9,0.11,0.07,0.19,0.11,0.00,0.00,0,0, +1746045978176,19,2137,1083,589.10,2147.78,1092.44,11379,4727,-65.94,16,5,-48.16,6.85,26.00,27.00,18,10,0.07,0.15,0.19,0.11,0.00,0.00,0,0, +1746045979176,19,2137,1083,579.81,2147.68,1093.39,12535,4640,-65.94,16,5,-48.16,6.85,26.00,27.00,19,10,0.12,0.06,0.19,0.11,0.00,0.00,0,0, +1746045980176,19,2149,1083,758.33,2159.71,1092.33,10071,4722,-66.00,16,5,-48.22,6.84,26.00,26.00,18,13,0.08,0.14,0.19,0.11,0.00,0.00,0,0, +1746045981176,19,2137,1083,585.10,2147.93,1093.42,12335,4646,-65.94,16,106,-34.89,200.31,26.00,27.00,19,10,0.13,0.08,0.19,0.11,0.00,0.00,0,0, +1746045982176,19,2137,1071,657.11,2147.82,1092.99,11449,4732,-65.75,16,27,-40.64,43.68,25.50,28.00,18,13,0.08,0.15,0.19,0.11,0.00,0.00,0,0, +1746045983176,19,2149,1083,619.17,2159.90,1092.86,13974,4609,-66.06,16,5,-48.28,6.84,26.00,26.00,19,7,0.11,0.10,0.19,0.11,0.00,0.00,0,0, +1746045984176,19,2137,1023,584.67,2147.87,1034.20,15062,4692,-66.06,16,5,-48.28,6.84,24.50,27.00,18,11,0.09,0.04,0.19,0.11,0.00,0.00,0,0, +1746045985176,19,2137,1083,641.70,2147.58,1092.89,9704,4447,-66.25,16,5,-48.47,6.83,26.50,27.00,19,10,0.11,0.16,0.19,0.11,0.00,0.00,0,0, +1746045986176,19,2149,1083,618.09,2159.82,1091.25,12632,4709,-65.88,16,5,-48.09,6.85,26.50,26.00,17,10,0.11,0.06,0.19,0.11,0.00,0.00,0,0, +1746045987176,19,2137,1083,541.72,2147.62,1090.25,9956,4870,-66.00,16,106,-34.96,200.14,26.00,27.00,19,13,0.05,0.13,0.19,0.11,0.00,0.00,0,0, +1746045988176,19,2137,1071,639.62,2147.72,1092.30,11437,4732,-66.00,16,5,-48.22,6.84,26.00,27.00,15,9,0.14,0.11,0.19,0.11,0.00,0.00,0,0, +1746045989176,19,2149,1083,531.00,2147.80,1084.99,12487,5162,-66.00,16,51,-38.13,88.27,26.00,26.00,15,12,0.05,0.04,0.19,0.11,0.00,0.00,0,0, +1746045990177,19,2137,1071,696.33,2159.82,1087.14,12963,4790,-66.44,16,5,-48.66,6.83,25.50,26.00,19,6,0.05,0.14,0.19,0.11,0.00,0.00,0,0, +1746045990177,23,0,0,0.00,0.00,0.00,-264,-2213,-74.33,6,5,-56.55,6.57,24.50,27.00,6,0,0.03,0.07,0.00,0.00,nan,0.00,0,0, +1746045991177,19,2137,1035,636.14,2147.78,1044.11,18182,4746,-66.56,16,5,-48.78,6.82,26.00,27.00,18,7,0.09,0.05,0.19,0.11,0.00,0.00,0,0, +1746045991177,23,0,0,0.00,0.00,0.00,10,65,-77.07,15,5,-59.29,6.50,25.00,26.00,0,0,0.01,0.07,0.00,0.00,nan,0.00,0,0, +1746045992177,19,2149,1143,545.95,2159.67,1151.56,11180,4667,-65.94,16,5,-48.16,6.85,27.00,30.00,19,13,0.11,0.13,0.19,0.11,0.00,0.00,0,0, +1746045992177,23,0,0,0.00,0.00,0.00,5,50,-73.69,13,5,-55.91,6.59,30.00,26.00,0,0,0.00,0.06,0.00,0.00,nan,0.00,0,0, +1746045993177,19,2137,1035,562.95,2147.55,1050.46,12013,4431,-65.94,16,5,-48.16,6.85,25.00,27.00,19,10,0.14,0.08,0.19,0.11,0.00,0.00,0,0, +1746045993177,23,0,0,0.00,0.00,0.00,5,50,-73.69,13,5,-55.91,6.59,27.00,28.00,0,0,0.00,0.05,0.00,0.00,nan,0.00,0,0, +1746045994177,19,2137,1083,624.60,2147.76,1093.11,11378,4703,-66.12,16,5,-48.34,6.84,26.00,31.00,18,10,0.08,0.18,0.19,0.11,0.00,0.00,0,0, +1746045994177,23,0,0,0.00,0.00,0.00,5,50,-69.50,12,5,-51.72,6.72,30.50,26.00,0,0,0.00,0.05,0.00,0.00,nan,0.00,0,0, +1746045995177,19,2149,1083,524.05,2155.25,1091.81,12667,4624,-65.94,16,106,-34.89,200.31,25.50,27.00,19,9,0.09,0.06,0.19,0.11,0.00,0.00,0,0, +1746045995177,23,0,0,0.00,0.00,0.00,5,50,-71.08,12,5,-53.30,6.67,27.00,27.00,0,0,0.00,0.04,0.00,0.00,nan,0.00,0,0, +1746045996177,19,2137,1071,676.35,2152.46,1092.90,11713,4744,-66.19,16,5,-48.41,6.84,26.00,27.00,18,9,0.08,0.19,0.19,0.11,0.00,0.00,0,0, +1746045996177,23,0,0,0.00,0.00,0.00,5,50,-70.27,11,5,-52.49,6.69,30.50,28.00,0,0,0.00,0.04,0.00,0.00,nan,0.00,0,0, +1746045997177,19,2137,1035,833.64,2148.14,1046.76,15769,4415,-66.19,16,5,-48.41,6.84,26.00,26.00,20,7,0.13,0.07,0.19,0.11,0.00,0.00,0,0, +1746045997177,23,0,0,0.00,0.00,0.00,5,50,-70.27,11,5,-52.49,6.69,24.50,26.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045998177,19,2149,1083,713.67,2159.96,1092.86,12713,4852,-65.94,16,5,-48.16,6.85,26.00,26.00,17,13,0.08,0.08,0.19,0.11,0.00,0.00,0,0, +1746045998177,23,0,0,0.00,0.00,0.00,5,50,-70.08,12,5,-52.30,6.70,31.00,25.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746045999177,19,2137,1083,683.50,2147.62,1095.85,9806,4836,-65.94,16,5,-48.16,6.85,26.00,27.00,19,11,0.08,0.13,0.19,0.11,0.00,0.00,0,0, +1746045999177,23,0,0,0.00,0.00,0.00,5,50,-74.57,14,5,-56.79,6.57,25.50,27.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746046000177,19,2137,1095,727.85,2147.58,1102.07,11112,4867,-66.00,16,36,-39.65,59.93,25.50,27.00,17,13,0.10,0.04,0.19,0.11,0.00,0.00,0,0, +1746046000177,23,0,0,0.00,0.00,0.00,5,50,-77.18,11,5,-59.40,6.50,30.00,26.00,0,0,0.00,0.03,0.00,0.00,nan,0.00,0,0, +1746046001177,19,2149,1023,600.75,2154.43,1032.31,11976,4628,-66.19,16,5,-48.41,6.84,26.50,26.00,19,8,0.08,0.11,0.19,0.11,0.00,0.00,0,0, +1746046001177,23,0,0,0.00,0.00,0.00,5,50,-73.50,14,5,-55.72,6.60,25.50,28.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746046002177,19,2137,1047,570.00,2153.14,1070.25,13607,4745,-66.19,16,5,-48.41,6.84,26.00,27.00,19,11,0.12,0.04,0.19,0.11,0.00,0.00,0,0, +1746046002177,23,0,0,0.00,0.00,0.00,5,50,-73.50,14,5,-55.72,6.60,30.50,28.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746046003177,19,2137,1143,739.40,2147.77,1146.65,10262,4603,-66.31,16,27,-41.21,43.45,25.50,27.00,18,12,0.13,0.10,0.19,0.11,0.00,0.00,0,0, +1746046003177,23,0,0,0.00,0.00,0.00,5,50,-71.40,15,5,-53.62,6.66,25.00,27.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746046004177,19,2149,1083,516.00,2156.19,1091.14,11401,4755,-66.38,16,5,-48.59,6.83,27.00,25.00,19,11,0.06,0.07,0.19,0.11,0.00,0.00,0,0, +1746046004177,23,0,0,0.00,0.00,0.00,5,50,-72.56,16,5,-54.78,6.62,29.50,27.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746046005177,19,2137,1035,650.14,2151.29,1049.61,10806,4402,-66.00,16,106,-34.96,200.14,25.00,27.00,19,12,0.12,0.07,0.19,0.11,0.00,0.00,0,0, +1746046005177,23,0,0,0.00,0.00,0.00,5,50,-66.82,11,5,-49.04,6.81,26.00,28.00,0,0,0.00,0.02,0.00,0.00,nan,0.00,0,0, +1746046006177,19,2137,1083,783.32,2147.89,1093.58,13107,4537,-66.00,16,5,-48.22,6.84,26.50,27.00,19,8,0.15,0.09,0.19,0.11,0.00,0.00,0,0, +1746046006177,23,0,0,0.00,0.00,0.00,5,50,-66.82,11,5,-49.04,6.81,29.50,25.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746046007177,19,2149,1083,517.44,2147.61,1094.62,12682,4503,-66.06,16,106,-35.02,199.97,25.50,27.00,18,13,0.16,0.04,0.19,0.11,0.00,0.00,0,0, +1746046007177,23,0,0,0.00,0.00,0.00,5,50,-74.62,16,5,-56.84,6.56,24.50,27.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746046008177,19,2137,1083,725.57,2159.74,1091.55,10612,4804,-66.12,16,5,-48.34,6.84,26.50,27.00,18,9,0.06,0.14,0.19,0.11,0.00,0.00,0,0, +1746046008177,23,0,0,0.00,0.00,0.00,5,50,-73.69,16,5,-55.91,6.59,29.00,27.00,0,0,0.00,0.01,0.00,0.00,nan,0.00,0,0, +1746046009177,19,2137,1035,674.15,2147.70,1049.44,12815,4429,-66.00,16,5,-48.22,6.84,26.50,26.00,19,10,0.13,0.05,0.19,0.11,0.00,0.00,0,0, +1746046009177,23,0,0,0.00,0.00,0.00,5,50,-67.94,16,23,-43.53,35.90,27.00,27.00,0,0,0.19,0.01,0.06,0.05,nan,0.00,0,0, +1746046010177,19,2149,1083,629.83,2147.63,1092.10,11192,4756,-66.00,16,5,-48.22,6.84,25.00,27.00,18,10,0.07,0.11,0.19,0.11,0.00,0.00,0,0, +1746046010177,23,0,0,0.00,0.00,0.00,5,40,-72.00,6,21,-47.99,31.51,28.00,28.00,0,0,0.48,0.11,0.20,0.05,nan,0.00,0,0, +1746046011177,19,2137,1095,594.53,2159.66,1107.97,11906,4711,-66.00,16,13,-44.07,19.47,24.50,27.00,19,13,0.15,0.04,0.19,0.11,0.00,0.00,0,0, +1746046011177,23,0,0,0.00,0.00,0.00,0,35,-72.00,6,5,-54.22,6.64,26.00,28.00,0,0,0.67,0.11,0.33,0.05,nan,0.00,0,0, +1746046012177,19,2137,1023,632.18,2148.02,1031.71,12421,4801,-66.25,16,5,-48.47,6.83,25.50,27.00,18,8,0.08,0.11,0.19,0.11,0.00,0.00,0,0, +1746046012177,23,0,0,0.00,0.00,0.00,0,0,-77.00,2,5,-59.22,6.50,26.00,28.00,0,0,0.67,0.11,0.33,0.05,nan,0.00,0,0, +1746046013177,19,2149,1083,627.11,2148.06,1092.58,13912,4486,-66.25,16,5,-48.47,6.83,25.50,28.00,19,11,0.11,0.04,0.19,0.11,0.00,0.00,0,0, +1746046014177,19,2137,1071,637.09,2159.70,1091.63,10214,4684,-66.06,16,5,-48.28,6.84,25.50,27.00,18,12,0.10,0.15,0.19,0.11,0.00,0.00,0,0, +1746046015177,19,2137,1083,618.36,2147.98,1091.10,10683,4777,-66.25,16,5,-48.47,6.83,25.50,28.00,19,9,0.07,0.16,0.19,0.11,0.00,0.00,0,0, +1746046016177,19,2149,1071,496.05,2155.40,1092.68,12793,4682,-66.25,16,5,-48.47,6.83,24.00,25.00,18,9,0.09,0.06,0.19,0.11,0.00,0.00,0,0, +1746046017177,19,2137,1083,590.40,2152.25,1092.18,10392,4706,-66.19,16,5,-48.41,6.84,25.50,27.00,19,12,0.10,0.14,0.19,0.11,0.00,0.00,0,0, +1746046018177,19,2137,1083,535.23,2147.71,1092.60,10049,4672,-66.00,16,5,-48.22,6.84,25.00,28.00,18,12,0.11,0.12,0.19,0.11,0.00,0.00,0,0, +1746046019177,19,2149,1083,609.43,2147.62,1096.46,12017,4683,-66.00,16,106,-34.96,200.14,25.50,27.00,20,8,0.07,0.11,0.19,0.11,0.00,0.00,0,0, +1746046020177,19,2137,1083,625.95,2160.15,1094.02,13768,4537,-66.00,16,5,-48.22,6.84,26.50,28.00,17,11,0.14,0.04,0.19,0.11,0.00,0.00,0,0, +1746046021177,19,1754,1023,525.40,1774.43,1029.73,9602,4955,-65.94,16,5,-48.16,6.85,25.00,27.00,17,9,0.06,0.09,0.19,0.11,0.00,0.00,0,0, +1746046022177,19,1179,1083,739.20,1184.91,1092.22,7176,4381,-66.69,16,5,-48.91,6.82,26.00,25.00,19,9,0.13,0.05,0.19,0.11,0.00,0.00,0,0, +1746046023177,19,759,1071,0.00,775.54,1091.17,3993,4686,-66.25,16,5,-48.47,6.83,26.00,30.00,18,10,0.09,0.07,0.19,0.11,0.00,0.00,0,0, +1746046024177,19,4,1090,0.00,4.97,1142.10,162,4944,-65.69,16,13,-43.76,19.52,25.50,30.00,19,4,0.08,0.04,0.19,0.11,0.00,0.00,0,0, +1746046025177,19,4,1078,0.00,5.09,1045.15,185,4385,-65.69,16,27,-40.58,43.70,25.50,26.00,18,0,0.13,0.03,0.19,0.11,0.00,0.00,0,0, +1746046026177,19,4,1078,0.00,4.97,1092.08,192,4788,-65.88,16,5,-48.09,6.85,25.00,28.00,18,1,0.05,0.01,0.19,0.11,0.00,0.00,0,0, +1746046027177,19,4,1030,602.50,5.00,1036.72,188,4341,-66.06,16,5,-48.28,6.84,26.00,27.00,18,0,0.16,0.01,0.19,0.11,0.00,0.00,0,0, +1746046028177,19,4,1078,1083.50,4.98,1092.43,264,4788,-66.19,16,5,-48.41,6.84,24.50,28.00,18,0,0.06,0.00,0.19,0.11,0.00,0.00,0,0, +1746046029177,19,4,1030,0.00,5.03,1036.02,216,4576,-66.19,16,5,-48.41,6.84,27.00,26.00,19,1,0.15,0.00,0.19,0.11,0.00,0.00,0,0, +1746046030177,19,4,1138,0.00,5.21,1151.58,279,4609,-66.19,16,5,-48.41,6.84,27.00,26.00,18,1,0.12,0.00,0.19,0.11,0.00,0.00,0,0, +1746046031177,19,4,1078,701.00,4.90,1091.88,234,4763,-66.19,16,5,-48.41,6.84,26.50,27.00,19,0,0.05,0.00,0.19,0.11,0.00,0.00,0,0, +1746046032177,19,4,1018,560.00,5.09,1085.21,244,4519,-66.19,16,5,-48.41,6.84,27.50,27.00,19,0,0.12,0.00,0.19,0.11,0.00,0.00,0,0, +1746046033177,19,4,1090,0.00,4.96,1044.68,259,4433,-66.19,16,5,-48.41,6.84,26.50,27.00,18,1,0.09,0.00,0.19,0.11,0.00,0.00,0,0, +1746046034177,19,4,1078,0.00,5.10,1092.56,266,4707,-66.19,16,5,-48.41,6.84,26.00,28.00,19,0,0.10,0.00,0.19,0.11,0.00,0.00,0,0, +1746046035177,19,4,1078,0.00,5.62,1092.17,303,4641,-66.19,16,5,-48.41,6.84,27.00,27.00,18,1,0.11,0.00,0.19,0.11,0.00,0.00,0,0, +1746046036177,19,4,1018,443.00,5.54,1033.22,224,4533,-66.00,16,5,-48.22,6.84,27.50,27.00,19,1,0.07,0.00,0.19,0.11,0.00,0.00,0,0, +1746046037177,19,4,1078,0.00,4.92,1093.06,182,4520,-66.25,16,5,-48.47,6.83,26.50,27.00,18,0,0.14,0.00,0.19,0.11,0.00,0.00,0,0, +1746046038177,19,4,1078,0.00,5.03,1092.71,282,4794,-66.25,16,5,-48.47,6.83,26.50,28.00,18,1,0.05,0.00,0.19,0.11,0.00,0.00,0,0, +1746046039177,19,4,1090,0.00,5.06,1094.58,278,4498,-66.38,16,5,-48.59,6.83,27.00,27.00,19,0,0.13,0.00,0.19,0.11,0.00,0.00,0,0, +1746046040177,19,4,1018,858.00,5.13,1033.31,262,4715,-66.00,16,5,-48.22,6.84,25.50,27.00,18,0,0.09,0.00,0.19,0.11,0.00,0.00,0,0, +1746046041176,19,4,1078,849.00,5.29,1091.43,279,4519,-66.00,16,5,-48.22,6.84,26.00,26.00,19,0,0.06,0.00,0.19,0.11,0.00,0.00,0,0, +1746046042176,19,4,1090,0.00,5.11,1094.02,189,4547,-66.00,16,5,-48.22,6.84,25.50,27.00,18,1,0.17,0.00,0.19,0.11,0.00,0.00,0,0, +1746046043177,19,4,1078,0.00,5.02,1092.04,193,4802,-66.00,16,27,-40.89,43.58,26.50,27.00,18,0,0.06,0.00,0.19,0.11,0.00,0.00,0,0, +1746046044177,19,4,1018,928.00,5.30,1033.44,265,4654,-66.12,16,5,-48.34,6.84,27.00,26.00,19,0,0.09,0.00,0.19,0.11,0.00,0.00,0,0, +1746046045176,19,4,1150,0.00,5.08,1151.70,194,4508,-66.44,16,106,-35.39,198.98,25.50,27.00,19,1,0.11,0.00,0.19,0.11,0.00,0.00,0,0, +1746046046176,19,4,1018,532.50,5.25,1035.99,287,4307,-66.62,16,5,-48.84,6.82,26.50,28.00,19,0,0.12,0.00,0.19,0.11,0.00,0.00,0,0, +1746046047177,19,4,1122,0.00,5.45,1093.39,272,4538,-66.19,16,5,-48.41,6.84,27.00,27.00,19,0,0.08,0.00,0.19,0.11,0.00,0.00,0,0, +1746046048176,19,4,1066,0.00,5.27,1093.58,267,4655,-66.19,16,5,-48.41,6.84,26.50,28.00,18,0,0.10,0.00,0.19,0.11,0.00,0.00,0,0, +1746046049176,19,4,1030,0.00,5.06,1033.42,203,4725,-66.25,16,5,-48.47,6.83,27.00,26.00,19,1,0.07,0.00,0.19,0.11,0.00,0.00,0,0, +1746046050176,19,4,1078,200.00,5.06,1094.96,221,4303,-66.62,16,5,-48.84,6.82,26.50,27.00,19,0,0.14,0.00,0.19,0.11,0.00,0.00,0,0, +1746046051176,19,4,1078,0.00,4.98,1152.30,241,4756,-66.31,16,5,-48.53,6.83,26.50,27.00,19,0,0.13,0.00,0.19,0.11,0.00,0.00,0,0, +1746046052176,19,4,1078,0.00,5.12,1031.46,279,4656,-66.31,16,5,-48.53,6.83,27.50,28.00,17,0,0.08,0.00,0.19,0.11,0.00,0.00,0,0, +1746046053176,19,4,1030,0.00,5.11,1033.12,222,4501,-66.12,16,5,-48.34,6.84,26.50,28.00,19,1,0.10,0.00,0.19,0.11,0.00,0.00,0,0, +1746046054176,19,4,1078,565.50,5.02,1093.15,256,4580,-66.00,16,5,-48.22,6.84,26.50,27.00,19,0,0.12,0.00,0.19,0.11,0.00,0.00,0,0, +1746046055176,19,4,1078,268.50,5.21,1091.26,210,4749,-66.12,16,5,-48.34,6.84,26.00,27.00,18,0,0.09,0.00,0.19,0.11,0.00,0.00,0,0, +1746046056176,19,4,1090,0.00,5.16,1091.62,258,4972,-66.31,16,106,-35.27,199.31,25.00,26.00,19,0,0.06,0.00,0.19,0.11,0.00,0.00,0,0, +1746046057176,19,4,1018,0.00,4.94,1085.98,254,4297,-66.31,16,12,-44.73,17.79,25.50,27.00,19,1,0.13,0.00,0.19,0.11,0.00,0.00,0,0, +1746046058176,19,4,1090,400.50,4.99,1044.08,255,4451,-65.94,16,5,-48.16,6.85,25.50,28.00,18,1,0.09,0.00,0.19,0.11,0.00,0.00,0,0, +1746046059176,19,4,1078,0.00,5.14,1091.16,253,4782,-66.25,16,5,-48.47,6.83,26.00,27.00,19,0,0.05,0.00,0.19,0.11,0.00,0.00,0,0, +1746046060176,19,4,1078,0.00,5.51,1091.50,289,4666,-66.00,16,5,-48.22,6.84,26.00,27.00,17,1,0.13,0.00,0.19,0.11,0.00,0.00,0,0, +1746046061176,19,4,1078,0.00,5.62,1088.39,222,4947,-66.00,16,36,-39.65,59.93,25.50,26.00,17,0,0.07,0.00,0.19,0.11,0.00,0.00,0,0, +1746046062176,19,4,1018,0.00,5.02,1035.22,251,4427,-66.25,16,5,-48.47,6.83,26.00,27.00,19,0,0.14,0.00,0.19,0.11,0.00,0.00,0,0, +1746046063176,19,4,1090,0.00,4.99,1092.30,263,4741,-65.81,16,5,-48.03,6.85,27.50,27.00,18,0,0.07,0.00,0.19,0.11,0.00,0.00,0,0, +1746046064176,19,4,1078,0.00,5.02,1094.13,259,4660,-66.00,16,5,-48.22,6.84,26.00,27.00,19,0,0.14,0.00,0.19,0.11,0.00,0.00,0,0, +1746046065176,19,4,1078,0.00,5.18,1094.33,214,4522,-65.88,16,5,-48.09,6.85,27.50,27.00,19,0,0.10,0.00,0.19,0.11,0.00,0.00,0,0, +1746046066176,19,4,1090,0.00,5.10,1094.48,266,4649,-65.88,16,28,-40.61,45.42,26.00,29.00,18,0,0.12,0.00,0.19,0.11,0.00,0.00,0,0, +1746046067176,19,4,1018,509.00,4.97,1033.05,250,4537,-66.00,16,5,-48.22,6.84,26.50,27.00,19,0,0.05,0.00,0.19,0.11,0.00,0.00,0,0, +1746046068176,19,4,1090,0.00,5.32,1094.18,210,4598,-66.00,16,5,-48.22,6.84,26.50,26.00,18,0,0.13,0.00,0.19,0.11,0.00,0.00,0,0, +1746046069176,19,4,1078,0.00,5.39,1090.26,284,4825,-65.88,16,5,-48.09,6.85,26.00,26.00,18,1,0.06,0.00,0.19,0.11,0.00,0.00,0,0, +1746046070176,19,4,1078,548.00,5.42,1091.70,223,4742,-65.88,16,5,-48.09,6.85,26.00,28.00,19,1,0.06,0.00,0.19,0.11,0.00,0.00,0,0, +1746046071176,19,4,1018,0.00,5.15,1035.08,272,4603,-66.12,16,5,-48.34,6.84,26.50,27.00,17,0,0.15,0.00,0.19,0.11,0.00,0.00,0,0, +1746046072176,19,4,1090,0.00,4.86,1090.22,181,4699,-65.75,16,5,-47.97,6.85,26.00,27.00,17,1,0.05,0.00,0.19,0.11,0.00,0.00,0,0, +1746046073176,19,4,1066,592.50,5.29,1093.66,274,4624,-66.00,16,5,-48.22,6.84,27.00,27.00,18,1,0.14,0.00,0.19,0.11,0.00,0.00,0,0, +1746046074176,19,4,1078,0.00,4.97,1091.93,258,4800,-66.12,16,5,-48.34,6.84,26.00,28.00,18,0,0.06,0.00,0.19,0.11,0.00,0.00,0,0, +1746046075176,19,4,1078,0.00,5.22,1092.06,206,4840,-66.12,16,106,-35.08,199.81,25.00,26.00,19,0,0.12,0.00,0.19,0.11,0.00,0.00,0,0, +1746046076176,19,4,1078,0.00,5.12,1093.91,212,4400,-66.19,16,27,-41.08,43.50,25.50,27.00,18,1,0.11,0.00,0.19,0.11,0.00,0.00,0,0, +1746046077176,19,4,1078,0.00,5.10,1090.07,265,4849,-66.12,16,5,-48.34,6.84,25.50,26.00,19,0,0.05,0.00,0.19,0.11,0.00,0.00,0,0, +1746046078176,19,4,1030,662.00,5.00,1036.23,251,4300,-65.94,16,5,-48.16,6.85,27.00,27.00,19,0,0.10,0.00,0.19,0.11,0.00,0.00,0,0, +1746046079176,19,4,1078,0.00,5.02,1093.26,254,4527,-66.25,16,5,-48.47,6.83,26.50,27.00,19,0,0.12,0.00,0.19,0.11,0.00,0.00,0,0, +1746046080176,19,4,1090,0.00,5.06,1094.53,292,4621,-66.25,16,28,-40.99,45.26,26.00,27.00,18,1,0.11,0.00,0.19,0.11,0.00,0.00,0,0, +1746046081176,19,4,1018,0.00,5.14,1032.59,194,4549,-66.00,16,5,-48.22,6.84,25.50,29.00,18,0,0.05,0.00,0.19,0.11,0.00,0.00,0,0, +1746046082176,19,4,1078,270.50,5.35,1093.90,213,4555,-66.00,16,5,-48.22,6.84,27.50,28.00,18,0,0.16,0.00,0.19,0.11,0.00,0.00,0,0, +1746046083176,19,4,1078,0.00,5.38,1088.64,269,4951,-66.00,16,5,-48.22,6.84,24.50,27.00,17,0,0.07,0.00,0.19,0.11,0.00,0.00,0,0, +1746046084176,19,4,1078,0.00,5.14,1093.82,218,4892,-66.00,16,106,-34.96,200.14,25.00,25.00,19,0,0.12,0.00,0.19,0.11,0.00,0.00,0,0, +1746046085176,19,4,1078,0.00,5.25,1092.50,194,4499,-65.75,16,5,-47.97,6.85,26.50,27.00,18,1,0.08,0.00,0.19,0.11,0.00,0.00,0,0, +1746046086176,19,4,1030,0.00,5.05,1033.26,198,4466,-65.94,16,5,-48.16,6.85,25.50,27.00,19,0,0.08,0.00,0.19,0.11,0.00,0.00,0,0, +1746046087176,19,4,1078,316.50,5.02,1092.98,193,4655,-66.19,16,5,-48.41,6.84,26.00,27.00,18,0,0.11,0.00,0.19,0.11,0.00,0.00,0,0, +1746046088176,19,4,1078,605.00,5.15,1091.54,209,4773,-66.12,16,5,-48.34,6.84,26.00,27.00,19,0,0.05,0.00,0.19,0.11,0.00,0.00,0,0, +1746046089176,19,4,1090,0.00,5.03,1093.22,193,4579,-66.12,16,5,-48.34,6.84,26.50,27.00,18,0,0.12,0.00,0.19,0.11,0.00,0.00,0,0, +1746046090176,19,4,1078,0.00,5.27,1091.40,234,4801,-66.00,16,28,-40.74,45.36,26.50,27.00,18,1,0.05,0.00,0.19,0.11,0.00,0.00,0,0, +1746046091176,19,4,1078,405.50,5.07,1094.18,208,4544,-66.00,16,5,-48.22,6.84,26.50,27.00,19,0,0.13,0.00,0.19,0.11,0.00,0.00,0,0, +1746046092176,19,4,1018,487.50,5.54,1032.72,218,4520,-66.00,16,5,-48.22,6.84,27.00,28.00,18,0,0.07,0.00,0.19,0.11,0.00,0.00,0,0, +1746046093176,19,4,1078,0.00,5.46,1092.93,277,4628,-66.00,16,5,-48.22,6.84,27.50,27.00,18,0,0.16,0.00,0.19,0.11,0.00,0.00,0,0, +1746046094176,19,4,1078,580.50,5.04,1091.35,212,4808,-66.00,16,5,-48.22,6.84,26.00,26.00,18,0,0.06,0.00,0.19,0.11,0.00,0.00,0,0, +1746046095176,19,483,1089,1089.05,489.75,1094.41,10979,4559,-65.88,16,5,-48.09,6.85,25.50,27.00,19,4,0.12,0.00,0.19,0.11,0.00,0.00,0,0, +1746046096176,19,1071,1063,548.50,1077.25,1092.82,7598,4534,-65.75,16,5,-47.97,6.85,26.50,30.00,19,13,0.11,0.14,0.19,0.11,0.00,0.00,0,0, +1746046097176,19,1083,1083,576.82,1088.59,1093.57,4893,4518,-66.12,16,12,-44.54,17.81,25.00,27.00,19,9,0.09,0.21,0.19,0.11,0.00,0.00,0,0, +1746046098176,19,1071,1071,848.60,1076.57,1092.11,8496,4693,-66.12,16,5,-48.34,6.84,27.00,27.00,18,6,0.09,0.08,0.19,0.11,0.00,0.00,0,0, +1746046099176,19,1059,1071,719.27,1064.62,1089.86,7636,4779,-65.94,16,5,-48.16,6.85,26.00,28.00,19,12,0.05,0.03,0.19,0.11,0.00,0.00,0,0, +1746046100176,19,1071,1083,416.44,1076.24,1093.53,5261,4544,-65.88,16,5,-48.09,6.85,26.00,27.00,18,9,0.14,0.12,0.19,0.11,0.00,0.00,0,0, +1746046101176,19,1071,1071,581.89,1076.50,1092.17,6433,4787,-65.62,16,5,-47.84,6.86,25.50,27.00,19,11,0.05,0.04,0.19,0.11,0.00,0.00,0,0, +1746046102176,19,1071,1083,641.50,1076.77,1091.52,5187,4647,-65.62,16,5,-47.84,6.86,26.50,28.00,18,11,0.14,0.19,0.19,0.11,0.00,0.00,0,0, +1746046103176,19,1083,1083,810.20,1088.47,1090.66,6469,4805,-66.19,16,27,-41.08,43.50,25.50,26.00,18,9,0.06,0.07,0.19,0.11,0.00,0.00,0,0, +1746046104176,19,1083,1083,468.70,1088.61,1093.06,5508,4614,-66.25,16,5,-48.47,6.83,26.00,26.00,19,12,0.14,0.17,0.19,0.11,0.00,0.00,0,0, +1746046105176,19,1071,1011,803.50,1076.28,1032.87,5791,4532,-65.94,16,5,-48.16,6.85,25.50,27.00,18,11,0.07,0.06,0.19,0.11,0.00,0.00,0,0, +1746046106176,19,1071,1131,449.70,1076.72,1149.64,5212,4939,-65.81,16,106,-34.77,200.65,25.50,27.00,19,12,0.09,0.09,0.19,0.11,0.00,0.00,0,0, +1746046107176,19,1071,1023,755.62,1076.50,1036.13,5926,4297,-65.81,16,5,-48.03,6.85,25.00,28.00,19,11,0.07,0.07,0.19,0.11,0.00,0.00,0,0, +1746046108176,19,1071,1083,833.91,1076.22,1094.55,5072,4534,-66.12,16,5,-48.34,6.84,26.00,27.00,19,12,0.07,0.25,0.19,0.11,0.00,0.00,0,0, +1746046109176,19,1083,1083,767.45,1088.49,1094.22,6925,4527,-66.00,16,12,-44.42,17.83,25.50,29.00,19,8,0.10,0.09,0.19,0.11,0.00,0.00,0,0, +1746046110176,19,1071,1083,589.89,1076.58,1092.92,6800,4694,-66.12,16,27,-41.02,43.52,26.50,29.00,18,12,0.08,0.03,0.19,0.11,0.00,0.00,0,0, +1746046111176,19,1071,1018,597.46,1076.50,1039.63,5807,4653,-66.19,16,5,-48.41,6.84,25.00,30.00,19,10,0.11,0.10,0.19,0.11,0.00,0.00,0,0, +1746046112176,19,1071,1135,409.80,1076.19,1131.10,6083,4697,-66.19,16,5,-48.41,6.84,25.50,27.00,18,12,0.08,0.06,0.19,0.11,0.00,0.00,0,0, +1746046113176,19,1071,1018,421.33,1076.40,1034.61,5211,4628,-66.19,16,5,-48.41,6.84,26.50,30.00,19,9,0.09,0.18,0.19,0.11,0.00,0.00,0,0, +1746046114176,19,1071,1083,836.20,1076.22,1092.59,6851,4343,-66.12,16,5,-48.34,6.84,26.00,23.00,18,8,0.13,0.06,0.19,0.11,0.00,0.00,0,0, +1746046115176,19,1083,1075,640.27,1083.76,1091.20,6254,4788,-66.62,16,5,-48.84,6.82,27.00,26.00,18,9,0.08,0.16,0.19,0.11,0.00,0.00,0,0, +1746046116176,19,1071,1083,572.25,1080.74,1097.41,6255,4694,-66.62,16,5,-48.84,6.82,26.00,26.00,19,9,0.14,0.06,0.19,0.11,0.00,0.00,0,0, +1746046117176,19,1059,1083,637.20,1064.32,1094.43,5669,4525,-66.50,16,5,-48.72,6.82,25.50,27.00,19,12,0.12,0.10,0.19,0.11,0.00,0.00,0,0, +1746046118176,19,1071,1083,441.67,1076.21,1092.86,6179,4647,-66.12,16,5,-48.34,6.84,26.00,26.00,18,9,0.11,0.10,0.19,0.11,0.00,0.00,0,0, +1746046119176,19,1083,1030,666.27,1088.10,1033.50,5811,4742,-66.12,16,5,-48.34,6.84,25.00,27.00,19,13,0.08,0.03,0.19,0.11,0.00,0.00,0,0, +1746046120176,19,1071,1083,670.09,1082.02,1094.24,6717,4293,-66.00,16,5,-48.22,6.84,26.50,29.00,19,7,0.11,0.11,0.19,0.11,0.00,0.00,0,0, +1746046121176,19,1083,1075,610.83,1082.42,1093.41,7961,4527,-66.00,16,5,-48.22,6.84,26.50,27.00,19,9,0.13,0.04,0.19,0.11,0.00,0.00,0,0, +1746046122176,19,1071,1083,654.73,1088.35,1092.16,5547,4704,-66.44,16,5,-48.66,6.83,27.00,27.00,18,12,0.09,0.08,0.19,0.11,0.00,0.00,0,0, +1746046123176,19,1071,1083,674.27,1076.20,1093.25,6115,4662,-66.56,16,5,-48.78,6.82,26.00,29.00,19,10,0.11,0.08,0.19,0.11,0.00,0.00,0,0, +1746046124176,19,1059,1083,642.50,1064.22,1093.92,5587,4593,-66.12,16,5,-48.34,6.84,25.50,27.00,18,13,0.14,0.13,0.19,0.11,0.00,0.00,0,0, +1746046125176,19,1071,1071,592.89,1076.43,1092.01,7217,4784,-66.12,16,5,-48.34,6.84,27.00,30.00,19,6,0.05,0.11,0.19,0.11,0.00,0.00,0,0, +1746046126176,19,1071,1083,517.00,1076.64,1093.98,9046,4551,-66.25,16,5,-48.47,6.83,26.00,28.00,18,9,0.14,0.04,0.19,0.11,0.00,0.00,0,0, +1746046127176,19,1083,1030,692.67,1088.51,1038.30,5315,4799,-65.94,16,13,-44.01,19.48,25.50,27.00,19,10,0.05,0.18,0.19,0.11,0.00,0.00,0,0, +1746046128176,19,1083,1075,513.25,1088.27,1090.06,6369,4294,-66.00,16,5,-48.22,6.84,26.50,30.00,19,9,0.14,0.06,0.19,0.11,0.00,0.00,0,0, +1746046129176,19,1071,1083,1009.30,1076.34,1091.82,5477,4766,-66.12,16,5,-48.34,6.84,27.00,27.00,18,12,0.07,0.09,0.19,0.11,0.00,0.00,0,0, +1746046130176,19,1059,1083,412.20,1064.32,1098.96,5414,4799,-66.12,16,5,-48.34,6.84,26.50,27.00,19,9,0.14,0.16,0.19,0.11,0.00,0.00,0,0, +1746046131176,19,1083,1083,571.27,1088.32,1088.07,6419,4441,-66.00,16,5,-48.22,6.84,27.00,27.00,18,9,0.10,0.05,0.19,0.11,0.00,0.00,0,0, +1746046132176,19,1071,1083,515.67,1076.55,1092.47,5601,4717,-65.88,16,106,-34.83,200.48,25.00,30.00,19,11,0.09,0.14,0.19,0.11,0.00,0.00,0,0, +1746046133176,19,1071,1083,669.38,1076.08,1093.37,5436,4628,-66.00,16,28,-40.74,45.36,26.00,27.00,18,12,0.12,0.05,0.19,0.11,0.00,0.00,0,0, +1746046134176,19,1083,1083,746.00,1088.35,1092.81,5091,4738,-66.00,16,5,-48.22,6.84,26.50,30.00,19,9,0.08,0.22,0.19,0.11,0.00,0.00,0,0, +1746046135176,19,1071,1023,589.58,1076.50,1035.10,8867,4403,-65.94,16,5,-48.16,6.85,26.00,27.00,18,6,0.12,0.08,0.19,0.11,0.00,0.00,0,0, +1746046136176,19,1071,1071,549.33,1076.35,1092.40,7855,4759,-65.94,16,5,-48.16,6.85,26.50,30.00,20,12,0.05,0.03,0.19,0.11,0.00,0.00,0,0, +1746046137176,19,1071,1095,505.00,1076.41,1106.22,5933,4452,-66.19,16,5,-48.41,6.84,25.00,27.00,18,10,0.13,0.09,0.19,0.11,0.00,0.00,0,0, +1746046138176,19,1059,1083,437.12,1064.30,1090.81,5850,4790,-66.12,16,5,-48.34,6.84,26.50,30.00,18,13,0.06,0.05,0.19,0.11,0.00,0.00,0,0, +1746046139176,19,1083,1083,281.50,1088.50,1093.70,6179,4621,-66.12,16,28,-40.86,45.31,26.00,27.00,18,10,0.14,0.09,0.19,0.11,0.00,0.00,0,0, +1746046140176,19,1083,1023,812.50,1088.30,1032.90,5773,4561,-65.94,16,5,-48.16,6.85,26.50,27.00,18,13,0.05,0.07,0.19,0.11,0.00,0.00,0,0, +1746046141176,19,1071,1083,632.36,1076.31,1093.98,5521,4619,-66.06,16,5,-48.28,6.84,25.50,29.00,18,11,0.13,0.09,0.19,0.11,0.00,0.00,0,0, +1746046142176,19,1071,1083,686.69,1076.31,1092.36,5594,4753,-66.00,16,5,-48.22,6.84,25.00,28.00,19,13,0.08,0.10,0.19,0.11,0.00,0.00,0,0, +1746046143176,19,1071,1071,426.17,1076.19,1092.70,5344,4706,-65.81,16,5,-48.03,6.85,26.50,30.00,18,11,0.08,0.09,0.19,0.11,0.00,0.00,0,0, +1746046144176,19,1071,1083,563.60,1076.38,1093.18,5411,4635,-65.81,16,5,-48.03,6.85,26.00,26.00,19,13,0.10,0.06,0.19,0.11,0.00,0.00,0,0, +1746046145176,19,1071,1083,709.67,1076.45,1092.94,6148,4652,-65.88,16,5,-48.09,6.85,26.00,28.00,18,9,0.10,0.09,0.19,0.11,0.00,0.00,0,0, +1746046146176,19,1083,1030,498.89,1088.32,1039.32,5833,4704,-66.19,16,13,-44.26,19.44,25.00,27.00,19,14,0.09,0.05,0.19,0.11,0.00,0.00,0,0, +1746046147176,19,1071,1075,538.00,1076.32,1089.71,6242,4333,-65.94,16,5,-48.16,6.85,26.00,27.00,18,8,0.14,0.11,0.19,0.11,0.00,0.00,0,0, +1746046148176,19,1071,1083,836.23,1076.25,1091.44,6651,4799,-65.94,16,5,-48.16,6.85,27.00,31.00,19,11,0.05,0.04,0.19,0.11,0.00,0.00,0,0, +1746046149176,19,1071,1083,724.07,1076.43,1093.69,4873,4611,-66.00,16,5,-48.22,6.84,25.50,27.00,18,11,0.13,0.16,0.19,0.11,0.00,0.00,0,0, +1746046150176,19,1071,1083,662.09,1076.29,1091.80,6248,4756,-65.81,16,5,-48.03,6.85,25.50,30.00,19,10,0.05,0.06,0.19,0.11,0.00,0.00,0,0, +1746046151176,19,1071,1083,811.00,1075.98,1094.38,5204,4509,-66.06,16,13,-44.13,19.46,25.00,28.00,19,10,0.12,0.31,0.19,0.11,0.00,0.00,0,0, +1746046152176,19,1071,1071,884.47,1078.26,1092.98,10699,4740,-66.06,16,5,-48.28,6.84,26.00,27.00,18,4,0.07,0.11,0.19,0.11,0.00,0.00,0,0, +1746046153176,19,1083,1030,493.00,1091.06,1034.32,12836,4377,-66.06,16,5,-48.28,6.84,26.00,29.00,19,7,0.13,0.04,0.19,0.11,0.00,0.00,0,0, +1746046154176,19,898,1071,0.00,903.51,1088.17,5044,5298,-65.75,16,5,-47.97,6.85,26.50,28.00,15,11,0.09,0.05,0.19,0.11,0.00,0.00,0,0, +1746046155176,19,460,1083,530.08,462.57,1087.89,3111,4781,-65.88,16,5,-48.09,6.85,27.00,26.00,20,11,0.03,0.02,0.19,0.11,0.00,0.00,0,0, +1746046156177,19,1071,1075,772.44,1076.06,1093.93,5057,4767,-66.31,16,5,-48.53,6.83,25.50,27.00,15,9,0.11,0.15,0.19,0.11,0.00,0.00,0,0, +1746046156177,24,0,0,0.00,0.00,0.00,-98,-1207,-65.83,6,5,-48.05,6.85,25.50,28.00,4,0,0.03,0.09,0.00,0.38,nan,0.00,0,0, +1746046157177,19,1083,1083,648.09,1088.45,1087.58,6502,5137,-66.31,16,5,-48.53,6.83,26.00,28.00,18,9,0.04,0.05,0.19,0.11,0.00,0.00,0,0, +1746046157177,24,0,0,0.00,0.00,0.00,5,50,-65.83,6,5,-48.05,6.85,25.50,27.00,0,0,0.01,0.08,0.00,0.37,nan,0.00,0,0, +1746046158177,19,1059,1083,607.78,1064.34,1093.95,5134,4511,-66.12,16,5,-48.34,6.84,28.00,27.00,19,11,0.09,0.19,0.19,0.11,0.00,0.00,0,0, +1746046158177,24,0,0,0.00,0.00,0.00,5,50,-67.00,9,5,-49.22,6.81,25.50,26.00,0,0,0.00,0.07,0.00,0.36,nan,0.00,0,0, +1746046159177,19,1071,1083,538.10,1076.30,1093.98,6289,4517,-66.19,16,5,-48.41,6.84,26.00,26.00,19,9,0.13,0.06,0.19,0.11,0.00,0.00,0,0, +1746046159177,24,0,0,0.00,0.00,0.00,5,50,-69.77,13,5,-51.99,6.71,25.50,27.00,0,0,0.00,0.07,0.00,0.35,nan,0.00,0,0, +1746046160177,19,1083,1083,757.64,1088.25,1094.44,5669,4518,-66.19,16,5,-48.41,6.84,26.00,27.00,19,10,0.11,0.20,0.19,0.11,0.00,0.00,0,0, +1746046160177,24,0,0,0.00,0.00,0.00,5,50,-80.07,15,5,-62.29,6.43,26.50,27.00,0,0,0.00,0.06,0.00,0.34,nan,0.00,0,0, +1746046161177,19,1071,1018,736.50,1076.42,1034.20,6959,4707,-66.50,16,5,-48.72,6.82,26.00,26.00,18,8,0.08,0.08,0.19,0.11,0.00,0.00,0,0, +1746046161177,24,0,0,0.00,0.00,0.00,5,50,-64.80,15,5,-47.02,6.89,26.50,28.00,0,0,0.00,0.05,0.00,0.33,nan,0.00,0,0, +1746046162177,19,1071,1135,593.88,1076.42,1149.79,6288,4747,-66.50,16,5,-48.72,6.82,26.00,28.00,19,11,0.09,0.16,0.19,0.11,0.00,0.00,0,0, +1746046162177,24,0,0,0.00,0.00,0.00,5,50,-64.80,15,5,-47.02,6.89,26.50,28.00,0,0,0.00,0.05,0.00,0.32,nan,0.00,0,0, +1746046163177,19,1083,1023,830.91,1088.23,1035.86,5825,4333,-66.25,16,5,-48.47,6.83,26.50,27.00,18,11,0.17,0.05,0.19,0.11,0.00,0.00,0,0, +1746046163177,24,0,0,0.00,0.00,0.00,5,50,-65.00,9,5,-47.22,6.88,26.00,27.00,0,0,0.00,0.04,0.00,0.32,nan,0.00,0,0, +1746046164177,19,1071,1083,713.30,1076.19,1089.18,5050,4939,-66.31,16,5,-48.53,6.83,27.00,26.00,17,12,0.06,0.08,0.19,0.11,0.00,0.00,0,0, +1746046164177,24,0,0,0.00,0.00,0.00,5,50,-66.43,7,5,-48.65,6.83,25.50,26.00,0,0,0.00,0.04,0.00,0.31,nan,0.00,0,0, +1746046165177,19,1071,1083,619.75,1076.40,1090.42,5805,4750,-66.06,16,5,-48.28,6.84,25.00,27.00,16,11,0.15,0.08,0.19,0.11,0.00,0.00,0,0, +1746046165177,24,0,0,0.00,0.00,0.00,5,50,-67.20,5,5,-49.42,6.80,26.00,27.00,0,0,0.00,0.04,0.00,0.30,nan,0.00,0,0, +1746046166177,19,1071,1071,772.91,1076.53,1089.32,5512,4972,-66.06,16,5,-48.28,6.84,27.00,27.00,16,12,0.05,0.10,0.19,0.11,0.00,0.00,0,0, +1746046166177,24,0,0,0.00,0.00,0.00,5,50,-67.20,5,5,-49.42,6.80,25.50,25.00,0,0,0.00,0.03,0.00,0.30,nan,0.00,0,0, +1746046167177,19,1071,1083,554.36,1076.15,1092.48,5696,4619,-66.25,16,106,-35.21,199.47,25.50,27.00,19,11,0.08,0.07,0.19,0.11,0.00,0.00,0,0, +1746046167177,24,0,0,0.00,0.00,0.00,5,50,-71.44,9,5,-53.66,6.66,27.00,25.00,0,0,0.00,0.03,0.00,0.29,nan,0.00,0,0, +1746046168177,19,1071,1030,993.89,1076.31,1036.63,5301,4515,-66.31,16,5,-48.53,6.83,25.00,27.00,19,12,0.12,0.06,0.19,0.11,0.00,0.00,0,0, +1746046168177,24,0,0,0.00,0.00,0.00,5,50,-65.62,8,5,-47.84,6.86,25.50,28.00,0,0,0.00,0.03,0.00,0.28,nan,0.00,0,0, +1746046169177,19,1083,1083,380.36,1088.23,1142.53,5102,4515,-66.06,16,12,-44.48,17.82,26.00,27.00,19,12,0.13,0.08,0.19,0.11,0.00,0.00,0,0, +1746046169177,24,0,0,0.00,0.00,0.00,5,50,-69.00,8,5,-51.22,6.74,24.50,25.00,0,0,0.00,0.02,0.00,0.28,nan,0.00,0,0, +1746046170177,19,1071,1075,531.90,1076.26,1043.14,4993,4497,-65.88,16,5,-48.09,6.85,26.00,27.00,18,12,0.07,0.09,0.19,0.11,0.00,0.00,0,0, +1746046170177,24,0,0,0.00,0.00,0.00,5,50,-68.00,9,5,-50.22,6.77,26.00,27.00,0,0,0.00,0.02,0.00,0.27,nan,0.00,0,0, +1746046171177,19,1071,1083,659.82,1076.31,1092.66,5123,4619,-65.88,16,5,-48.09,6.85,28.00,26.00,18,12,0.16,0.08,0.19,0.11,0.00,0.00,0,0, +1746046171177,24,0,0,0.00,0.00,0.00,5,50,-68.00,9,5,-50.22,6.77,25.00,28.00,0,0,0.00,0.02,0.00,0.27,nan,0.00,0,0, +1746046172177,19,1071,1083,551.75,1076.22,1092.29,5323,4787,-65.81,16,5,-48.03,6.85,26.00,26.00,18,12,0.05,0.11,0.19,0.11,0.00,0.00,0,0, +1746046172177,24,0,0,0.00,0.00,0.00,5,50,-69.00,10,5,-51.22,6.74,26.50,26.00,0,0,0.00,0.02,0.00,0.26,nan,0.00,0,0, +1746046173177,19,1071,1083,820.89,1076.18,1093.90,5089,4505,-65.88,16,5,-48.09,6.85,27.00,27.00,19,12,0.12,0.10,0.19,0.11,0.00,0.00,0,0, +1746046173177,24,0,0,0.00,0.00,0.00,5,50,-69.00,9,5,-51.22,6.74,25.00,27.00,0,0,0.00,0.02,0.00,0.26,nan,0.00,0,0, +1746046174177,19,1071,1071,761.30,1076.26,1093.77,5194,4741,-66.00,16,106,-34.96,200.14,25.00,27.00,19,12,0.08,0.12,0.19,0.11,0.00,0.00,0,0, +1746046174177,24,0,0,0.00,0.00,0.00,5,50,-69.00,12,5,-51.22,6.74,25.00,27.00,0,0,0.00,0.01,0.00,0.25,nan,0.00,0,0, +1746046175177,19,1083,1042,663.70,1088.23,1049.96,5037,4222,-66.19,16,5,-48.41,6.84,26.50,27.00,19,12,0.12,0.14,0.19,0.11,0.00,0.00,0,0, +1746046175177,24,0,0,0.00,0.00,0.00,5,50,-66.92,13,5,-49.14,6.81,26.00,25.00,0,0,0.00,0.01,0.00,0.25,nan,0.00,0,0, +1746046176177,19,1059,1099,524.30,1064.14,1106.79,5291,4862,-66.19,16,5,-48.41,6.84,26.50,28.00,18,9,0.07,0.16,0.19,0.11,0.00,0.00,0,0, +1746046176177,24,0,0,0.00,0.00,0.00,5,50,-66.92,13,5,-49.14,6.81,26.00,26.00,0,0,0.00,0.01,0.00,0.24,nan,0.00,0,0, +1746046177177,19,1083,1030,768.10,1088.26,1050.13,6258,4724,-65.88,16,5,-48.09,6.85,26.00,26.00,19,9,0.11,0.05,0.19,0.11,0.00,0.00,0,0, +1746046177177,24,0,0,0.00,0.00,0.00,5,50,-66.75,8,5,-48.97,6.82,25.50,25.00,0,0,0.00,0.01,0.00,0.24,nan,0.00,0,0, +1746046178177,19,1071,1099,595.64,1076.39,1107.42,5450,4604,-66.12,16,5,-48.34,6.84,25.50,27.00,18,11,0.09,0.11,0.19,0.11,0.00,0.00,0,0, +1746046178177,24,0,0,0.00,0.00,0.00,5,50,-65.73,11,5,-47.95,6.85,26.00,27.00,0,0,0.00,0.01,0.00,0.24,nan,0.00,0,0, +1746046179177,19,1071,1083,478.80,1076.17,1092.08,5327,4664,-66.12,16,5,-48.34,6.84,26.50,27.00,19,13,0.08,0.06,0.19,0.11,0.00,0.00,0,0, +1746046179177,24,0,0,0.00,0.00,0.00,5,50,-69.00,11,5,-51.22,6.74,25.00,27.00,0,0,0.00,0.01,0.00,0.23,nan,0.00,0,0, +1746046180177,19,1071,1083,914.55,1076.18,1093.84,4913,4497,-66.12,16,5,-48.34,6.84,26.50,26.00,19,12,0.12,0.11,0.19,0.11,0.00,0.00,0,0, +1746046180177,24,0,0,0.00,0.00,0.00,5,50,-69.00,11,5,-51.22,6.74,26.50,27.00,0,0,0.00,0.01,0.00,0.23,nan,0.00,0,0, +1746046181177,19,1071,1083,550.56,1076.17,1092.80,4985,4675,-65.94,16,5,-48.16,6.85,26.00,27.00,18,12,0.09,0.09,0.19,0.11,0.00,0.00,0,0, +1746046181177,24,0,0,0.00,0.00,0.00,5,50,-69.00,10,5,-51.22,6.74,26.50,27.00,0,0,0.00,0.01,0.00,0.22,nan,0.00,0,0, +1746046182177,19,1083,1018,551.27,1088.40,1040.60,5387,4645,-65.88,16,5,-48.09,6.85,25.50,27.00,20,10,0.08,0.15,0.19,0.11,0.00,0.00,0,0, +1746046182177,24,0,0,0.00,0.00,0.00,5,50,-69.00,8,5,-51.22,6.74,26.00,27.00,0,0,0.00,0.01,0.00,0.22,nan,0.00,0,0, +1746046183177,19,1071,1087,573.50,1076.23,1095.17,6173,4493,-66.00,16,5,-48.22,6.84,25.50,26.00,18,10,0.08,0.05,0.19,0.11,0.00,0.00,0,0, +1746046183177,24,0,0,0.00,0.00,0.00,5,50,-66.30,10,5,-48.52,6.83,25.50,27.00,0,0,0.00,0.01,0.00,0.22,nan,0.00,0,0, +1746046184177,19,1059,1083,449.22,1064.19,1093.56,5086,4646,-65.94,16,5,-48.16,6.85,25.50,29.00,19,10,0.12,0.15,0.19,0.11,0.00,0.00,0,0, +1746046184177,24,0,0,0.00,0.00,0.00,5,50,-68.00,9,5,-50.22,6.77,26.00,26.00,0,0,0.00,0.00,0.00,0.21,nan,0.00,0,0, +1746046185177,19,1071,1083,557.00,1076.21,1090.83,6315,4782,-65.94,16,5,-48.16,6.85,26.00,28.00,17,10,0.10,0.06,0.19,0.11,0.00,0.00,0,0, +1746046185177,24,0,0,0.00,0.00,0.00,5,50,-68.00,9,5,-50.22,6.77,24.50,27.00,0,0,0.00,0.00,0.00,0.21,nan,0.00,0,0, +1746046186177,19,1083,1083,767.10,1088.48,1089.69,5135,4864,-66.00,16,5,-48.22,6.84,26.50,28.00,19,13,0.06,0.11,0.19,0.11,0.00,0.00,0,0, +1746046186177,24,0,0,0.00,0.00,0.00,5,50,-69.00,10,5,-51.22,6.74,25.50,27.00,0,0,0.00,0.00,0.00,0.21,nan,0.00,0,0, +1746046187177,19,1083,1030,633.80,1088.14,1049.24,4946,4455,-66.25,16,5,-48.47,6.83,26.00,27.00,18,12,0.13,0.11,0.19,0.11,0.00,0.00,0,0, +1746046187177,24,0,0,0.00,0.00,0.00,5,50,-67.88,8,5,-50.09,6.77,26.00,27.00,0,0,0.00,0.00,0.00,0.20,nan,0.00,0,0, +1746046188177,19,1071,1147,593.40,1076.30,1151.78,5141,4994,-66.06,16,5,-48.28,6.84,26.00,27.00,20,12,0.05,0.09,0.19,0.11,0.00,0.00,0,0, +1746046188177,24,0,0,0.00,0.00,0.00,5,50,-68.25,12,5,-50.47,6.76,25.50,26.00,0,0,0.00,0.00,0.00,0.20,nan,0.00,0,0, +1746046189177,19,1071,1035,560.56,1076.11,1046.24,4976,4315,-66.06,16,5,-48.28,6.84,26.50,27.00,17,12,0.12,0.06,0.19,0.11,0.00,0.00,0,0, +1746046189177,24,0,0,0.00,0.00,0.00,5,50,-68.25,12,5,-50.47,6.76,25.00,27.00,0,0,0.00,0.00,0.00,0.20,nan,0.00,0,0, +1746046190177,19,1071,1071,558.60,1076.35,1089.98,5167,4938,-66.19,16,5,-48.41,6.84,26.50,27.00,19,12,0.04,0.09,0.19,0.11,0.00,0.00,0,0, +1746046190177,24,0,0,0.00,0.00,0.00,5,50,-67.50,12,5,-49.72,6.79,26.00,28.00,0,0,0.00,0.00,0.00,0.20,nan,0.00,0,0, +1746046191177,19,1071,1083,849.78,1076.17,1094.17,4855,4541,-66.31,16,12,-44.73,17.79,25.00,27.00,19,12,0.12,0.07,0.19,0.11,0.00,0.00,0,0, +1746046191177,24,0,0,0.00,0.00,0.00,5,50,-69.08,12,5,-51.30,6.73,24.50,26.00,0,0,0.00,0.00,0.00,0.19,nan,0.00,0,0, +1746046192177,19,1071,1030,316.27,1076.21,1036.35,4991,4539,-66.12,16,5,-48.34,6.84,26.50,26.00,19,12,0.12,0.08,0.19,0.11,0.00,0.00,0,0, +1746046192177,24,0,0,0.00,0.00,0.00,5,50,-67.36,11,5,-49.58,6.79,25.50,27.00,0,0,0.00,0.00,0.00,0.19,nan,0.00,0,0, +1746046193177,19,1083,1083,742.80,1088.22,1092.71,4911,4368,-66.00,16,5,-48.22,6.84,26.50,26.00,18,12,0.12,0.06,0.19,0.11,0.00,0.00,0,0, +1746046193177,24,0,0,0.00,0.00,0.00,5,50,-86.50,10,5,-68.72,6.29,25.00,27.00,0,0,0.00,0.00,0.00,0.19,nan,0.00,0,0, +1746046194177,19,1071,1075,563.27,1076.26,1091.83,5220,4774,-66.00,16,5,-48.22,6.84,26.50,27.00,19,12,0.07,0.11,0.19,0.11,0.00,0.00,0,0, +1746046194177,24,0,0,0.00,0.00,0.00,5,50,-86.50,10,5,-68.72,6.29,25.00,24.00,0,0,0.00,0.00,0.00,0.18,nan,0.00,0,0, +1746046195176,19,1071,1143,775.70,1076.11,1152.38,4971,4726,-66.12,16,106,-35.08,199.81,25.00,27.00,18,12,0.15,0.08,0.19,0.11,0.00,0.00,0,0, +1746046195177,24,0,0,0.00,0.00,0.00,5,50,-72.70,10,5,-54.92,6.62,25.00,26.00,0,0,0.00,0.00,0.00,0.18,nan,0.00,0,0, +1746046196177,19,1071,1023,637.70,1078.58,1033.50,5048,4556,-66.06,16,5,-48.28,6.84,27.00,28.00,18,12,0.06,0.06,0.19,0.11,0.00,0.00,0,0, +1746046196177,24,0,0,0.00,0.00,0.00,5,50,-72.83,12,5,-55.05,6.61,26.50,27.00,0,0,0.00,0.00,0.00,0.18,nan,0.00,0,0, +1746046197177,19,1071,1030,634.00,1076.31,1050.61,5241,4713,-66.06,16,5,-48.28,6.84,26.50,28.00,19,12,0.11,0.10,0.19,0.11,0.00,0.00,0,0, +1746046197177,24,0,0,0.00,0.00,0.00,5,50,-69.00,10,5,-51.22,6.74,25.50,26.00,0,0,0.00,0.00,0.00,0.18,nan,0.00,0,0, +1746046198177,19,1071,1083,741.10,1076.19,1094.61,4929,4538,-66.06,16,5,-48.28,6.84,26.00,27.00,19,12,0.08,0.07,0.19,0.11,0.00,0.00,0,0, +1746046198177,24,0,0,0.00,0.00,0.00,5,50,-69.00,10,5,-51.22,6.74,25.50,26.00,0,0,0.00,0.00,0.00,0.18,nan,0.00,0,0, +1746046199177,19,1083,1099,843.80,1088.26,1109.35,4924,4425,-66.06,16,5,-48.28,6.84,26.50,26.00,19,12,0.10,0.12,0.19,0.11,0.00,0.00,0,0, +1746046199177,24,0,0,0.00,0.00,0.00,5,50,-73.18,11,5,-55.40,6.60,24.50,27.00,0,0,0.00,0.00,0.00,0.17,nan,0.00,0,0, +1746046200177,19,1059,1083,596.40,1064.12,1094.14,4987,4774,-66.25,16,106,-35.21,199.47,25.00,27.00,19,12,0.11,0.12,0.19,0.11,0.00,0.00,0,0, +1746046200177,24,0,0,0.00,0.00,0.00,5,50,-72.73,15,5,-54.95,6.62,25.00,27.00,0,0,0.00,0.00,0.00,0.17,nan,0.00,0,0, +1746046201177,19,1083,1030,646.56,1088.23,1084.82,5102,4306,-66.06,16,12,-44.48,17.82,25.50,28.00,19,12,0.12,0.11,0.19,0.11,0.00,0.00,0,0, +1746046201177,24,0,0,0.00,0.00,0.00,5,50,-86.14,14,5,-68.36,6.30,26.00,26.00,0,0,0.00,0.00,0.00,0.17,nan,0.00,0,0, +1746046202177,19,1071,1135,538.60,1076.18,1103.82,4879,4506,-66.12,16,5,-48.34,6.84,27.50,26.00,19,12,0.11,0.11,0.19,0.11,0.00,0.00,0,0, +1746046202177,24,0,0,0.00,0.00,0.00,5,50,-72.77,13,5,-54.99,6.62,25.00,27.00,0,0,0.00,0.00,0.00,0.17,nan,0.00,0,0, +1746046203177,19,1071,1030,571.78,1076.38,1036.72,5059,4309,-66.12,16,5,-48.34,6.84,26.50,26.00,19,12,0.10,0.11,0.19,0.11,0.00,0.00,0,0, +1746046203177,24,0,0,0.00,0.00,0.00,5,50,-72.77,13,5,-54.99,6.62,25.00,27.00,0,0,0.00,0.00,0.00,0.17,nan,0.00,0,0, +1746046204177,19,1071,1083,1093.70,1076.10,1094.25,4892,4529,-66.25,16,5,-48.47,6.83,27.50,28.00,19,12,0.10,0.08,0.19,0.11,0.00,0.00,0,0, +1746046204177,24,0,0,0.00,0.00,0.00,5,50,-83.92,12,5,-66.14,6.34,25.00,27.00,0,0,0.00,0.00,0.00,0.16,nan,0.00,0,0, +1746046205177,19,1083,1075,510.55,1088.28,1095.22,5047,4548,-66.12,16,5,-48.34,6.84,27.00,26.00,19,12,0.12,0.08,0.19,0.11,0.00,0.00,0,0, +1746046205177,24,0,0,0.00,0.00,0.00,5,50,-75.09,11,5,-57.31,6.55,26.00,26.00,0,0,0.00,0.00,0.00,0.16,nan,0.00,0,0, +1746046206177,19,1071,1083,484.44,1076.25,1093.90,4992,4533,-66.19,16,5,-48.41,6.84,27.00,26.00,19,12,0.09,0.10,0.19,0.11,0.00,0.00,0,0, +1746046206177,24,0,0,0.00,0.00,0.00,5,50,-70.73,11,5,-52.95,6.68,26.50,28.00,0,0,0.00,0.00,0.00,0.16,nan,0.00,0,0, +1746046207177,19,1071,1083,622.80,1076.50,1094.73,5392,4526,-66.25,16,12,-44.67,17.80,26.50,27.00,19,12,0.11,0.12,0.19,0.11,0.00,0.00,0,0, +1746046207177,24,0,0,0.00,0.00,0.00,5,50,-79.67,15,5,-61.89,6.44,25.00,27.00,0,0,0.00,0.00,0.00,0.16,nan,0.00,0,0, +1746046208177,19,1071,1083,524.22,1075.98,1094.35,5877,4530,-66.25,16,5,-48.47,6.83,26.00,27.00,19,10,0.09,0.07,0.19,0.11,0.00,0.00,0,0, +1746046208177,24,0,0,0.00,0.00,0.00,5,50,-79.67,15,5,-61.89,6.44,26.00,26.00,0,0,0.00,0.00,0.00,0.16,nan,0.00,0,0, +1746046209177,19,1071,1030,596.00,1076.38,1034.41,5556,4623,-66.88,16,5,-49.09,6.81,28.00,27.00,18,11,0.12,0.19,0.19,0.11,0.00,0.00,0,0, +1746046209177,24,0,0,0.00,0.00,0.00,5,50,-91.62,16,5,-73.84,6.20,25.50,30.00,0,0,0.00,0.00,0.00,0.15,nan,0.00,0,0, +1746046210177,19,1071,1087,709.64,1076.30,1102.17,6203,4523,-66.19,16,5,-48.41,6.84,27.50,26.00,20,9,0.04,0.08,0.19,0.11,0.00,0.00,0,0, +1746046210177,24,0,0,0.00,0.00,0.00,5,50,-91.12,16,5,-73.34,6.21,26.00,27.00,0,0,0.00,0.00,0.00,0.15,nan,0.00,0,0, +1746046211177,19,1083,1083,613.36,1088.34,1092.70,5737,4658,-66.31,16,5,-48.53,6.83,27.50,26.00,18,13,0.08,0.14,0.19,0.11,0.00,0.00,0,0, +1746046211177,24,0,0,0.00,0.00,0.00,5,50,-86.00,13,5,-68.22,6.30,24.00,26.00,0,0,0.00,0.00,0.00,0.15,nan,0.00,0,0, +1746046212177,19,1071,1095,460.73,1076.18,1107.66,6210,4749,-66.31,16,5,-48.53,6.83,26.50,26.00,19,8,0.12,0.10,0.19,0.11,0.00,0.00,0,0, +1746046212177,24,0,0,0.00,0.00,0.00,5,50,-86.00,13,5,-68.22,6.30,24.50,27.00,0,0,0.00,0.00,0.00,0.15,nan,0.00,0,0, +1746046213177,19,1071,1023,743.92,1076.54,1035.72,6961,4313,-66.38,16,5,-48.59,6.83,28.00,25.00,19,11,0.12,0.04,0.19,0.11,0.00,0.00,0,0, +1746046213177,24,0,0,0.00,0.00,0.00,5,50,-69.94,16,5,-52.16,6.70,24.50,27.00,0,0,0.00,0.00,0.00,0.15,nan,0.00,0,0, +1746046214177,19,1071,1083,559.55,1076.10,1094.34,4985,4541,-66.38,16,5,-48.59,6.83,27.50,25.00,19,10,0.14,0.12,0.19,0.11,0.00,0.00,0,0, +1746046214177,24,0,0,0.00,0.00,0.00,5,50,-70.07,14,5,-52.29,6.70,24.50,26.00,0,0,0.00,0.00,0.00,0.15,nan,0.00,0,0, +1746046215177,19,1059,1083,727.90,1064.33,1094.89,6125,4526,-66.19,16,5,-48.41,6.84,28.00,25.00,19,12,0.09,0.04,0.19,0.11,0.00,0.00,0,0, +1746046215177,24,0,0,0.00,0.00,0.00,5,50,-74.50,16,5,-56.72,6.57,25.00,28.00,0,0,0.00,0.00,0.00,0.14,nan,0.00,0,0, +1746046216177,19,1083,1083,646.64,1088.27,1095.31,5131,4505,-66.19,16,5,-48.41,6.84,26.50,23.00,19,12,0.11,0.13,0.19,0.11,0.00,0.00,0,0, +1746046216177,24,0,0,0.00,0.00,0.00,5,50,-75.69,16,5,-57.91,6.54,25.00,26.00,0,0,0.00,0.00,0.00,0.14,nan,0.00,0,0, +1746046217177,19,1071,1083,562.40,1076.22,1094.31,5701,4541,-66.19,16,55,-37.99,95.82,25.50,24.00,19,11,0.09,0.07,0.19,0.11,0.00,0.00,0,0, +1746046217177,24,0,0,0.00,0.00,0.00,5,50,-75.69,16,5,-57.91,6.54,25.00,26.00,0,0,0.00,0.00,0.00,0.14,nan,0.00,0,0, +1746046218177,19,1083,1083,489.56,1088.31,1093.68,5309,4542,-66.31,16,5,-48.53,6.83,27.50,25.00,19,12,0.07,0.08,0.19,0.11,0.00,0.00,0,0, +1746046218177,24,0,0,0.00,0.00,0.00,5,50,-82.75,16,5,-64.97,6.37,24.50,27.00,0,0,0.00,0.00,0.00,0.14,nan,0.00,0,0, +1746046219177,19,1071,1023,624.09,1081.82,1033.13,5138,4521,-66.25,16,5,-48.47,6.83,26.00,24.00,18,12,0.07,0.12,0.19,0.11,0.00,0.00,0,0, +1746046219177,24,0,0,0.00,0.00,0.00,5,50,-83.75,12,5,-65.97,6.35,24.50,26.00,0,0,0.00,0.00,0.00,0.14,nan,0.00,0,0, +1746046220177,19,1071,1143,609.44,1076.21,1151.38,5024,4824,-66.31,16,5,-48.53,6.83,26.50,27.00,19,12,0.09,0.12,0.19,0.11,0.00,0.00,0,0, +1746046220177,24,0,0,0.00,0.00,0.00,5,50,-75.94,16,5,-58.16,6.53,25.50,26.00,0,0,0.00,0.00,0.00,0.14,nan,0.00,0,0, +1746046221177,19,1071,1023,502.50,1076.28,1034.62,5006,4305,-66.31,16,5,-48.53,6.83,27.00,28.00,19,12,0.11,0.09,0.19,0.11,0.00,0.00,0,0, +1746046221177,24,0,0,0.00,0.00,0.00,5,50,-75.94,16,5,-58.16,6.53,25.50,27.00,0,0,0.00,0.00,0.00,0.14,nan,0.00,0,0, +1746046222177,19,1071,1083,616.10,1076.31,1094.40,4933,4505,-66.25,16,5,-48.47,6.83,27.50,28.00,19,12,0.08,0.09,0.19,0.11,0.00,0.00,0,0, +1746046222177,24,0,0,0.00,0.00,0.00,5,50,-73.62,13,5,-55.83,6.59,23.00,29.00,0,0,0.00,0.00,0.00,0.13,nan,0.00,0,0, +1746046223177,19,1071,1083,590.90,1076.32,1095.36,5153,4517,-66.06,16,5,-48.28,6.84,27.00,27.00,19,12,0.07,0.14,0.19,0.11,0.00,0.00,0,0, +1746046223177,24,0,0,0.00,0.00,0.00,5,50,-87.17,12,5,-69.39,6.28,25.50,26.00,0,0,0.00,0.00,0.00,0.13,nan,0.00,0,0, +1746046224177,19,1083,1035,791.73,1088.15,1048.95,5147,4499,-66.06,16,5,-48.28,6.84,26.50,27.00,18,10,0.11,0.15,0.19,0.11,0.00,0.00,0,0, +1746046224177,24,0,0,0.00,0.00,0.00,5,50,-86.89,9,5,-69.11,6.29,25.50,27.00,0,0,0.00,0.00,0.00,0.13,nan,0.00,0,0, +1746046225177,19,1071,1083,930.73,1076.37,1091.70,6359,4741,-66.56,16,5,-48.78,6.82,26.50,27.00,19,10,0.09,0.06,0.19,0.11,0.00,0.00,0,0, +1746046225177,24,0,0,0.00,0.00,0.00,5,50,-68.88,8,5,-51.09,6.74,25.50,28.00,0,0,0.00,0.00,0.00,0.13,nan,0.00,0,0, +1746046226177,19,1071,1083,602.90,1076.25,1094.68,5247,4543,-66.56,16,5,-48.78,6.82,27.00,26.00,18,10,0.15,0.17,0.19,0.11,0.00,0.00,0,0, +1746046226177,24,0,0,0.00,0.00,0.00,5,50,-68.88,8,5,-51.09,6.74,26.00,26.00,0,0,0.00,0.00,0.00,0.13,nan,0.00,0,0, +1746046227177,19,1071,1071,785.75,1076.52,1091.54,6427,4802,-66.44,16,5,-48.66,6.83,25.50,26.00,18,10,0.05,0.06,0.19,0.11,0.00,0.00,0,0, +1746046227177,24,0,0,0.00,0.00,0.00,5,50,-80.00,8,5,-62.22,6.43,25.50,27.00,0,0,0.00,0.00,0.00,0.13,nan,0.00,0,0, +1746046228177,19,1071,1030,675.45,1076.37,1084.62,5534,4524,-66.31,16,5,-48.53,6.83,26.00,28.00,19,12,0.10,0.08,0.19,0.11,0.00,0.00,0,0, +1746046228177,24,0,0,0.00,0.00,0.00,5,50,-90.00,10,5,-72.22,6.23,24.50,26.00,0,0,0.00,0.00,0.00,0.13,nan,0.00,0,0, +1746046229177,19,1071,1135,306.20,1076.31,1103.47,5068,4518,-66.25,16,5,-48.47,6.83,27.00,27.00,19,12,0.09,0.14,0.19,0.11,0.00,0.00,0,0, +1746046229177,24,0,0,0.00,0.00,0.00,5,50,-73.86,14,5,-56.08,6.59,26.00,25.00,0,0,0.00,0.00,0.00,0.13,nan,0.00,0,0, +1746046230177,19,1083,1083,918.00,1088.32,1094.79,6289,4532,-66.25,16,13,-44.32,19.43,25.00,27.00,19,10,0.11,0.07,0.19,0.11,0.00,0.00,0,0, +1746046230177,24,0,0,0.00,0.00,0.00,5,50,-73.86,14,5,-56.08,6.59,26.00,28.00,0,0,0.00,0.00,0.00,0.12,nan,0.00,0,0, +1746046231177,19,1059,1107,769.90,1064.38,1109.11,5261,4647,-66.19,16,5,-48.41,6.84,27.00,27.00,19,12,0.09,0.28,0.19,0.11,0.00,0.00,0,0, +1746046231177,24,0,0,0.00,0.00,0.00,5,50,-78.23,13,5,-60.45,6.47,27.00,26.00,0,0,0.00,0.00,0.00,0.12,nan,0.00,0,0, +1746046232177,19,1071,1023,670.25,1076.24,1035.30,7814,4274,-66.25,16,5,-48.47,6.83,26.00,27.00,19,6,0.12,0.11,0.19,0.11,0.00,0.00,0,0, +1746046232177,24,0,0,0.00,0.00,0.00,5,50,-71.11,9,5,-53.33,6.67,26.00,27.00,0,0,0.00,0.00,0.00,0.12,nan,0.00,0,0, +1746046233177,19,1083,1018,481.09,1088.42,1084.85,8824,4527,-66.06,16,5,-48.28,6.84,27.00,26.00,19,9,0.09,0.04,0.19,0.11,0.00,0.00,0,0, +1746046233177,24,0,0,0.00,0.00,0.00,5,50,-75.17,12,5,-57.39,6.55,25.50,26.00,0,0,0.00,0.00,0.00,0.12,nan,0.00,0,0, +1746046234177,19,1071,1083,729.00,1076.38,1045.31,5248,4513,-66.19,16,5,-48.41,6.84,27.00,26.00,19,10,0.09,0.16,0.19,0.11,0.00,0.00,0,0, +1746046234177,24,0,0,0.00,0.00,0.00,5,50,-72.40,15,5,-54.62,6.63,24.50,27.00,0,0,0.00,0.00,0.00,0.12,nan,0.00,0,0, +1746046235177,19,1083,1099,606.11,1076.33,1108.94,6215,4409,-66.19,16,5,-48.41,6.84,26.50,26.00,19,10,0.14,0.06,0.19,0.11,0.00,0.00,0,0, +1746046235177,24,0,0,0.00,0.00,0.00,5,50,-72.40,15,5,-54.62,6.63,25.00,27.00,0,0,0.00,0.00,0.00,0.12,nan,0.00,0,0, +1746046236177,19,1071,1083,711.00,1088.26,1092.77,5410,4645,-66.31,16,5,-48.53,6.83,26.50,27.00,18,12,0.10,0.09,0.19,0.11,0.00,0.00,0,0, +1746046236177,24,0,0,0.00,0.00,0.00,5,50,-80.56,16,5,-62.78,6.42,26.00,26.00,0,0,0.00,0.00,0.00,0.12,nan,0.00,0,0, +1746046237177,19,1071,1083,492.40,1076.25,1092.51,5062,4706,-66.25,16,13,-44.32,19.43,25.00,28.00,19,12,0.07,0.09,0.19,0.11,0.00,0.00,0,0, +1746046237177,24,0,0,0.00,0.00,0.00,5,50,-81.64,11,5,-63.85,6.39,25.00,25.00,0,0,0.00,0.00,0.00,0.12,nan,0.00,0,0, +1746046238177,19,1071,1071,399.11,1076.26,1093.50,5710,4532,-66.12,16,106,-35.08,199.81,25.00,27.00,19,11,0.08,0.07,0.19,0.11,0.00,0.00,0,0, +1746046238177,24,0,0,0.00,0.00,0.00,5,50,-79.00,12,5,-61.22,6.45,25.50,26.00,0,0,0.00,0.00,0.00,0.12,nan,0.00,0,0, +1746046239177,19,1071,1030,769.11,1076.18,1084.68,5071,4501,-66.19,16,12,-44.60,17.81,25.50,28.00,19,13,0.10,0.11,0.19,0.11,0.00,0.00,0,0, +1746046239177,24,0,0,0.00,0.00,0.00,5,50,-70.11,9,5,-52.33,6.70,26.50,24.00,0,0,0.00,0.00,0.00,0.12,nan,0.00,0,0, +1746046240177,19,1071,1099,966.00,1076.37,1058.88,6137,4498,-66.19,16,5,-48.41,6.84,26.50,27.00,17,10,0.16,0.08,0.19,0.11,0.00,0.00,0,0, +1746046240177,24,0,0,0.00,0.00,0.00,5,50,-70.11,9,5,-52.33,6.70,26.00,26.00,0,0,0.00,0.00,0.00,0.11,nan,0.00,0,0, +1746046241177,19,1083,1071,629.89,1086.22,1089.46,5840,4958,-66.12,16,5,-48.34,6.84,26.00,26.00,17,12,0.05,0.06,0.19,0.11,0.00,0.00,0,0, +1746046241177,24,0,0,0.00,0.00,0.00,5,50,-63.38,8,5,-45.59,6.95,24.50,26.00,0,0,0.00,0.00,0.00,0.11,nan,0.00,0,0, +1746046242177,19,1071,1095,176.11,1078.64,1108.84,5059,4664,-66.12,16,5,-48.34,6.84,26.00,25.00,19,12,0.13,0.10,0.19,0.11,0.00,0.00,0,0, +1746046242177,24,0,0,0.00,0.00,0.00,5,50,-68.10,10,5,-50.32,6.77,26.50,24.00,0,0,0.00,0.00,0.00,0.11,nan,0.00,0,0, +1746046243177,19,1071,1047,785.70,1076.26,1048.49,5160,4426,-66.06,16,5,-48.28,6.84,26.00,26.00,18,12,0.14,0.10,0.19,0.11,0.00,0.00,0,0, +1746046243177,24,0,0,0.00,0.00,0.00,5,50,-72.11,9,5,-54.33,6.64,26.00,25.00,0,0,0.00,0.00,0.00,0.11,nan,0.00,0,0, +1746046244177,19,1071,1071,583.67,1076.46,1091.62,5391,4782,-66.06,16,5,-48.28,6.84,27.00,27.00,19,12,0.05,0.11,0.19,0.11,0.00,0.00,0,0, +1746046244177,24,0,0,0.00,0.00,0.00,5,50,-72.11,9,5,-54.33,6.64,26.50,26.00,0,0,0.00,0.00,0.00,0.11,nan,0.00,0,0, +1746046245177,19,1071,1107,631.20,1076.32,1108.30,5148,4643,-65.94,16,5,-48.16,6.85,26.50,27.00,19,12,0.12,0.11,0.19,0.11,0.00,0.00,0,0, +1746046245177,24,0,0,0.00,0.00,0.00,5,50,-72.36,11,5,-54.58,6.63,25.50,27.00,0,0,0.00,0.00,0.00,0.11,nan,0.00,0,0, +1746046246177,19,1071,1071,737.45,1076.18,1092.66,5037,4739,-65.81,16,27,-40.71,43.65,26.50,27.00,18,12,0.07,0.08,0.19,0.11,0.00,0.00,0,0, +1746046246177,24,0,0,0.00,0.00,0.00,5,50,-67.00,9,5,-49.22,6.81,25.50,25.00,0,0,0.00,0.00,0.00,0.11,nan,0.00,0,0, +1746046247177,19,1059,1047,703.25,1064.20,1049.27,4914,4504,-66.06,16,5,-48.28,6.84,27.50,27.00,19,12,0.09,0.10,0.19,0.11,0.00,0.00,0,0, +1746046247177,24,0,0,0.00,0.00,0.00,5,50,-67.88,8,5,-50.09,6.77,25.50,26.00,0,0,0.00,0.00,0.00,0.11,nan,0.00,0,0, +1746046248177,19,1095,1030,631.67,1100.50,1100.51,5812,4639,-66.12,16,5,-48.34,6.84,26.50,27.00,19,9,0.12,0.14,0.19,0.11,0.00,0.00,0,0, +1746046248177,24,0,0,0.00,0.00,0.00,5,50,-67.71,7,5,-49.93,6.78,25.00,26.00,0,0,0.00,0.00,0.00,0.11,nan,0.00,0,0, +1746046249177,19,1071,1083,506.27,1076.07,1044.56,6036,4300,-66.12,16,5,-48.34,6.84,26.50,26.00,19,10,0.13,0.05,0.19,0.11,0.00,0.00,0,0, +1746046249177,24,0,0,0.00,0.00,0.00,5,50,-67.71,7,5,-49.93,6.78,24.50,28.00,0,0,0.00,0.00,0.00,0.11,nan,0.00,0,0, +1746046250177,19,1071,1087,723.27,1076.23,1090.50,5811,4782,-66.12,16,5,-48.34,6.84,26.50,28.00,18,9,0.06,0.11,0.19,0.11,0.00,0.00,0,0, +1746046250177,24,0,0,0.00,0.00,0.00,5,50,-66.00,9,5,-48.22,6.84,24.50,26.00,0,0,0.00,0.00,0.00,0.11,nan,0.00,0,0, +1746046251177,19,1071,1083,551.30,1076.36,1093.92,6168,4566,-66.44,16,5,-48.66,6.83,27.50,27.00,18,12,0.20,0.04,0.19,0.11,0.00,0.00,0,0, +1746046251177,24,0,0,0.00,0.00,0.00,5,50,-68.00,8,5,-50.22,6.77,25.00,25.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046252177,19,1071,1071,610.82,1076.12,1089.42,6093,4968,-66.25,16,5,-48.47,6.83,26.50,27.00,16,7,0.07,0.13,0.19,0.11,0.00,0.00,0,0, +1746046252177,24,0,0,0.00,0.00,0.00,5,50,-81.45,11,5,-63.67,6.40,25.50,25.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046253177,19,1071,1042,472.00,1076.42,1053.09,7852,4705,-66.25,16,5,-48.47,6.83,26.50,24.00,19,8,0.22,0.05,0.19,0.11,0.00,0.00,0,0, +1746046253177,24,0,0,0.00,0.00,0.00,5,50,-81.45,11,5,-63.67,6.40,24.50,26.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046254177,19,1071,1135,559.10,1076.46,1142.26,5388,5514,-66.12,16,5,-48.34,6.84,27.50,27.00,13,11,0.10,0.17,0.19,0.11,0.00,0.00,0,0, +1746046254177,24,0,0,0.00,0.00,0.00,5,50,-75.73,11,5,-57.95,6.53,24.50,26.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046255177,19,1071,1059,569.12,1076.33,1079.98,6455,5733,-66.00,16,5,-48.22,6.84,28.00,27.00,17,10,0.04,0.06,0.19,0.11,0.00,0.00,0,0, +1746046255177,24,0,0,0.00,0.00,0.00,5,50,-82.83,6,5,-65.05,6.37,26.00,27.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046256177,19,1071,1095,967.50,1076.26,1094.90,5273,4605,-66.25,16,5,-48.47,6.83,26.00,27.00,18,11,0.12,0.14,0.19,0.11,0.00,0.00,0,0, +1746046256177,24,0,0,0.00,0.00,0.00,5,50,-64.50,8,5,-46.72,6.90,24.50,28.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046257177,19,1083,1071,1032.33,1088.59,1091.15,5968,4774,-65.94,16,5,-48.16,6.85,27.50,26.00,19,11,0.06,0.05,0.19,0.11,0.00,0.00,0,0, +1746046257177,24,0,0,0.00,0.00,0.00,5,50,-83.00,9,5,-65.22,6.36,25.50,26.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046258177,19,1071,1030,791.45,1076.50,1036.11,5083,4558,-65.94,16,5,-48.16,6.85,26.00,27.00,18,12,0.16,0.14,0.19,0.11,0.00,0.00,0,0, +1746046258177,24,0,0,0.00,0.00,0.00,5,50,-83.00,9,5,-65.22,6.36,25.00,27.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046259177,19,1071,1075,669.75,1076.34,1091.13,5071,4565,-66.00,16,5,-48.22,6.84,26.00,27.00,18,12,0.06,0.10,0.19,0.11,0.00,0.00,0,0, +1746046259177,24,0,0,0.00,0.00,0.00,5,50,-83.08,12,5,-65.30,6.36,26.00,25.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046260177,19,1083,1083,439.00,1088.30,1093.46,5107,4602,-66.12,16,5,-48.34,6.84,27.00,26.00,18,12,0.14,0.09,0.19,0.11,0.00,0.00,0,0, +1746046260177,24,0,0,0.00,0.00,0.00,5,50,-85.43,14,5,-67.65,6.31,25.50,27.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046261177,19,1059,1083,524.44,1074.10,1091.40,5129,4809,-66.19,16,5,-48.41,6.84,26.00,27.00,18,11,0.06,0.18,0.19,0.11,0.00,0.00,0,0, +1746046261177,24,0,0,0.00,0.00,0.00,5,50,-86.78,9,5,-69.00,6.29,26.50,27.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046262177,19,1083,1083,566.08,1088.46,1099.35,6612,4813,-66.19,16,36,-39.83,59.82,25.50,26.00,17,10,0.11,0.07,0.19,0.11,0.00,0.00,0,0, +1746046262177,24,0,0,0.00,0.00,0.00,5,50,-86.78,9,5,-69.00,6.29,25.00,28.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046263177,19,1071,1083,781.00,1076.10,1088.35,5111,4940,-66.38,16,5,-48.59,6.83,27.50,28.00,17,12,0.09,0.24,0.19,0.11,0.00,0.00,0,0, +1746046263177,24,0,0,0.00,0.00,0.00,5,50,-71.67,9,5,-53.89,6.65,25.50,26.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046264177,19,1071,1059,562.45,1076.48,1081.29,7123,4957,-66.50,16,106,-35.46,198.81,25.50,28.00,19,7,0.15,0.10,0.19,0.11,0.00,0.00,0,0, +1746046264177,24,0,0,0.00,0.00,0.00,5,50,-80.00,8,5,-62.22,6.43,25.00,26.00,0,0,0.00,0.00,0.00,0.10,nan,0.00,0,0, +1746046265177,19,1071,1030,789.11,1076.46,1030.90,7559,4725,-66.25,16,5,-48.47,6.83,27.00,26.00,17,11,0.06,0.03,0.19,0.11,0.00,0.00,0,0, +1746046265177,24,0,0,0.00,0.00,0.00,5,50,-75.56,9,5,-57.77,6.54,26.00,25.00,0,0,0.00,0.00,0.00,0.09,nan,0.00,0,0, +1746046266177,19,1083,1071,610.30,1088.22,1092.66,4946,4447,-66.25,16,5,-48.47,6.83,28.00,27.00,19,11,0.09,0.14,0.19,0.11,0.00,0.00,0,0, +1746046266177,24,0,0,0.00,0.00,0.00,5,50,-76.93,14,5,-59.15,6.50,25.00,27.00,0,0,0.00,0.00,0.00,0.09,nan,0.00,0,0, +1746046267177,19,1071,1087,688.00,1076.28,1094.56,5449,4539,-66.25,16,5,-48.47,6.83,28.00,27.00,19,11,0.10,0.05,0.19,0.11,0.00,0.00,0,0, +1746046267177,24,0,0,0.00,0.00,0.00,5,50,-76.93,14,5,-59.15,6.50,25.00,26.00,0,0,0.00,0.00,0.00,0.09,nan,0.00,0,0, +1746046268177,19,1071,1083,712.50,1076.42,1094.22,5556,4517,-66.31,16,5,-48.53,6.83,27.00,26.00,19,9,0.10,0.16,0.19,0.11,0.00,0.00,0,0, +1746046268177,24,0,0,0.00,0.00,0.00,5,50,-82.93,15,5,-65.15,6.36,25.50,27.00,0,0,0.00,0.00,0.00,0.09,nan,0.00,0,0, +1746046269177,19,1059,1083,575.56,1064.31,1143.67,6388,4743,-66.44,16,13,-44.51,19.41,25.50,28.00,19,9,0.09,0.05,0.19,0.11,0.00,0.00,0,0, +1746046269177,24,0,0,0.00,0.00,0.00,5,50,-87.00,12,5,-69.22,6.28,25.00,24.00,0,0,0.00,0.00,0.00,0.09,nan,0.00,0,0, +1746046270177,19,1083,1083,621.00,1088.38,1044.78,5434,4518,-66.25,16,106,-35.21,199.47,25.00,27.00,19,12,0.13,0.09,0.19,0.11,0.00,0.00,0,0, +1746046270177,24,0,0,0.00,0.00,0.00,5,50,-75.20,15,5,-57.42,6.55,26.00,26.00,0,0,0.00,0.00,0.00,0.09,nan,0.00,0,0, +1746046271177,19,1071,1030,634.56,1076.42,1037.02,5144,4307,-66.31,16,5,-48.53,6.83,26.00,26.00,19,12,0.11,0.10,0.19,0.11,0.00,0.00,0,0, +1746046271177,24,0,0,0.00,0.00,0.00,5,50,-76.67,12,5,-58.89,6.51,24.50,27.00,0,0,0.00,0.00,0.00,0.09,nan,0.00,0,0, +1746046272177,19,1083,1083,711.30,1088.50,1094.06,5139,4283,-66.31,16,5,-48.53,6.83,26.50,27.00,19,12,0.13,0.08,0.19,0.11,0.00,0.00,0,0, +1746046272177,24,335,27,1066.44,339.94,28.62,8702,1694,-76.67,12,5,-58.89,6.51,29.00,26.00,2,2,0.00,0.00,0.00,0.01,0.00,0.00,0,0, +1746046273177,19,1071,1075,486.80,1076.18,1093.91,5075,4477,-66.19,16,5,-48.41,6.84,27.50,28.00,19,12,0.13,0.07,0.19,0.11,0.00,0.00,0,0, +1746046273177,24,1066,4,693.91,1072.43,5.54,8834,483,-73.93,15,5,-56.15,6.58,28.00,26.00,11,12,0.00,0.02,0.00,0.03,0.00,0.00,0,0, +1746046274177,19,1071,1083,760.30,1076.30,1092.19,4976,4615,-66.00,16,5,-48.22,6.84,26.50,27.00,18,13,0.10,0.05,0.19,0.11,0.00,0.00,0,0, +1746046274177,24,1066,4,656.18,1125.07,5.81,4746,412,-84.27,15,5,-66.49,6.34,25.00,28.00,20,13,0.01,0.13,0.00,0.15,0.00,0.00,0,0, +1746046275177,19,1059,1083,584.56,1064.37,1091.31,4791,4669,-66.06,16,5,-48.28,6.84,28.00,27.00,19,10,0.08,0.16,0.19,0.11,0.00,0.00,0,0, +1746046275177,24,1078,4,635.25,1121.77,5.78,5518,363,-84.56,16,5,-66.78,6.33,30.50,27.00,18,10,0.13,0.12,0.01,0.18,0.00,0.00,0,0, +1746046276177,19,1083,1083,759.10,1088.36,1093.66,6413,4494,-66.06,16,5,-48.28,6.84,26.00,27.00,18,10,0.16,0.06,0.19,0.11,0.00,0.00,0,0, +1746046276177,24,1066,4,506.90,1083.38,5.58,6175,422,-84.56,16,5,-66.78,6.33,30.00,26.00,18,10,0.05,0.08,0.01,0.16,0.00,0.00,0,0, +1746046277177,19,1059,1071,666.50,1064.61,1090.78,5378,4774,-66.00,16,5,-48.22,6.84,24.50,27.00,18,12,0.05,0.15,0.19,0.11,0.00,0.00,0,0, +1746046277177,24,1066,4,614.67,1071.39,5.53,6209,392,-81.00,13,5,-63.22,6.41,29.00,28.00,17,10,0.18,0.08,0.01,0.15,0.00,0.00,0,0, +1746046278177,19,1095,1030,823.20,1100.20,1084.00,5016,4485,-66.12,16,5,-48.34,6.84,26.00,29.00,19,12,0.13,0.11,0.19,0.11,0.00,0.00,0,0, +1746046278177,24,1066,4,611.44,1080.98,5.58,5727,446,-86.08,12,5,-68.30,6.30,30.00,27.00,16,12,0.07,0.10,0.01,0.15,0.00,0.00,0,0, +1746046279177,19,1071,1135,701.09,1076.34,1100.52,5137,4720,-65.88,16,28,-40.61,45.42,26.00,27.00,18,12,0.07,0.08,0.19,0.11,0.00,0.00,0,0, +1746046279177,24,1066,4,659.80,1100.53,5.66,5115,386,-80.64,11,5,-62.85,6.41,31.00,27.00,20,12,0.07,0.09,0.02,0.17,0.00,0.00,0,0, +1746046280177,19,1071,1083,454.80,1076.24,1092.07,4978,4599,-65.88,16,5,-48.09,6.85,25.00,28.00,19,12,0.08,0.08,0.19,0.11,0.00,0.00,0,0, +1746046280177,24,1066,4,717.60,1083.38,5.55,4846,417,-86.18,11,5,-68.40,6.30,26.50,27.00,18,12,0.08,0.10,0.02,0.18,0.00,0.00,0,0, +1746046281177,19,1059,1035,605.18,1064.34,1049.73,5173,4398,-65.88,16,5,-48.09,6.85,26.00,27.00,19,12,0.13,0.06,0.19,0.11,0.00,0.00,0,0, +1746046281177,24,1078,4,755.50,1080.86,5.57,4833,408,-86.18,11,5,-68.40,6.30,29.00,27.00,20,12,0.11,0.11,0.02,0.19,0.00,0.00,0,0, +1746046282177,19,1071,1083,739.25,1076.34,1090.12,5072,4734,-66.06,16,5,-48.28,6.84,26.00,27.00,18,12,0.07,0.07,0.19,0.11,0.00,0.00,0,0, +1746046282177,24,1066,4,526.20,1102.81,5.64,5189,421,-79.82,11,5,-62.04,6.43,25.00,26.00,17,12,0.10,0.11,0.02,0.20,0.00,0.00,0,0, +1746046283177,19,1083,1071,646.90,1088.14,1093.06,5911,4604,-66.00,16,5,-48.22,6.84,26.50,27.00,19,10,0.11,0.10,0.19,0.11,0.00,0.00,0,0, +1746046283177,24,1066,4,703.91,1090.86,5.64,5140,423,-73.91,11,5,-56.13,6.58,29.50,27.00,19,12,0.04,0.12,0.02,0.21,0.00,0.00,0,0, +1746046284177,19,1083,1083,729.20,1088.50,1093.81,5912,4480,-65.88,16,12,-44.29,17.85,25.00,27.00,19,14,0.13,0.04,0.19,0.11,0.00,0.00,0,0, +1746046284177,24,1066,4,666.33,1095.46,5.54,5271,407,-81.71,7,5,-63.93,6.39,30.50,26.00,19,10,0.09,0.15,0.03,0.23,0.00,0.00,0,0, +1746046285177,19,1071,1083,770.62,1076.37,1091.36,6558,4655,-65.88,16,29,-40.46,47.22,26.50,27.00,18,5,0.11,0.16,0.19,0.11,0.00,0.00,0,0, +1746046285177,24,1066,4,756.18,1071.67,5.55,6586,402,-81.71,7,5,-63.93,6.39,25.50,27.00,19,9,0.08,0.08,0.03,0.21,0.00,0.00,0,0, +1746046286177,19,1071,1023,716.06,1079.48,1033.10,10948,4461,-65.88,16,5,-48.09,6.85,26.00,27.00,19,5,0.08,0.05,0.19,0.11,0.00,0.00,0,0, +1746046286177,24,1066,4,654.45,1079.98,5.58,6285,370,-76.55,11,5,-58.76,6.51,30.50,26.00,18,11,0.19,0.09,0.04,0.21,0.00,0.00,0,0, +1746046287177,19,1071,1143,651.78,1076.23,1152.54,6289,4715,-66.25,16,5,-48.47,6.83,26.00,27.00,19,14,0.12,0.14,0.19,0.11,0.00,0.00,0,0, +1746046287177,24,1078,4,469.64,1105.28,5.68,6120,441,-93.33,9,5,-75.55,6.18,26.00,28.00,16,11,0.08,0.12,0.03,0.23,0.00,0.00,0,0, +1746046288177,19,1059,1023,682.88,1064.69,1041.68,7025,4487,-66.31,16,5,-48.53,6.83,25.50,25.00,19,5,0.14,0.14,0.19,0.11,0.00,0.00,0,0, +1746046288177,24,1066,4,604.30,1091.86,5.64,5666,407,-91.92,12,5,-74.14,6.20,26.00,28.00,19,11,0.07,0.10,0.04,0.23,0.00,0.00,0,0, +1746046289177,19,1083,1095,803.00,1091.38,1102.77,11025,4454,-66.00,16,28,-40.74,45.36,26.00,27.00,18,6,0.12,0.05,0.19,0.11,0.00,0.00,0,0, +1746046289177,24,1066,4,796.82,1088.10,5.66,5516,370,-86.60,10,5,-68.82,6.29,26.00,27.00,19,11,0.15,0.07,0.04,0.23,0.00,0.00,0,0, +1746046290177,19,1083,1018,522.20,1088.38,1033.02,6156,4707,-66.00,16,5,-48.22,6.84,27.50,30.00,20,11,0.05,0.18,0.19,0.11,0.00,0.00,0,0, +1746046290177,24,1066,4,670.10,1071.31,5.53,5632,418,-86.60,10,5,-68.82,6.29,26.50,28.00,17,11,0.11,0.09,0.04,0.23,0.00,0.00,0,0, +1746046291177,19,1059,1099,508.00,1064.31,1160.46,6288,4362,-66.25,16,13,-44.32,19.43,25.00,26.00,19,10,0.13,0.06,0.19,0.11,0.00,0.00,0,0, +1746046291177,24,1066,4,597.73,1079.90,5.58,5804,426,-77.50,14,5,-59.72,6.49,27.00,26.00,19,11,0.04,0.11,0.04,0.24,0.00,0.00,0,0, +1746046292177,19,1083,1083,472.09,1088.34,1042.19,5546,4487,-66.00,16,5,-48.22,6.84,26.00,27.00,18,10,0.07,0.21,0.19,0.11,0.00,0.00,0,0, +1746046292177,24,1066,4,706.11,1105.12,5.75,5856,402,-83.17,6,5,-65.39,6.36,28.00,26.00,19,11,0.10,0.14,0.04,0.24,0.00,0.00,0,0, +1746046293177,19,1071,1059,370.75,1076.42,1063.13,6997,4504,-66.12,16,5,-48.34,6.84,26.00,26.00,19,8,0.10,0.07,0.19,0.11,0.00,0.00,0,0, +1746046293177,24,1078,4,649.60,1091.94,5.61,5796,412,-80.90,10,5,-63.12,6.41,32.00,27.00,19,11,0.06,0.12,0.04,0.25,0.00,0.00,0,0, +1746046294177,19,1059,1083,487.25,1064.33,1103.93,6102,4948,-66.12,16,5,-48.34,6.84,27.50,31.00,17,12,0.09,0.06,0.19,0.11,0.00,0.00,0,0, +1746046294177,24,1066,4,410.10,1105.16,5.75,5861,397,-80.90,10,5,-63.12,6.41,26.50,27.00,19,11,0.05,0.11,0.04,0.25,0.00,0.00,0,0, +1746046295177,19,1083,1018,721.36,1088.50,1079.77,5087,4835,-66.38,16,5,-48.59,6.83,26.50,28.00,19,10,0.06,0.24,0.19,0.11,0.00,0.00,0,0, +1746046295177,24,1066,4,900.10,1096.89,5.66,6077,375,-73.54,13,5,-55.76,6.59,30.50,26.00,20,9,0.15,0.16,0.04,0.25,0.00,0.00,0,0, +1746046296177,19,1083,1147,253.20,1088.37,1102.72,8626,4492,-66.12,16,12,-44.54,17.81,25.50,26.00,19,6,0.10,0.08,0.19,0.11,0.00,0.00,0,0, +1746046296177,24,1066,4,440.00,1071.43,5.53,6248,431,-83.25,8,5,-65.47,6.36,29.50,28.00,15,9,0.11,0.06,0.05,0.24,0.00,0.00,0,0, +1746046297177,19,1071,1018,740.00,1076.38,1036.31,7676,4492,-66.31,16,5,-48.53,6.83,26.00,26.00,19,12,0.15,0.04,0.19,0.11,0.00,0.00,0,0, +1746046297177,24,1066,4,591.18,1079.90,5.58,5851,417,-81.91,11,5,-64.13,6.39,29.50,27.00,17,11,0.04,0.08,0.04,0.24,0.00,0.00,0,0, +1746046298177,19,1059,1087,463.44,1064.28,1090.41,5835,4784,-66.12,16,5,-48.34,6.84,27.00,28.00,18,8,0.08,0.11,0.19,0.11,0.00,0.00,0,0, +1746046298177,24,1066,4,738.82,1105.16,5.78,5930,366,-77.15,13,5,-59.37,6.50,29.50,27.00,19,11,0.24,0.10,0.05,0.25,0.00,0.00,0,0, +1746046299177,19,1083,1078,527.60,1088.48,1090.61,6977,4444,-66.12,16,5,-48.34,6.84,27.00,27.00,18,11,0.12,0.04,0.19,0.11,0.00,0.00,0,0, +1746046299177,24,1078,4,370.78,1071.35,5.49,5561,421,-77.15,13,5,-59.37,6.50,34.50,28.00,15,11,0.11,0.08,0.05,0.24,0.00,0.00,0,0, +1746046300177,19,1071,1075,422.33,1076.45,1090.94,5186,4751,-66.50,16,5,-48.72,6.82,25.00,27.00,20,12,0.05,0.11,0.19,0.11,0.00,0.00,0,0, +1746046300177,24,1066,4,474.50,1108.80,5.72,6010,426,-77.09,11,5,-59.31,6.50,30.00,27.00,16,11,0.05,0.10,0.05,0.25,0.00,0.00,0,0, +1746046301177,19,1071,1083,669.18,1076.37,1098.02,6430,5050,-66.25,16,5,-48.47,6.83,27.50,27.00,14,8,0.11,0.10,0.19,0.11,0.00,0.00,0,0, +1746046301177,24,1066,4,727.30,1113.79,5.77,6044,402,-86.86,7,5,-69.08,6.29,26.00,28.00,19,11,0.05,0.12,0.05,0.26,0.00,0.00,0,0, +1746046302177,19,1083,1071,907.75,1088.42,1083.22,6894,5288,-66.12,16,5,-48.34,6.84,26.50,27.00,17,12,0.04,0.04,0.19,0.11,0.00,0.00,0,0, +1746046302177,24,1066,4,593.36,1096.65,5.70,5953,418,-83.67,9,5,-65.89,6.35,25.50,26.00,15,11,0.16,0.11,0.05,0.26,0.00,0.00,0,0, +1746046303177,19,1059,1083,538.44,1064.18,1092.47,5957,4787,-66.31,16,106,-35.27,199.31,25.00,27.00,19,10,0.08,0.08,0.19,0.11,0.00,0.00,0,0, +1746046303177,24,1066,4,671.40,1088.26,5.66,5660,431,-87.58,12,5,-69.80,6.27,26.00,28.00,15,11,0.06,0.13,0.05,0.26,0.00,0.00,0,0, +1746046304177,19,1083,1083,630.11,1088.52,1095.03,5718,4555,-66.31,16,36,-39.96,59.74,26.00,26.00,17,13,0.12,0.07,0.19,0.11,0.00,0.00,0,0, +1746046304177,24,1066,4,806.92,1113.75,5.77,6096,370,-87.58,12,5,-69.80,6.27,31.50,27.00,21,11,0.05,0.13,0.05,0.27,0.00,0.00,0,0, +1746046305177,19,1071,1018,837.78,1076.17,1030.46,5436,4641,-66.19,16,5,-48.41,6.84,26.50,27.00,19,9,0.04,0.11,0.19,0.11,0.00,0.00,0,0, +1746046305177,24,1078,4,299.22,1105.16,5.75,5860,426,-93.56,9,5,-75.77,6.17,28.50,27.00,16,11,0.12,0.15,0.05,0.27,0.00,0.00,0,0, +1746046306177,19,1071,1135,773.73,1076.39,1149.54,6395,4903,-66.50,16,5,-48.72,6.82,27.00,27.00,17,10,0.12,0.05,0.19,0.11,0.00,0.00,0,0, +1746046306177,24,1066,4,575.70,1100.45,5.66,5904,426,-79.00,11,5,-61.22,6.45,31.50,27.00,16,11,0.05,0.11,0.05,0.27,0.00,0.00,0,0, +1746046307177,19,1071,1035,854.91,1076.50,1040.55,5805,4624,-66.50,16,5,-48.72,6.82,27.00,28.00,20,8,0.04,0.14,0.19,0.11,0.00,0.00,0,0, +1746046307177,24,1066,4,936.20,1113.75,5.81,6167,402,-84.25,12,5,-66.47,6.34,30.00,26.00,18,11,0.14,0.13,0.05,0.28,0.00,0.00,0,0, +1746046308177,19,1083,1095,696.90,1088.31,1111.24,7038,4498,-66.50,16,5,-48.72,6.82,26.00,27.00,19,9,0.13,0.05,0.19,0.11,0.00,0.00,0,0, +1746046308177,24,1066,4,566.27,1105.12,5.75,5861,422,-84.25,12,5,-66.47,6.34,26.00,27.00,18,11,0.06,0.10,0.05,0.28,0.00,0.00,0,0, +1746046309177,19,1071,1071,605.55,1076.31,1083.27,5309,4576,-66.38,16,5,-48.59,6.83,27.00,27.00,18,9,0.11,0.23,0.19,0.11,0.00,0.00,0,0, +1746046309177,24,1066,4,367.90,1096.73,5.68,5695,381,-78.73,15,5,-60.95,6.46,24.50,27.00,20,11,0.09,0.11,0.05,0.28,0.00,0.00,0,0, +1746046310177,19,1071,1083,720.45,1076.38,1091.53,8825,4705,-66.06,16,5,-48.28,6.84,26.50,28.00,19,6,0.08,0.08,0.19,0.11,0.00,0.00,0,0, +1746046310177,24,1066,4,461.92,1096.89,5.70,6080,422,-77.44,9,5,-59.66,6.49,30.00,27.00,16,11,0.17,0.13,0.05,0.28,0.00,0.00,0,0, +1746046311177,19,1071,1059,382.70,1076.33,1113.38,7663,4789,-66.25,16,5,-48.47,6.83,26.50,27.00,18,12,0.12,0.03,0.19,0.11,0.00,0.00,0,0, +1746046311177,24,1078,4,594.25,1088.18,5.64,5577,436,-77.87,15,5,-60.09,6.48,34.00,27.00,15,11,0.06,0.11,0.05,0.28,0.00,0.00,0,0, +1746046312177,19,1059,1131,654.10,1064.45,1149.95,5159,4846,-66.06,16,18,-42.72,27.84,26.50,27.00,19,12,0.08,0.15,0.19,0.11,0.00,0.00,0,0, +1746046312177,24,1066,4,749.09,1117.26,6.18,6026,603,-78.75,16,23,-54.34,33.33,27.50,27.00,20,11,0.08,0.12,0.05,0.29,0.00,0.00,0,0, +1746046313177,19,1083,1023,688.20,1088.15,1033.83,4905,4362,-66.06,16,5,-48.28,6.84,27.00,28.00,18,12,0.11,0.09,0.19,0.11,0.00,0.00,0,0, +1746046313177,24,1066,4,810.11,1088.34,5.64,5796,422,-78.75,16,5,-60.97,6.46,26.00,27.00,18,11,0.09,0.13,0.05,0.29,0.00,0.00,0,0, +1746046314177,19,1083,1083,539.70,1076.08,1091.34,5055,4732,-66.06,16,13,-44.13,19.46,24.50,27.00,19,12,0.07,0.12,0.19,0.11,0.00,0.00,0,0, +1746046314177,24,1066,4,689.17,1079.98,5.58,5808,397,-80.87,15,5,-63.09,6.41,31.00,26.00,17,11,0.15,0.11,0.06,0.29,0.00,0.00,0,0, +1746046315177,19,1071,1035,526.44,1088.39,1049.11,5127,4395,-66.12,16,5,-48.34,6.84,25.50,27.00,18,12,0.15,0.13,0.19,0.11,0.00,0.00,0,0, +1746046315177,24,1066,4,725.90,1079.82,5.61,5613,438,-87.20,15,5,-69.42,6.28,25.50,27.00,17,11,0.07,0.12,0.06,0.29,0.00,0.00,0,0, +1746046316177,19,1071,1083,898.33,1076.53,1090.92,5210,4762,-66.25,16,5,-48.47,6.83,27.00,27.00,18,12,0.05,0.14,0.19,0.11,0.00,0.00,0,0, +1746046316177,24,1066,4,633.64,1079.86,5.58,5667,375,-78.40,15,5,-60.62,6.47,26.50,26.00,18,11,0.18,0.09,0.06,0.29,0.00,0.00,0,0, +1746046317177,19,1071,1083,499.50,1076.33,1092.86,6190,4564,-66.25,16,5,-48.47,6.83,26.00,27.00,18,10,0.17,0.07,0.19,0.11,0.00,0.00,0,0, +1746046317177,24,1066,4,498.33,1105.16,5.73,5989,433,-78.40,15,5,-60.62,6.47,35.00,28.00,17,11,0.07,0.11,0.06,0.29,0.00,0.00,0,0, +1746046318177,19,1071,1071,502.33,1076.45,1088.53,5555,4959,-66.38,16,5,-48.59,6.83,27.00,27.00,17,11,0.06,0.26,0.19,0.11,0.00,0.00,0,0, +1746046318177,24,1078,4,404.67,1108.84,5.72,5966,375,-79.10,10,5,-61.32,6.45,29.50,27.00,20,10,0.11,0.15,0.06,0.29,0.00,0.00,0,0, +1746046319177,19,1071,1083,778.90,1076.53,1095.03,8108,4843,-66.19,16,5,-48.41,6.84,27.50,27.00,16,6,0.12,0.10,0.19,0.11,0.00,0.00,0,0, +1746046319177,24,1066,4,643.60,1071.43,5.53,6247,407,-82.44,9,5,-64.66,6.37,26.00,27.00,18,9,0.09,0.10,0.06,0.29,0.00,0.00,0,0, +1746046320177,19,1083,1018,668.67,1088.46,1030.31,8669,4959,-66.06,16,5,-48.28,6.84,26.00,28.00,18,10,0.04,0.03,0.19,0.11,0.00,0.00,0,0, +1746046320177,24,1066,4,829.08,1071.39,5.53,6237,402,-86.00,5,5,-68.22,6.30,29.50,27.00,20,12,0.05,0.05,0.06,0.28,0.00,0.00,0,0, +1746046321177,19,1071,1111,406.90,1076.38,1117.19,5169,4214,-66.19,16,5,-48.41,6.84,25.50,27.00,18,10,0.15,0.20,0.19,0.11,0.00,0.00,0,0, +1746046321177,24,1066,4,630.40,1090.80,6.33,5014,584,-79.07,14,5,-61.29,6.45,29.50,27.00,18,12,0.08,0.13,0.06,0.28,0.00,0.00,0,0, +1746046322177,19,1071,1071,620.38,1076.26,1089.94,6876,4778,-66.19,16,5,-48.41,6.84,25.50,26.00,18,8,0.05,0.07,0.19,0.11,0.00,0.00,0,0, +1746046322177,24,1066,4,702.60,1090.82,5.64,5075,397,-79.07,14,5,-61.29,6.45,30.00,27.00,19,12,0.10,0.12,0.06,0.29,0.00,0.00,0,0, +1746046323177,19,1059,1083,577.88,1064.12,1142.68,5430,4741,-66.06,16,13,-44.13,19.46,25.50,27.00,19,13,0.13,0.20,0.19,0.11,0.00,0.00,0,0, +1746046323177,24,1066,4,299.88,1098.05,5.66,5601,386,-78.83,12,5,-61.05,6.46,27.00,27.00,19,11,0.10,0.15,0.06,0.29,0.00,0.00,0,0, +1746046324177,19,1071,1083,532.10,1076.48,1043.53,6495,4455,-66.19,16,5,-48.41,6.84,24.50,27.00,18,8,0.08,0.09,0.19,0.11,0.00,0.00,0,0, +1746046324177,24,1078,4,786.20,1091.78,5.58,5599,423,-83.09,11,5,-65.31,6.36,26.00,27.00,16,11,0.12,0.09,0.06,0.29,0.00,0.00,0,0, +1746046325177,19,1083,1030,464.40,1088.40,1082.79,6516,4630,-66.06,16,12,-44.48,17.82,26.00,27.00,19,13,0.09,0.03,0.19,0.11,0.00,0.00,0,0, +1746046325177,24,1066,4,433.27,1088.30,5.64,5846,411,-77.82,11,5,-60.04,6.48,26.00,27.00,16,11,0.05,0.08,0.06,0.29,0.00,0.00,0,0, +1746046326177,19,1083,1071,297.45,1083.62,1043.70,5607,4407,-66.06,16,5,-48.28,6.84,26.50,27.00,18,10,0.09,0.11,0.19,0.11,0.00,0.00,0,0, +1746046326177,24,1066,4,586.10,1110.74,5.70,5815,375,-77.82,11,5,-60.04,6.48,30.50,26.00,20,11,0.11,0.10,0.06,0.29,0.00,0.00,0,0, +1746046327177,19,1071,1087,252.20,1080.79,1091.26,6049,4689,-66.06,16,5,-48.28,6.84,25.50,27.00,19,13,0.08,0.05,0.19,0.11,0.00,0.00,0,0, +1746046327177,24,1066,4,456.36,1079.86,5.57,5807,426,-70.69,13,5,-52.91,6.68,24.00,28.00,16,11,0.09,0.10,0.06,0.29,0.00,0.00,0,0, +1746046328177,19,1059,1095,629.90,1064.50,1107.30,5308,4778,-65.88,16,5,-48.09,6.85,26.00,26.00,18,8,0.09,0.18,0.19,0.11,0.00,0.00,0,0, +1746046328177,24,1066,4,552.78,1071.27,5.50,5632,428,-83.30,10,5,-65.52,6.36,31.50,26.00,19,11,0.04,0.12,0.06,0.29,0.00,0.00,0,0, +1746046329177,19,1083,1107,489.00,1088.41,1121.07,8142,4873,-66.12,16,5,-48.34,6.84,25.50,28.00,19,7,0.11,0.06,0.19,0.11,0.00,0.00,0,0, +1746046329177,24,1066,4,457.40,1113.71,5.81,6227,412,-80.00,13,5,-62.22,6.43,28.50,26.00,19,11,0.07,0.12,0.06,0.29,0.00,0.00,0,0, +1746046330177,19,1071,1023,310.70,1087.30,1034.02,5946,4352,-66.19,16,5,-48.41,6.84,26.50,27.00,18,13,0.10,0.10,0.19,0.11,0.00,0.00,0,0, +1746046330177,24,1078,4,533.36,1100.29,5.64,5705,375,-74.38,13,5,-56.60,6.57,27.00,27.00,18,11,0.16,0.13,0.06,0.29,0.00,0.00,0,0, +1746046331177,19,1071,1083,575.80,1076.30,1090.74,5575,4695,-66.19,16,5,-48.41,6.84,25.00,28.00,19,11,0.08,0.07,0.19,0.11,0.00,0.00,0,0, +1746046331177,24,1066,4,543.64,1096.85,5.70,6019,422,-74.38,13,5,-56.60,6.57,30.50,26.00,18,11,0.06,0.12,0.06,0.29,0.00,0.00,0,0, +1746046332177,19,1071,1083,529.50,1076.18,1093.99,5224,4487,-66.25,16,5,-48.47,6.83,26.00,27.00,19,12,0.06,0.07,0.19,0.11,0.00,0.00,0,0, +1746046332177,24,1066,4,693.91,1096.65,5.70,5820,375,-78.08,13,5,-60.30,6.47,29.50,27.00,19,11,0.14,0.11,0.06,0.29,0.00,0.00,0,0, +1746046333177,19,1083,1083,661.20,1088.42,1094.25,5399,4481,-66.25,16,12,-44.67,17.80,25.50,26.00,19,12,0.12,0.10,0.19,0.11,0.00,0.00,0,0, +1746046333177,24,1066,4,573.40,1096.73,5.68,5952,339,-75.42,12,5,-57.64,6.54,30.50,28.00,17,11,0.08,0.13,0.06,0.29,0.00,0.00,0,0, +1746046334177,19,1071,1083,694.46,1076.31,1105.40,6532,4844,-66.31,16,27,-41.21,43.45,26.00,27.00,18,7,0.08,0.11,0.19,0.11,0.00,0.00,0,0, +1746046334177,24,1066,4,757.20,1096.89,5.70,5830,402,-77.67,12,5,-59.89,6.48,25.50,27.00,19,11,0.08,0.13,0.06,0.30,0.00,0.00,0,0, +1746046335177,19,1071,1047,687.82,1076.38,1051.41,7779,4590,-66.00,16,5,-48.22,6.84,26.00,28.00,19,9,0.14,0.04,0.19,0.11,0.00,0.00,0,0, +1746046335177,24,1066,4,740.80,1105.24,5.78,6069,402,-83.75,12,5,-65.97,6.35,26.00,27.00,19,11,0.05,0.11,0.06,0.30,0.00,0.00,0,0, +1746046336177,19,1071,1083,499.56,1076.23,1093.94,5226,4730,-66.00,16,101,-35.16,189.56,25.00,27.00,19,12,0.13,0.06,0.19,0.11,0.00,0.00,0,0, +1746046336177,24,1078,4,581.80,1108.60,5.70,5746,336,-83.75,12,5,-65.97,6.35,30.50,27.00,16,11,0.14,0.11,0.06,0.30,0.00,0.00,0,0, +1746046337177,19,1071,1083,876.67,1076.27,1094.39,5727,4271,-66.25,16,5,-48.47,6.83,26.50,27.00,19,11,0.10,0.09,0.19,0.11,0.00,0.00,0,0, +1746046337177,24,1066,4,464.73,1105.24,5.75,6006,343,-76.44,16,5,-58.66,6.52,33.50,27.00,16,11,0.06,0.13,0.06,0.30,0.00,0.00,0,0, +1746046338177,19,1083,1018,435.50,1076.41,1035.91,5677,4306,-66.38,16,5,-48.59,6.83,27.50,27.00,19,13,0.09,0.05,0.19,0.11,0.00,0.00,0,0, +1746046338177,24,1066,4,632.50,1088.30,5.66,5780,412,-77.50,14,5,-59.72,6.49,29.50,28.00,19,11,0.07,0.10,0.06,0.30,0.00,0.00,0,0, +1746046339177,19,1071,1087,602.67,1088.40,1094.50,5137,4461,-66.06,16,5,-48.28,6.84,25.50,26.00,19,10,0.13,0.18,0.19,0.11,0.00,0.00,0,0, +1746046339177,24,1066,4,741.10,1088.38,5.60,6097,358,-89.00,15,5,-71.22,6.25,26.00,26.00,19,10,0.10,0.15,0.06,0.30,0.00,0.00,0,0, +1746046340177,19,1059,1095,753.30,1064.25,1105.83,6316,4780,-66.06,16,5,-48.28,6.84,27.50,27.00,18,9,0.08,0.06,0.19,0.11,0.00,0.00,0,0, +1746046340177,24,1066,4,687.44,1071.31,5.53,6044,422,-89.00,15,5,-71.22,6.25,28.50,28.00,18,10,0.10,0.08,0.06,0.30,0.00,0.00,0,0, +1746046341177,19,1083,1083,814.36,1088.31,1092.17,5610,4615,-66.31,16,106,-35.27,199.31,25.50,27.00,19,12,0.09,0.09,0.19,0.11,0.00,0.00,0,0, +1746046341177,24,1066,4,598.55,1071.59,5.55,6338,348,-78.07,15,5,-60.29,6.47,26.00,25.00,19,10,0.05,0.08,0.06,0.30,0.00,0.00,0,0, +1746046342177,19,1071,1018,558.90,1076.22,1041.27,5135,4494,-66.19,16,5,-48.41,6.84,27.50,28.00,19,11,0.14,0.14,0.19,0.11,0.00,0.00,0,0, +1746046342177,24,1078,4,764.78,1083.42,5.50,6308,389,-69.79,14,5,-52.00,6.71,26.00,29.00,19,10,0.05,0.07,0.06,0.29,0.00,0.00,0,0, +1746046343177,19,1071,1083,652.92,1076.50,1087.71,5970,4496,-66.44,16,5,-48.66,6.83,25.50,26.00,18,12,0.14,0.05,0.19,0.11,0.00,0.00,0,0, +1746046343177,24,1066,4,775.82,1071.43,5.55,6306,397,-76.07,14,5,-58.29,6.53,31.50,26.00,19,10,0.09,0.07,0.06,0.29,0.00,0.00,0,0, +1746046344177,19,1083,1083,624.88,1076.26,1091.26,4876,4539,-66.19,16,5,-48.41,6.84,26.00,27.00,19,12,0.05,0.13,0.19,0.11,0.00,0.00,0,0, +1746046344177,24,1066,4,829.27,1079.04,5.61,6365,402,-76.86,14,5,-59.08,6.50,29.00,27.00,20,10,0.05,0.09,0.06,0.29,0.00,0.00,0,0, +1746046345177,19,1071,1075,626.45,1088.36,1094.35,6097,4502,-66.19,16,5,-48.41,6.84,26.50,28.00,19,8,0.14,0.13,0.19,0.11,0.00,0.00,0,0, +1746046345177,24,1066,4,698.20,1071.43,5.55,6256,349,-76.86,14,5,-59.08,6.50,27.00,27.00,19,10,0.09,0.07,0.06,0.29,0.00,0.00,0,0, +1746046346177,19,1071,1083,1099.10,1076.28,1090.66,6965,4757,-66.12,16,5,-48.34,6.84,26.00,27.00,17,9,0.09,0.05,0.19,0.11,0.00,0.00,0,0, +1746046346177,24,1066,4,584.56,1071.27,5.49,6045,376,-82.00,14,5,-64.22,6.38,28.50,26.00,20,10,0.05,0.06,0.06,0.28,0.00,0.00,0,0, +1746046347177,19,1059,1083,623.40,1064.07,1090.34,5104,4812,-66.31,16,5,-48.53,6.83,25.50,26.00,19,12,0.06,0.08,0.19,0.11,0.00,0.00,0,0, +1746046347177,24,1066,4,615.70,1079.04,5.58,6361,418,-78.23,13,5,-60.45,6.47,32.00,26.00,17,10,0.10,0.08,0.07,0.28,0.00,0.00,0,0, +1746046348177,19,1083,1030,753.11,1088.26,1098.95,5074,4619,-65.88,16,5,-48.09,6.85,26.00,28.00,19,12,0.14,0.10,0.19,0.11,0.00,0.00,0,0, +1746046348177,24,1078,4,604.50,1091.03,5.58,6315,431,-74.38,13,5,-56.60,6.57,25.50,28.00,17,11,0.05,0.07,0.07,0.28,0.00,0.00,0,0, +1746046349177,19,1071,1099,673.80,1076.23,1058.93,5174,4361,-65.88,16,5,-48.09,6.85,26.00,27.00,18,12,0.15,0.09,0.19,0.11,0.00,0.00,0,0, +1746046349177,24,1066,4,312.20,1088.22,5.66,5714,353,-74.38,13,5,-56.60,6.57,31.00,27.00,18,11,0.13,0.09,0.07,0.28,0.00,0.00,0,0, +1746046350177,19,1071,1083,646.56,1076.38,1091.15,5232,4758,-66.00,16,5,-48.22,6.84,27.00,27.00,18,12,0.06,0.10,0.19,0.11,0.00,0.00,0,0, +1746046350177,24,1066,4,922.70,1113.71,5.83,6100,417,-79.33,15,5,-61.55,6.44,26.50,27.00,18,11,0.06,0.11,0.07,0.28,0.00,0.00,0,0, +1746046351177,19,1071,1095,617.10,1076.19,1107.63,5076,4622,-66.12,16,5,-48.34,6.84,26.00,27.00,19,12,0.11,0.10,0.19,0.11,0.00,0.00,0,0, +1746046351177,24,1066,4,898.50,1071.55,5.53,5701,422,-79.00,14,5,-61.22,6.45,29.50,26.00,16,11,0.17,0.09,0.07,0.28,0.00,0.00,0,0, +1746046352177,19,1083,1083,721.90,1088.44,1096.80,6091,4692,-66.00,16,28,-40.74,45.36,26.00,26.00,18,10,0.10,0.08,0.19,0.11,0.00,0.00,0,0, +1746046352177,24,1066,4,674.78,1088.14,5.64,5585,421,-81.90,10,5,-64.12,6.39,27.50,27.00,16,11,0.07,0.10,0.07,0.28,0.00,0.00,0,0, +1746046353177,19,1071,1023,411.75,1076.26,1032.54,5570,4461,-66.06,16,5,-48.28,6.84,26.00,28.00,19,12,0.09,0.20,0.19,0.11,0.00,0.00,0,0, +1746046353177,24,1066,4,646.55,1088.34,5.64,5841,395,-78.50,6,5,-60.72,6.46,30.00,27.00,20,11,0.07,0.12,0.07,0.28,0.00,0.00,0,0, +1746046354177,19,1071,1083,804.36,1076.22,1093.14,7047,4603,-66.06,16,5,-48.28,6.84,25.50,26.00,18,7,0.10,0.09,0.19,0.11,0.00,0.00,0,0, +1746046354177,24,1078,4,544.20,1108.88,5.72,6079,431,-78.50,6,5,-60.72,6.46,30.00,26.00,17,11,0.12,0.13,0.07,0.28,0.00,0.00,0,0, +1746046355177,19,1071,1131,599.27,1076.22,1149.06,7142,4900,-66.00,16,106,-34.96,200.14,26.00,26.00,19,11,0.08,0.04,0.19,0.11,0.00,0.00,0,0, +1746046355177,24,1066,4,903.40,1079.86,5.58,5686,421,-77.40,10,5,-59.62,6.49,24.50,28.00,18,11,0.05,0.08,0.07,0.28,0.00,0.00,0,0, +1746046356177,19,1071,1023,301.25,1076.22,1034.43,5122,4253,-66.25,16,5,-48.47,6.83,26.00,27.00,19,12,0.10,0.14,0.19,0.11,0.00,0.00,0,0, +1746046356177,24,1066,4,616.70,1096.85,5.72,6154,446,-81.92,12,5,-64.14,6.39,24.50,27.00,17,11,0.11,0.12,0.07,0.28,0.00,0.00,0,0, +1746046357177,19,1071,1083,746.50,1076.21,1098.78,5828,4698,-66.44,16,13,-44.51,19.41,24.50,27.00,19,8,0.12,0.12,0.19,0.11,0.00,0.00,0,0, +1746046357177,24,1066,4,406.80,1071.43,5.53,5701,431,-83.78,9,5,-66.00,6.35,25.00,26.00,19,11,0.04,0.11,0.07,0.28,0.00,0.00,0,0, +1746046358177,19,1083,1095,258.90,1088.26,1102.43,7042,4400,-66.44,16,29,-41.02,46.97,27.00,27.00,18,9,0.14,0.05,0.19,0.11,0.00,0.00,0,0, +1746046358177,24,1066,4,557.80,1096.85,5.70,6013,412,-83.78,9,5,-66.00,6.35,24.00,27.00,19,11,0.19,0.11,0.07,0.29,0.00,0.00,0,0, +1746046359177,19,1071,1030,659.73,1076.37,1031.13,5951,4695,-66.33,15,5,-48.55,6.83,27.00,27.00,17,8,0.06,0.16,0.19,0.11,0.00,0.00,0,0, +1746046359177,24,1066,4,680.60,1080.10,5.61,6810,413,-75.00,8,5,-57.22,6.55,28.50,26.00,17,8,0.12,0.10,0.07,0.28,0.00,0.00,0,0, +1746046360177,19,1071,1075,448.17,1076.60,1092.06,7116,4655,-66.00,16,5,-48.22,6.84,25.50,27.00,19,8,0.12,0.05,0.19,0.11,0.00,0.00,0,0, +1746046360177,24,1078,4,896.64,1083.58,5.53,7090,418,-86.38,8,5,-68.59,6.30,29.00,28.00,17,10,0.09,0.04,0.07,0.28,0.00,0.00,0,0, +1746046361177,19,1071,1071,534.50,1076.29,1087.70,5351,5012,-66.25,16,5,-48.47,6.83,25.00,28.00,14,11,0.12,0.20,0.19,0.11,0.00,0.00,0,0, +1746046361177,24,1066,4,373.70,1091.94,5.57,5843,426,-89.20,10,5,-71.42,6.24,30.00,26.00,17,11,0.08,0.13,0.07,0.28,0.00,0.00,0,0, +1746046362177,19,1071,1071,901.70,1083.98,1081.05,6488,5447,-66.25,16,5,-48.47,6.83,25.50,26.00,16,9,0.04,0.08,0.19,0.11,0.00,0.00,0,0, +1746046362177,24,1066,4,522.44,1088.18,5.64,5793,412,-81.10,10,5,-63.32,6.40,30.50,27.00,18,11,0.05,0.11,0.07,0.28,0.00,0.00,0,0, +1746046363177,19,1083,1083,523.30,1088.07,1093.43,5261,4623,-66.25,16,5,-48.47,6.83,24.50,27.00,18,13,0.13,0.22,0.19,0.11,0.00,0.00,0,0, +1746046363177,24,1066,4,665.33,1096.86,10.54,5958,489,-81.10,10,5,-63.32,6.40,30.00,27.00,20,11,0.17,0.13,0.07,0.28,0.00,0.00,0,0, +1746046364177,19,1059,1083,687.50,1065.14,1089.73,7969,4776,-66.62,16,5,-48.84,6.82,26.50,28.00,18,5,0.05,0.13,0.19,0.11,0.00,0.00,0,0, +1746046364177,24,1066,4,639.70,1079.74,5.54,5675,421,-81.45,11,5,-63.67,6.40,26.00,26.00,17,11,0.08,0.12,0.07,0.28,0.00,0.00,0,0, +1746046365177,19,1083,1030,817.29,1091.38,1098.95,11012,4626,-66.19,16,14,-43.93,21.09,25.00,28.00,19,6,0.11,0.05,0.19,0.11,0.00,0.00,0,0, +1746046365177,24,1066,4,557.10,1113.71,5.78,5964,395,-73.90,10,5,-56.12,6.58,26.50,27.00,20,11,0.10,0.11,0.07,0.28,0.00,0.00,0,0, +1746046366177,19,1071,1099,681.00,1084.64,1060.02,5999,4366,-66.06,16,5,-48.28,6.84,27.00,26.00,19,13,0.13,0.21,0.19,0.11,0.00,0.00,0,0, +1746046366177,24,1078,4,334.18,1100.37,5.66,5904,431,-73.82,11,5,-56.04,6.59,25.50,27.00,13,11,0.16,0.13,0.07,0.28,0.00,0.00,0,0, +1746046367177,19,1059,1083,617.00,1064.34,1091.30,5949,4770,-66.00,16,5,-48.22,6.84,27.00,27.00,18,9,0.06,0.09,0.19,0.11,0.00,0.00,0,0, +1746046367177,24,1066,4,374.80,1088.26,5.64,5713,425,-79.86,14,5,-62.08,6.43,27.50,26.00,13,11,0.07,0.10,0.07,0.28,0.00,0.00,0,0, +1746046368177,19,1083,1083,660.22,1088.33,1094.06,6154,4514,-66.00,16,5,-48.22,6.84,27.00,27.00,19,12,0.10,0.06,0.19,0.11,0.00,0.00,0,0, +1746046368177,24,1066,4,499.50,1105.20,5.75,6059,422,-79.86,14,23,-55.45,33.12,27.50,26.00,20,11,0.04,0.12,0.07,0.29,0.00,0.00,0,0, +1746046369177,19,1083,1018,537.82,1088.31,1083.79,5059,4484,-66.12,16,5,-48.34,6.84,26.00,25.00,19,10,0.10,0.14,0.19,0.11,0.00,0.00,0,0, +1746046369177,24,1066,4,647.60,1088.18,5.64,5648,427,-77.07,15,5,-59.29,6.50,32.00,26.00,18,11,0.09,0.09,0.07,0.28,0.00,0.00,0,0, +1746046370177,19,1071,1147,455.20,1076.30,1104.40,6349,4481,-66.00,16,5,-48.22,6.84,26.50,27.00,19,11,0.10,0.05,0.19,0.11,0.00,0.00,0,0, +1746046370177,24,1066,4,532.10,1088.30,5.64,5846,394,-77.50,12,5,-59.72,6.49,25.00,26.00,20,11,0.08,0.10,0.07,0.29,0.00,0.00,0,0, +1746046371177,19,1071,1023,596.55,1076.26,1035.37,5253,4264,-66.12,16,5,-48.34,6.84,27.00,28.00,19,11,0.14,0.11,0.19,0.11,0.00,0.00,0,0, +1746046371177,24,1066,4,846.64,1096.65,5.68,5755,421,-82.62,16,5,-64.84,6.37,27.50,26.00,17,11,0.10,0.10,0.07,0.29,0.00,0.00,0,0, +1746046372177,19,1071,1083,776.30,1076.29,1093.65,5872,4517,-66.12,16,5,-48.34,6.84,25.00,26.00,19,12,0.07,0.05,0.19,0.11,0.00,0.00,0,0, +1746046372177,24,1078,4,580.75,1122.06,5.81,6140,426,-82.62,16,5,-64.84,6.37,25.50,26.00,19,11,0.04,0.11,0.07,0.29,0.00,0.00,0,0, +1746046373177,19,1071,1083,494.20,1076.31,1094.65,5837,4478,-66.19,16,106,-35.14,199.64,25.50,28.00,19,8,0.08,0.13,0.19,0.11,0.00,0.00,0,0, +1746046373177,24,1066,4,563.22,1091.98,5.66,6139,366,-73.43,14,5,-55.65,6.60,26.50,26.00,19,10,0.22,0.11,0.07,0.29,0.00,0.00,0,0, +1746046374177,19,1071,1083,751.30,1076.25,1095.36,7030,4508,-66.44,16,5,-48.66,6.83,26.50,28.00,19,9,0.08,0.05,0.19,0.11,0.00,0.00,0,0, +1746046374177,24,1066,4,645.45,1071.59,5.53,6447,426,-79.00,15,5,-61.22,6.45,25.50,26.00,16,10,0.08,0.10,0.07,0.29,0.00,0.00,0,0, +1746046375177,19,1083,1083,420.40,1088.42,1093.46,5054,4493,-66.00,16,13,-44.07,19.47,25.50,28.00,19,11,0.13,0.18,0.19,0.11,0.00,0.00,0,0, +1746046375177,24,1066,4,502.00,1071.43,5.55,6251,422,-87.20,15,5,-69.42,6.28,26.50,27.00,20,10,0.04,0.08,0.07,0.28,0.00,0.00,0,0, +1746046376177,19,1071,1083,717.82,1076.43,1091.18,6485,4720,-66.31,16,28,-41.05,45.23,26.00,27.00,18,10,0.08,0.06,0.19,0.11,0.00,0.00,0,0, +1746046376177,24,1066,4,467.10,1071.43,5.49,6379,388,-80.77,13,5,-62.99,6.41,30.00,27.00,17,10,0.13,0.06,0.07,0.28,0.00,0.00,0,0, +1746046377177,19,1071,1023,1083.18,1076.60,1034.46,5611,4614,-66.31,16,5,-48.53,6.83,27.00,27.00,19,10,0.07,0.17,0.19,0.11,0.00,0.00,0,0, +1746046377177,24,1066,4,668.20,1088.30,5.64,5841,423,-80.77,13,5,-62.99,6.41,28.00,28.00,18,11,0.05,0.11,0.07,0.28,0.00,0.00,0,0, +1746046378177,19,1059,1083,822.44,1064.22,1093.40,6312,4234,-66.19,16,5,-48.41,6.84,27.00,27.00,19,9,0.10,0.06,0.19,0.11,0.00,0.00,0,0, +1746046378177,24,1078,4,382.83,1088.34,5.58,5845,417,-79.33,12,5,-61.55,6.44,30.00,26.00,17,11,0.14,0.09,0.08,0.28,0.00,0.00,0,0, +1746046379177,19,1083,1071,602.30,1088.50,1093.66,5883,4610,-66.06,16,5,-48.28,6.84,26.50,26.00,18,9,0.10,0.21,0.19,0.11,0.00,0.00,0,0, +1746046379177,24,1066,4,351.60,1117.27,5.81,5920,436,-91.88,8,5,-74.09,6.20,28.00,26.00,17,11,0.05,0.15,0.07,0.28,0.00,0.00,0,0, +1746046380177,19,1059,1083,922.40,1064.59,1092.16,8805,4685,-66.25,16,5,-48.47,6.83,27.50,26.00,19,6,0.12,0.07,0.19,0.11,0.00,0.00,0,0, +1746046380177,24,1066,4,806.80,1071.27,5.55,5632,370,-77.00,13,5,-59.22,6.50,25.50,26.00,17,11,0.23,0.10,0.08,0.28,0.00,0.00,0,0, +1746046381177,19,1083,1083,754.33,1088.54,1092.30,7463,4654,-66.25,16,106,-35.21,199.47,24.50,27.00,18,13,0.10,0.04,0.19,0.11,0.00,0.00,0,0, +1746046381177,24,1066,4,711.78,1088.30,5.62,5780,425,-77.00,13,5,-59.22,6.50,33.00,26.00,13,11,0.11,0.10,0.08,0.28,0.00,0.00,0,0, +1746046382177,19,1083,1042,411.18,1088.30,1053.18,4989,4786,-66.31,16,13,-44.38,19.42,26.00,27.00,19,12,0.11,0.10,0.19,0.11,0.00,0.00,0,0, +1746046382177,24,1066,4,641.00,1088.22,5.64,5648,429,-84.50,12,5,-66.72,6.33,25.00,26.00,15,11,0.04,0.10,0.08,0.28,0.00,0.00,0,0, +1746046383177,19,1071,1075,534.70,1076.17,1086.78,5050,4454,-66.25,16,5,-48.47,6.83,27.00,27.00,18,12,0.08,0.11,0.19,0.11,0.00,0.00,0,0, +1746046383177,24,1066,4,750.70,1105.22,6.23,5931,524,-78.50,14,5,-60.72,6.46,25.00,25.00,19,11,0.16,0.11,0.08,0.28,0.00,0.00,0,0, +1746046384177,19,1071,1083,575.50,1076.37,1150.70,6169,4847,-66.25,16,5,-48.47,6.83,26.00,28.00,18,8,0.17,0.09,0.19,0.11,0.00,0.00,0,0, +1746046384177,24,1078,4,284.10,1088.34,5.54,5718,391,-82.80,10,5,-65.02,6.37,25.50,27.00,19,11,0.10,0.10,0.08,0.28,0.00,0.00,0,0, +1746046385177,19,1071,1071,832.67,1076.48,1089.38,6579,4914,-66.25,16,5,-48.47,6.83,26.50,27.00,17,12,0.06,0.04,0.19,0.11,0.00,0.00,0,0, +1746046385177,24,1066,4,530.22,1108.68,5.75,5947,397,-87.71,14,5,-69.93,6.27,30.00,25.00,20,11,0.05,0.09,0.08,0.28,0.00,0.00,0,0, +1746046386177,19,1059,1083,481.89,1064.28,1092.95,5518,4628,-66.25,16,5,-48.47,6.83,27.00,26.00,19,11,0.15,0.09,0.19,0.11,0.00,0.00,0,0, +1746046386177,24,1066,4,924.50,1096.77,5.70,5821,422,-87.71,14,5,-69.93,6.27,29.00,25.00,17,11,0.13,0.09,0.08,0.28,0.00,0.00,0,0, +1746046387177,19,1095,1083,438.90,1100.50,1091.10,5727,4725,-66.38,16,5,-48.59,6.83,27.00,28.00,18,12,0.07,0.08,0.19,0.11,0.00,0.00,0,0, +1746046387177,24,1066,4,533.00,1096.85,5.70,5955,426,-85.71,14,5,-67.93,6.31,32.00,25.00,17,11,0.05,0.11,0.08,0.29,0.00,0.00,0,0, +1746046388177,19,1071,1083,535.55,1076.33,1092.72,5157,4579,-66.31,16,13,-44.38,19.42,25.00,25.00,19,12,0.12,0.12,0.19,0.11,0.00,0.00,0,0, +1746046388177,24,1066,4,401.91,1110.90,5.73,6020,402,-82.27,15,5,-64.49,6.38,24.50,27.00,19,11,0.13,0.12,0.08,0.29,0.00,0.00,0,0, +1746046389177,19,1071,1035,430.91,1076.30,1047.78,5254,4585,-66.25,16,5,-48.47,6.83,26.50,26.00,18,12,0.08,0.12,0.19,0.11,0.00,0.00,0,0, +1746046389177,24,1066,4,597.09,1105.28,5.75,6055,418,-78.88,16,5,-61.09,6.46,25.00,27.00,17,11,0.10,0.13,0.08,0.29,0.00,0.00,0,0, +1746046390177,19,1071,1083,573.64,1076.44,1092.74,5130,4532,-66.25,16,5,-48.47,6.83,26.50,26.00,19,12,0.13,0.09,0.19,0.11,0.00,0.00,0,0, +1746046390177,24,1078,4,817.67,1113.55,5.77,5903,436,-78.88,16,5,-61.09,6.46,30.00,27.00,19,11,0.05,0.10,0.08,0.29,0.00,0.00,0,0, +1746046391177,19,1071,1071,759.00,1076.30,1092.06,5141,4682,-66.19,16,5,-48.41,6.84,26.00,27.00,18,12,0.08,0.07,0.19,0.11,0.00,0.00,0,0, +1746046391177,24,1066,4,621.64,1125.70,5.83,6157,407,-77.67,15,5,-59.89,6.48,31.00,27.00,19,11,0.10,0.14,0.08,0.29,0.00,0.00,0,0, +1746046392177,19,1059,1083,589.89,1064.39,1092.65,5164,4629,-66.00,16,5,-48.22,6.84,27.00,27.00,19,12,0.14,0.08,0.19,0.11,0.00,0.00,0,0, +1746046392177,24,1066,4,373.00,1071.31,5.53,5635,412,-86.15,13,5,-68.37,6.30,29.50,27.00,19,11,0.14,0.12,0.08,0.29,0.00,0.00,0,0, +1746046393177,19,1095,1083,441.44,1100.43,1091.05,5246,4744,-66.19,16,5,-48.41,6.84,26.50,27.00,18,12,0.07,0.09,0.19,0.11,0.00,0.00,0,0, +1746046393177,24,1066,4,523.40,1088.34,5.64,5912,422,-76.79,14,5,-59.00,6.51,30.00,26.00,18,11,0.13,0.11,0.08,0.29,0.00,0.00,0,0, +1746046394177,19,1071,1095,459.80,1076.34,1102.65,5101,4385,-66.31,16,29,-40.90,47.02,26.00,27.00,18,12,0.17,0.12,0.19,0.11,0.00,0.00,0,0, +1746046394177,24,1066,4,546.50,1088.26,5.66,5647,412,-94.67,9,5,-76.89,6.16,26.00,26.00,18,11,0.09,0.10,0.08,0.29,0.00,0.00,0,0, +1746046395177,19,1071,1071,680.09,1076.47,1088.57,5194,4949,-66.31,16,36,-39.96,59.74,25.50,26.00,17,11,0.07,0.17,0.19,0.11,0.00,0.00,0,0, +1746046395177,24,1066,4,724.50,1096.73,5.66,5827,371,-94.67,9,5,-76.89,6.16,27.00,25.00,19,11,0.15,0.12,0.08,0.29,0.00,0.00,0,0, +1746046396177,19,1071,1018,595.11,1076.38,1031.22,6245,4516,-66.38,16,5,-48.59,6.83,26.00,27.00,18,10,0.13,0.07,0.19,0.11,0.00,0.00,0,0, +1746046396177,24,1078,4,505.12,1088.22,10.44,5601,529,-81.45,11,5,-63.67,6.40,31.00,27.00,18,11,0.16,0.11,0.08,0.29,0.00,0.00,0,0, +1746046397177,19,1071,1083,744.90,1076.55,1089.18,5975,4993,-66.38,16,5,-48.59,6.83,26.50,28.00,18,12,0.08,0.21,0.19,0.11,0.00,0.00,0,0, +1746046397177,24,1066,4,505.33,1108.88,5.70,6260,417,-80.70,10,5,-62.92,6.41,32.50,25.00,18,10,0.06,0.13,0.08,0.29,0.00,0.00,0,0, +1746046398177,19,1059,1087,710.60,1064.34,1106.49,7560,4435,-66.19,16,5,-48.41,6.84,26.00,26.00,19,6,0.13,0.10,0.19,0.11,0.00,0.00,0,0, +1746046398177,24,1066,4,629.80,1071.39,5.55,6247,370,-82.14,7,5,-64.36,6.38,25.50,25.00,19,9,0.16,0.10,0.08,0.29,0.00,0.00,0,0, +1746046399177,19,1095,1083,708.42,1100.65,1091.15,8787,4744,-66.25,16,5,-48.47,6.83,27.00,27.00,18,10,0.07,0.04,0.19,0.11,0.00,0.00,0,0, +1746046399177,24,1066,4,661.45,1071.55,5.53,6512,402,-76.38,13,5,-58.60,6.52,31.50,26.00,19,10,0.13,0.06,0.08,0.29,0.00,0.00,0,0, +1746046400177,19,1071,1059,401.55,1076.34,1068.40,5057,4442,-66.25,16,5,-48.47,6.83,26.00,27.00,18,12,0.16,0.18,0.19,0.11,0.00,0.00,0,0, +1746046400177,24,1066,4,721.60,1088.30,5.66,6016,417,-76.38,13,5,-58.60,6.52,26.00,26.00,17,11,0.14,0.10,0.08,0.29,0.00,0.00,0,0, +1746046401177,19,1059,1083,728.90,1064.38,1090.26,7310,4799,-66.44,16,5,-48.66,6.83,26.50,28.00,18,7,0.05,0.09,0.19,0.11,0.00,0.00,0,0, +1746046401177,24,1066,4,862.27,1105.36,5.71,6200,416,-83.13,15,5,-65.35,6.36,29.50,27.00,17,11,0.06,0.10,0.08,0.29,0.00,0.00,0,0, +1746046402177,19,1083,1083,303.70,1088.34,1093.50,7291,4578,-66.19,16,5,-48.41,6.84,26.00,26.00,18,12,0.13,0.03,0.19,0.11,0.00,0.00,0,0, +1746046402177,24,1078,4,722.88,1088.30,5.60,5774,386,-85.94,16,5,-68.16,6.30,30.00,27.00,19,11,0.06,0.12,0.08,0.29,0.00,0.00,0,0, +1746046403177,19,1071,1018,726.30,1076.42,1033.96,5310,4731,-66.12,16,5,-48.34,6.84,26.00,27.00,20,10,0.05,0.21,0.19,0.11,0.00,0.00,0,0, +1746046403177,24,1066,4,666.45,1100.29,5.66,5903,375,-72.93,15,5,-55.15,6.61,26.00,27.00,19,11,0.14,0.13,0.08,0.29,0.00,0.00,0,0, +1746046404177,19,1071,1099,794.36,1076.26,1115.97,7638,4341,-66.12,16,5,-48.34,6.84,26.00,27.00,18,7,0.12,0.07,0.19,0.11,0.00,0.00,0,0, +1746046404177,24,1066,4,669.60,1096.57,5.70,5755,412,-72.93,15,5,-55.15,6.61,30.00,26.00,19,11,0.09,0.09,0.08,0.29,0.00,0.00,0,0, +1746046405177,19,1083,1143,524.89,1064.43,1148.79,6482,5009,-66.19,16,5,-48.41,6.84,26.50,27.00,18,12,0.05,0.06,0.19,0.11,0.00,0.00,0,0, +1746046405177,24,1066,4,664.17,1096.85,5.70,6085,370,-77.77,13,5,-59.99,6.48,31.00,27.00,21,11,0.07,0.10,0.08,0.29,0.00,0.00,0,0, +1746046406177,19,1071,1023,459.50,1100.33,1033.97,5223,4362,-65.94,16,5,-48.16,6.85,26.50,27.00,18,12,0.14,0.10,0.19,0.11,0.00,0.00,0,0, +1746046406177,24,1066,4,624.40,1088.22,5.60,5713,436,-71.08,12,5,-53.30,6.67,26.00,27.00,16,11,0.11,0.10,0.08,0.29,0.00,0.00,0,0, +1746046407177,19,1059,1071,368.30,1064.36,1090.65,5676,4779,-66.31,16,5,-48.53,6.83,26.50,27.00,18,9,0.05,0.12,0.19,0.11,0.00,0.00,0,0, +1746046407177,24,1066,4,619.40,1113.67,5.81,6235,423,-62.67,9,5,-44.89,6.98,29.00,26.00,18,11,0.04,0.11,0.08,0.29,0.00,0.00,0,0, +1746046408177,19,1071,1083,809.12,1076.56,1092.62,6302,4589,-66.12,16,5,-48.34,6.84,27.00,27.00,18,11,0.13,0.04,0.19,0.11,0.00,0.00,0,0, +1746046408177,24,1066,4,973.25,1088.38,5.64,5907,427,-78.46,13,5,-60.68,6.47,25.50,28.00,16,11,0.16,0.11,0.08,0.29,0.00,0.00,0,0, +1746046409177,19,1083,1083,903.45,1088.38,1090.92,4844,4769,-66.12,16,5,-48.34,6.84,26.50,27.00,18,11,0.05,0.15,0.19,0.11,0.00,0.00,0,0, +1746046409177,24,1078,4,529.27,1100.37,5.64,5904,408,-78.46,13,5,-60.68,6.47,29.50,27.00,16,11,0.07,0.11,0.08,0.29,0.00,0.00,0,0, +1746046410177,19,1071,1035,524.75,1076.43,1049.01,5823,4441,-66.19,16,5,-48.41,6.84,27.00,27.00,18,11,0.13,0.05,0.19,0.11,0.00,0.00,0,0, +1746046410177,24,1066,4,571.40,1096.81,5.66,5885,356,-72.56,16,5,-54.78,6.62,26.00,26.00,18,11,0.05,0.14,0.08,0.29,0.00,0.00,0,0, +1746046411177,19,1083,1083,610.46,1084.82,1090.46,5321,4782,-66.12,16,5,-48.34,6.84,26.00,27.00,19,11,0.05,0.14,0.19,0.11,0.00,0.00,0,0, +1746046411177,24,1066,4,661.09,1096.69,5.66,5823,402,-92.62,13,5,-74.83,6.19,26.50,27.00,17,11,0.18,0.12,0.08,0.29,0.00,0.00,0,0, +1746046412177,19,1071,1107,559.22,1079.82,1116.04,5837,4856,-66.19,16,28,-40.92,45.29,23.50,27.00,18,11,0.10,0.07,0.19,0.11,0.00,0.00,0,0, +1746046412177,24,1066,4,793.18,1105.20,5.75,5928,426,-85.10,10,5,-67.32,6.32,26.00,24.00,16,11,0.08,0.11,0.08,0.29,0.00,0.00,0,0, +1746046413177,19,1071,1018,677.36,1076.48,1038.25,5511,4698,-66.19,16,12,-44.60,17.81,24.50,27.00,19,12,0.08,0.06,0.19,0.11,0.00,0.00,0,0, +1746046413177,24,1066,4,542.55,1088.36,7.87,5714,502,-85.10,10,5,-67.32,6.32,29.50,27.00,20,11,0.09,0.10,0.08,0.29,0.00,0.00,0,0, +1746046414177,19,1071,1083,307.00,1076.32,1087.98,4828,4488,-66.25,16,5,-48.47,6.83,27.00,27.00,18,11,0.08,0.21,0.19,0.11,0.00,0.00,0,0, +1746046414177,24,1066,4,534.44,1096.81,5.70,5948,418,-82.71,14,5,-64.93,6.37,29.00,27.00,16,11,0.11,0.13,0.08,0.29,0.00,0.00,0,0, +1746046415177,19,1059,1075,816.44,1064.33,1092.46,6808,4664,-66.00,16,5,-48.22,6.84,25.00,27.00,19,8,0.08,0.07,0.19,0.11,0.00,0.00,0,0, +1746046415177,24,1078,4,698.90,1100.41,5.66,5904,426,-78.17,12,5,-60.39,6.47,30.00,27.00,18,11,0.04,0.11,0.08,0.29,0.00,0.00,0,0, +1746046416177,19,1083,1083,791.40,1088.50,1091.53,6094,4659,-66.06,16,5,-48.28,6.84,26.50,27.00,17,13,0.11,0.10,0.19,0.11,0.00,0.00,0,0, +1746046416177,24,1066,4,595.90,1110.82,5.68,6084,371,-82.21,14,5,-64.43,6.38,26.50,27.00,19,11,0.19,0.13,0.08,0.29,0.00,0.00,0,0, +1746046417177,19,1083,1083,473.55,1070.30,1089.42,7213,4872,-66.00,16,5,-48.22,6.84,26.00,29.00,19,7,0.06,0.11,0.19,0.11,0.00,0.00,0,0, +1746046417177,24,1066,4,900.91,1071.39,5.55,5635,421,-81.64,11,5,-63.85,6.39,27.50,27.00,17,11,0.07,0.12,0.08,0.29,0.00,0.00,0,0, +1746046418177,19,1071,1095,574.00,1094.71,1158.34,7840,4922,-66.00,16,28,-40.74,45.36,23.50,29.00,18,10,0.10,0.04,0.19,0.11,0.00,0.00,0,0, +1746046418177,24,1066,4,491.27,1088.26,5.60,5846,381,-81.64,11,5,-63.85,6.39,30.00,25.00,21,11,0.04,0.11,0.08,0.29,0.00,0.00,0,0, +1746046419177,19,1071,1023,838.42,1076.35,1032.38,5173,4495,-66.31,16,5,-48.53,6.83,25.00,27.00,19,12,0.07,0.09,0.19,0.11,0.00,0.00,0,0, +1746046419177,24,1066,4,600.36,1088.34,5.64,5780,426,-80.00,11,5,-62.22,6.43,26.50,26.00,15,11,0.13,0.11,0.08,0.29,0.00,0.00,0,0, +1746046420177,19,1071,1078,386.11,1076.42,1092.00,5168,4571,-66.06,16,5,-48.28,6.84,26.00,26.00,18,12,0.09,0.12,0.19,0.11,0.00,0.00,0,0, +1746046420177,24,1066,4,718.90,1079.94,5.58,5869,426,-87.82,11,5,-70.04,6.27,26.00,27.00,15,11,0.06,0.12,0.08,0.29,0.00,0.00,0,0, +1746046421177,19,1071,1087,694.18,1076.10,1095.55,5675,4768,-66.38,16,106,-35.33,199.14,23.50,27.00,19,7,0.08,0.16,0.19,0.11,0.00,0.00,0,0, +1746046421177,24,1078,4,582.00,1100.45,5.64,5849,375,-79.43,14,5,-61.65,6.44,24.50,27.00,20,11,0.08,0.14,0.08,0.29,0.00,0.00,0,0, +1746046422177,19,1059,1083,692.30,1064.48,1092.34,8126,4625,-66.38,16,5,-48.59,6.83,27.00,27.00,18,7,0.11,0.05,0.19,0.11,0.00,0.00,0,0, +1746046422177,24,1066,4,822.89,1071.35,5.55,6247,421,-79.43,14,5,-61.65,6.44,25.00,27.00,15,10,0.12,0.09,0.08,0.29,0.00,0.00,0,0, +1746046423177,19,1083,1071,586.33,1088.48,1091.80,6287,4714,-66.12,16,5,-48.34,6.84,27.00,28.00,19,10,0.11,0.12,0.19,0.11,0.00,0.00,0,0, +1746046423177,24,1066,4,781.50,1071.43,5.53,6117,421,-79.29,7,5,-61.50,6.45,31.00,27.00,16,10,0.05,0.07,0.08,0.29,0.00,0.00,0,0, +1746046424177,19,1071,1083,666.22,1076.27,1090.87,6240,4713,-66.00,16,5,-48.22,6.84,26.50,26.00,18,12,0.07,0.04,0.19,0.11,0.00,0.00,0,0, +1746046424177,24,1066,4,720.30,1083.47,10.39,6252,517,-75.27,11,5,-57.49,6.55,26.50,27.00,18,10,0.17,0.06,0.08,0.29,0.00,0.00,0,0, +1746046425177,19,1083,1042,474.30,1088.22,1049.20,4619,4492,-66.25,16,5,-48.47,6.83,27.00,26.00,18,13,0.15,0.13,0.19,0.11,0.00,0.00,0,0, +1746046425177,24,1066,4,578.00,1105.16,5.71,6073,339,-80.83,12,5,-63.05,6.41,25.50,27.00,17,11,0.07,0.11,0.08,0.29,0.00,0.00,0,0, +1746046426177,19,1071,1075,340.00,1076.31,1089.70,5687,4717,-66.12,16,5,-48.34,6.84,27.00,27.00,18,8,0.06,0.12,0.19,0.11,0.00,0.00,0,0, +1746046426177,24,1066,4,734.90,1071.31,5.53,5693,375,-76.47,15,5,-58.69,6.51,25.50,26.00,20,11,0.08,0.11,0.08,0.29,0.00,0.00,0,0, +1746046427177,19,1059,1095,657.00,1064.24,1108.21,6731,4743,-66.12,16,5,-48.34,6.84,26.00,27.00,18,10,0.14,0.04,0.19,0.11,0.00,0.00,0,0, +1746046427177,24,1078,4,569.90,1100.33,5.64,5836,412,-76.47,15,5,-58.69,6.51,25.00,27.00,18,11,0.12,0.12,0.08,0.29,0.00,0.00,0,0, +1746046428177,19,1083,1083,783.17,1088.32,1090.16,5393,4734,-66.00,16,5,-48.22,6.84,27.00,27.00,19,9,0.05,0.18,0.19,0.11,0.00,0.00,0,0, +1746046428177,24,1066,4,733.83,1096.73,5.70,5953,417,-81.07,14,5,-63.29,6.40,30.50,27.00,18,11,0.05,0.14,0.08,0.29,0.00,0.00,0,0, +1746046429177,19,1083,1018,647.11,1088.14,1035.92,6851,4385,-66.06,16,5,-48.28,6.84,27.00,26.00,18,8,0.11,0.06,0.19,0.11,0.00,0.00,0,0, +1746046429177,24,1066,4,978.70,1079.90,5.54,6382,426,-67.38,13,5,-49.60,6.79,30.00,27.00,16,10,0.13,0.08,0.08,0.29,0.00,0.00,0,0, +1746046430177,19,1071,1099,337.10,1082.06,1109.15,6091,4901,-66.25,16,5,-48.47,6.83,28.00,26.00,18,12,0.10,0.13,0.19,0.11,0.00,0.00,0,0, +1746046430177,24,1066,4,553.00,1071.59,5.53,6203,443,-81.38,13,5,-63.60,6.40,26.00,27.00,16,10,0.05,0.11,0.08,0.29,0.00,0.00,0,0, +1746046431177,19,1071,1095,602.36,1076.53,1109.18,5565,4880,-66.31,16,5,-48.53,6.83,26.00,27.00,18,10,0.13,0.13,0.19,0.11,0.00,0.00,0,0, +1746046431177,24,1066,4,560.40,1071.47,5.49,6178,370,-83.17,12,5,-65.39,6.36,29.00,27.00,19,10,0.18,0.07,0.08,0.29,0.00,0.00,0,0, +1746046432177,19,1071,1018,733.45,1076.14,1030.70,6289,4821,-66.31,16,5,-48.53,6.83,27.50,26.00,17,12,0.09,0.04,0.19,0.11,0.00,0.00,0,0, +1746046432177,24,1066,4,851.73,1071.63,5.49,6707,393,-83.17,12,5,-65.39,6.36,29.50,27.00,18,10,0.09,0.08,0.08,0.29,0.00,0.00,0,0, +1746046433177,19,1059,1099,642.56,1064.24,1105.06,5585,4670,-65.88,16,5,-48.09,6.85,26.00,27.00,19,7,0.10,0.15,0.19,0.11,0.00,0.00,0,0, +1746046433177,24,1078,4,751.78,1091.03,5.58,6372,373,-82.82,11,5,-65.04,6.37,33.00,27.00,18,10,0.07,0.08,0.08,0.29,0.00,0.00,0,0, +1746046434177,19,1083,1071,807.67,1088.60,1090.56,8339,4732,-66.38,16,5,-48.59,6.83,26.00,27.00,17,7,0.11,0.05,0.19,0.11,0.00,0.00,0,0, +1746046434177,24,1066,4,482.33,1079.90,5.61,6196,370,-82.27,15,5,-64.49,6.38,30.00,27.00,18,11,0.20,0.07,0.08,0.28,0.00,0.00,0,0, +1746046435177,19,1083,1083,625.62,1076.17,1088.35,5315,4941,-66.00,16,5,-48.22,6.84,27.00,30.00,17,12,0.05,0.11,0.19,0.11,0.00,0.00,0,0, +1746046435177,24,1066,4,746.56,1079.66,5.54,5541,421,-87.12,16,5,-69.34,6.28,26.50,27.00,16,11,0.08,0.07,0.08,0.28,0.00,0.00,0,0, +1746046436177,19,1071,1083,659.90,1088.46,1090.09,5119,4834,-66.00,16,5,-48.22,6.84,26.00,27.00,17,12,0.14,0.12,0.19,0.11,0.00,0.00,0,0, +1746046436177,24,1066,4,579.25,1096.85,5.70,6085,427,-87.12,16,5,-69.34,6.28,30.50,27.00,20,11,0.04,0.11,0.08,0.29,0.00,0.00,0,0, +1746046437177,19,1059,1071,760.11,1064.21,1087.94,5068,4910,-66.12,16,5,-48.34,6.84,25.50,30.00,17,12,0.06,0.12,0.19,0.11,0.00,0.00,0,0, +1746046437177,24,1066,4,449.50,1096.73,5.70,5884,402,-86.06,16,5,-68.28,6.30,28.50,28.00,16,11,0.24,0.11,0.08,0.29,0.00,0.00,0,0, +1746046438177,19,1083,1083,635.92,1088.50,1089.62,5619,4814,-65.75,16,106,-34.71,200.82,22.00,28.00,18,11,0.12,0.17,0.19,0.11,0.00,0.00,0,0, +1746046438177,24,1066,4,393.10,1088.46,5.64,5910,458,-75.44,16,5,-57.66,6.54,28.50,27.00,12,11,0.09,0.12,0.08,0.29,0.00,0.00,0,0, +1746046439177,19,1059,1071,1105.33,1064.34,1089.26,6197,4880,-65.94,16,5,-48.16,6.85,26.00,29.00,17,10,0.08,0.06,0.19,0.11,0.00,0.00,0,0, +1746046439177,24,1078,4,620.20,1117.27,5.75,6052,430,-90.00,14,5,-72.22,6.23,26.50,26.00,15,11,0.04,0.12,0.08,0.29,0.00,0.00,0,0, +1746046440177,19,1083,1018,559.10,1088.38,1037.26,5605,4780,-66.38,16,5,-48.59,6.83,26.00,28.00,19,11,0.09,0.13,0.19,0.11,0.00,0.00,0,0, +1746046440177,24,1066,4,439.17,1088.58,5.64,6047,375,-68.44,16,5,-50.66,6.76,30.00,27.00,20,11,0.12,0.12,0.08,0.29,0.00,0.00,0,0, +1746046441177,19,1071,1083,597.50,1076.34,1085.66,5724,4751,-66.38,16,5,-48.59,6.83,25.50,28.00,17,12,0.10,0.05,0.19,0.11,0.00,0.00,0,0, +1746046441177,24,1066,4,936.50,1096.73,5.66,6019,426,-68.44,16,5,-50.66,6.76,24.50,26.00,14,11,0.14,0.13,0.08,0.29,0.00,0.00,0,0, +1746046442177,19,1083,1083,489.00,1088.20,1088.78,5500,4640,-66.06,16,5,-48.28,6.84,25.50,27.00,18,8,0.06,0.15,0.19,0.11,0.00,0.00,0,0, +1746046442177,24,1066,4,848.80,1088.38,5.60,5965,432,-72.69,13,5,-54.91,6.62,25.00,27.00,14,10,0.05,0.12,0.08,0.29,0.00,0.00,0,0, +1746046443177,19,1071,1075,875.73,1076.20,1090.15,6829,4664,-66.38,16,5,-48.59,6.83,27.00,27.00,18,8,0.12,0.05,0.19,0.11,0.00,0.00,0,0, +1746046443177,24,1066,4,583.89,1078.86,6.46,6287,498,-83.00,14,5,-65.22,6.36,25.00,27.00,19,10,0.15,0.09,0.09,0.29,0.00,0.00,0,0, +1746046444177,19,1071,1071,624.00,1076.26,1090.27,5555,4776,-66.25,16,5,-48.47,6.83,26.50,27.00,18,12,0.15,0.14,0.19,0.11,0.00,0.00,0,0, +1746046444177,24,1066,4,727.27,1079.04,5.58,6415,391,-82.13,15,5,-64.35,6.38,30.00,25.00,19,10,0.13,0.06,0.09,0.28,0.00,0.00,0,0, +1746046445177,19,1059,1083,901.67,1064.30,1090.49,5609,4736,-66.25,16,5,-48.47,6.83,26.00,27.00,18,11,0.10,0.06,0.19,0.11,0.00,0.00,0,0, +1746046445177,24,1078,4,700.55,1083.42,5.55,5711,402,-82.13,15,5,-64.35,6.38,31.00,28.00,19,12,0.09,0.11,0.09,0.29,0.00,0.00,0,0, +1746046446177,19,1083,1083,678.67,1088.34,1089.95,5222,4765,-66.06,16,106,-35.02,199.97,21.00,27.00,17,12,0.15,0.21,0.20,0.11,0.00,0.00,0,0, +1746046446177,24,1066,4,533.10,1092.98,5.58,4885,375,-81.36,11,5,-63.58,6.40,26.00,27.00,20,12,0.14,0.10,0.09,0.28,0.00,0.00,0,0, +1746046447177,19,1071,1071,373.00,1076.59,1088.78,6775,4950,-65.81,16,5,-48.03,6.85,26.00,26.00,17,8,0.07,0.08,0.19,0.11,0.00,0.00,0,0, +1746046447177,24,1066,4,714.55,1102.97,5.69,5544,417,-88.22,9,5,-70.44,6.26,25.50,27.00,18,10,0.08,0.15,0.09,0.29,0.00,0.00,0,0, +1746046448177,19,1071,1083,546.44,1076.21,1090.08,6189,4810,-65.75,16,5,-47.97,6.85,27.00,26.00,18,13,0.14,0.04,0.20,0.11,0.00,0.00,0,0, +1746046448177,24,1066,4,796.09,1071.39,5.49,6048,381,-95.36,14,5,-77.58,6.15,27.00,28.00,19,10,0.05,0.09,0.09,0.28,0.00,0.00,0,0, +1746046449177,19,1083,1095,407.40,1088.30,1107.72,5662,4992,-65.94,16,38,-39.35,63.68,25.50,27.00,17,10,0.11,0.10,0.20,0.11,0.00,0.00,0,0, +1746046449177,24,1066,4,627.22,1071.43,5.53,6241,427,-86.92,13,5,-69.14,6.29,27.00,27.00,16,10,0.17,0.07,0.09,0.28,0.00,0.00,0,0, +1746046450177,19,1071,1023,950.77,1076.42,1030.87,5952,4898,-65.94,16,5,-48.16,6.85,26.00,27.00,18,11,0.06,0.16,0.20,0.11,0.00,0.00,0,0, +1746046450177,24,1066,4,675.70,1071.47,5.49,6244,421,-86.92,13,5,-69.14,6.29,30.50,27.00,15,10,0.07,0.08,0.09,0.28,0.00,0.00,0,0, +1746046451177,19,1059,1107,549.00,1064.20,1128.10,5799,4775,-66.12,16,5,-48.34,6.84,24.50,27.00,17,11,0.16,0.06,0.20,0.11,0.00,0.00,0,0, +1746046451177,24,1078,4,869.10,1078.96,5.53,6483,412,-83.75,12,5,-65.97,6.35,34.00,27.00,19,10,0.11,0.10,0.09,0.28,0.00,0.00,0,0, +1746046452177,19,1083,1083,543.20,1088.38,1088.05,5141,4933,-66.19,16,5,-48.41,6.84,25.00,26.00,17,11,0.05,0.18,0.20,0.11,0.00,0.00,0,0, +1746046452177,24,1066,4,565.44,1075.96,5.96,6160,603,-85.73,15,5,-67.95,6.31,30.00,27.00,19,10,0.12,0.09,0.09,0.28,0.00,0.00,0,0, +1746046453177,19,1071,1030,342.25,1076.38,1049.60,6285,4789,-66.00,16,28,-40.74,45.36,26.00,27.00,18,10,0.14,0.06,0.20,0.11,0.00,0.00,0,0, +1746046453177,24,1066,4,598.27,1071.51,5.49,6379,441,-83.14,14,5,-65.36,6.36,26.00,27.00,17,10,0.09,0.07,0.09,0.28,0.00,0.00,0,0, +1746046454177,19,1083,1063,412.78,1088.16,1070.20,4995,4561,-66.00,16,5,-48.22,6.84,27.00,27.00,17,13,0.07,0.11,0.20,0.11,0.00,0.00,0,0, +1746046454177,24,1066,4,560.10,1071.35,5.50,6243,417,-83.14,14,5,-65.36,6.36,26.50,25.00,20,10,0.04,0.08,0.09,0.28,0.00,0.00,0,0, +1746046455177,19,1071,1083,778.00,1076.32,1089.74,5808,4787,-66.12,16,5,-48.34,6.84,25.00,27.00,18,10,0.10,0.10,0.20,0.11,0.00,0.00,0,0, +1746046455177,24,1066,4,633.30,1071.51,5.55,6322,407,-83.27,15,5,-65.49,6.36,30.50,26.00,19,10,0.10,0.09,0.09,0.28,0.00,0.00,0,0, +1746046456177,19,1071,1095,539.83,1076.26,1108.38,5818,4938,-66.06,16,5,-48.28,6.84,26.50,28.00,17,13,0.13,0.06,0.20,0.11,0.00,0.00,0,0, +1746046456177,24,1066,4,612.10,1071.35,5.49,6245,391,-85.23,13,5,-67.45,6.32,30.00,26.00,20,10,0.10,0.09,0.09,0.28,0.00,0.00,0,0, +1746046457177,19,1059,1071,584.00,1064.50,1088.01,4726,4945,-66.00,16,5,-48.22,6.84,27.00,27.00,18,12,0.06,0.17,0.20,0.11,0.00,0.00,0,0, +1746046457177,24,1078,4,533.75,1091.03,5.58,6548,407,-76.92,13,5,-59.14,6.50,29.00,27.00,18,10,0.10,0.10,0.09,0.28,0.00,0.00,0,0, +1746046458177,19,1083,1083,600.09,1088.26,1090.32,5642,4761,-65.88,16,5,-48.09,6.85,26.00,27.00,18,11,0.12,0.06,0.20,0.11,0.00,0.00,0,0, +1746046458177,24,1066,4,780.22,1071.19,5.53,6043,395,-78.54,13,5,-60.76,6.46,29.00,27.00,20,10,0.05,0.07,0.09,0.28,0.00,0.00,0,0, +1746046459177,19,1071,1018,742.82,1076.25,1082.02,4945,4764,-65.88,16,5,-48.09,6.85,26.00,27.00,18,13,0.12,0.13,0.20,0.11,0.00,0.00,0,0, +1746046459177,24,1066,4,876.09,1071.43,5.49,6311,436,-78.54,13,5,-60.76,6.46,30.00,27.00,17,10,0.09,0.07,0.09,0.27,0.00,0.00,0,0, +1746046460177,19,1083,1135,637.00,1088.17,1098.86,4436,4766,-65.88,16,106,-34.83,200.48,20.00,27.00,18,13,0.14,0.13,0.20,0.11,0.00,0.00,0,0, +1746046460177,24,1066,4,635.67,1088.38,5.64,6022,422,-82.75,12,5,-64.97,6.37,25.50,27.00,20,11,0.04,0.10,0.09,0.27,0.00,0.00,0,0, +1746046461177,19,1071,1083,784.83,1076.26,1088.62,5129,4943,-65.81,16,37,-39.34,61.90,25.50,27.00,17,12,0.07,0.11,0.20,0.11,0.00,0.00,0,0, +1746046461177,24,1066,4,668.60,1079.86,5.58,5870,417,-75.93,14,5,-58.15,6.53,33.00,27.00,18,11,0.12,0.11,0.09,0.28,0.00,0.00,0,0, +1746046462177,19,1059,1023,663.10,1064.22,1031.92,4989,4818,-65.88,16,5,-48.09,6.85,26.00,27.00,18,12,0.10,0.09,0.20,0.11,0.00,0.00,0,0, +1746046462177,24,1066,4,527.55,1105.16,5.75,5927,417,-78.91,11,5,-61.13,6.45,26.50,25.00,18,11,0.05,0.12,0.09,0.28,0.00,0.00,0,0, +1746046463177,19,1071,1131,878.20,1076.64,1149.83,5231,4710,-66.06,16,5,-48.28,6.84,26.50,27.00,19,12,0.06,0.10,0.20,0.11,0.00,0.00,0,0, +1746046463177,24,1078,4,533.17,1096.91,6.54,6220,508,-89.20,10,5,-71.42,6.24,25.00,27.00,19,11,0.17,0.15,0.09,0.28,0.00,0.00,0,0, +1746046464177,19,1083,1023,686.70,1088.32,1037.53,4983,4271,-66.06,16,5,-48.28,6.84,27.00,27.00,19,12,0.11,0.09,0.20,0.11,0.00,0.00,0,0, +1746046464177,24,1066,4,731.33,1117.35,5.81,5989,428,-89.20,10,5,-71.42,6.24,26.00,25.00,17,11,0.09,0.15,0.09,0.28,0.00,0.00,0,0, +1746046465177,19,1059,1107,552.44,1064.18,1108.10,4979,4623,-66.25,16,5,-48.47,6.83,28.00,28.00,19,12,0.13,0.09,0.20,0.11,0.00,0.00,0,0, +1746046465177,24,1066,4,781.27,1113.79,5.81,6236,431,-82.62,16,5,-64.84,6.37,30.00,26.00,18,11,0.05,0.13,0.09,0.28,0.00,0.00,0,0, +1746046466177,19,1095,1035,434.83,1100.61,1046.77,6189,4473,-66.25,16,5,-48.47,6.83,27.50,26.00,18,10,0.12,0.09,0.20,0.11,0.00,0.00,0,0, +1746046466177,24,1066,4,680.20,1100.10,5.70,5837,375,-78.00,13,5,-60.22,6.48,30.50,25.00,20,11,0.13,0.14,0.09,0.28,0.00,0.00,0,0, +1746046467177,19,1071,1071,538.36,1076.55,1091.34,6188,4735,-66.12,16,5,-48.34,6.84,26.50,27.00,19,12,0.06,0.05,0.20,0.11,0.00,0.00,0,0, +1746046467177,24,1066,4,625.55,1096.73,5.72,6013,421,-80.30,10,5,-62.52,6.42,31.00,27.00,16,11,0.11,0.13,0.09,0.28,0.00,0.00,0,0, +1746046468177,19,1071,1107,581.27,1076.14,1109.40,5126,4535,-66.12,16,5,-48.34,6.84,26.50,27.00,19,12,0.11,0.08,0.20,0.11,0.00,0.00,0,0, +1746046468177,24,1066,4,952.44,1071.35,5.53,5502,428,-80.30,10,5,-62.52,6.42,25.00,27.00,18,11,0.04,0.10,0.09,0.28,0.00,0.00,0,0, +1746046469177,19,1071,1071,670.33,1076.19,1094.05,5168,4452,-66.00,16,101,-35.16,189.56,25.00,26.00,19,12,0.14,0.08,0.20,0.11,0.00,0.00,0,0, +1746046469177,24,1078,4,768.27,1122.17,6.79,6292,551,-76.19,16,5,-58.41,6.52,25.50,25.00,20,11,0.16,0.13,0.09,0.28,0.00,0.00,0,0, +1746046470177,19,1071,1083,670.00,1076.34,1092.33,5082,4744,-66.12,16,5,-48.34,6.84,27.50,25.00,18,12,0.07,0.09,0.20,0.11,0.00,0.00,0,0, +1746046470177,24,1066,4,639.60,1100.41,5.70,6150,421,-82.33,15,5,-64.55,6.38,29.00,27.00,15,10,0.10,0.12,0.09,0.28,0.00,0.00,0,0, +1746046471177,19,1071,1030,585.78,1076.46,1036.54,5360,4488,-66.19,16,5,-48.41,6.84,27.00,26.00,17,11,0.16,0.12,0.20,0.11,0.00,0.00,0,0, +1746046471177,24,1066,4,713.64,1071.59,5.53,6514,436,-73.73,15,5,-55.95,6.59,32.00,26.00,18,10,0.04,0.08,0.09,0.28,0.00,0.00,0,0, +1746046472177,19,1083,1075,930.36,1088.42,1088.42,5893,4639,-65.75,16,5,-47.97,6.85,26.50,27.00,17,11,0.06,0.05,0.20,0.11,0.00,0.00,0,0, +1746046472177,24,1066,4,623.33,1071.35,5.55,6111,402,-75.25,12,5,-57.47,6.55,25.50,27.00,18,10,0.14,0.07,0.09,0.28,0.00,0.00,0,0, +1746046473177,19,1071,1083,439.60,1076.38,1097.90,5037,4559,-65.75,16,5,-47.97,6.85,26.50,26.00,17,12,0.17,0.06,0.20,0.11,0.00,0.00,0,0, +1746046473177,24,1066,4,633.82,1071.43,5.50,6311,378,-75.25,12,5,-57.47,6.55,47.00,25.00,18,10,0.08,0.07,0.09,0.28,0.00,0.00,0,0, +1746046474177,19,1071,1083,532.50,1076.25,1089.15,5155,4969,-65.94,16,5,-48.16,6.85,27.00,27.00,16,12,0.06,0.08,0.20,0.11,0.00,0.00,0,0, +1746046474177,24,1066,4,551.60,1078.88,5.61,6153,402,-89.93,14,5,-72.15,6.23,29.50,27.00,20,10,0.07,0.06,0.09,0.28,0.00,0.00,0,0, +1746046475177,19,1071,1083,712.89,1076.34,1096.65,5068,4568,-66.19,16,106,-35.14,199.64,25.50,26.00,18,12,0.17,0.06,0.20,0.11,0.00,0.00,0,0, +1746046475177,24,1078,4,693.00,1078.92,5.58,5997,394,-85.46,13,5,-67.68,6.31,24.50,26.00,18,11,0.14,0.05,0.09,0.27,0.00,0.00,0,0, +1746046476177,19,1059,1071,556.62,1064.29,1088.37,5017,4914,-66.06,16,5,-48.28,6.84,26.00,28.00,17,12,0.07,0.07,0.20,0.11,0.00,0.00,0,0, +1746046476177,24,1066,4,522.00,1100.17,5.64,5773,407,-82.38,13,5,-64.60,6.38,31.00,26.00,18,11,0.06,0.07,0.09,0.27,0.00,0.00,0,0, +1746046477177,19,1083,1083,828.00,1088.28,1093.35,5047,4627,-66.06,16,12,-44.48,17.82,26.50,27.00,19,12,0.09,0.07,0.20,0.11,0.00,0.00,0,0, +1746046477177,24,1066,4,722.67,1105.16,5.75,5861,407,-82.38,13,5,-64.60,6.38,36.00,26.00,19,11,0.09,0.07,0.09,0.28,0.00,0.00,0,0, +1746046478177,19,1083,1083,610.70,1088.58,1093.49,5322,4489,-66.19,16,5,-48.41,6.84,25.50,27.00,19,12,0.08,0.10,0.20,0.11,0.00,0.00,0,0, +1746046478177,24,1066,4,522.78,1079.74,5.61,5610,331,-82.54,13,5,-64.76,6.37,26.00,25.00,18,11,0.11,0.09,0.09,0.28,0.00,0.00,0,0, +1746046479177,19,1071,1023,630.17,1076.38,1034.44,5171,4368,-66.12,16,5,-48.34,6.84,26.50,27.00,18,12,0.12,0.10,0.20,0.11,0.00,0.00,0,0, +1746046479177,24,1066,4,532.60,1105.16,5.78,6008,417,-85.92,12,5,-68.14,6.30,29.00,27.00,18,11,0.06,0.11,0.09,0.28,0.00,0.00,0,0, +1746046480177,19,1071,1083,620.36,1076.23,1091.13,5217,4709,-66.00,16,5,-48.22,6.84,27.50,25.00,19,9,0.06,0.15,0.20,0.11,0.00,0.00,0,0, +1746046480177,24,1066,4,754.00,1117.16,5.81,6252,370,-79.08,12,5,-61.30,6.45,30.50,27.00,20,11,0.14,0.12,0.09,0.28,0.00,0.00,0,0, +1746046481177,19,1059,1083,845.44,1064.32,1094.74,6429,4515,-66.25,16,5,-48.47,6.83,27.50,25.00,19,9,0.06,0.06,0.20,0.11,0.00,0.00,0,0, +1746046481177,24,1078,4,546.64,1079.74,5.55,5672,426,-84.42,12,5,-66.64,6.33,30.00,26.00,17,11,0.11,0.08,0.09,0.28,0.00,0.00,0,0, +1746046482177,19,1083,1083,616.89,1088.35,1093.83,5155,4671,-66.25,16,106,-35.21,199.47,25.00,24.00,19,13,0.12,0.11,0.20,0.11,0.00,0.00,0,0, +1746046482177,24,1066,4,627.30,1083.34,5.58,5559,386,-84.42,12,5,-66.64,6.33,24.50,24.00,19,11,0.04,0.09,0.09,0.28,0.00,0.00,0,0, +1746046483177,19,1071,1083,648.09,1076.37,1091.65,6123,4447,-66.31,16,36,-39.96,59.74,26.00,26.00,17,9,0.11,0.09,0.20,0.11,0.00,0.00,0,0, +1746046483177,24,1066,4,577.55,1096.85,5.66,6019,375,-82.07,14,5,-64.29,6.38,24.50,25.00,19,11,0.15,0.11,0.09,0.28,0.00,0.00,0,0, +1746046484177,19,1083,1018,440.90,1088.37,1028.26,6160,4954,-66.31,16,5,-48.53,6.83,27.00,26.00,17,12,0.08,0.07,0.20,0.11,0.00,0.00,0,0, +1746046484177,24,1066,4,493.56,1096.81,5.70,5821,402,-83.67,12,5,-65.89,6.35,29.50,26.00,19,11,0.06,0.10,0.09,0.28,0.00,0.00,0,0, +1746046485177,19,1071,1071,897.44,1076.34,1088.51,5012,4790,-66.25,16,5,-48.47,6.83,25.50,26.00,17,12,0.18,0.12,0.20,0.11,0.00,0.00,0,0, +1746046485177,24,1066,4,764.09,1096.73,5.72,5824,365,-100.73,11,5,-82.95,6.07,25.00,27.00,20,11,0.08,0.09,0.09,0.28,0.00,0.00,0,0, +1746046486177,19,1071,1135,865.00,1076.38,1148.75,6212,4943,-66.25,16,36,-39.90,59.78,25.50,28.00,16,9,0.07,0.08,0.20,0.11,0.00,0.00,0,0, +1746046486177,24,1066,4,928.90,1079.78,5.58,5678,421,-100.73,11,5,-82.95,6.07,31.00,26.00,15,11,0.18,0.10,0.09,0.28,0.00,0.00,0,0, +1746046487177,19,1071,1018,437.44,1076.18,1031.78,5723,4368,-66.00,16,5,-48.22,6.84,27.00,28.00,18,14,0.23,0.13,0.20,0.11,0.00,0.00,0,0, +1746046487177,24,1078,4,498.38,1096.69,5.70,5816,431,-83.27,11,5,-65.49,6.36,27.50,27.00,14,11,0.07,0.11,0.09,0.28,0.00,0.00,0,0, +1746046488177,19,1071,1083,615.33,1076.41,1085.56,6423,5082,-66.00,16,5,-48.22,6.84,28.50,27.00,15,8,0.08,0.10,0.20,0.11,0.00,0.00,0,0, +1746046488177,24,1066,4,357.44,1100.29,5.66,5838,412,-86.67,12,5,-68.89,6.29,24.50,28.00,20,11,0.03,0.09,0.09,0.28,0.00,0.00,0,0, +1746046489177,19,1071,1135,718.00,1076.47,1149.70,6616,5114,-66.19,16,106,-35.14,199.64,25.50,27.00,20,12,0.05,0.04,0.20,0.11,0.00,0.00,0,0, +1746046489177,24,1066,4,904.00,1088.34,5.64,5845,417,-84.08,12,5,-66.30,6.34,26.00,26.00,16,11,0.18,0.11,0.09,0.28,0.00,0.00,0,0, +1746046490177,19,1083,1035,717.00,1088.32,1043.46,4983,4271,-66.06,16,5,-48.28,6.84,26.00,27.00,18,11,0.12,0.16,0.20,0.11,0.00,0.00,0,0, +1746046490177,24,1066,4,655.75,1096.85,5.70,5955,431,-68.80,15,5,-51.02,6.74,27.00,27.00,15,11,0.07,0.10,0.09,0.28,0.00,0.00,0,0, +1746046491177,19,1071,1071,521.40,1076.45,1091.56,5796,4731,-66.06,16,5,-48.28,6.84,26.50,27.00,19,11,0.05,0.05,0.20,0.11,0.00,0.00,0,0, +1746046491177,24,1066,4,785.00,1088.26,5.66,5782,412,-68.80,15,5,-51.02,6.74,25.50,27.00,20,11,0.03,0.11,0.09,0.28,0.00,0.00,0,0, +1746046492177,19,1071,1059,565.50,1076.08,1059.83,4811,4293,-66.00,16,5,-48.22,6.84,27.50,27.00,18,11,0.15,0.24,0.20,0.11,0.00,0.00,0,0, +1746046492177,24,1066,4,758.73,1117.35,5.78,6112,338,-75.67,15,5,-57.89,6.54,29.00,27.00,16,11,0.14,0.15,0.09,0.28,0.00,0.00,0,0, +1746046493177,19,1071,1071,786.00,1076.34,1090.50,7369,4765,-66.00,16,5,-48.22,6.84,27.50,28.00,18,7,0.05,0.08,0.20,0.11,0.00,0.00,0,0, +1746046493177,24,1078,4,519.56,1088.22,5.60,5709,416,-72.38,16,5,-54.59,6.63,33.00,25.00,16,11,0.05,0.10,0.09,0.28,0.00,0.00,0,0, +1746046494177,19,1071,1083,920.73,1076.44,1094.31,7326,4514,-66.06,16,5,-48.28,6.84,26.00,27.00,19,13,0.10,0.05,0.20,0.11,0.00,0.00,0,0, +1746046494177,24,1066,4,641.10,1108.80,5.70,6011,390,-73.33,12,5,-55.55,6.60,30.00,26.00,20,11,0.10,0.13,0.09,0.28,0.00,0.00,0,0, +1746046495177,19,1071,1030,705.50,1076.14,1050.24,5363,4489,-66.19,16,5,-48.41,6.84,24.50,28.00,19,10,0.12,0.12,0.20,0.11,0.00,0.00,0,0, +1746046495177,24,1066,4,747.44,1087.39,5.64,6192,423,-79.09,11,5,-61.31,6.45,33.50,27.00,17,10,0.09,0.11,0.09,0.28,0.00,0.00,0,0, +1746046496177,19,1083,1083,479.82,1088.11,1078.43,5862,4562,-66.19,16,5,-48.41,6.84,28.00,27.00,18,13,0.12,0.05,0.20,0.11,0.00,0.00,0,0, +1746046496177,24,1066,4,556.91,1071.35,5.53,6111,363,-79.09,11,5,-61.31,6.45,30.00,25.00,19,10,0.08,0.08,0.09,0.28,0.00,0.00,0,0, +1746046497177,19,1071,1135,558.44,1076.28,1149.07,4594,4738,-65.81,16,5,-48.03,6.85,26.50,29.00,19,12,0.06,0.18,0.20,0.11,0.00,0.00,0,0, +1746046497177,24,1066,4,595.45,1071.46,5.96,6053,603,-89.33,12,5,-71.55,6.24,30.50,27.00,19,10,0.07,0.05,0.09,0.28,0.00,0.00,0,0, +1746046498177,19,1071,1035,796.18,1076.41,1050.29,6599,4377,-65.81,16,5,-48.03,6.85,27.00,26.00,19,10,0.13,0.07,0.20,0.11,0.00,0.00,0,0, +1746046498177,24,1066,4,511.91,1079.08,5.58,6486,402,-81.40,10,5,-63.62,6.40,30.00,27.00,17,10,0.15,0.07,0.09,0.28,0.00,0.00,0,0, +1746046499177,19,1071,1083,793.00,1076.12,1091.70,5256,4710,-66.12,16,5,-48.34,6.84,25.00,27.00,18,11,0.07,0.25,0.20,0.11,0.00,0.00,0,0, +1746046499177,24,1078,4,561.22,1071.35,5.55,6178,426,-75.82,11,5,-58.04,6.53,28.50,27.00,16,10,0.07,0.08,0.09,0.28,0.00,0.00,0,0, +1746046500177,19,1059,1083,718.91,1064.44,1092.67,7667,4641,-66.12,16,5,-48.34,6.84,24.50,27.00,18,7,0.14,0.09,0.20,0.11,0.00,0.00,0,0, +1746046500177,24,1066,4,760.75,1107.57,5.55,6817,417,-75.82,11,5,-58.04,6.53,29.50,27.00,19,8,0.05,0.09,0.09,0.27,0.00,0.00,0,0, +1746046501177,19,1083,1071,856.18,1088.53,1090.36,7307,4764,-66.31,16,106,-35.27,199.31,25.50,27.00,19,12,0.05,0.03,0.20,0.11,0.00,0.00,0,0, +1746046501177,24,1066,4,746.45,1071.39,5.55,6759,402,-74.33,12,5,-56.55,6.57,26.00,27.00,19,10,0.11,0.04,0.09,0.27,0.00,0.00,0,0, +1746046502177,19,1083,1030,555.20,1076.19,1035.66,5135,4514,-66.12,16,5,-48.34,6.84,25.00,28.00,18,9,0.15,0.18,0.20,0.11,0.00,0.00,0,0, +1746046502177,24,1066,4,727.50,1088.42,5.62,5965,352,-90.54,13,5,-72.76,6.22,25.50,27.00,19,11,0.14,0.09,0.09,0.27,0.00,0.00,0,0, +1746046503177,19,1071,1135,716.80,1088.54,1148.84,7016,4777,-65.94,16,28,-40.67,45.39,24.00,27.00,18,8,0.05,0.06,0.20,0.11,0.00,0.00,0,0, +1746046503177,24,1066,4,313.70,1088.18,5.64,5714,407,-91.44,16,5,-73.66,6.21,31.00,30.00,19,11,0.08,0.09,0.09,0.27,0.00,0.00,0,0, +1746046504177,19,1071,1023,795.82,1076.34,1034.52,5773,4288,-66.06,16,5,-48.28,6.84,25.50,27.00,19,12,0.11,0.15,0.20,0.11,0.00,0.00,0,0, +1746046504177,24,1066,4,619.91,1088.38,5.60,5912,381,-74.75,12,5,-56.97,6.56,30.00,26.00,19,11,0.15,0.12,0.09,0.27,0.00,0.00,0,0, +1746046505177,19,1071,1095,718.44,1076.17,1106.48,4888,4736,-66.06,16,5,-48.28,6.84,26.00,27.00,18,12,0.10,0.09,0.20,0.11,0.00,0.00,0,0, +1746046505177,24,1078,4,727.60,1096.77,5.70,5948,412,-74.75,12,5,-56.97,6.56,28.50,27.00,19,11,0.11,0.13,0.09,0.27,0.00,0.00,0,0, +1746046506177,19,1071,1083,647.60,1076.26,1091.66,5043,4711,-65.94,16,106,-34.89,200.31,25.50,27.00,19,12,0.07,0.11,0.20,0.11,0.00,0.00,0,0, +1746046506177,24,1066,4,514.64,1108.76,5.72,5945,407,-82.36,14,5,-64.58,6.38,26.50,27.00,19,11,0.08,0.12,0.09,0.28,0.00,0.00,0,0, +1746046507177,19,1059,1083,541.11,1064.18,1093.61,4849,4476,-65.75,16,5,-47.97,6.85,28.00,27.00,19,12,0.12,0.10,0.20,0.11,0.00,0.00,0,0, +1746046507177,24,1066,4,630.91,1079.78,5.56,5675,407,-80.22,9,5,-62.44,6.42,26.00,27.00,20,11,0.05,0.11,0.09,0.28,0.00,0.00,0,0, +1746046508177,19,1095,1035,705.73,1096.74,1050.20,5326,4378,-66.00,16,5,-48.22,6.84,26.50,28.00,19,11,0.10,0.15,0.20,0.11,0.00,0.00,0,0, +1746046508177,24,1066,4,531.83,1105.28,5.78,6000,423,-80.54,13,5,-62.76,6.42,25.50,26.00,17,11,0.11,0.13,0.09,0.28,0.00,0.00,0,0, +1746046509177,19,1071,1083,612.30,1079.94,1093.50,5850,4478,-66.00,16,5,-48.22,6.84,26.00,28.00,19,11,0.09,0.05,0.20,0.11,0.00,0.00,0,0, +1746046509177,24,1066,4,585.50,1088.34,5.64,5977,423,-80.54,13,5,-62.76,6.42,33.00,27.00,18,11,0.05,0.14,0.09,0.28,0.00,0.00,0,0, +1746046510177,19,1071,1083,572.00,1076.38,1094.32,4957,4490,-66.19,16,12,-44.60,17.81,25.00,27.00,19,11,0.13,0.15,0.20,0.11,0.00,0.00,0,0, +1746046510177,24,1066,4,529.36,1079.82,5.61,5734,417,-70.06,16,5,-52.28,6.70,27.00,27.00,19,11,0.13,0.12,0.09,0.28,0.00,0.00,0,0, +1746046511177,19,1071,1071,474.82,1076.50,1090.63,6005,4742,-65.88,16,5,-48.09,6.85,25.00,30.00,18,11,0.07,0.05,0.20,0.11,0.00,0.00,0,0, +1746046511177,24,1066,4,737.56,1105.24,5.73,5989,422,-80.91,11,5,-63.13,6.41,24.50,27.00,18,11,0.11,0.13,0.09,0.28,0.00,0.00,0,0, +1746046512177,19,1059,1083,724.60,1064.47,1091.13,6248,4597,-66.06,16,5,-48.28,6.84,25.50,28.00,17,9,0.22,0.10,0.20,0.11,0.00,0.00,0,0, +1746046512177,24,1078,4,1021.50,1100.25,5.64,5640,421,-81.94,16,5,-64.16,6.39,29.50,27.00,16,11,0.08,0.11,0.09,0.28,0.00,0.00,0,0, +1746046513177,19,1083,1071,782.44,1088.38,1083.93,6270,5355,-65.94,16,68,-36.82,121.77,25.50,27.00,14,12,0.08,0.05,0.20,0.11,0.00,0.00,0,0, +1746046513177,24,1066,4,678.08,1079.94,5.58,5938,412,-78.75,12,5,-60.97,6.46,25.50,27.00,19,11,0.07,0.10,0.09,0.28,0.00,0.00,0,0, +1746046514177,19,1083,1030,556.91,1081.43,1041.14,6205,5047,-65.94,16,5,-48.16,6.85,26.00,28.00,20,6,0.05,0.18,0.20,0.11,0.00,0.00,0,0, +1746046514177,24,1066,4,508.10,1093.76,5.62,5738,402,-78.75,12,5,-60.97,6.46,29.50,27.00,19,11,0.07,0.12,0.09,0.28,0.00,0.00,0,0, +1746046515177,19,1071,1087,828.17,1086.42,1100.91,11205,4536,-65.94,16,5,-48.16,6.85,26.00,30.00,17,5,0.12,0.06,0.20,0.11,0.00,0.00,0,0, +1746046515177,24,1066,4,922.18,1113.47,5.81,5903,407,-72.94,16,5,-55.16,6.61,26.00,26.00,19,11,0.07,0.11,0.09,0.28,0.00,0.00,0,0, +1746046516177,19,1071,1083,672.11,1076.73,1088.58,7048,4767,-66.06,16,5,-48.28,6.84,26.00,30.00,19,14,0.04,0.03,0.20,0.11,0.00,0.00,0,0, +1746046516177,24,1066,4,561.67,1079.81,6.28,5678,620,-79.88,16,5,-62.09,6.43,26.50,28.00,17,11,0.18,0.08,0.09,0.28,0.00,0.00,0,0, +1746046517177,19,1071,1095,681.00,1076.39,1108.19,5888,4731,-65.69,16,27,-40.58,43.70,26.00,30.00,18,9,0.12,0.11,0.20,0.11,0.00,0.00,0,0, +1746046517177,24,1066,4,880.75,1088.34,5.62,5973,423,-91.93,15,5,-74.15,6.20,34.00,28.00,16,11,0.06,0.12,0.09,0.28,0.00,0.00,0,0, +1746046518177,19,1071,1018,828.73,1076.27,1038.39,6148,4716,-65.69,16,5,-47.91,6.86,26.00,27.00,19,12,0.07,0.04,0.20,0.11,0.00,0.00,0,0, +1746046518177,24,1078,4,559.18,1108.76,5.72,5879,402,-91.93,15,5,-74.15,6.20,30.00,27.00,19,11,0.08,0.11,0.09,0.28,0.00,0.00,0,0, +1746046519177,19,1071,1099,668.08,1076.35,1102.34,5386,4467,-65.88,16,5,-48.09,6.85,25.00,29.00,17,7,0.14,0.17,0.20,0.11,0.00,0.00,0,0, +1746046519177,24,1066,4,664.55,1079.98,5.58,5877,412,-84.25,16,5,-66.47,6.34,25.00,27.00,19,11,0.06,0.14,0.09,0.28,0.00,0.00,0,0, +1746046520177,19,1083,1083,473.00,1081.53,1089.25,9352,4930,-65.94,16,5,-48.16,6.85,25.50,28.00,18,6,0.05,0.06,0.20,0.11,0.00,0.00,0,0, +1746046520177,24,1066,4,975.78,1096.69,5.70,5819,402,-93.40,15,5,-75.62,6.18,25.50,26.00,17,11,0.17,0.10,0.09,0.28,0.00,0.00,0,0, +1746046521177,19,1071,1071,522.33,1083.35,1092.56,6534,4566,-66.12,16,5,-48.34,6.84,27.00,30.00,18,14,0.15,0.14,0.20,0.11,0.00,0.00,0,0, +1746046521177,24,1066,4,861.00,1079.90,5.58,5871,416,-81.06,16,5,-63.28,6.40,25.50,28.00,16,11,0.07,0.11,0.09,0.28,0.00,0.00,0,0, +1746046522177,19,1059,1083,621.70,1064.36,1090.11,6445,4728,-66.12,16,5,-48.34,6.84,26.00,29.00,18,6,0.06,0.14,0.20,0.11,0.00,0.00,0,0, +1746046522177,24,1066,4,769.90,1079.86,5.58,5610,370,-81.47,15,5,-63.69,6.40,29.50,29.00,19,11,0.17,0.11,0.09,0.28,0.00,0.00,0,0, +1746046523177,19,1083,1030,750.27,1088.58,1052.92,9434,4621,-66.12,16,28,-40.86,45.31,26.00,27.00,18,7,0.12,0.05,0.20,0.11,0.00,0.00,0,0, +1746046523177,24,1066,4,782.10,1079.94,5.58,5866,408,-81.47,15,5,-63.69,6.40,26.50,27.00,18,11,0.10,0.09,0.09,0.28,0.00,0.00,0,0, +1746046524177,19,1059,1123,746.80,1064.38,1130.41,5598,4751,-66.19,16,5,-48.41,6.84,26.00,27.00,18,12,0.05,0.10,0.20,0.11,0.00,0.00,0,0, +1746046524177,24,1078,4,672.90,1083.42,5.57,5564,357,-78.44,16,5,-60.66,6.47,27.50,27.00,18,11,0.09,0.09,0.09,0.28,0.00,0.00,0,0, +1746046525177,19,1083,1047,758.58,1088.46,1050.72,5194,4444,-66.25,16,5,-48.47,6.83,26.00,29.00,18,12,0.15,0.14,0.20,0.11,0.00,0.00,0,0, +1746046525177,24,1066,4,884.67,1105.26,5.76,6064,417,-70.31,16,5,-52.53,6.69,30.50,27.00,18,11,0.06,0.11,0.09,0.28,0.00,0.00,0,0, +1746046526177,19,1083,1071,458.11,1076.31,1079.99,4998,6238,-66.00,16,5,-48.22,6.84,26.00,27.00,12,12,0.11,0.12,0.20,0.11,0.00,0.00,0,0, +1746046526177,24,1066,4,494.20,1096.57,5.70,5622,426,-80.62,16,5,-62.84,6.41,30.00,27.00,15,11,0.25,0.08,0.09,0.28,0.00,0.00,0,0, +1746046527177,19,1071,1054,510.50,1093.83,1074.18,5118,7358,-66.19,16,5,-48.41,6.84,26.50,27.00,14,12,0.04,0.15,0.20,0.11,0.00,0.00,0,0, +1746046527177,24,1066,4,537.00,1105.40,5.78,6132,445,-83.81,16,5,-66.03,6.35,26.50,27.00,11,11,0.11,0.11,0.09,0.28,0.00,0.00,0,0, +1746046528177,19,1071,1087,728.64,1076.33,1096.30,6208,5684,-66.19,16,5,-48.41,6.84,26.00,26.00,14,10,0.09,0.08,0.20,0.11,0.00,0.00,0,0, +1746046528177,24,1066,4,588.00,1088.26,5.64,5782,434,-83.81,16,5,-66.03,6.35,26.50,26.00,13,11,0.04,0.11,0.09,0.28,0.00,0.00,0,0, +1746046529177,19,1071,1095,723.64,1076.41,1102.07,5778,5814,-65.94,16,5,-48.16,6.85,25.50,27.00,14,13,0.13,0.14,0.20,0.11,0.00,0.00,0,0, +1746046529177,24,1066,4,492.36,1096.73,5.70,5948,402,-80.64,11,5,-62.85,6.41,29.50,29.00,20,11,0.07,0.14,0.09,0.28,0.00,0.00,0,0, +1746046530177,19,1059,1071,428.89,1064.34,1080.82,5978,5457,-65.62,16,5,-47.84,6.86,26.50,26.00,14,10,0.14,0.08,0.20,0.11,0.00,0.00,0,0, +1746046530177,24,1078,4,773.30,1100.29,5.64,5837,397,-83.78,9,5,-66.00,6.35,26.00,27.00,19,11,0.10,0.11,0.09,0.28,0.00,0.00,0,0, +1746046531177,19,1083,1071,719.91,1088.61,1090.19,5752,5566,-65.94,16,68,-36.82,121.77,12.00,26.00,14,13,0.13,0.12,0.20,0.11,0.00,0.00,0,0, +1746046531177,24,1066,4,626.36,1096.73,5.68,5887,407,-82.30,10,5,-64.52,6.38,26.00,27.00,19,11,0.07,0.11,0.09,0.28,0.00,0.00,0,0, +1746046532177,19,1083,1071,485.88,1064.26,1081.41,4964,5411,-65.94,16,5,-48.16,6.85,26.50,27.00,14,12,0.13,0.12,0.20,0.11,0.00,0.00,0,0, +1746046532177,24,1066,4,618.78,1071.23,5.53,5500,375,-82.30,10,5,-64.52,6.38,31.50,26.00,20,11,0.09,0.09,0.09,0.28,0.00,0.00,0,0, +1746046533177,19,1071,1071,564.60,1100.56,1081.90,5264,5462,-66.12,16,5,-48.34,6.84,26.00,27.00,14,12,0.12,0.09,0.20,0.11,0.00,0.00,0,0, +1746046533177,24,1066,4,683.80,1096.77,5.72,5887,375,-82.58,12,5,-64.80,6.37,29.00,26.00,18,11,0.16,0.11,0.09,0.28,0.00,0.00,0,0, +1746046534177,19,1071,1071,798.60,1076.46,1087.02,5084,5480,-66.00,16,5,-48.22,6.84,26.50,26.00,14,12,0.13,0.08,0.20,0.11,0.00,0.00,0,0, +1746046534177,24,1066,4,347.78,1088.26,5.64,5716,407,-88.53,15,5,-70.75,6.26,30.00,26.00,18,11,0.06,0.11,0.09,0.28,0.00,0.00,0,0, +1746046535177,19,1071,1071,449.73,1076.17,1081.76,5006,5510,-66.25,16,5,-48.47,6.83,26.00,28.00,14,12,0.12,0.09,0.20,0.11,0.00,0.00,0,0, +1746046535177,24,1066,4,577.50,1113.59,5.81,5899,370,-80.38,13,5,-62.60,6.42,31.00,26.00,19,11,0.15,0.13,0.09,0.28,0.00,0.00,0,0, +1746046536177,19,1059,1083,623.12,1064.04,1088.72,4989,5581,-66.38,16,5,-48.59,6.83,27.00,25.00,14,12,0.12,0.11,0.20,0.11,0.00,0.00,0,0, +1746046536177,24,1078,4,477.50,1108.72,5.70,5879,412,-76.80,15,5,-59.02,6.51,24.50,27.00,18,11,0.06,0.10,0.09,0.28,0.00,0.00,0,0, +1746046537177,19,1083,1071,620.20,1088.09,1082.04,5072,5476,-66.38,16,68,-37.26,121.14,12.00,27.00,14,12,0.11,0.09,0.20,0.11,0.00,0.00,0,0, +1746046537177,24,1066,4,875.45,1096.77,5.72,5887,365,-76.80,15,5,-59.02,6.51,24.50,25.00,19,11,0.14,0.08,0.09,0.28,0.00,0.00,0,0, +1746046538177,19,1083,1054,571.89,1083.78,1069.37,5606,5518,-66.31,16,68,-37.20,121.23,12.00,29.00,14,10,0.11,0.12,0.20,0.11,0.00,0.00,0,0, +1746046538177,24,1066,4,902.40,1096.77,5.72,5890,402,-68.69,13,5,-50.91,6.75,30.00,27.00,19,11,0.11,0.12,0.09,0.28,0.00,0.00,0,0, +1746046539177,19,1071,1099,857.73,1080.72,1102.30,6219,5455,-66.44,16,5,-48.66,6.83,26.50,27.00,14,11,0.11,0.05,0.20,0.11,0.00,0.00,0,0, +1746046539177,24,1066,4,492.67,1096.81,5.72,5952,402,-72.67,15,5,-54.89,6.62,31.00,26.00,19,11,0.11,0.11,0.09,0.28,0.00,0.00,0,0, +1746046540177,19,1059,1071,638.22,1064.21,1088.70,5165,5586,-66.12,16,68,-37.01,121.50,12.00,26.00,14,9,0.12,0.15,0.20,0.11,0.00,0.00,0,0, +1746046540177,24,1066,4,631.22,1088.22,5.60,6116,371,-85.06,16,5,-67.28,6.32,29.50,27.00,19,9,0.12,0.12,0.09,0.28,0.00,0.00,0,0, +1746046541177,19,1083,1059,704.27,1088.16,1075.14,6288,5685,-66.12,16,68,-37.01,121.50,12.00,26.00,14,9,0.13,0.05,0.20,0.11,0.00,0.00,0,0, +1746046541177,24,1066,4,594.64,1071.55,5.53,6576,402,-85.06,16,5,-67.28,6.32,33.00,27.00,19,9,0.13,0.06,0.09,0.28,0.00,0.00,0,0, +1746046542177,19,1071,1042,589.50,1076.26,1050.86,4891,5290,-66.19,16,5,-48.41,6.84,26.00,27.00,14,12,0.12,0.21,0.20,0.11,0.00,0.00,0,0, +1746046542177,24,1078,4,856.30,1095.62,5.55,6575,397,-86.33,12,5,-68.55,6.30,31.50,27.00,19,10,0.12,0.12,0.09,0.28,0.00,0.00,0,0, +1746046543177,19,1071,1111,662.17,1076.45,1119.89,7501,5733,-65.88,16,5,-48.09,6.85,25.00,29.00,14,7,0.13,0.09,0.20,0.11,0.00,0.00,0,0, +1746046543177,24,1066,4,589.58,1071.63,5.53,6517,402,-73.36,11,5,-55.58,6.60,31.00,27.00,19,9,0.06,0.10,0.10,0.28,0.00,0.00,0,0, +1746046544177,19,1071,1042,652.56,1076.59,1059.80,7352,5673,-65.81,16,5,-48.03,6.85,25.50,27.00,14,12,0.13,0.03,0.20,0.11,0.00,0.00,0,0, +1746046544177,24,1066,4,680.55,1071.31,5.55,6176,402,-87.77,13,5,-69.99,6.27,25.00,27.00,19,10,0.09,0.07,0.10,0.28,0.00,0.00,0,0, +1746046545177,19,1083,1071,654.18,1088.30,1081.03,5266,5197,-66.06,16,5,-48.28,6.84,26.50,27.00,14,9,0.13,0.13,0.20,0.11,0.00,0.00,0,0, +1746046545177,24,1066,4,339.82,1079.90,5.58,5935,418,-79.77,13,5,-61.99,6.43,46.50,26.00,17,11,0.10,0.08,0.10,0.28,0.00,0.00,0,0, +1746046546177,19,1071,1111,806.50,1076.42,1119.59,6379,5751,-66.06,16,70,-36.82,125.60,12.50,26.00,14,11,0.14,0.04,0.20,0.11,0.00,0.00,0,0, +1746046546177,24,1066,4,531.10,1079.78,5.61,5734,418,-79.77,13,5,-61.99,6.43,25.00,27.00,19,11,0.04,0.09,0.10,0.28,0.00,0.00,0,0, +1746046547177,19,1059,1083,329.00,1064.34,1089.72,5776,5573,-65.81,16,68,-36.70,121.96,12.50,26.00,14,10,0.14,0.10,0.20,0.11,0.00,0.00,0,0, +1746046547177,24,1066,4,645.91,1079.86,5.54,5800,402,-78.83,12,5,-61.05,6.46,29.50,27.00,18,11,0.15,0.09,0.10,0.28,0.00,0.00,0,0, +1746046548177,19,1083,1071,581.73,1088.30,1082.75,6183,5500,-66.38,16,68,-37.26,121.14,12.00,26.00,14,13,0.12,0.07,0.20,0.11,0.00,0.00,0,0, +1746046548177,24,1078,4,739.44,1108.76,5.70,5813,418,-88.00,13,5,-70.22,6.27,26.50,26.00,17,11,0.08,0.09,0.10,0.28,0.00,0.00,0,0, +1746046549177,19,1071,1071,699.91,1076.17,1081.53,6448,5477,-66.19,16,68,-37.07,121.41,12.00,27.00,14,7,0.13,0.11,0.20,0.11,0.00,0.00,0,0, +1746046549177,24,1066,4,490.27,1105.24,5.78,5865,397,-81.46,13,5,-63.68,6.40,30.50,27.00,19,11,0.12,0.10,0.10,0.28,0.00,0.00,0,0, +1746046550177,19,1071,1071,567.60,1076.38,1081.24,7864,5474,-66.19,16,68,-37.07,121.41,11.50,27.00,14,10,0.12,0.04,0.20,0.11,0.00,0.00,0,0, +1746046550177,24,1066,4,879.36,1105.20,5.78,5994,402,-81.46,13,5,-63.68,6.40,26.00,26.00,17,11,0.16,0.09,0.10,0.28,0.00,0.00,0,0, +1746046551177,19,1071,1083,690.67,1076.29,1101.44,5105,5475,-66.19,16,68,-37.07,121.41,12.00,28.00,14,12,0.11,0.08,0.20,0.11,0.00,0.00,0,0, +1746046551177,24,1066,4,836.22,1088.34,5.64,5654,418,-82.67,12,5,-64.89,6.37,29.00,25.00,17,11,0.07,0.08,0.10,0.28,0.00,0.00,0,0, +1746046552177,19,1071,1071,430.33,1076.34,1081.52,5667,5482,-66.56,16,68,-37.45,120.88,11.50,27.00,14,11,0.11,0.07,0.20,0.11,0.00,0.00,0,0, +1746046552177,24,1066,4,674.80,1096.85,5.72,5893,402,-84.08,12,5,-66.30,6.34,27.00,27.00,19,11,0.13,0.09,0.10,0.28,0.00,0.00,0,0, +1746046553177,19,1083,1047,982.70,1088.08,1060.60,4985,5485,-66.31,16,68,-37.20,121.23,11.50,26.00,14,11,0.11,0.33,0.20,0.11,0.00,0.00,0,0, +1746046553177,24,1066,4,781.75,1096.81,5.66,5819,421,-73.42,12,5,-55.64,6.60,31.00,25.00,15,11,0.18,0.14,0.10,0.28,0.00,0.00,0,0, +1746046554177,19,1059,1095,871.29,1065.54,1101.71,9666,5451,-66.44,16,5,-48.66,6.83,26.50,27.00,14,4,0.12,0.13,0.20,0.11,0.00,0.00,0,0, +1746046554177,24,1078,4,559.70,1096.85,5.70,5953,426,-77.83,12,5,-60.05,6.48,25.50,26.00,14,11,0.07,0.11,0.10,0.28,0.00,0.00,0,0, +1746046555177,19,1071,1071,733.25,1079.70,1081.03,13465,5490,-66.44,16,68,-37.32,121.05,12.00,25.00,14,5,0.12,0.05,0.20,0.11,0.00,0.00,0,0, +1746046555177,24,1066,4,538.55,1108.68,5.72,5813,421,-77.83,12,5,-60.05,6.48,25.50,26.00,19,11,0.03,0.09,0.10,0.28,0.00,0.00,0,0, +1746046556177,19,1083,1047,504.80,1088.56,1061.86,6666,5520,-66.31,16,68,-37.20,121.23,12.00,26.00,14,13,0.13,0.14,0.20,0.11,0.00,0.00,0,0, +1746046556177,24,1066,4,950.25,1096.85,5.70,6019,412,-80.93,14,5,-63.15,6.41,31.00,27.00,18,11,0.12,0.12,0.10,0.28,0.00,0.00,0,0, +1746046557177,19,1071,1095,641.33,1076.10,1101.17,5509,5480,-66.00,16,5,-48.22,6.84,26.50,25.00,14,10,0.12,0.11,0.20,0.11,0.00,0.00,0,0, +1746046557177,24,1066,4,431.80,1096.81,5.70,5827,412,-79.21,14,5,-61.43,6.45,23.50,27.00,19,11,0.05,0.11,0.10,0.28,0.00,0.00,0,0, +1746046558177,19,1083,1071,402.11,1088.46,1080.86,6177,5493,-66.25,16,68,-37.13,121.32,12.00,23.00,14,12,0.12,0.06,0.20,0.11,0.00,0.00,0,0, +1746046558177,24,1066,4,528.40,1079.86,5.58,5805,402,-74.00,14,5,-56.22,6.58,23.50,26.00,19,11,0.10,0.12,0.10,0.28,0.00,0.00,0,0, +1746046559177,19,1071,1059,665.17,1076.54,1080.82,6117,5493,-66.06,16,5,-48.28,6.84,27.00,24.00,14,9,0.12,0.10,0.20,0.11,0.00,0.00,0,0, +1746046559177,24,1066,4,737.30,1120.87,5.73,6135,383,-72.10,10,5,-54.32,6.64,28.50,26.00,18,8,0.10,0.17,0.10,0.28,0.00,0.00,0,0, +1746046560177,19,1059,1095,793.18,1064.51,1095.29,6291,5685,-66.06,16,68,-36.95,121.59,12.00,26.00,14,13,0.12,0.04,0.20,0.11,0.00,0.00,0,0, +1746046560177,24,1078,4,586.89,1071.51,5.55,7908,412,-72.10,10,5,-54.32,6.64,26.00,28.00,18,7,0.06,0.07,0.10,0.28,0.00,0.00,0,0, +1746046561177,19,1071,1059,519.00,1076.25,1081.78,6178,5515,-66.38,16,68,-37.26,121.14,12.00,26.00,14,7,0.14,0.13,0.20,0.11,0.00,0.00,0,0, +1746046561177,24,1066,4,631.11,1095.62,5.55,7318,360,-101.00,9,5,-83.22,6.07,25.00,27.00,18,9,0.18,0.16,0.10,0.28,0.00,0.00,0,0, +1746046562177,19,1083,1071,662.64,1088.48,1081.29,8024,5454,-66.56,16,5,-48.78,6.82,27.00,27.00,14,8,0.13,0.05,0.20,0.11,0.00,0.00,0,0, +1746046562177,24,1066,4,509.33,1071.67,5.53,6584,418,-78.36,11,5,-60.58,6.47,25.00,27.00,17,9,0.09,0.08,0.10,0.28,0.00,0.00,0,0, +1746046563177,19,1083,1071,803.60,1088.38,1080.65,5430,5393,-66.25,16,5,-48.47,6.83,26.50,27.00,14,12,0.12,0.13,0.20,0.11,0.00,0.00,0,0, +1746046563177,24,1066,4,595.89,1071.39,5.53,5835,402,-83.55,11,5,-65.76,6.35,31.00,27.00,20,12,0.05,0.06,0.10,0.28,0.00,0.00,0,0, +1746046564177,19,1059,1071,627.89,1064.37,1082.11,6126,5439,-66.25,16,5,-48.47,6.83,27.00,26.00,14,10,0.13,0.08,0.20,0.11,0.00,0.00,0,0, +1746046564177,24,1066,4,570.64,1081.10,5.58,5164,397,-83.55,11,5,-65.76,6.35,26.00,26.00,17,12,0.23,0.13,0.10,0.28,0.00,0.00,0,0, +1746046565177,19,1083,1071,797.22,1088.26,1080.75,5449,5493,-66.19,16,5,-48.41,6.84,27.50,26.00,14,13,0.13,0.10,0.20,0.11,0.00,0.00,0,0, +1746046565177,24,1066,4,301.70,1100.37,5.66,4981,425,-83.15,13,5,-65.37,6.36,31.50,27.00,13,12,0.09,0.14,0.10,0.28,0.00,0.00,0,0, +1746046566177,19,1059,1083,444.50,1064.32,1088.33,5641,5596,-66.12,16,5,-48.34,6.84,27.00,28.00,14,7,0.12,0.16,0.20,0.11,0.00,0.00,0,0, +1746046566177,24,1078,4,574.09,1091.94,5.58,5643,416,-86.42,12,5,-68.64,6.30,29.50,27.00,16,8,0.04,0.17,0.10,0.28,0.00,0.00,0,0, +1746046567177,19,1071,1071,232.88,1076.38,1089.50,8007,5590,-66.50,16,5,-48.72,6.82,26.50,27.00,14,7,0.14,0.06,0.20,0.11,0.00,0.00,0,0, +1746046567177,24,1066,4,485.22,1071.55,5.55,7983,375,-93.58,12,5,-75.80,6.17,29.00,26.00,20,7,0.07,0.08,0.10,0.28,0.00,0.00,0,0, +1746046568177,19,1083,1083,592.10,1088.44,1094.70,6066,8546,-66.44,16,63,-37.65,111.16,8.00,25.00,10,11,0.08,0.13,0.20,0.11,0.00,0.00,0,0, +1746046568177,24,1066,4,829.50,1071.43,5.53,7256,375,-84.00,11,5,-66.22,6.34,30.00,27.00,18,10,0.16,0.07,0.10,0.27,0.00,0.00,0,0, +1746046569177,19,1083,1059,626.00,1088.50,1069.18,5791,8448,-66.44,16,5,-48.66,6.83,26.50,28.00,12,11,0.06,0.05,0.20,0.11,0.00,0.00,0,0, +1746046569177,24,1066,4,661.89,1071.47,5.53,6380,407,-84.00,11,5,-66.22,6.34,24.50,27.00,18,10,0.09,0.05,0.10,0.27,0.00,0.00,0,0, +1746046570177,19,1071,1083,555.00,1076.33,1092.54,5154,7907,-65.94,16,106,-34.89,200.31,9.50,26.00,12,12,0.09,0.08,0.20,0.11,0.00,0.00,0,0, +1746046570177,24,1066,4,600.91,1083.58,5.55,6871,412,-75.00,10,5,-57.22,6.55,26.00,27.00,18,8,0.09,0.09,0.10,0.27,0.00,0.00,0,0, +1746046571177,19,1071,1059,834.22,1076.53,1100.87,5199,7778,-66.31,16,5,-48.53,6.83,25.50,27.00,12,12,0.08,0.11,0.20,0.11,0.00,0.00,0,0, +1746046571177,24,1066,4,607.70,1079.82,5.58,6513,402,-80.58,12,5,-62.80,6.42,36.00,28.00,19,11,0.12,0.08,0.10,0.27,0.00,0.00,0,0, +1746046572177,19,1059,1119,724.62,1064.19,1129.87,4759,8173,-66.19,16,93,-35.71,172.37,8.00,26.00,12,12,0.09,0.09,0.20,0.11,0.00,0.00,0,0, +1746046572177,24,1078,4,424.70,1079.86,5.55,5609,397,-83.00,13,5,-65.22,6.36,26.50,27.00,18,11,0.14,0.08,0.10,0.27,0.00,0.00,0,0, +1746046573177,19,1083,1006,651.50,1088.30,1048.16,5224,7782,-66.19,16,88,-35.95,162.01,8.00,27.00,12,12,0.10,0.09,0.20,0.11,0.00,0.00,0,0, +1746046573177,24,1066,4,695.78,1091.94,5.64,5867,417,-83.00,13,5,-65.22,6.36,29.00,27.00,18,11,0.07,0.11,0.10,0.27,0.00,0.00,0,0, +1746046574177,19,1071,1083,615.58,1076.64,1067.54,5519,7435,-66.25,16,5,-48.47,6.83,26.00,27.00,12,12,0.11,0.12,0.20,0.11,0.00,0.00,0,0, +1746046574177,24,1066,4,812.82,1105.28,5.78,6060,365,-78.50,16,5,-60.72,6.46,31.50,30.00,20,11,0.15,0.10,0.10,0.27,0.00,0.00,0,0, +1746046575177,19,1083,1087,491.50,1088.28,1102.01,5042,7860,-66.44,16,5,-48.66,6.83,26.00,28.00,12,12,0.11,0.10,0.20,0.11,0.00,0.00,0,0, +1746046575177,24,1066,4,518.45,1079.98,5.58,5870,421,-75.88,16,5,-58.09,6.53,33.50,30.00,14,11,0.11,0.12,0.10,0.27,0.00,0.00,0,0, +1746046576177,19,1071,1059,545.40,1076.41,1072.58,5618,7797,-66.06,16,5,-48.28,6.84,27.00,27.00,12,11,0.10,0.08,0.20,0.11,0.00,0.00,0,0, +1746046576177,24,1066,4,360.36,1071.43,5.55,5767,426,-86.88,16,5,-69.09,6.29,29.50,30.00,15,11,0.05,0.10,0.10,0.27,0.00,0.00,0,0, +1746046577177,19,1071,1083,448.30,1076.02,1084.22,4956,7665,-66.06,16,5,-48.28,6.84,25.50,28.00,12,12,0.12,0.23,0.20,0.11,0.00,0.00,0,0, +1746046577177,24,1066,4,606.78,1096.61,5.72,5757,365,-82.69,16,5,-64.91,6.37,29.50,27.00,18,11,0.14,0.11,0.10,0.27,0.00,0.00,0,0, +1746046578177,19,1071,1042,492.45,1076.22,1062.28,6706,7873,-66.06,16,5,-48.28,6.84,24.50,28.00,12,8,0.13,0.08,0.20,0.11,0.00,0.00,0,0, +1746046578177,24,1078,4,525.44,1083.42,5.53,5751,407,-82.69,16,5,-64.91,6.37,27.50,28.00,18,11,0.07,0.09,0.10,0.27,0.00,0.00,0,0, +1746046579177,19,1071,1123,611.56,1076.36,1135.82,6167,7877,-66.19,16,23,-41.78,36.44,25.50,31.00,12,13,0.12,0.06,0.20,0.11,0.00,0.00,0,0, +1746046579177,24,1066,4,848.11,1088.30,5.64,5780,407,-79.00,16,5,-61.22,6.45,28.00,28.00,19,11,0.08,0.08,0.11,0.27,0.00,0.00,0,0, +1746046580177,19,1071,1071,736.82,1076.42,1101.94,5881,7827,-66.06,16,94,-35.54,174.73,8.50,26.00,12,10,0.13,0.10,0.20,0.11,0.00,0.00,0,0, +1746046580177,24,1066,4,681.09,1105.24,5.78,5928,402,-81.00,16,5,-63.22,6.41,24.50,27.00,19,11,0.08,0.09,0.11,0.27,0.00,0.00,0,0, +1746046581177,19,1083,1059,876.45,1088.34,1078.03,6063,7730,-66.00,16,5,-48.22,6.84,26.50,30.00,12,13,0.13,0.05,0.20,0.11,0.00,0.00,0,0, +1746046581177,24,1066,4,386.90,1105.20,5.78,5923,370,-71.62,16,5,-53.84,6.65,26.50,29.00,19,11,0.14,0.08,0.11,0.27,0.00,0.00,0,0, +1746046582177,19,1071,1071,668.30,1076.26,1076.30,5574,8298,-66.00,16,5,-48.22,6.84,26.00,27.00,11,11,0.08,0.08,0.20,0.11,0.00,0.00,0,0, +1746046582177,24,1066,4,752.00,1088.30,5.64,5714,402,-71.62,16,5,-53.84,6.65,25.50,30.00,19,11,0.09,0.08,0.11,0.27,0.00,0.00,0,0, +1746046583177,19,1071,1059,691.33,1076.16,1071.58,5130,8120,-65.88,16,5,-48.09,6.85,26.00,28.00,12,13,0.09,0.14,0.20,0.11,0.00,0.00,0,0, +1746046583177,24,1066,4,681.67,1088.22,5.64,5770,402,-78.69,16,5,-60.91,6.46,29.50,29.00,19,11,0.08,0.11,0.11,0.27,0.00,0.00,0,0, +1746046584177,19,1071,1054,760.70,1076.43,1072.30,6092,8022,-66.00,16,5,-48.22,6.84,25.50,27.00,12,10,0.12,0.09,0.20,0.11,0.00,0.00,0,0, +1746046584177,24,1078,4,553.22,1079.78,5.58,5668,390,-83.62,16,5,-65.84,6.35,30.00,27.00,20,11,0.11,0.08,0.11,0.27,0.00,0.00,0,0, +1746046585177,19,1071,1083,506.33,1076.42,1093.66,6050,7498,-65.75,16,5,-47.97,6.85,26.50,27.00,12,12,0.12,0.07,0.20,0.11,0.00,0.00,0,0, +1746046585177,24,1066,4,735.90,1108.88,5.72,6077,421,-77.25,16,5,-59.47,6.50,25.50,27.00,16,11,0.12,0.12,0.11,0.27,0.00,0.00,0,0, +1746046586177,19,1059,1111,480.11,1064.19,1126.81,5007,8001,-66.06,16,106,-35.02,199.97,9.50,27.00,12,12,0.10,0.07,0.20,0.11,0.00,0.00,0,0, +1746046586177,24,1066,4,474.36,1110.66,5.74,5819,352,-70.40,15,5,-52.62,6.69,26.00,28.00,17,11,0.05,0.10,0.11,0.27,0.00,0.00,0,0, +1746046587177,19,1095,1042,642.27,1088.66,1071.62,5318,8118,-66.06,16,5,-48.28,6.84,25.50,26.00,12,12,0.12,0.09,0.20,0.11,0.00,0.00,0,0, +1746046587177,24,1066,4,711.50,1113.59,5.81,6102,402,-70.40,15,5,-52.62,6.69,34.00,27.00,17,11,0.18,0.11,0.11,0.27,0.00,0.00,0,0, +1746046588177,19,1071,1059,489.36,1088.26,1077.74,5084,7444,-66.12,16,5,-48.34,6.84,26.00,27.00,12,12,0.11,0.09,0.20,0.11,0.00,0.00,0,0, +1746046588177,24,1066,4,532.00,1088.26,5.66,5709,418,-79.88,16,5,-62.09,6.43,32.00,27.00,16,11,0.09,0.09,0.11,0.27,0.00,0.00,0,0, +1746046589177,19,1071,1071,704.70,1076.38,1081.94,5143,8197,-66.19,16,88,-35.95,162.01,8.00,28.00,12,12,0.12,0.11,0.20,0.11,0.00,0.00,0,0, +1746046589177,24,1066,4,576.38,1088.42,5.64,5981,412,-75.81,16,5,-58.03,6.53,30.50,29.00,19,11,0.05,0.10,0.11,0.27,0.00,0.00,0,0, +1746046590177,19,1059,1111,901.88,1064.38,1121.14,5093,7808,-66.19,16,5,-48.41,6.84,26.50,27.00,12,12,0.12,0.08,0.20,0.11,0.00,0.00,0,0, +1746046590177,24,1078,4,513.00,1096.81,5.70,5816,397,-86.25,16,5,-68.47,6.30,26.50,25.00,19,11,0.12,0.10,0.11,0.27,0.00,0.00,0,0, +1746046591177,19,1083,1030,638.25,1088.41,1043.96,6187,7816,-66.31,16,5,-48.53,6.83,25.50,27.00,12,10,0.13,0.08,0.20,0.11,0.00,0.00,0,0, +1746046591177,24,1066,4,619.82,1117.31,5.78,6185,402,-77.85,13,5,-60.06,6.48,26.00,27.00,16,11,0.17,0.13,0.11,0.28,0.00,0.00,0,0, +1746046592177,19,1071,1135,533.00,1076.40,1141.52,5454,7946,-66.31,16,93,-35.84,172.09,8.00,30.00,12,13,0.14,0.15,0.20,0.11,0.00,0.00,0,0, +1746046592177,24,1066,4,693.00,1088.42,5.64,5846,421,-77.85,13,5,-60.06,6.48,25.50,27.00,15,11,0.08,0.14,0.11,0.28,0.00,0.00,0,0, +1746046593177,19,1071,1059,933.56,1077.12,1071.87,7954,7789,-66.19,16,5,-48.41,6.84,25.50,27.00,12,5,0.14,0.12,0.20,0.11,0.00,0.00,0,0, +1746046593177,24,1066,4,531.25,1113.59,5.81,5976,426,-77.31,16,5,-59.53,6.49,48.00,29.00,19,11,0.04,0.12,0.11,0.28,0.00,0.00,0,0, +1746046594177,19,1083,1030,722.78,1090.81,1048.22,10580,7793,-66.12,16,5,-48.34,6.84,25.50,30.00,11,7,0.11,0.04,0.20,0.11,0.00,0.00,0,0, +1746046594177,24,1066,4,584.09,1079.90,5.58,5672,413,-80.81,16,5,-63.03,6.41,26.00,27.00,15,11,0.22,0.11,0.11,0.28,0.00,0.00,0,0, +1746046595177,19,1071,1111,559.73,1076.54,1123.64,5612,8802,-66.12,16,5,-48.34,6.84,26.00,26.00,12,12,0.06,0.17,0.20,0.11,0.00,0.00,0,0, +1746046595177,24,1066,4,670.55,1088.26,5.66,5779,435,-78.69,16,5,-60.91,6.46,25.00,28.00,12,11,0.08,0.11,0.11,0.28,0.00,0.00,0,0, +1746046596177,19,1071,1059,526.00,1076.33,1072.00,5602,7812,-66.12,16,5,-48.34,6.84,25.00,27.00,12,11,0.10,0.06,0.20,0.11,0.00,0.00,0,0, +1746046596177,24,1078,4,262.78,1071.27,5.49,5627,421,-78.69,16,5,-60.91,6.46,24.50,27.00,16,11,0.04,0.09,0.11,0.28,0.00,0.00,0,0, +1746046597177,19,1071,1054,523.90,1076.26,1065.20,5156,7865,-65.88,16,106,-34.83,200.48,9.50,27.00,12,11,0.13,0.27,0.20,0.11,0.00,0.00,0,0, +1746046597177,24,1066,4,614.17,1100.45,5.66,5906,371,-86.69,16,5,-68.91,6.29,26.00,27.00,18,11,0.14,0.12,0.11,0.28,0.00,0.00,0,0, +1746046598177,19,1071,1071,491.91,1076.38,1081.82,8064,7601,-65.88,16,5,-48.09,6.85,25.00,28.00,12,6,0.12,0.09,0.20,0.11,0.00,0.00,0,0, +1746046598177,24,1066,4,573.90,1079.86,5.58,5673,412,-95.81,16,5,-78.03,6.14,30.50,27.00,18,11,0.08,0.10,0.11,0.28,0.00,0.00,0,0, +1746046599177,19,1083,1087,622.58,1088.33,1094.93,8496,7980,-66.06,16,5,-48.28,6.84,25.50,28.00,11,10,0.08,0.03,0.20,0.11,0.00,0.00,0,0, +1746046599177,24,1066,4,979.25,1071.43,5.53,5764,395,-76.40,15,5,-58.62,6.52,29.50,27.00,20,11,0.13,0.08,0.11,0.28,0.00,0.00,0,0, +1746046600177,19,1071,1054,554.89,1076.15,1073.12,5130,7683,-65.94,16,5,-48.16,6.85,27.00,26.00,13,9,0.11,0.15,0.20,0.11,0.00,0.00,0,0, +1746046600177,24,1066,4,807.73,1088.30,5.62,5846,336,-94.53,15,5,-76.75,6.16,27.00,27.00,18,11,0.08,0.12,0.11,0.28,0.00,0.00,0,0, +1746046601177,19,1071,1087,623.91,1076.50,1093.33,6410,8349,-65.94,16,5,-48.16,6.85,27.00,27.00,10,9,0.10,0.05,0.20,0.11,0.00,0.00,0,0, +1746046601177,24,1066,4,557.22,1079.86,5.58,5805,370,-94.53,15,5,-76.75,6.16,25.50,28.00,20,11,0.13,0.12,0.11,0.28,0.00,0.00,0,0, +1746046602177,19,1071,1107,607.60,1076.02,1125.52,5062,9306,-66.12,16,94,-35.60,174.59,8.50,27.00,12,12,0.06,0.23,0.20,0.11,0.00,0.00,0,0, +1746046602177,24,1078,4,346.22,1096.97,5.70,6081,402,-83.75,12,5,-65.97,6.35,30.00,27.00,19,11,0.12,0.12,0.11,0.28,0.00,0.00,0,0, +1746046603177,19,1071,1071,789.25,1076.34,1072.20,7667,7705,-66.19,16,106,-35.14,199.64,9.00,27.00,12,6,0.08,0.10,0.20,0.11,0.00,0.00,0,0, +1746046603177,24,1066,4,726.10,1117.11,5.78,5854,402,-74.18,11,5,-56.40,6.58,25.50,27.00,19,11,0.13,0.10,0.12,0.28,0.00,0.00,0,0, +1746046604177,19,1071,1059,705.10,1076.45,1072.21,8784,8101,-66.00,16,88,-35.76,162.40,7.50,27.00,12,9,0.10,0.04,0.20,0.11,0.00,0.00,0,0, +1746046604177,24,1066,4,701.33,1079.70,5.58,5540,413,-80.00,12,5,-62.22,6.43,25.50,26.00,17,11,0.13,0.12,0.12,0.28,0.00,0.00,0,0, +1746046605177,19,1083,1071,389.85,1083.84,1092.84,5506,7511,-66.00,16,5,-48.22,6.84,25.50,25.00,12,10,0.12,0.23,0.20,0.11,0.00,0.00,0,0, +1746046605177,24,1066,4,503.82,1105.24,5.75,6060,421,-80.00,12,5,-62.22,6.43,31.50,26.00,17,11,0.06,0.11,0.12,0.28,0.00,0.00,0,0, +1746046606177,19,1071,1071,856.30,1080.93,1072.05,8423,7740,-66.25,16,5,-48.47,6.83,25.00,26.00,12,6,0.10,0.08,0.20,0.11,0.00,0.00,0,0, +1746046606177,24,1066,4,365.80,1102.35,5.67,5845,361,-73.83,12,5,-56.05,6.59,30.00,27.00,21,11,0.15,0.10,0.12,0.28,0.00,0.00,0,0, +1746046607177,19,1071,1083,702.00,1076.24,1096.83,7937,7882,-66.38,16,5,-48.59,6.83,26.00,25.00,12,12,0.12,0.03,0.20,0.11,0.00,0.00,0,0, +1746046607177,24,1066,4,386.00,1105.16,5.75,5994,426,-76.19,16,5,-58.41,6.52,30.00,27.00,13,11,0.14,0.10,0.12,0.28,0.00,0.00,0,0, +1746046608177,19,1071,1030,546.67,1076.38,1071.68,6143,8091,-66.38,16,5,-48.59,6.83,25.50,27.00,12,7,0.10,0.14,0.20,0.11,0.00,0.00,0,0, +1746046608177,24,1066,4,667.22,1071.43,5.53,5696,420,-76.06,16,5,-58.28,6.53,29.00,26.00,13,11,0.06,0.12,0.12,0.28,0.00,0.00,0,0, +1746046609177,19,1071,1123,662.00,1076.28,1131.02,7985,7868,-66.25,16,88,-36.01,161.88,8.50,26.00,12,7,0.12,0.05,0.20,0.11,0.00,0.00,0,0, +1746046609177,24,1078,4,536.40,1100.21,5.66,5772,412,-92.27,15,5,-74.49,6.19,25.50,27.00,19,11,0.05,0.10,0.12,0.28,0.00,0.00,0,0, +1746046610177,19,1071,1030,748.18,1076.53,1043.58,5702,7709,-66.25,16,88,-36.01,161.88,8.50,28.00,12,12,0.11,0.11,0.20,0.11,0.00,0.00,0,0, +1746046610177,24,1066,4,779.22,1088.46,5.64,5862,407,-92.27,15,5,-74.49,6.19,30.00,27.00,16,11,0.15,0.10,0.12,0.28,0.00,0.00,0,0, +1746046611177,19,1083,1059,861.11,1076.32,1096.80,5556,7766,-66.06,16,88,-35.83,162.27,8.50,31.00,12,11,0.12,0.08,0.20,0.11,0.00,0.00,0,0, +1746046611177,24,1066,4,742.67,1088.34,5.64,5915,421,-77.69,16,5,-59.91,6.48,33.00,27.00,16,11,0.07,0.10,0.12,0.28,0.00,0.00,0,0, +1746046612177,19,1071,1111,513.00,1088.48,1096.20,5959,7703,-66.25,16,5,-48.47,6.83,25.00,28.00,12,11,0.11,0.07,0.20,0.11,0.00,0.00,0,0, +1746046612177,24,1066,4,657.90,1088.22,5.66,5780,402,-78.75,16,5,-60.97,6.46,29.50,28.00,20,11,0.09,0.09,0.12,0.28,0.00,0.00,0,0, +1746046613177,19,1071,1059,885.27,1076.29,1067.41,5600,7909,-66.38,16,5,-48.59,6.83,25.00,31.00,12,9,0.12,0.15,0.20,0.11,0.00,0.00,0,0, +1746046613177,24,1066,4,604.90,1079.98,5.58,5680,416,-74.56,16,5,-56.78,6.57,26.00,25.00,15,11,0.12,0.08,0.12,0.28,0.00,0.00,0,0, +1746046614177,19,1071,1054,365.78,1076.33,1077.42,6385,7788,-66.38,16,5,-48.59,6.83,25.50,30.00,12,9,0.13,0.05,0.20,0.11,0.00,0.00,0,0, +1746046614177,24,1066,4,826.40,1096.81,5.70,6080,426,-74.56,16,5,-56.78,6.57,26.50,27.00,15,11,0.06,0.10,0.12,0.28,0.00,0.00,0,0, +1746046615177,19,1059,1123,782.78,1064.25,1135.45,5590,8218,-66.00,16,45,-38.68,76.79,25.50,30.00,11,8,0.10,0.17,0.20,0.11,0.00,0.00,0,0, +1746046615177,24,1078,4,853.00,1100.25,5.64,5720,370,-78.38,16,5,-60.59,6.47,29.50,27.00,19,11,0.17,0.11,0.12,0.28,0.00,0.00,0,0, +1746046616177,19,1083,1071,673.50,1088.72,1076.09,8415,8327,-65.94,16,5,-48.16,6.85,25.50,31.00,12,7,0.09,0.06,0.20,0.11,0.00,0.00,0,0, +1746046616177,24,1066,4,532.82,1079.94,5.58,5739,418,-84.88,16,5,-67.09,6.33,28.00,26.00,16,11,0.14,0.09,0.12,0.28,0.00,0.00,0,0, +1746046617177,19,1083,1059,981.43,1064.06,1077.99,5798,7809,-66.00,16,5,-48.22,6.84,25.00,27.00,12,14,0.10,0.04,0.20,0.11,0.00,0.00,0,0, +1746046617177,24,1066,4,792.45,1079.78,5.61,5673,421,-75.50,16,5,-57.72,6.54,26.50,29.00,16,11,0.07,0.08,0.12,0.28,0.00,0.00,0,0, +1746046618177,19,1071,1071,448.00,1100.39,1077.22,5990,7748,-65.81,16,5,-48.03,6.85,26.50,28.00,12,9,0.12,0.11,0.20,0.11,0.00,0.00,0,0, +1746046618177,24,1066,4,753.67,1096.77,5.70,5887,370,-76.12,16,5,-58.34,6.52,26.50,26.00,19,11,0.15,0.08,0.12,0.28,0.00,0.00,0,0, +1746046619177,19,1071,1059,800.36,1076.34,1072.86,6236,7796,-65.81,16,5,-48.03,6.85,26.00,27.00,12,12,0.12,0.04,0.20,0.11,0.00,0.00,0,0, +1746046619177,24,1066,4,451.45,1096.61,5.68,5754,383,-76.12,16,5,-58.34,6.52,29.00,27.00,18,11,0.09,0.07,0.12,0.28,0.00,0.00,0,0, +1746046620177,19,1071,1078,782.08,1076.25,1083.15,5117,8063,-65.94,16,5,-48.16,6.85,25.50,27.00,11,12,0.12,0.06,0.20,0.11,0.00,0.00,0,0, +1746046620177,24,1066,4,546.00,1088.30,5.64,5770,412,-87.75,16,5,-69.97,6.27,25.50,26.00,18,11,0.08,0.09,0.12,0.28,0.00,0.00,0,0, +1746046621177,19,1071,1047,781.91,1076.43,1070.42,6083,8390,-66.19,16,5,-48.41,6.84,27.00,27.00,12,10,0.08,0.10,0.20,0.11,0.00,0.00,0,0, +1746046621177,24,1078,4,464.10,1117.39,5.75,5995,407,-86.93,15,5,-69.15,6.29,28.00,27.00,19,11,0.06,0.10,0.12,0.28,0.00,0.00,0,0, +1746046622177,19,1059,1123,584.27,1064.46,1130.43,6111,8183,-66.00,16,94,-35.48,174.87,9.00,27.00,12,13,0.11,0.07,0.20,0.11,0.00,0.00,0,0, +1746046622177,24,1066,4,680.18,1096.73,5.72,5887,421,-80.20,15,5,-62.42,6.42,26.00,27.00,15,11,0.15,0.09,0.12,0.28,0.00,0.00,0,0, +1746046623177,19,1095,1059,534.22,1076.54,1089.29,5351,7691,-66.25,16,5,-48.47,6.83,25.50,27.00,12,11,0.14,0.11,0.20,0.11,0.00,0.00,0,0, +1746046623177,24,1066,4,582.00,1096.77,5.70,5822,416,-76.69,16,5,-58.91,6.51,26.00,27.00,15,11,0.08,0.11,0.12,0.28,0.00,0.00,0,0, +1746046624177,19,1071,1083,438.70,1100.44,1096.00,5743,7853,-66.25,16,5,-48.47,6.83,25.00,27.00,12,12,0.14,0.08,0.20,0.11,0.00,0.00,0,0, +1746046624177,24,1066,4,521.67,1110.90,5.70,5953,412,-76.69,16,5,-58.91,6.51,25.00,27.00,19,11,0.07,0.11,0.12,0.28,0.00,0.00,0,0, +1746046625177,19,1071,1083,691.55,1076.18,1096.40,5155,7857,-66.06,16,94,-35.54,174.73,8.50,26.00,12,11,0.11,0.13,0.20,0.11,0.00,0.00,0,0, +1746046625177,24,1066,4,600.22,1088.26,5.66,5781,397,-80.93,14,5,-63.15,6.41,28.50,28.00,17,11,0.17,0.09,0.12,0.28,0.00,0.00,0,0, +1746046626177,19,1059,1059,613.00,1064.42,1077.48,5679,7789,-66.00,16,5,-48.22,6.84,25.50,26.00,12,12,0.12,0.13,0.20,0.11,0.00,0.00,0,0, +1746046626177,24,1066,4,755.50,1105.20,5.75,5796,416,-82.00,13,5,-64.22,6.38,26.50,25.00,17,11,0.08,0.08,0.12,0.28,0.00,0.00,0,0, +1746046627177,19,1083,1083,708.60,1088.17,1120.52,6067,7988,-66.50,16,94,-35.98,173.75,8.50,27.00,12,10,0.12,0.07,0.20,0.11,0.00,0.00,0,0, +1746046627177,24,1078,4,552.80,1108.72,5.72,5945,402,-78.42,12,5,-60.64,6.47,26.00,30.00,19,11,0.06,0.09,0.12,0.28,0.00,0.00,0,0, +1746046628177,19,1071,1042,686.50,1076.21,1043.38,5799,7805,-66.50,16,5,-48.72,6.82,24.50,27.00,12,10,0.13,0.14,0.20,0.11,0.00,0.00,0,0, +1746046628177,24,1066,4,523.36,1071.55,5.53,5767,395,-78.42,12,5,-60.64,6.47,25.50,27.00,20,11,0.11,0.12,0.13,0.28,0.00,0.00,0,0, +1746046629177,19,1083,1111,227.75,1076.16,1127.03,6105,7800,-66.69,16,106,-35.64,198.33,9.50,25.00,12,11,0.11,0.05,0.20,0.11,0.00,0.00,0,0, +1746046629177,24,1066,4,496.20,1113.63,5.81,5970,421,-80.43,14,5,-62.65,6.42,33.00,28.00,15,11,0.12,0.10,0.13,0.28,0.00,0.00,0,0, +1746046630177,19,1071,1059,577.09,1088.46,1077.24,5153,7700,-66.12,16,5,-48.34,6.84,24.50,27.00,12,12,0.11,0.07,0.20,0.11,0.00,0.00,0,0, +1746046630177,24,1066,4,932.91,1096.81,5.72,5953,421,-83.47,15,5,-65.69,6.35,28.50,27.00,15,11,0.06,0.11,0.13,0.28,0.00,0.00,0,0, +1746046631177,19,1071,1059,673.50,1076.34,1071.98,5911,7710,-66.25,16,5,-48.47,6.83,26.00,26.00,12,9,0.09,0.09,0.20,0.11,0.00,0.00,0,0, +1746046631177,24,1066,4,484.44,1096.85,5.70,5896,370,-82.00,14,5,-64.22,6.38,30.50,26.00,19,11,0.16,0.13,0.13,0.28,0.00,0.00,0,0, +1746046632177,19,1071,1095,808.67,1076.44,1129.60,6095,8215,-66.12,16,94,-35.60,174.59,9.00,26.00,12,13,0.09,0.08,0.20,0.11,0.00,0.00,0,0, +1746046632177,24,1066,4,762.00,1071.43,5.53,5825,421,-85.09,11,5,-67.31,6.32,27.50,27.00,17,11,0.09,0.10,0.13,0.28,0.00,0.00,0,0, +1746046633177,19,1059,1071,997.89,1064.48,1076.78,6855,8175,-66.12,16,34,-40.02,56.18,25.50,30.00,11,6,0.11,0.13,0.20,0.11,0.00,0.00,0,0, +1746046633177,24,1078,4,530.20,1129.34,5.78,6180,423,-85.09,11,5,-67.31,6.32,33.50,27.00,17,11,0.06,0.13,0.13,0.28,0.00,0.00,0,0, +1746046634177,19,1071,1059,398.33,1076.37,1069.95,9358,8594,-66.19,16,5,-48.41,6.84,25.50,31.00,11,7,0.05,0.05,0.20,0.11,0.00,0.00,0,0, +1746046634177,24,1066,4,495.92,1113.71,5.83,6101,397,-85.70,10,5,-67.92,6.31,27.00,27.00,17,11,0.17,0.11,0.13,0.28,0.00,0.00,0,0, +1746046635177,19,1095,1071,718.12,1076.53,1082.40,5695,7874,-66.43,14,5,-48.65,6.83,25.50,27.00,12,13,0.12,0.14,0.20,0.11,0.00,0.00,0,0, +1746046635177,24,1066,4,702.45,1105.08,5.75,5928,418,-88.92,12,5,-71.14,6.25,32.00,27.00,17,11,0.09,0.12,0.13,0.28,0.00,0.00,0,0, +1746046636177,19,1071,1071,533.55,1106.05,1092.08,5657,8432,-66.25,16,5,-48.47,6.83,26.00,27.00,11,9,0.10,0.14,0.20,0.11,0.00,0.00,0,0, +1746046636177,24,1066,4,531.25,1113.63,5.83,5969,421,-76.36,11,5,-58.58,6.52,29.50,26.00,17,11,0.08,0.10,0.13,0.28,0.00,0.00,0,0, +1746046637177,19,1071,1059,754.18,1076.29,1070.30,6295,8621,-66.25,16,5,-48.47,6.83,25.50,27.00,12,10,0.05,0.05,0.20,0.11,0.00,0.00,0,0, +1746046637177,24,1066,4,362.90,1096.77,5.70,5820,421,-76.36,11,5,-58.58,6.52,29.50,26.00,17,11,0.07,0.12,0.13,0.28,0.00,0.00,0,0, +1746046638177,19,1071,1071,727.17,1076.39,1083.74,5575,7677,-66.07,15,5,-48.29,6.84,25.50,27.00,12,9,0.15,0.15,0.20,0.11,0.00,0.00,0,0, +1746046638177,24,1066,4,532.67,1100.10,5.70,5711,370,-83.25,12,5,-65.47,6.36,30.50,28.00,20,11,0.12,0.10,0.13,0.28,0.00,0.00,0,0, +1746046639177,19,1059,1107,391.67,1064.39,1114.39,6388,8798,-65.87,15,34,-39.76,56.32,26.00,27.00,11,9,0.08,0.06,0.20,0.11,0.00,0.00,0,0, +1746046639177,24,1078,4,608.50,1091.98,5.58,5797,412,-87.00,10,5,-69.22,6.28,33.50,26.00,18,11,0.09,0.12,0.13,0.28,0.00,0.00,0,0, +1746046640177,19,1083,1059,626.73,1088.50,1072.86,5917,7973,-66.07,15,5,-48.29,6.84,26.00,26.00,12,9,0.14,0.18,0.20,0.11,0.00,0.00,0,0, +1746046640177,24,1066,4,603.00,1105.20,5.75,5931,390,-84.73,11,5,-66.95,6.33,25.00,27.00,20,11,0.15,0.12,0.13,0.28,0.00,0.00,0,0, +1746046641177,19,1071,1083,627.56,1076.43,1091.73,6909,8635,-66.27,15,34,-40.16,56.10,26.00,30.00,11,8,0.08,0.06,0.20,0.11,0.00,0.00,0,0, +1746046641177,24,1066,4,633.64,1088.42,5.64,5978,421,-89.43,14,5,-71.65,6.24,32.00,27.00,15,11,0.13,0.10,0.13,0.28,0.00,0.00,0,0, +1746046642177,19,1071,1071,611.80,1076.54,1089.72,5841,8709,-66.27,15,5,-48.49,6.83,25.50,26.00,11,13,0.05,0.12,0.20,0.11,0.00,0.00,0,0, +1746046642177,24,1066,4,388.82,1096.81,5.70,5953,416,-89.43,14,5,-71.65,6.24,26.00,27.00,15,11,0.06,0.10,0.13,0.28,0.00,0.00,0,0, +1746046643177,19,1083,1030,831.30,1088.26,1033.98,6494,8089,-66.27,15,88,-36.03,161.85,7.00,27.00,12,8,0.12,0.09,0.20,0.11,0.00,0.00,0,0, +1746046643177,24,1066,4,546.33,1088.18,5.64,5716,402,-69.00,13,5,-51.22,6.74,30.00,26.00,20,11,0.11,0.10,0.13,0.28,0.00,0.00,0,0, +1746046644177,19,1071,1111,663.83,1076.66,1133.98,6755,8496,-66.21,14,5,-48.43,6.84,25.50,27.00,11,13,0.08,0.05,0.20,0.11,0.00,0.00,0,0, +1746046644177,24,1066,4,629.45,1096.69,5.70,5818,413,-91.17,12,5,-73.39,6.21,27.00,27.00,16,11,0.12,0.08,0.13,0.28,0.00,0.00,0,0, +1746046645177,19,1059,1071,441.56,1064.31,1076.62,5312,8114,-66.12,16,5,-48.34,6.84,25.50,27.00,12,11,0.13,0.08,0.20,0.11,0.00,0.00,0,0, +1746046645177,24,1078,4,815.18,1100.25,5.64,5838,421,-93.07,15,5,-75.29,6.18,38.00,26.00,16,11,0.06,0.10,0.13,0.28,0.00,0.00,0,0, +1746046646177,19,1071,1083,593.00,1076.35,1098.54,5226,8221,-66.12,16,34,-40.02,56.18,25.50,27.00,11,12,0.12,0.17,0.20,0.11,0.00,0.00,0,0, +1746046646177,24,1066,4,436.00,1088.22,5.62,5713,370,-93.07,15,5,-75.29,6.18,25.50,27.00,19,11,0.22,0.10,0.13,0.28,0.00,0.00,0,0, +1746046647177,19,1071,1071,771.75,1076.49,1075.84,5956,8415,-65.93,15,93,-35.46,172.94,7.50,30.00,12,11,0.06,0.07,0.20,0.11,0.00,0.00,0,0, +1746046647177,24,1066,4,516.89,1079.90,5.58,5871,413,-83.69,13,5,-65.91,6.35,26.00,27.00,16,11,0.10,0.12,0.13,0.28,0.00,0.00,0,0, +1746046648177,19,1095,1071,882.10,1100.29,1082.30,5095,8089,-65.80,15,5,-48.02,6.85,25.00,28.00,11,13,0.10,0.14,0.20,0.11,0.00,0.00,0,0, +1746046648177,24,1066,4,594.50,1102.39,5.65,5794,421,-95.36,14,5,-77.58,6.15,25.00,27.00,16,11,0.05,0.11,0.13,0.28,0.00,0.00,0,0, +1746046649177,19,1059,1059,676.18,1064.54,1080.89,6398,8833,-65.94,16,106,-34.89,200.31,8.50,26.00,12,8,0.07,0.10,0.20,0.11,0.00,0.00,0,0, +1746046649177,24,1066,4,742.45,1079.94,5.61,6003,365,-78.57,14,5,-60.79,6.46,25.50,27.00,18,11,0.22,0.14,0.13,0.28,0.00,0.00,0,0, +1746046650177,19,1083,1054,749.91,1088.59,1066.97,6804,7553,-65.75,16,5,-47.97,6.85,26.00,28.00,11,12,0.14,0.03,0.20,0.11,0.00,0.00,0,0, +1746046650177,24,1066,4,757.10,1088.22,5.64,5646,426,-105.11,9,5,-87.33,6.02,29.50,27.00,15,11,0.09,0.11,0.13,0.28,0.00,0.00,0,0, +1746046651177,19,1071,1059,658.92,1076.55,1070.14,6124,8527,-65.75,16,5,-47.97,6.85,26.50,26.00,11,8,0.05,0.12,0.20,0.11,0.00,0.00,0,0, +1746046651177,24,1078,4,770.80,1079.12,5.53,6317,418,-105.11,9,5,-87.33,6.02,28.50,27.00,16,10,0.05,0.13,0.13,0.28,0.00,0.00,0,0, +1746046652177,19,1059,1123,329.40,1064.23,1156.92,6799,8551,-66.07,15,35,-39.83,58.05,26.00,29.00,11,9,0.14,0.05,0.20,0.11,0.00,0.00,0,0, +1746046652177,24,1066,4,707.11,1075.94,5.55,6137,371,-82.20,10,5,-64.42,6.38,25.50,26.00,18,10,0.14,0.08,0.13,0.28,0.00,0.00,0,0, +1746046653177,19,1083,1059,655.50,1088.44,1070.72,5308,8516,-66.25,16,5,-48.47,6.83,26.00,26.00,11,10,0.06,0.17,0.20,0.11,0.00,0.00,0,0, +1746046653177,24,1066,4,770.36,1079.12,5.58,6553,412,-71.50,12,5,-53.72,6.66,31.50,25.00,18,10,0.08,0.08,0.14,0.28,0.00,0.00,0,0, +1746046654177,19,1083,1071,669.73,1088.28,1083.67,6428,5972,-66.19,16,5,-48.41,6.84,26.00,27.00,20,9,0.04,0.06,0.20,0.11,0.00,0.00,0,0, +1746046654177,24,1066,4,377.00,1071.39,5.53,6244,370,-79.93,14,5,-62.15,6.43,30.50,28.00,20,10,0.14,0.09,0.14,0.28,0.00,0.00,0,0, +1746046655177,19,1059,1095,585.89,1064.10,1111.47,5033,4696,-66.19,16,5,-48.41,6.84,26.50,27.00,16,12,0.12,0.21,0.20,0.11,0.00,0.00,0,0, +1746046655177,24,1066,4,525.20,1071.39,5.55,6244,412,-84.93,15,5,-67.15,6.32,26.00,26.00,18,10,0.11,0.09,0.13,0.28,0.00,0.00,0,0, +1746046656177,19,1083,1083,596.10,1088.08,1089.08,6131,4943,-66.19,16,27,-41.08,43.50,26.00,26.00,18,9,0.04,0.08,0.20,0.11,0.00,0.00,0,0, +1746046656177,24,1066,4,626.20,1071.47,5.53,6309,412,-84.93,15,5,-67.15,6.32,30.50,27.00,19,10,0.05,0.09,0.13,0.28,0.00,0.00,0,0, +1746046657177,19,1071,1035,623.42,1076.35,1050.43,5931,4443,-66.19,16,5,-48.41,6.84,27.00,27.00,18,13,0.14,0.14,0.20,0.11,0.00,0.00,0,0, +1746046657177,24,1078,4,777.83,1091.19,5.58,6552,426,-83.07,14,5,-65.29,6.36,29.00,26.00,17,10,0.13,0.09,0.13,0.28,0.00,0.00,0,0, +1746046658177,19,1059,1083,674.00,1064.23,1090.65,5368,4746,-66.00,16,5,-48.22,6.84,26.50,27.00,19,9,0.05,0.13,0.20,0.11,0.00,0.00,0,0, +1746046658177,24,1066,4,448.22,1082.05,5.58,6031,421,-79.69,13,5,-61.91,6.44,24.50,27.00,17,10,0.05,0.06,0.13,0.28,0.00,0.00,0,0, +1746046659177,19,1083,1083,679.36,1088.50,1093.26,6512,4599,-66.19,16,5,-48.41,6.84,25.50,28.00,18,10,0.11,0.05,0.20,0.11,0.00,0.00,0,0, +1746046659177,24,1066,4,825.45,1071.43,5.53,6311,380,-76.08,12,5,-58.30,6.52,27.50,26.00,18,10,0.21,0.06,0.13,0.28,0.00,0.00,0,0, +1746046660177,19,1083,1018,279.10,1088.42,1042.06,5626,4764,-66.19,16,5,-48.41,6.84,26.00,25.00,19,10,0.13,0.13,0.20,0.11,0.00,0.00,0,0, +1746046660177,24,1066,4,304.67,1105.12,5.78,5989,431,-76.08,12,5,-58.30,6.52,26.00,27.00,15,11,0.09,0.12,0.13,0.28,0.00,0.00,0,0, +1746046661177,19,1071,1147,680.42,1076.54,1144.58,6543,4755,-66.00,16,29,-40.58,47.16,26.50,27.00,18,11,0.06,0.05,0.20,0.11,0.00,0.00,0,0, +1746046661177,24,1066,4,568.70,1088.38,5.64,5912,413,-72.36,11,5,-54.58,6.63,26.50,27.00,19,11,0.03,0.12,0.13,0.28,0.00,0.00,0,0, +1746046662177,19,1071,1035,503.30,1076.26,1049.31,4606,4499,-66.00,16,5,-48.22,6.84,26.00,26.00,18,13,0.15,0.14,0.20,0.11,0.00,0.00,0,0, +1746046662177,24,1066,4,721.22,1079.86,5.56,5866,418,-91.60,10,5,-73.82,6.20,27.50,28.00,16,11,0.15,0.13,0.13,0.28,0.00,0.00,0,0, +1746046663177,19,1071,1083,771.92,1076.46,1091.43,5354,4702,-66.12,16,5,-48.34,6.84,26.50,27.00,18,11,0.06,0.14,0.20,0.11,0.00,0.00,0,0, +1746046663177,24,1078,4,539.33,1079.98,5.53,6068,428,-92.00,14,5,-74.22,6.20,28.00,27.00,16,11,0.06,0.14,0.13,0.28,0.00,0.00,0,0, +1746046664177,19,1071,1095,692.22,1076.25,1109.17,5823,4675,-66.12,16,5,-48.34,6.84,25.50,27.00,18,12,0.15,0.05,0.20,0.11,0.00,0.00,0,0, +1746046664177,24,1066,4,513.80,1082.64,5.58,6308,380,-73.83,12,5,-56.05,6.59,30.00,27.00,21,10,0.11,0.11,0.13,0.28,0.00,0.00,0,0, +1746046665177,19,1071,1071,726.33,1076.38,1090.30,5422,4764,-66.12,16,27,-41.02,43.52,26.50,27.00,18,8,0.05,0.15,0.20,0.11,0.00,0.00,0,0, +1746046665177,24,1066,4,616.58,1071.71,5.55,6581,413,-73.83,12,5,-56.05,6.59,31.00,27.00,17,10,0.09,0.12,0.13,0.28,0.00,0.00,0,0, +1746046666177,19,1083,1047,537.27,1088.59,1050.48,7488,4305,-65.88,16,5,-48.09,6.85,27.00,28.00,19,8,0.14,0.05,0.20,0.11,0.00,0.00,0,0, +1746046666177,24,1066,4,546.30,1071.27,5.53,6043,427,-82.20,10,5,-64.42,6.38,24.50,26.00,20,10,0.08,0.06,0.13,0.28,0.00,0.00,0,0, +1746046667177,19,1071,1083,782.64,1076.43,1090.81,5701,4795,-66.00,16,5,-48.22,6.84,27.50,27.00,18,13,0.06,0.12,0.20,0.11,0.00,0.00,0,0, +1746046667177,24,1066,4,609.00,1088.26,5.66,5950,402,-78.86,14,5,-61.08,6.46,29.50,27.00,19,11,0.09,0.10,0.13,0.28,0.00,0.00,0,0, +1746046668177,19,1071,1059,821.09,1076.10,1078.33,5091,4662,-66.00,16,5,-48.22,6.84,26.00,27.00,18,10,0.15,0.12,0.20,0.11,0.00,0.00,0,0, +1746046668177,24,1066,4,493.50,1088.26,5.64,5781,422,-78.80,15,5,-61.02,6.46,23.50,26.00,19,11,0.06,0.11,0.13,0.28,0.00,0.00,0,0, +1746046669177,19,1071,1083,761.36,1076.41,1090.62,6286,4791,-66.00,16,5,-48.22,6.84,25.50,27.00,18,12,0.05,0.04,0.20,0.11,0.00,0.00,0,0, +1746046669177,24,1078,4,486.00,1105.20,5.66,5861,370,-78.80,15,5,-61.02,6.46,24.50,27.00,20,11,0.12,0.11,0.13,0.28,0.00,0.00,0,0, +1746046670177,19,1071,1095,637.60,1076.28,1108.11,5114,4662,-66.00,16,5,-48.22,6.84,25.50,28.00,18,12,0.15,0.08,0.20,0.11,0.00,0.00,0,0, +1746046670177,24,1066,4,723.10,1083.42,5.58,5757,417,-71.56,16,5,-53.78,6.65,25.50,27.00,18,11,0.11,0.13,0.13,0.28,0.00,0.00,0,0, +1746046671177,19,1071,1018,609.36,1076.24,1031.26,5117,4775,-66.12,16,5,-48.34,6.84,26.00,28.00,18,12,0.06,0.08,0.20,0.11,0.00,0.00,0,0, +1746046671177,24,1066,4,701.60,1096.65,5.70,5623,417,-78.94,16,5,-61.16,6.45,31.50,26.00,20,11,0.04,0.08,0.13,0.28,0.00,0.00,0,0, +1746046672177,19,1083,1135,618.82,1088.50,1152.42,5255,4545,-66.00,16,5,-48.22,6.84,25.50,28.00,19,12,0.13,0.08,0.20,0.11,0.00,0.00,0,0, +1746046672177,24,1066,4,492.22,1113.75,5.83,6232,417,-74.38,13,5,-56.60,6.57,29.00,26.00,17,11,0.15,0.12,0.13,0.28,0.00,0.00,0,0, +1746046673177,19,1071,1023,891.00,1076.23,1032.22,5061,4509,-66.31,16,5,-48.53,6.83,27.50,27.00,18,12,0.07,0.11,0.20,0.11,0.00,0.00,0,0, +1746046673177,24,1066,4,709.82,1079.98,5.54,5874,421,-78.36,14,5,-60.58,6.47,24.50,27.00,17,11,0.06,0.12,0.13,0.28,0.00,0.00,0,0, +1746046674177,19,1071,1083,1046.50,1076.28,1093.22,4936,4521,-66.31,16,5,-48.53,6.83,26.00,27.00,19,12,0.15,0.10,0.20,0.11,0.00,0.00,0,0, +1746046674177,24,1066,4,591.30,1088.36,6.62,5784,473,-78.36,14,5,-60.58,6.47,25.00,25.00,20,11,0.16,0.10,0.13,0.28,0.00,0.00,0,0, +1746046675177,19,1071,1095,499.80,1076.31,1106.00,5783,4858,-66.12,16,27,-41.02,43.52,26.50,26.00,18,10,0.07,0.11,0.20,0.11,0.00,0.00,0,0, +1746046675177,24,1078,4,471.44,1091.82,5.57,5663,421,-66.86,14,5,-49.08,6.81,31.00,27.00,17,11,0.09,0.10,0.13,0.28,0.00,0.00,0,0, +1746046676177,19,1071,1018,471.00,1076.21,1039.06,5975,4622,-66.25,16,5,-48.47,6.83,25.50,26.00,19,13,0.11,0.04,0.20,0.11,0.00,0.00,0,0, +1746046676177,24,1066,4,615.20,1096.77,5.72,5887,373,-77.58,12,5,-59.80,6.49,30.00,28.00,20,11,0.05,0.10,0.13,0.28,0.00,0.00,0,0, +1746046677177,19,1071,1099,569.42,1076.27,1100.33,5576,4579,-66.00,16,5,-48.22,6.84,24.50,26.00,18,9,0.08,0.13,0.20,0.11,0.00,0.00,0,0, +1746046677177,24,1066,4,760.27,1113.59,5.81,5903,418,-77.44,16,5,-59.66,6.49,29.50,26.00,17,11,0.11,0.10,0.13,0.28,0.00,0.00,0,0, +1746046678177,19,1083,1083,743.42,1088.40,1093.24,6376,4607,-66.00,16,5,-48.22,6.84,26.00,27.00,19,10,0.13,0.05,0.20,0.11,0.00,0.00,0,0, +1746046678177,24,1066,4,682.45,1079.94,5.58,5871,433,-77.44,16,5,-59.66,6.49,24.50,27.00,18,11,0.05,0.11,0.13,0.28,0.00,0.00,0,0, +1746046679177,19,1071,1083,925.40,1076.30,1092.10,4982,4681,-66.06,16,5,-48.28,6.84,26.00,28.00,18,11,0.09,0.18,0.20,0.11,0.00,0.00,0,0, +1746046679177,24,1066,4,340.27,1088.18,5.58,5713,388,-75.57,14,5,-57.79,6.54,28.50,27.00,16,11,0.17,0.12,0.13,0.28,0.00,0.00,0,0, +1746046680177,19,1071,1071,699.22,1076.30,1091.23,6326,4725,-65.88,16,13,-43.94,19.49,25.50,27.00,19,10,0.06,0.07,0.20,0.11,0.00,0.00,0,0, +1746046680177,24,1066,4,687.08,1096.81,5.66,5948,416,-78.29,7,5,-60.50,6.47,25.00,27.00,16,11,0.06,0.11,0.13,0.28,0.00,0.00,0,0, +1746046681177,19,1071,1083,675.44,1076.37,1090.95,5387,4745,-65.88,16,36,-39.52,60.01,26.00,27.00,16,13,0.11,0.13,0.20,0.11,0.00,0.00,0,0, +1746046681177,24,1078,4,707.11,1088.28,6.54,5657,559,-75.55,11,5,-57.76,6.54,34.50,27.00,19,11,0.17,0.11,0.13,0.28,0.00,0.00,0,0, +1746046682177,19,1071,1083,746.55,1076.35,1089.42,4886,4913,-66.12,16,5,-48.34,6.84,26.50,27.00,18,11,0.04,0.17,0.20,0.11,0.00,0.00,0,0, +1746046682177,24,1066,4,653.90,1108.88,5.72,6113,407,-75.42,12,5,-57.64,6.54,26.50,27.00,18,11,0.10,0.11,0.13,0.28,0.00,0.00,0,0, +1746046683177,19,1059,1083,661.56,1064.14,1094.12,6105,4514,-66.12,16,5,-48.34,6.84,25.00,27.00,19,10,0.14,0.06,0.20,0.11,0.00,0.00,0,0, +1746046683177,24,1066,4,576.20,1096.65,5.70,5755,378,-75.42,12,5,-57.64,6.54,25.50,28.00,19,11,0.05,0.10,0.13,0.28,0.00,0.00,0,0, +1746046684177,19,1095,1023,303.30,1095.78,1033.82,5254,4675,-66.31,16,5,-48.53,6.83,27.00,27.00,18,10,0.09,0.19,0.20,0.11,0.00,0.00,0,0, +1746046684177,24,1066,4,689.09,1105.08,5.75,5862,402,-75.85,13,5,-58.06,6.53,30.50,27.00,17,11,0.23,0.11,0.13,0.28,0.00,0.00,0,0, +1746046685177,19,1071,1083,623.00,1080.83,1093.77,6990,4440,-66.12,16,5,-48.34,6.84,25.50,27.00,19,8,0.11,0.07,0.20,0.11,0.00,0.00,0,0, +1746046685177,24,1066,4,465.50,1088.18,5.62,5714,440,-88.64,11,5,-70.85,6.25,29.50,28.00,13,11,0.09,0.11,0.13,0.28,0.00,0.00,0,0, +1746046686177,19,1071,1071,912.27,1076.51,1090.31,6032,4746,-65.94,16,5,-48.16,6.85,26.00,28.00,18,13,0.07,0.14,0.20,0.11,0.00,0.00,0,0, +1746046686177,24,1066,4,605.08,1096.85,5.70,6084,431,-77.83,6,5,-60.05,6.48,26.00,26.00,17,11,0.03,0.12,0.13,0.28,0.00,0.00,0,0, +1746046687177,19,1071,1083,656.80,1076.06,1095.15,6514,4800,-66.06,16,5,-48.28,6.84,27.00,27.00,17,8,0.13,0.09,0.20,0.11,0.00,0.00,0,0, +1746046687177,24,1078,4,411.00,1091.82,5.54,5660,366,-87.91,11,5,-70.13,6.27,25.50,26.00,22,11,0.10,0.12,0.13,0.28,0.00,0.00,0,0, +1746046688177,19,1071,1083,638.27,1076.50,1088.58,6518,4908,-66.06,16,106,-35.02,199.97,25.00,27.00,19,13,0.04,0.03,0.20,0.11,0.00,0.00,0,0, +1746046688177,24,1066,4,730.55,1096.77,5.72,5953,423,-87.91,11,5,-70.13,6.27,25.50,27.00,16,11,0.12,0.13,0.13,0.28,0.00,0.00,0,0, +1746046689177,19,1071,1083,802.70,1076.13,1093.57,5689,4538,-66.19,16,5,-48.41,6.84,26.50,26.00,18,8,0.15,0.11,0.20,0.11,0.00,0.00,0,0, +1746046689177,24,1066,4,773.80,1079.82,5.54,5676,436,-75.18,11,5,-57.40,6.55,26.50,27.00,17,11,0.05,0.10,0.13,0.28,0.00,0.00,0,0, +1746046690177,19,1083,1071,788.73,1088.63,1090.42,6983,4784,-65.94,16,27,-40.83,43.60,26.50,27.00,18,11,0.05,0.04,0.20,0.11,0.00,0.00,0,0, +1746046690177,24,1066,4,617.91,1102.31,5.65,5911,402,-78.29,14,5,-60.50,6.47,30.00,26.00,19,11,0.12,0.10,0.13,0.28,0.00,0.00,0,0, +1746046691177,19,1071,1030,345.60,1076.27,1034.66,5224,4308,-65.88,16,5,-48.09,6.85,26.00,27.00,19,12,0.14,0.08,0.20,0.11,0.00,0.00,0,0, +1746046691177,24,1066,4,484.60,1113.47,5.81,5772,412,-88.86,14,5,-71.08,6.25,29.50,27.00,19,11,0.09,0.10,0.13,0.28,0.00,0.00,0,0, +1746046692177,19,1071,1071,563.18,1076.45,1091.34,5172,4720,-65.88,16,5,-48.09,6.85,27.00,28.00,18,12,0.07,0.11,0.20,0.11,0.00,0.00,0,0, +1746046692177,24,1066,4,840.73,1088.50,5.64,5926,402,-88.86,14,5,-71.08,6.25,29.50,26.00,19,11,0.05,0.12,0.13,0.28,0.00,0.00,0,0, +1746046693177,19,1071,1147,373.70,1076.27,1150.41,4997,4751,-65.75,16,5,-47.97,6.85,27.00,27.00,19,12,0.09,0.08,0.20,0.11,0.00,0.00,0,0, +1746046693177,24,1078,4,553.88,1096.75,6.13,5772,595,-83.73,11,5,-65.95,6.35,26.00,27.00,19,11,0.10,0.12,0.13,0.28,0.00,0.00,0,0, +1746046694177,19,1071,1023,655.70,1076.17,1036.06,5266,4295,-66.00,16,5,-48.22,6.84,26.00,27.00,19,12,0.09,0.09,0.20,0.11,0.00,0.00,0,0, +1746046694177,24,1066,4,654.00,1091.98,5.58,6028,329,-80.14,14,5,-62.36,6.43,25.50,28.00,19,11,0.07,0.12,0.13,0.28,0.00,0.00,0,0, +1746046695177,19,1059,1083,490.30,1064.31,1092.10,5027,4617,-66.19,16,5,-48.41,6.84,27.50,27.00,18,12,0.10,0.07,0.20,0.11,0.00,0.00,0,0, +1746046695177,24,1066,4,441.09,1088.38,5.66,5978,422,-81.00,13,5,-63.22,6.41,26.50,27.00,18,11,0.13,0.12,0.13,0.28,0.00,0.00,0,0, +1746046696177,19,1095,1071,405.10,1083.96,1090.69,5701,4708,-66.25,16,5,-48.47,6.83,26.50,25.00,19,9,0.06,0.14,0.20,0.11,0.00,0.00,0,0, +1746046696177,24,1066,4,628.92,1144.67,5.93,6265,412,-82.14,14,5,-64.36,6.38,30.50,29.00,18,11,0.06,0.12,0.13,0.28,0.00,0.00,0,0, +1746046697177,19,1059,1083,399.22,1081.01,1088.32,6425,4886,-66.25,16,5,-48.47,6.83,26.50,27.00,17,10,0.08,0.05,0.20,0.11,0.00,0.00,0,0, +1746046697177,24,1066,4,575.60,1096.69,5.72,5821,375,-82.14,14,5,-64.36,6.38,25.50,26.00,19,11,0.14,0.11,0.13,0.28,0.00,0.00,0,0, +1746046698177,19,1083,1071,696.82,1088.46,1090.55,5444,4707,-65.94,16,106,-34.89,200.31,24.50,27.00,19,9,0.08,0.26,0.20,0.11,0.00,0.00,0,0, +1746046698177,24,1066,4,479.17,1088.26,5.64,5714,402,-79.11,9,5,-61.33,6.45,25.50,27.00,19,11,0.07,0.11,0.13,0.28,0.00,0.00,0,0, +1746046699177,19,1059,1083,810.19,1066.10,1093.94,10767,4441,-66.19,16,5,-48.41,6.84,26.00,27.00,19,4,0.11,0.10,0.20,0.11,0.00,0.00,0,0, +1746046699177,24,1078,4,632.89,1096.74,10.51,5825,502,-80.10,10,23,-55.69,33.08,27.50,27.00,18,11,0.19,0.12,0.13,0.28,0.00,0.00,0,0, +1746046700177,19,1083,1030,687.50,1090.64,1035.15,12152,4183,-66.19,16,5,-48.41,6.84,25.50,27.00,19,8,0.14,0.04,0.20,0.11,0.00,0.00,0,0, +1746046700177,24,1066,4,781.90,1083.42,5.53,5624,438,-75.62,16,5,-57.84,6.54,29.50,28.00,16,11,0.08,0.10,0.13,0.28,0.00,0.00,0,0, +1746046701177,19,1071,1075,625.75,1076.51,1090.65,5292,4758,-66.19,16,5,-48.41,6.84,26.50,26.00,18,11,0.07,0.18,0.20,0.11,0.00,0.00,0,0, +1746046701177,24,1066,4,784.00,1096.81,5.66,5820,376,-75.62,16,5,-57.84,6.54,30.50,27.00,20,11,0.07,0.12,0.13,0.28,0.00,0.00,0,0, +1746046702177,19,1083,1083,766.18,1076.29,1092.75,6292,4535,-66.00,16,5,-48.22,6.84,26.00,26.00,19,10,0.09,0.06,0.20,0.11,0.00,0.00,0,0, +1746046702177,24,1066,4,527.55,1096.53,5.70,5637,407,-76.93,15,5,-59.15,6.50,27.50,26.00,17,11,0.16,0.09,0.13,0.28,0.00,0.00,0,0, +1746046703177,19,1059,1083,499.56,1076.43,1094.10,5388,4487,-66.25,16,106,-35.21,199.47,25.00,28.00,19,12,0.11,0.16,0.20,0.11,0.00,0.00,0,0, +1746046703177,24,1066,4,614.00,1122.10,5.85,6079,426,-74.36,14,5,-56.58,6.57,25.50,26.00,17,11,0.06,0.13,0.13,0.28,0.00,0.00,0,0, +1746046704177,19,1083,1071,757.82,1089.64,1339.86,6424,5798,-66.19,16,65,-37.27,115.44,5.00,26.00,15,10,0.27,0.07,0.20,0.11,0.00,0.00,0,0, +1746046704177,24,1066,4,686.00,1079.78,5.58,5738,404,-77.87,15,5,-60.09,6.48,27.00,25.00,19,11,0.06,0.12,0.13,0.28,0.00,0.00,0,0, +1746046705177,19,1071,1059,288.00,1076.40,1101.05,5480,8218,-66.25,16,5,-48.47,6.83,26.00,26.00,6,12,0.34,0.08,0.20,0.11,0.00,0.00,0,0, +1746046705177,24,1066,4,744.00,1105.08,5.70,5922,387,-115.00,1,5,-97.22,5.91,29.00,27.00,19,11,0.07,0.13,0.13,0.28,0.00,0.00,0,0, +1746046706177,19,1071,826,852.64,1076.16,843.06,4920,24403,-66.25,16,106,-35.21,199.47,7.00,25.00,0,12,0.12,0.08,0.20,0.11,0.00,0.00,0,0, +1746046706177,24,1078,4,454.82,1100.33,5.66,5904,402,-115.00,1,5,-97.22,5.91,24.50,27.00,19,11,0.11,0.13,0.13,0.28,0.00,0.00,0,0, +1746046707177,19,1071,1274,719.70,1076.43,1296.81,4996,51164,-66.06,16,106,-35.02,199.97,7.00,28.00,2,12,0.04,0.11,0.20,0.11,0.00,0.00,0,0, +1746046707177,24,1066,4,695.55,1088.50,5.64,6205,408,-89.00,2,5,-71.22,6.25,25.50,26.00,17,10,0.09,0.11,0.13,0.28,0.00,0.00,0,0, +1746046708177,19,1083,1111,640.36,1088.44,1133.93,5366,13812,-66.47,15,5,-48.69,6.83,26.50,27.00,6,12,0.19,0.12,0.20,0.11,0.00,0.00,0,0, +1746046709177,19,1071,1083,502.60,1076.27,1093.41,5484,17730,-66.25,16,94,-35.73,174.31,6.50,27.00,4,11,0.07,0.09,0.20,0.11,0.00,0.00,0,0, +1746046709177,24,1066,4,911.27,1071.67,5.53,6579,402,-115.00,1,5,-97.22,5.91,30.50,26.00,19,10,0.11,0.08,0.13,0.28,0.00,0.00,0,0, +1746046710177,19,1059,1107,904.22,1064.41,1116.22,5322,13812,-66.25,16,94,-35.73,174.31,6.50,26.00,7,14,0.12,0.05,0.20,0.11,0.00,0.00,0,0, +1746046710177,24,1066,4,361.00,1071.47,5.53,6446,402,-115.00,1,5,-97.22,5.91,25.50,27.00,18,10,0.15,0.08,0.13,0.28,0.00,0.00,0,0, +1746046711177,19,1083,1047,882.27,1096.75,1065.52,6205,11888,-66.19,16,106,-35.14,199.64,7.00,27.00,6,8,0.08,0.11,0.20,0.11,0.00,0.00,0,0, +1746046711177,24,1078,4,307.12,1071.59,5.53,6384,412,-69.00,2,5,-51.22,6.74,30.00,26.00,18,10,0.07,0.10,0.13,0.28,0.00,0.00,0,0, +1746046712177,19,1059,1083,821.80,1064.52,1104.08,6810,11969,-66.12,16,94,-35.60,174.59,6.50,25.00,6,11,0.14,0.04,0.20,0.11,0.00,0.00,0,0, +1746046713177,19,1083,1047,881.92,1088.39,1055.89,5249,12161,-66.12,16,5,-48.34,6.84,27.00,27.00,6,12,0.07,0.08,0.20,0.11,0.00,0.00,0,0, +1746046713177,24,1066,4,821.20,1071.51,5.53,6378,392,-119.00,2,5,-101.22,5.88,29.00,26.00,19,10,0.13,0.07,0.13,0.28,0.00,0.00,0,0, +1746046714177,19,1083,1066,474.50,1076.43,1080.42,5294,11599,-66.25,16,5,-48.47,6.83,27.00,28.00,7,12,0.13,0.11,0.20,0.11,0.00,0.00,0,0, +1746046714177,24,1066,4,690.08,1071.55,5.53,6245,402,-51.00,1,5,-33.22,7.68,29.50,25.00,19,10,0.11,0.11,0.13,0.28,0.00,0.00,0,0, +1746046715177,19,1071,1075,642.00,1088.36,1091.62,5099,12482,-66.25,16,106,-35.21,199.47,7.00,27.00,6,12,0.06,0.10,0.20,0.11,0.00,0.00,0,0, +1746046715177,24,1066,4,618.83,1071.55,5.53,6380,402,-51.00,1,5,-33.22,7.68,46.50,26.00,19,10,0.07,0.12,0.13,0.28,0.00,0.00,0,0, +1746046716177,19,1071,1054,625.00,1076.23,1067.75,4969,11421,-66.38,16,5,-48.59,6.83,26.50,27.00,6,12,0.13,0.10,0.20,0.11,0.00,0.00,0,0, +1746046716177,24,1066,4,417.40,1071.39,5.55,6111,365,-69.00,1,5,-51.22,6.74,30.50,25.00,19,10,0.16,0.13,0.13,0.28,0.00,0.00,0,0, +1746046717177,19,1071,1107,732.55,1076.19,1110.63,5099,12255,-66.12,16,5,-48.34,6.84,27.00,25.00,7,12,0.07,0.12,0.20,0.11,0.00,0.00,0,0, +1746046717177,24,1066,4,708.60,1071.47,5.53,6368,397,-75.67,3,5,-57.89,6.54,28.50,27.00,19,10,0.11,0.13,0.13,0.28,0.00,0.00,0,0, +1746046718177,19,1071,1035,661.10,1076.37,1055.54,5590,12890,-66.12,16,5,-48.34,6.84,26.50,25.00,5,10,0.09,0.11,0.20,0.11,0.00,0.00,0,0, +1746046718177,24,1078,4,570.80,1083.50,5.53,6309,402,-123.00,1,5,-105.22,5.84,28.00,26.00,19,10,0.11,0.09,0.13,0.28,0.00,0.00,0,0, +1746046719177,19,1071,1099,575.08,1076.44,1104.53,6210,13905,-65.88,16,106,-34.83,200.48,7.00,27.00,7,13,0.10,0.05,0.20,0.11,0.00,0.00,0,0, +1746046719177,24,1066,4,755.20,1071.35,5.55,6309,402,-74.50,2,5,-56.72,6.57,26.00,27.00,17,10,0.16,0.10,0.13,0.28,0.00,0.00,0,0, +1746046720177,19,1083,1054,522.10,1082.85,1070.92,6032,11114,-65.88,16,5,-48.09,6.85,27.00,26.00,6,8,0.11,0.11,0.20,0.11,0.00,0.00,0,0, +1746046720177,24,1066,4,596.50,1071.59,5.53,6257,418,-74.50,2,5,-56.72,6.57,25.00,26.00,17,10,0.07,0.11,0.14,0.28,0.00,0.00,0,0, +1746046721177,19,1059,1099,683.80,1070.01,1115.15,7271,12869,-66.19,16,49,-38.49,84.25,24.50,27.00,7,11,0.10,0.05,0.20,0.11,0.00,0.00,0,0, +1746046721177,24,1066,4,791.20,1071.55,5.53,6446,370,-69.00,1,5,-51.22,6.74,25.50,27.00,20,10,0.13,0.12,0.14,0.28,0.00,0.00,0,0, +1746046722177,19,1083,1059,581.36,1088.46,1069.74,4871,11674,-66.00,16,106,-34.96,200.14,7.50,26.00,6,13,0.09,0.10,0.20,0.11,0.00,0.00,0,0, +1746046723177,19,1071,1054,513.18,1076.36,1066.58,4737,11959,-65.80,15,106,-34.76,200.68,7.50,27.00,7,13,0.14,0.14,0.20,0.11,0.00,0.00,0,0, +1746046723177,24,1066,4,668.40,1071.51,5.53,6377,412,-69.00,2,5,-51.22,6.74,34.00,27.00,18,10,0.06,0.09,0.14,0.28,0.00,0.00,0,0, +1746046724177,19,1071,1083,381.50,1076.07,1098.30,4524,13385,-65.80,15,5,-48.02,6.85,26.00,26.00,5,13,0.09,0.13,0.20,0.11,0.00,0.00,0,0, +1746046724177,24,1078,4,627.30,1083.70,5.55,6479,365,-69.00,2,5,-51.22,6.74,30.00,27.00,20,10,0.15,0.08,0.14,0.28,0.00,0.00,0,0, +1746046725177,19,1071,1099,962.36,1076.41,1101.54,5640,13287,-66.00,16,5,-48.22,6.84,26.00,27.00,7,11,0.12,0.10,0.20,0.11,0.00,0.00,0,0, +1746046725177,24,1066,4,624.58,1071.43,5.53,6377,418,-119.00,2,5,-101.22,5.88,32.50,27.00,17,10,0.11,0.07,0.14,0.28,0.00,0.00,0,0, +1746046726177,19,1083,1059,997.75,1076.33,1076.03,5506,13400,-66.00,16,5,-48.22,6.84,25.50,28.00,5,13,0.08,0.07,0.20,0.11,0.00,0.00,0,0, +1746046726177,24,1066,4,501.00,1071.39,5.53,6246,416,-96.00,6,5,-78.22,6.14,26.00,26.00,17,10,0.05,0.08,0.14,0.28,0.00,0.00,0,0, +1746046727177,19,1059,1083,410.67,1076.34,1114.42,5709,13207,-66.07,14,51,-38.20,88.20,20.50,27.00,7,9,0.13,0.11,0.20,0.11,0.00,0.00,0,0, +1746046727177,24,1066,4,587.55,1071.63,5.53,6455,402,-68.00,1,5,-50.22,6.77,25.00,27.00,19,10,0.15,0.10,0.14,0.28,0.00,0.00,0,0, +1746046728177,19,1083,1071,798.20,1088.42,1061.98,6452,11947,-65.88,16,5,-48.09,6.85,26.50,27.00,6,12,0.07,0.04,0.20,0.11,0.00,0.00,0,0, +1746046729177,19,1071,1066,739.67,1076.39,1078.31,5626,11864,-65.88,16,5,-48.09,6.85,26.50,26.00,6,9,0.12,0.13,0.20,0.11,0.00,0.00,0,0, +1746046730177,19,1059,1099,877.11,1064.04,1116.46,6038,12645,-66.20,15,106,-35.16,199.61,7.50,27.00,7,9,0.07,0.05,0.20,0.11,0.00,0.00,0,0, +1746046730177,24,1078,4,565.80,1083.46,5.55,6243,402,-96.00,2,5,-78.22,6.14,25.00,26.00,19,10,0.10,0.07,0.14,0.28,0.00,0.00,0,0, +1746046731177,19,1083,1083,600.00,1088.69,1092.61,5776,12223,-66.09,11,106,-35.05,199.90,7.50,29.00,6,12,0.07,0.15,0.20,0.11,0.00,0.00,0,0, +1746046731177,24,1066,4,631.45,1071.51,5.53,6379,392,-123.00,1,5,-105.22,5.84,28.50,26.00,19,10,0.09,0.08,0.14,0.28,0.00,0.00,0,0, +1746046732177,19,1083,1059,648.00,1064.16,1068.23,5091,11470,-66.08,13,5,-48.30,6.84,25.00,28.00,6,12,0.14,0.13,0.20,0.11,0.00,0.00,0,0, +1746046732177,24,1066,4,255.89,1071.39,5.53,6244,402,-69.00,1,5,-51.22,6.74,25.00,27.00,19,10,0.11,0.11,0.14,0.28,0.00,0.00,0,0, +1746046733177,19,1059,1071,635.44,1088.19,1091.07,4971,12482,-66.08,13,106,-35.03,199.94,7.00,26.00,6,12,0.06,0.13,0.20,0.11,0.00,0.00,0,0, +1746046733177,24,1066,4,761.09,1071.47,5.55,6202,412,-69.00,1,5,-51.22,6.74,26.50,27.00,18,10,0.12,0.09,0.14,0.28,0.00,0.00,0,0, +1746046734177,19,1083,1030,838.50,1088.35,1042.66,5062,11453,-66.25,16,5,-48.47,6.83,26.50,27.00,5,12,0.12,0.13,0.20,0.11,0.00,0.00,0,0, +1746046734177,24,1066,4,575.45,1071.55,5.50,6444,407,-90.50,4,5,-72.72,6.22,29.50,27.00,18,10,0.06,0.12,0.14,0.28,0.00,0.00,0,0, +1746046735177,19,1071,1087,583.46,1076.31,1091.50,5835,14713,-66.00,15,5,-48.22,6.84,26.50,26.00,6,11,0.05,0.08,0.20,0.11,0.00,0.00,0,0, +1746046735177,24,1066,4,750.50,1071.51,5.53,6549,402,-87.00,3,5,-69.22,6.28,27.00,26.00,19,8,0.05,0.11,0.14,0.28,0.00,0.00,0,0, +1746046736177,19,1071,1095,262.60,1076.33,1116.48,5384,12501,-65.87,15,106,-34.82,200.50,7.50,27.00,5,12,0.12,0.07,0.20,0.11,0.00,0.00,0,0, +1746046736177,24,1078,4,622.64,1083.62,5.53,7173,397,-85.00,1,5,-67.22,6.32,25.00,26.00,19,8,0.06,0.06,0.14,0.27,0.00,0.00,0,0, +1746046737177,19,1071,1042,678.00,1076.26,1051.54,5114,14395,-66.21,14,5,-48.43,6.84,26.00,26.00,5,12,0.05,0.11,0.20,0.11,0.00,0.00,0,0, +1746046738177,19,1083,1135,603.50,1064.18,1144.55,5769,14870,-66.21,14,106,-35.17,199.57,6.00,26.00,5,9,0.09,0.12,0.20,0.11,0.00,0.00,0,0, +1746046739177,19,1071,1035,640.30,1100.64,1063.61,6602,13952,-66.00,13,94,-35.48,174.87,5.00,26.00,6,11,0.10,0.04,0.20,0.11,0.00,0.00,0,0, +1746046740177,19,1071,1059,778.90,1076.39,1073.37,5695,14719,-66.43,14,5,-48.65,6.83,26.50,26.00,5,9,0.06,0.12,0.20,0.11,0.00,0.00,0,0, +1746046741177,19,1071,1071,705.50,1076.34,1083.74,6242,14550,-66.36,11,5,-48.58,6.83,26.50,27.00,4,12,0.13,0.04,0.20,0.11,0.00,0.00,0,0, +1746046742177,19,1059,1095,996.20,1064.22,1101.78,5445,18122,-66.36,11,94,-35.84,174.05,5.50,27.00,5,11,0.05,0.14,0.20,0.11,0.00,0.00,0,0, +1746046743177,19,1071,1071,494.80,1076.30,1079.28,5765,13892,-66.33,12,106,-35.29,199.25,6.00,27.00,5,11,0.09,0.07,0.20,0.11,0.00,0.00,0,0, +1746046744177,19,1083,1042,256.75,1088.32,1062.37,5563,13951,-66.38,13,5,-48.60,6.83,27.00,27.00,4,12,0.15,0.20,0.20,0.11,0.00,0.00,0,0, +1746046745177,19,1083,1099,480.00,1088.42,1112.14,6908,18604,-66.27,15,94,-35.74,174.27,7.00,28.00,4,8,0.05,0.08,0.20,0.11,0.00,0.00,0,0, +1746046746177,19,1071,1083,824.44,1076.21,1090.58,6077,12336,-66.31,16,106,-35.27,199.31,7.50,27.00,6,13,0.11,0.10,0.20,0.11,0.00,0.00,0,0, +1746046746177,24,1066,4,521.45,1079.86,5.54,5943,388,-69.00,1,5,-51.22,6.74,25.00,27.00,18,10,0.10,0.15,0.14,0.28,0.00,0.00,0,0, +1746046747177,19,1071,1030,820.55,1076.29,1059.25,5045,12406,-66.31,16,106,-35.27,199.31,8.00,26.00,7,9,0.09,0.16,0.20,0.11,0.00,0.00,0,0, +1746046747177,24,1066,4,789.09,1071.55,5.53,6313,417,-69.00,1,5,-51.22,6.74,33.50,26.00,18,10,0.05,0.12,0.14,0.28,0.00,0.00,0,0, +1746046748177,19,1071,1099,924.23,1076.48,1100.24,6505,13245,-66.06,16,5,-48.28,6.84,26.50,25.00,5,9,0.09,0.06,0.20,0.11,0.00,0.00,0,0, +1746046749177,19,1059,1071,572.67,1064.30,1085.42,5301,13274,-66.19,16,5,-48.41,6.84,27.50,24.00,7,12,0.15,0.11,0.20,0.11,0.00,0.00,0,0, +1746046750177,19,1083,1083,796.10,1088.42,1088.41,5263,14232,-66.44,16,106,-35.39,198.98,8.00,26.00,5,12,0.09,0.13,0.20,0.11,0.00,0.00,0,0, +1746046750177,24,1066,4,561.36,1071.47,5.53,6378,402,-69.00,1,5,-51.22,6.74,24.50,27.00,19,10,0.07,0.07,0.14,0.27,0.00,0.00,0,0, +1746046751177,19,1083,1083,520.00,1088.36,1114.24,5908,13536,-66.38,16,106,-35.33,199.14,8.00,25.00,6,10,0.17,0.11,0.20,0.11,0.00,0.00,0,0, +1746046752177,19,1071,1047,647.45,1076.39,1065.06,6299,11975,-66.38,16,5,-48.59,6.83,26.50,26.00,6,12,0.06,0.06,0.20,0.11,0.00,0.00,0,0, +1746046753177,19,1071,1107,503.60,1076.25,1114.03,4879,12247,-66.31,16,106,-35.27,199.31,8.00,27.00,6,12,0.12,0.10,0.20,0.11,0.00,0.00,0,0, +1746046754177,19,1071,1018,504.08,1076.59,1031.66,5925,12276,-66.31,16,5,-48.53,6.83,27.00,27.00,6,11,0.07,0.08,0.20,0.11,0.00,0.00,0,0, +1746046755177,19,1059,1111,525.00,1064.10,1121.73,5339,12042,-66.25,16,106,-35.21,199.47,8.00,26.00,6,11,0.11,0.20,0.20,0.11,0.00,0.00,0,0, +1746046756177,19,1083,1030,648.60,1088.64,1054.39,7154,12213,-66.25,16,53,-38.22,91.88,10.50,25.00,7,8,0.10,0.08,0.20,0.11,0.00,0.00,0,0, +1746046757177,19,1083,1111,890.70,1088.29,1109.71,6113,12049,-66.62,16,5,-48.84,6.82,25.50,26.00,6,12,0.07,0.09,0.20,0.11,0.00,0.00,0,0, +1746046758177,19,1059,1083,384.90,1064.36,1101.07,5173,12943,-66.25,16,106,-35.21,199.47,8.00,27.00,5,12,0.13,0.10,0.20,0.11,0.00,0.00,0,0, +1746046759177,19,1071,1059,749.38,1076.25,1063.32,5386,14043,-66.21,14,5,-48.43,6.84,26.50,27.00,7,11,0.04,0.10,0.20,0.11,0.00,0.00,0,0, +1746046760177,19,1083,1066,496.92,1088.42,1079.25,5821,12080,-65.92,12,5,-48.14,6.85,25.50,27.00,6,12,0.08,0.05,0.20,0.11,0.00,0.00,0,0, +1746046760177,24,1078,4,742.91,1083.54,5.53,6408,416,-69.00,1,5,-51.22,6.74,24.50,27.00,14,10,0.07,0.08,0.15,0.27,0.00,0.00,0,0, +1746046761177,19,1071,1087,744.56,1076.10,1107.18,5130,11974,-65.92,12,106,-34.87,200.37,8.50,26.00,7,12,0.14,0.08,0.20,0.11,0.00,0.00,0,0, +1746046761177,24,1066,4,546.90,1071.47,5.53,6311,413,-69.00,1,5,-51.22,6.74,25.00,27.00,19,10,0.08,0.06,0.15,0.27,0.00,0.00,0,0, +1746046762177,19,1059,1071,564.70,1064.52,1087.18,5926,10764,-66.07,14,53,-38.04,92.06,12.00,25.00,7,10,0.10,0.11,0.20,0.11,0.00,0.00,0,0, +1746046762177,24,1066,4,747.42,1090.86,5.64,5297,370,-83.00,5,5,-65.22,6.36,25.00,28.00,18,12,0.22,0.11,0.15,0.27,0.00,0.00,0,0, +1746046763177,19,1095,1059,670.40,1100.61,1062.92,6248,10539,-66.19,16,5,-48.41,6.84,26.50,26.00,8,13,0.06,0.05,0.20,0.11,0.00,0.00,0,0, +1746046763177,24,1066,4,406.90,1081.10,5.58,5029,431,-77.78,9,5,-60.00,6.48,31.50,27.00,15,12,0.09,0.11,0.15,0.27,0.00,0.00,0,0, +1746046764177,19,1071,1083,629.09,1076.68,1102.94,7006,10460,-65.81,16,106,-34.77,200.65,10.50,27.00,7,7,0.15,0.11,0.20,0.11,0.00,0.00,0,0, +1746046764177,24,1066,4,854.55,1083.38,5.58,5928,343,-82.40,10,5,-64.62,6.38,27.00,27.00,19,9,0.04,0.11,0.15,0.27,0.00,0.00,0,0, +1746046765177,19,1071,1083,862.55,1076.62,1087.69,7699,10704,-65.81,16,51,-37.94,88.46,19.50,30.00,7,10,0.07,0.04,0.20,0.11,0.00,0.00,0,0, +1746046765177,24,1066,4,658.78,1071.47,5.49,6312,416,-82.40,10,5,-64.62,6.38,25.50,26.00,16,10,0.14,0.06,0.15,0.27,0.00,0.00,0,0, +1746046766177,19,1071,1059,505.69,1076.68,1072.48,5539,10005,-66.00,16,5,-48.22,6.84,26.50,26.00,7,11,0.18,0.18,0.20,0.11,0.00,0.00,0,0, +1746046766177,24,1078,4,925.33,1079.12,5.49,6441,426,-82.25,12,5,-64.47,6.38,26.00,28.00,16,10,0.06,0.12,0.15,0.27,0.00,0.00,0,0, +1746046767177,19,1071,1066,628.33,1076.25,1076.16,6528,12491,-66.25,16,5,-48.47,6.83,27.00,28.00,6,10,0.06,0.06,0.20,0.11,0.00,0.00,0,0, +1746046767177,24,1066,4,440.89,1075.98,5.55,6336,366,-72.00,12,5,-54.22,6.64,29.00,27.00,21,10,0.07,0.10,0.15,0.27,0.00,0.00,0,0, +1746046768177,19,1071,1099,547.80,1076.37,1123.12,5411,11274,-65.81,16,106,-34.77,200.65,10.50,28.00,5,10,0.16,0.17,0.20,0.11,0.00,0.00,0,0, +1746046768177,24,1066,4,558.82,1071.47,5.53,6385,398,-83.90,10,5,-66.12,6.34,25.50,27.00,17,10,0.11,0.09,0.15,0.27,0.00,0.00,0,0, +1746046769177,19,1083,1047,701.60,1088.47,1047.42,6443,14256,-66.00,16,5,-48.22,6.84,27.00,29.00,5,9,0.06,0.06,0.20,0.11,0.00,0.00,0,0, +1746046769177,24,1066,4,601.36,1071.51,5.53,6645,423,-80.43,14,5,-62.65,6.42,32.50,27.00,17,10,0.06,0.09,0.15,0.27,0.00,0.00,0,0, +1746046770177,19,1071,1071,587.15,1076.26,1089.50,5475,10654,-66.00,16,5,-48.22,6.84,27.00,27.00,8,11,0.14,0.13,0.20,0.11,0.00,0.00,0,0, +1746046770177,24,1066,4,662.09,1092.04,5.62,6494,376,-80.43,14,5,-62.65,6.42,30.50,27.00,17,10,0.19,0.09,0.15,0.27,0.00,0.00,0,0, +1746046771177,19,1071,1083,834.67,1076.23,1093.98,5702,11000,-65.94,16,5,-48.16,6.85,26.50,26.00,7,12,0.08,0.05,0.20,0.11,0.00,0.00,0,0, +1746046771177,24,1066,4,719.45,1071.51,5.53,6335,426,-82.31,13,5,-64.53,6.38,32.00,27.00,15,10,0.09,0.08,0.15,0.27,0.00,0.00,0,0, +1746046772177,19,1059,1083,652.78,1064.37,1101.54,4574,10865,-66.00,16,5,-48.22,6.84,25.00,27.00,8,13,0.06,0.11,0.20,0.11,0.00,0.00,0,0, +1746046772177,24,1078,4,684.45,1095.30,5.55,5381,426,-78.75,16,5,-60.97,6.46,30.50,27.00,17,12,0.05,0.07,0.15,0.27,0.00,0.00,0,0, +1746046773177,19,1083,1059,732.00,1088.48,1063.67,6254,10291,-66.25,16,5,-48.47,6.83,26.00,27.00,7,10,0.10,0.07,0.20,0.11,0.00,0.00,0,0, +1746046773177,24,1066,4,488.11,1112.48,5.70,5356,407,-76.25,12,5,-58.47,6.52,33.50,25.00,16,10,0.16,0.15,0.15,0.27,0.00,0.00,0,0, +1746046774177,19,1071,1083,711.10,1076.40,1095.12,5494,11386,-66.25,16,106,-35.21,199.47,10.50,27.00,7,12,0.05,0.10,0.20,0.11,0.00,0.00,0,0, +1746046774177,24,1066,4,548.90,1071.47,5.55,6278,418,-76.25,12,5,-58.47,6.52,25.00,27.00,16,10,0.08,0.09,0.15,0.27,0.00,0.00,0,0, +1746046775177,19,1071,1095,504.90,1086.08,1112.35,6018,10101,-66.31,16,49,-38.62,84.14,25.00,29.00,7,10,0.17,0.10,0.20,0.11,0.00,0.00,0,0, +1746046775177,24,1066,4,703.82,1071.55,5.53,6514,412,-74.00,13,5,-56.22,6.58,30.00,27.00,20,10,0.04,0.09,0.15,0.27,0.00,0.00,0,0, +1746046776177,19,1083,1018,563.50,1088.38,1034.97,5808,10522,-66.19,16,5,-48.41,6.84,26.00,27.00,7,13,0.07,0.06,0.20,0.11,0.00,0.00,0,0, +1746046776177,24,1066,4,562.00,1071.35,5.55,6111,397,-75.14,14,5,-57.36,6.55,26.00,27.00,18,10,0.14,0.07,0.15,0.27,0.00,0.00,0,0, +1746046777177,19,1059,1111,718.75,1064.25,1125.04,6028,11080,-66.50,16,18,-43.16,27.74,26.00,26.00,8,7,0.08,0.13,0.20,0.11,0.00,0.00,0,0, +1746046777177,24,1066,4,713.25,1071.71,5.53,6403,412,-73.25,12,5,-55.47,6.60,28.50,27.00,18,10,0.07,0.09,0.15,0.27,0.00,0.00,0,0, +1746046778177,19,1083,1042,840.10,1088.29,1049.75,7911,10133,-66.19,16,5,-48.41,6.84,26.00,27.00,7,8,0.09,0.05,0.20,0.11,0.00,0.00,0,0, +1746046778177,24,1078,4,620.33,1071.43,5.53,6271,412,-80.73,11,5,-62.95,6.41,30.00,27.00,17,10,0.14,0.08,0.15,0.27,0.00,0.00,0,0, +1746046779177,19,1071,1111,746.40,1076.42,1121.26,5457,11260,-66.19,16,106,-35.14,199.64,10.50,27.00,8,11,0.05,0.20,0.20,0.11,0.00,0.00,0,0, +1746046779177,24,1066,4,530.00,1083.62,5.53,6550,408,-80.73,11,5,-62.95,6.41,27.00,27.00,17,10,0.07,0.10,0.15,0.27,0.00,0.00,0,0, +1746046780177,19,1071,1030,644.60,1076.34,1043.74,6302,10573,-66.31,16,5,-48.53,6.83,26.00,26.00,7,9,0.11,0.07,0.20,0.11,0.00,0.00,0,0, +1746046780177,24,1066,4,681.40,1071.43,5.53,6311,417,-73.21,14,5,-55.43,6.60,31.00,28.00,19,10,0.07,0.09,0.15,0.27,0.00,0.00,0,0, +1746046781177,19,1083,1099,601.78,1076.42,1120.50,5807,11071,-66.00,16,5,-48.22,6.84,26.00,27.00,7,12,0.05,0.09,0.20,0.11,0.00,0.00,0,0, +1746046781177,24,1066,4,596.73,1071.43,5.55,6255,402,-86.69,13,5,-68.91,6.29,29.00,27.00,19,10,0.13,0.07,0.15,0.27,0.00,0.00,0,0, +1746046782177,19,1071,1059,740.11,1088.45,1062.88,5115,10407,-66.12,16,5,-48.34,6.84,25.50,26.00,7,12,0.12,0.07,0.20,0.11,0.00,0.00,0,0, +1746046782177,24,1066,4,657.00,1071.31,5.50,6044,418,-80.80,15,5,-63.02,6.41,26.00,27.00,16,10,0.12,0.06,0.15,0.27,0.00,0.00,0,0, +1746046783177,19,1071,1066,643.55,1076.48,1090.38,5788,11757,-66.07,15,5,-48.29,6.84,25.50,27.00,6,10,0.09,0.12,0.20,0.11,0.00,0.00,0,0, +1746046783177,24,1066,4,674.00,1092.14,5.64,5403,416,-84.62,13,5,-66.83,6.33,34.00,26.00,16,13,0.06,0.08,0.15,0.27,0.00,0.00,0,0, +1746046784177,19,1071,1099,279.50,1076.21,1102.28,6248,12246,-66.07,15,106,-35.02,199.96,9.00,27.00,7,11,0.10,0.05,0.19,0.11,0.00,0.00,0,0, +1746046784177,24,1078,4,588.80,1127.47,5.75,4812,376,-84.62,13,5,-66.83,6.33,24.00,27.00,18,13,0.15,0.08,0.15,0.27,0.00,0.00,0,0, +1746046785177,19,1071,1047,505.10,1076.25,1063.82,5478,10520,-65.81,16,5,-48.03,6.85,26.50,26.00,6,8,0.17,0.19,0.20,0.11,0.00,0.00,0,0, +1746046785177,24,1066,4,645.73,1104.53,5.70,4863,417,-85.45,11,5,-67.67,6.31,25.00,27.00,18,13,0.09,0.13,0.15,0.27,0.00,0.00,0,0, +1746046786177,19,1071,1083,717.33,1076.46,1094.69,9262,15013,-66.19,16,5,-48.41,6.84,25.50,27.00,5,6,0.06,0.07,0.19,0.11,0.00,0.00,0,0, +1746046786177,24,1066,4,826.40,1126.51,5.83,4872,402,-82.67,12,5,-64.89,6.37,26.00,26.00,18,13,0.16,0.14,0.15,0.27,0.00,0.00,0,0, +1746046787177,19,1083,1066,699.20,1088.42,1076.79,6962,11505,-66.31,16,5,-48.53,6.83,25.00,27.00,6,13,0.16,0.07,0.19,0.11,0.00,0.00,0,0, +1746046787177,24,1066,4,610.00,1126.43,5.81,4940,417,-84.08,13,5,-66.30,6.34,30.50,27.00,17,13,0.16,0.13,0.16,0.27,0.00,0.00,0,0, +1746046788177,19,1059,1099,558.00,1064.14,1119.69,4816,12843,-66.31,16,106,-35.27,199.31,9.00,27.00,6,10,0.06,0.16,0.19,0.11,0.00,0.00,0,0, +1746046788177,24,1066,4,916.50,1127.35,5.74,4751,421,-84.08,13,5,-66.30,6.34,28.00,26.00,17,13,0.07,0.12,0.16,0.27,0.00,0.00,0,0, +1746046789177,19,1083,1071,817.00,1088.42,1098.82,6308,12026,-66.19,16,106,-35.14,199.64,8.50,25.00,6,10,0.11,0.06,0.19,0.11,0.00,0.00,0,0, +1746046789177,24,1066,4,554.82,1082.30,5.56,4446,407,-85.08,13,5,-67.30,6.32,27.00,30.00,18,13,0.09,0.10,0.16,0.27,0.00,0.00,0,0, +1746046790177,19,1071,1059,452.90,1076.31,1070.10,5079,12602,-65.92,13,106,-34.88,200.35,8.00,27.00,6,11,0.06,0.26,0.19,0.11,0.00,0.00,0,0, +1746046790177,24,1078,4,504.67,1082.34,5.58,4556,402,-105.33,6,5,-87.55,6.02,30.50,27.00,19,13,0.07,0.12,0.16,0.27,0.00,0.00,0,0, +1746046791177,19,1071,1066,611.42,1076.52,1078.81,8282,12201,-65.85,13,5,-48.06,6.85,25.50,27.00,5,6,0.13,0.09,0.19,0.11,0.00,0.00,0,0, +1746046791177,24,1066,4,777.45,1105.33,5.62,4471,390,-68.67,3,5,-50.89,6.75,30.50,27.00,19,13,0.15,0.11,0.16,0.27,0.00,0.00,0,0, +1746046792177,19,1071,1071,752.30,1076.46,1080.63,8897,14330,-65.75,12,5,-47.97,6.85,25.00,28.00,7,9,0.04,0.04,0.19,0.11,0.00,0.00,0,0, +1746046793177,19,1083,1075,637.42,1088.41,1092.86,5214,13731,-65.75,12,5,-47.97,6.85,26.00,26.00,5,12,0.08,0.22,0.19,0.11,0.00,0.00,0,0, +1746046794177,19,1071,1095,686.40,1076.39,1110.37,6507,13418,-65.91,11,5,-48.13,6.85,25.50,26.00,6,8,0.17,0.09,0.19,0.11,0.00,0.00,0,0, +1746046794177,24,1066,4,457.40,1093.46,5.62,4797,405,-82.33,3,5,-64.55,6.38,25.00,27.00,17,12,0.13,0.15,0.16,0.27,0.00,0.00,0,0, +1746046795177,19,1071,1047,707.00,1076.34,1055.64,6553,17198,-65.85,13,5,-48.06,6.85,26.00,26.00,4,12,0.07,0.05,0.19,0.11,0.00,0.00,0,0, +1746046795177,24,1066,4,717.27,1071.51,5.53,6316,413,-102.00,1,5,-84.22,6.06,25.00,26.00,17,9,0.07,0.10,0.16,0.27,0.00,0.00,0,0, +1746046796177,19,1071,1078,388.33,1076.20,1106.02,5869,14192,-65.75,12,5,-47.97,6.85,25.50,26.00,6,6,0.14,0.16,0.19,0.11,0.00,0.00,0,0, +1746046797177,19,1059,1099,572.82,1064.30,1107.54,9205,12696,-65.75,12,94,-35.23,175.45,8.00,27.00,6,6,0.07,0.07,0.19,0.11,0.00,0.00,0,0, +1746046798177,19,1083,1042,631.82,1088.50,1055.91,7109,12135,-66.00,15,5,-48.22,6.84,27.00,27.00,7,13,0.09,0.05,0.19,0.11,0.00,0.00,0,0, +1746046799177,19,1083,987,727.10,1088.24,1008.61,5335,16565,-66.33,15,5,-48.55,6.83,26.00,27.00,3,10,0.09,0.13,0.19,0.11,0.00,0.00,0,0, +1746046800177,19,1071,1159,797.80,1076.17,1169.21,6112,18882,-66.12,16,5,-48.34,6.84,27.00,26.00,6,11,0.05,0.05,0.19,0.11,0.00,0.00,0,0, +1746046801177,19,1071,1095,684.36,1076.26,1101.90,5251,14646,-66.25,16,106,-35.21,199.47,8.50,27.00,4,9,0.12,0.24,0.19,0.11,0.00,0.00,0,0, +1746046802177,19,1071,1042,991.00,1078.33,1064.04,10136,17073,-66.25,16,5,-48.47,6.83,27.00,25.00,6,5,0.04,0.08,0.19,0.11,0.00,0.00,0,0, +1746046803177,19,1071,1071,768.82,1077.64,1080.50,8989,11808,-65.94,16,5,-48.16,6.85,26.50,27.00,6,11,0.14,0.04,0.19,0.11,0.00,0.00,0,0, +1746046804177,19,1059,1087,715.45,1064.14,1101.10,5200,12483,-65.67,15,106,-34.62,201.05,8.50,26.00,6,8,0.11,0.21,0.19,0.11,0.00,0.00,0,0, +1746046805177,19,1095,1071,872.17,1102.73,1074.51,10509,12700,-66.00,15,106,-34.96,200.14,8.50,27.00,6,5,0.06,0.07,0.19,0.11,0.00,0.00,0,0, +1746046806177,19,1071,1083,504.56,1077.32,1094.11,8352,12748,-66.00,15,5,-48.22,6.84,25.50,26.00,5,12,0.10,0.03,0.19,0.11,0.00,0.00,0,0, +1746046807177,19,1071,1042,601.10,1076.22,1059.68,5280,14119,-66.12,16,106,-35.08,199.81,8.50,26.00,7,9,0.11,0.13,0.19,0.11,0.00,0.00,0,0, +1746046807177,24,1066,4,587.30,1071.31,5.49,6044,421,-120.00,1,5,-102.22,5.87,33.50,26.00,16,10,0.05,0.07,0.16,0.27,0.00,0.00,0,0, +1746046808177,19,1071,1095,452.78,1076.45,1102.49,6459,15426,-65.94,16,5,-48.16,6.85,28.00,26.00,4,10,0.10,0.05,0.19,0.11,0.00,0.00,0,0, +1746046809177,19,1071,1087,742.90,1076.16,1112.52,4981,16463,-66.12,16,51,-38.26,88.15,16.50,25.00,7,12,0.09,0.06,0.19,0.11,0.00,0.00,0,0, +1746046810177,19,1071,1054,683.55,1076.38,1055.09,5920,13633,-66.31,16,5,-48.53,6.83,27.00,26.00,5,11,0.08,0.07,0.19,0.11,0.00,0.00,0,0, +1746046811177,19,1071,1075,540.78,1076.39,1094.30,5246,13246,-66.31,16,5,-48.53,6.83,27.00,27.00,5,13,0.17,0.14,0.19,0.11,0.00,0.00,0,0, +1746046812177,19,1071,1083,552.78,1076.36,1098.03,6579,17896,-66.44,16,106,-35.39,198.98,8.00,26.00,4,8,0.07,0.10,0.19,0.11,0.00,0.00,0,0, +1746046813177,19,1083,1042,466.90,1088.14,1051.99,6693,13636,-66.44,16,5,-48.66,6.83,27.00,26.00,4,12,0.15,0.03,0.19,0.11,0.00,0.00,0,0, +1746046814177,19,1071,1111,699.50,1076.39,1128.01,5624,18607,-66.44,16,106,-35.39,198.98,8.50,24.00,4,8,0.05,0.14,0.19,0.11,0.00,0.00,0,0, +1746046815177,19,1071,1083,424.55,1076.53,1114.14,7103,13669,-66.50,16,106,-35.46,198.81,8.50,23.00,5,9,0.12,0.05,0.19,0.11,0.00,0.00,0,0, +1746046816177,19,1059,1047,355.75,1064.12,1061.75,5378,13871,-66.50,16,5,-48.72,6.82,27.50,27.00,6,10,0.06,0.18,0.19,0.11,0.00,0.00,0,0, +1746046817177,19,1095,1071,596.78,1088.16,1073.59,6272,12165,-66.19,16,5,-48.41,6.84,26.50,27.00,5,9,0.14,0.06,0.19,0.11,0.00,0.00,0,0, +1746046818177,19,1071,1083,634.00,1088.33,1095.13,5589,14914,-66.06,16,5,-48.28,6.84,26.00,28.00,6,12,0.05,0.05,0.19,0.11,0.00,0.00,0,0, +1746046819177,19,1071,1071,824.30,1076.30,1082.23,5058,11740,-65.92,13,5,-48.14,6.85,26.00,27.00,6,12,0.15,0.13,0.19,0.11,0.00,0.00,0,0, +1746046819177,24,1066,4,820.33,1079.94,5.54,5745,425,-68.00,1,5,-50.22,6.77,34.50,28.00,13,11,0.12,0.13,0.16,0.27,0.00,0.00,0,0, +1746046820177,19,1071,1071,718.25,1076.27,1090.01,5235,12426,-65.92,13,5,-48.14,6.85,25.50,28.00,6,12,0.10,0.12,0.19,0.11,0.00,0.00,0,0, +1746046820177,24,1066,4,543.00,1088.14,5.64,5645,424,-68.00,1,5,-50.22,6.77,26.00,27.00,13,11,0.06,0.09,0.16,0.27,0.00,0.00,0,0, +1746046821177,19,1071,1095,652.67,1076.31,1109.12,5225,12065,-66.00,12,106,-34.96,200.14,9.50,26.00,7,11,0.12,0.11,0.19,0.11,0.00,0.00,0,0, +1746046821177,24,1078,4,598.60,1100.53,5.66,5975,407,-77.00,2,5,-59.22,6.50,27.50,27.00,19,11,0.06,0.12,0.16,0.27,0.00,0.00,0,0, +1746046822177,19,1071,1047,437.67,1076.47,1052.07,5733,13954,-65.94,16,106,-34.89,200.31,9.50,26.00,5,13,0.08,0.04,0.19,0.11,0.00,0.00,0,0, +1746046822177,24,1066,4,697.64,1096.81,5.70,5835,407,-85.00,14,5,-67.22,6.32,27.50,27.00,19,11,0.07,0.09,0.16,0.27,0.00,0.00,0,0, +1746046823177,19,1083,1083,537.43,1063.99,1095.32,4432,12575,-65.81,16,5,-48.03,6.85,26.50,27.00,6,13,0.16,0.11,0.19,0.11,0.00,0.00,0,0, +1746046823177,24,1066,4,723.20,1079.62,5.58,5608,368,-86.42,12,5,-68.64,6.30,26.50,28.00,18,11,0.08,0.08,0.16,0.27,0.00,0.00,0,0, +1746046824177,19,1071,1059,555.75,1100.26,1078.23,5708,12388,-65.81,16,5,-48.03,6.85,26.00,28.00,6,11,0.06,0.08,0.19,0.11,0.00,0.00,0,0, +1746046824177,24,1066,4,972.36,1110.74,5.70,5900,375,-82.08,12,5,-64.30,6.38,26.00,26.00,20,11,0.14,0.10,0.16,0.27,0.00,0.00,0,0, +1746046825177,19,1071,1071,516.33,1076.28,1082.83,5290,11838,-65.81,16,5,-48.03,6.85,26.00,27.00,6,13,0.12,0.06,0.19,0.11,0.00,0.00,0,0, +1746046825177,24,1066,4,583.78,1105.24,5.74,6060,376,-82.08,12,5,-64.30,6.38,24.50,27.00,19,11,0.08,0.12,0.16,0.27,0.00,0.00,0,0, +1746046826177,19,1071,1071,633.25,1076.34,1082.58,5949,12890,-66.19,16,106,-35.14,199.64,9.50,27.00,7,7,0.05,0.14,0.19,0.11,0.00,0.00,0,0, +1746046826177,24,1066,4,766.50,1096.65,5.70,5691,402,-73.56,9,5,-55.77,6.59,25.50,26.00,19,11,0.06,0.11,0.16,0.27,0.00,0.00,0,0, +1746046827177,19,1071,1078,515.00,1076.66,1081.29,8154,11430,-66.31,16,5,-48.53,6.83,26.50,27.00,6,7,0.08,0.05,0.19,0.11,0.00,0.00,0,0, +1746046827177,24,1078,4,703.70,1100.21,5.64,5772,397,-76.00,12,5,-58.22,6.53,29.00,28.00,19,11,0.11,0.12,0.16,0.27,0.00,0.00,0,0, +1746046828177,19,1059,1075,647.73,1064.50,1089.62,5836,12188,-66.31,16,5,-48.53,6.83,27.00,27.00,7,12,0.08,0.18,0.19,0.11,0.00,0.00,0,0, +1746046828177,24,1066,4,770.10,1105.20,5.75,5993,402,-86.00,14,5,-68.22,6.30,26.00,26.00,19,11,0.08,0.12,0.16,0.27,0.00,0.00,0,0, +1746046829177,19,1095,1071,637.11,1088.39,1086.40,6166,12112,-66.31,16,5,-48.53,6.83,27.50,26.00,6,10,0.09,0.07,0.19,0.11,0.00,0.00,0,0, +1746046829177,24,1066,4,559.55,1088.34,5.62,5846,402,-86.00,14,5,-68.22,6.30,29.00,27.00,19,11,0.07,0.11,0.16,0.27,0.00,0.00,0,0, +1746046830177,19,1071,1083,711.82,1088.44,1092.32,5687,12187,-66.19,16,5,-48.41,6.84,27.50,27.00,7,11,0.09,0.17,0.19,0.11,0.00,0.00,0,0, +1746046830177,24,1066,4,575.22,1113.59,5.83,5771,370,-96.00,14,5,-78.22,6.14,31.00,26.00,19,11,0.18,0.09,0.16,0.27,0.00,0.00,0,0, +1746046831177,19,1059,1083,458.78,1064.22,1102.33,5687,13327,-65.94,16,106,-34.89,200.31,9.50,27.00,5,11,0.10,0.06,0.19,0.11,0.00,0.00,0,0, +1746046831177,24,1066,4,383.44,1079.78,5.58,5805,423,-81.23,13,5,-63.45,6.40,26.50,27.00,16,11,0.10,0.09,0.16,0.27,0.00,0.00,0,0, +1746046832177,19,1083,1083,691.42,1088.50,1092.32,5550,13659,-66.12,16,106,-35.08,199.81,9.50,26.00,7,12,0.08,0.07,0.19,0.11,0.00,0.00,0,0, +1746046832177,24,1066,4,720.09,1102.31,5.65,5845,418,-93.00,16,5,-75.22,6.18,27.50,27.00,16,11,0.05,0.09,0.16,0.27,0.00,0.00,0,0, +1746046833177,19,1071,1006,652.22,1076.17,1016.98,4893,11744,-66.06,16,5,-48.28,6.84,27.00,26.00,6,12,0.07,0.09,0.19,0.11,0.00,0.00,0,0, +1746046833177,24,1078,4,600.92,1091.86,5.61,5946,375,-80.38,16,5,-62.59,6.42,27.50,26.00,18,11,0.22,0.12,0.16,0.27,0.00,0.00,0,0, +1746046834177,19,1059,1135,697.78,1064.34,1163.41,5058,12251,-66.06,16,94,-35.54,174.73,9.00,27.00,6,13,0.16,0.05,0.19,0.11,0.00,0.00,0,0, +1746046834177,24,1066,4,574.36,1079.74,5.58,5607,426,-80.38,16,5,-62.59,6.42,25.00,27.00,15,11,0.10,0.10,0.16,0.27,0.00,0.00,0,0, +1746046835177,19,1095,1042,437.62,1088.19,1049.21,4537,14391,-66.00,16,5,-48.22,6.84,26.50,27.00,5,13,0.06,0.09,0.19,0.11,0.00,0.00,0,0, +1746046835177,24,1066,4,799.09,1096.81,5.70,6018,421,-82.33,15,5,-64.55,6.38,31.50,27.00,15,11,0.06,0.12,0.16,0.27,0.00,0.00,0,0, +1746046836177,19,1071,1059,897.00,1088.22,1092.62,4371,12484,-66.12,16,5,-48.34,6.84,27.00,27.00,5,13,0.14,0.12,0.19,0.11,0.00,0.00,0,0, +1746046836177,24,1066,4,391.70,1102.23,5.65,5793,362,-84.43,14,5,-66.65,6.33,29.50,26.00,20,11,0.13,0.12,0.16,0.27,0.00,0.00,0,0, +1746046837177,19,1071,1099,460.70,1076.28,1112.91,5148,14862,-66.00,16,5,-48.22,6.84,27.00,27.00,6,11,0.05,0.11,0.19,0.11,0.00,0.00,0,0, +1746046837177,24,1066,4,471.44,1096.77,5.70,5952,426,-79.27,15,5,-61.49,6.45,32.50,27.00,13,11,0.14,0.12,0.17,0.27,0.00,0.00,0,0, +1746046838177,19,1071,1066,544.64,1076.42,1078.04,5671,11687,-66.00,16,5,-48.22,6.84,26.50,27.00,6,13,0.11,0.06,0.19,0.11,0.00,0.00,0,0, +1746046838177,24,1066,4,679.80,1079.70,5.58,5604,420,-79.27,15,5,-61.49,6.45,26.00,27.00,13,11,0.07,0.08,0.17,0.27,0.00,0.00,0,0, +1746046839177,19,1071,1047,515.55,1076.12,1065.91,4509,12130,-66.00,16,5,-48.22,6.84,26.50,27.00,7,13,0.07,0.14,0.19,0.11,0.00,0.00,0,0, +1746046839177,24,1078,4,908.55,1117.19,5.75,6052,421,-81.62,16,5,-63.84,6.39,28.00,27.00,18,11,0.04,0.10,0.17,0.27,0.00,0.00,0,0, +1746046840177,19,1071,1099,557.45,1076.21,1111.74,5975,12680,-66.12,16,106,-35.08,199.81,9.50,27.00,6,10,0.08,0.08,0.19,0.11,0.00,0.00,0,0, +1746046840177,24,1066,4,734.22,1079.94,5.58,5809,412,-72.00,11,5,-54.22,6.64,26.00,27.00,18,11,0.13,0.10,0.17,0.27,0.00,0.00,0,0, +1746046841177,19,1071,1071,910.12,1076.31,1077.58,5720,11405,-65.81,16,5,-48.03,6.85,26.50,27.00,6,13,0.16,0.08,0.19,0.11,0.00,0.00,0,0, +1746046841177,24,1066,4,528.82,1105.44,5.75,6258,422,-79.75,8,5,-61.97,6.43,26.00,26.00,18,11,0.08,0.12,0.17,0.27,0.00,0.00,0,0, +1746046842177,19,1083,1083,463.11,1088.35,1094.30,4528,12625,-65.88,16,5,-48.09,6.85,27.00,26.00,6,13,0.07,0.12,0.19,0.11,0.00,0.00,0,0, +1746046842177,24,1066,4,658.67,1079.74,5.58,5606,375,-85.18,11,5,-67.40,6.32,25.50,26.00,20,11,0.10,0.11,0.17,0.27,0.00,0.00,0,0, +1746046843177,19,1071,1083,1058.82,1076.40,1102.73,5092,12344,-65.88,16,94,-35.35,175.16,9.00,27.00,5,11,0.12,0.14,0.19,0.11,0.00,0.00,0,0, +1746046843177,24,1066,4,710.36,1113.79,5.83,6233,402,-85.18,11,5,-67.40,6.32,25.50,27.00,19,11,0.10,0.13,0.17,0.27,0.00,0.00,0,0, +1746046844177,19,1071,1047,416.18,1076.16,1048.73,5496,13986,-66.12,16,5,-48.34,6.84,26.50,26.00,7,12,0.04,0.05,0.19,0.11,0.00,0.00,0,0, +1746046844177,24,1066,4,925.09,1079.90,5.58,5804,397,-78.57,14,5,-60.79,6.46,26.50,26.00,19,11,0.06,0.11,0.17,0.27,0.00,0.00,0,0, +1746046845177,19,1071,1095,432.91,1076.44,1116.69,5420,12119,-66.12,16,106,-35.08,199.81,9.50,29.00,6,11,0.09,0.12,0.19,0.11,0.00,0.00,0,0, +1746046845177,24,1078,4,680.18,1108.84,5.67,5959,422,-79.75,12,5,-61.97,6.43,29.00,26.00,18,11,0.14,0.14,0.17,0.27,0.00,0.00,0,0, +1746046846177,19,1071,1042,700.10,1076.21,1053.27,5728,12053,-66.44,16,5,-48.66,6.83,26.50,27.00,7,12,0.05,0.05,0.19,0.11,0.00,0.00,0,0, +1746046846177,24,1066,4,379.70,1088.14,5.66,5648,412,-80.85,13,5,-63.06,6.41,29.50,28.00,18,11,0.07,0.10,0.17,0.27,0.00,0.00,0,0, +1746046847177,19,1059,1099,873.25,1064.29,1102.74,5537,12134,-66.38,16,106,-35.33,199.14,9.50,26.00,6,11,0.09,0.11,0.19,0.11,0.00,0.00,0,0, +1746046847177,24,1066,4,679.36,1088.34,5.64,5978,397,-79.08,12,5,-61.30,6.45,24.50,27.00,20,11,0.05,0.10,0.17,0.27,0.00,0.00,0,0, +1746046848177,19,1095,1071,1007.80,1100.34,1092.30,5554,12087,-66.38,16,5,-48.59,6.83,26.50,27.00,6,12,0.14,0.12,0.19,0.11,0.00,0.00,0,0, +1746046848177,24,1066,4,602.20,1096.87,5.78,5897,382,-79.08,12,5,-61.30,6.45,25.50,28.00,17,11,0.11,0.11,0.17,0.27,0.00,0.00,0,0, +1746046849177,19,1071,1059,837.18,1076.51,1063.74,5427,12303,-66.25,16,5,-48.47,6.83,27.00,26.00,6,11,0.06,0.11,0.19,0.11,0.00,0.00,0,0, +1746046849177,24,1066,4,457.20,1088.30,5.64,5717,413,-74.00,11,5,-56.22,6.58,30.50,27.00,17,11,0.06,0.11,0.17,0.27,0.00,0.00,0,0, +1746046850177,19,1071,1071,792.70,1076.14,1091.42,5534,12294,-66.25,16,5,-48.47,6.83,27.50,25.00,5,12,0.14,0.06,0.19,0.11,0.00,0.00,0,0, +1746046850177,24,1066,4,999.40,1105.24,5.73,5922,417,-83.90,10,5,-66.12,6.34,31.00,27.00,19,11,0.10,0.10,0.17,0.27,0.00,0.00,0,0, +1746046851177,19,1059,1107,678.00,1064.22,1109.93,5083,14944,-66.50,16,106,-35.46,198.81,9.50,27.00,6,12,0.05,0.10,0.19,0.11,0.00,0.00,0,0, +1746046851177,24,1078,4,308.00,1096.77,5.64,5885,402,-82.33,12,5,-64.55,6.38,35.00,26.00,18,11,0.19,0.10,0.17,0.27,0.00,0.00,0,0, +1746046852177,19,1083,1042,747.22,1088.42,1055.70,5156,13129,-66.50,16,106,-35.46,198.81,9.50,27.00,5,12,0.09,0.14,0.19,0.11,0.00,0.00,0,0, +1746046852177,24,1066,4,619.30,1100.45,5.72,5779,436,-82.33,12,5,-64.55,6.38,26.50,27.00,15,11,0.10,0.10,0.17,0.27,0.00,0.00,0,0, +1746046853177,19,1071,1087,660.30,1076.45,1121.44,5226,13525,-66.25,16,5,-48.47,6.83,26.50,26.00,6,12,0.15,0.13,0.19,0.11,0.00,0.00,0,0, +1746046853177,24,1066,4,684.33,1096.77,5.70,5890,405,-85.56,16,5,-67.78,6.31,26.00,28.00,17,11,0.05,0.10,0.17,0.27,0.00,0.00,0,0, +1746046854177,19,1083,1059,423.92,1088.54,1069.80,5515,12330,-66.12,16,5,-48.34,6.84,27.50,27.00,6,9,0.06,0.14,0.19,0.11,0.00,0.00,0,0, +1746046854177,24,1066,4,539.00,1088.30,5.64,5849,407,-81.82,11,5,-64.04,6.39,26.00,27.00,17,11,0.17,0.11,0.17,0.27,0.00,0.00,0,0, +1746046855177,19,1071,1071,517.09,1076.34,1076.70,6509,12480,-66.19,16,106,-35.14,199.64,9.50,26.00,5,10,0.13,0.05,0.19,0.11,0.00,0.00,0,0, +1746046855177,24,1066,4,553.18,1079.86,5.58,5805,423,-80.18,11,5,-62.40,6.42,31.00,27.00,16,11,0.09,0.09,0.17,0.27,0.00,0.00,0,0, +1746046856177,19,1071,1054,764.91,1076.22,1073.36,5223,14709,-66.38,16,5,-48.59,6.83,25.00,26.00,5,12,0.05,0.07,0.19,0.11,0.00,0.00,0,0, +1746046856177,24,1066,4,577.40,1079.82,5.58,5675,412,-78.11,9,5,-60.33,6.47,25.00,26.00,19,11,0.05,0.09,0.17,0.27,0.00,0.00,0,0, +1746046857177,19,1071,1111,594.75,1076.56,1128.32,5264,12197,-66.38,16,106,-35.33,199.14,9.50,26.00,6,10,0.10,0.15,0.19,0.11,0.00,0.00,0,0, +1746046857177,24,1078,4,929.00,1108.61,5.70,6016,417,-78.11,9,5,-60.33,6.47,26.50,28.00,16,11,0.20,0.10,0.17,0.27,0.00,0.00,0,0, +1746046858177,19,1071,1071,468.56,1076.19,1073.36,6290,12328,-66.19,16,106,-35.14,199.64,9.50,27.00,6,10,0.17,0.05,0.19,0.11,0.00,0.00,0,0, +1746046858177,24,1066,4,559.00,1091.90,5.60,5997,396,-76.17,12,5,-58.39,6.52,30.50,27.00,14,11,0.10,0.12,0.17,0.27,0.00,0.00,0,0, +1746046859177,19,1071,1042,884.64,1076.28,1057.84,5179,11865,-65.94,16,5,-48.16,6.85,26.00,27.00,6,13,0.06,0.10,0.19,0.11,0.00,0.00,0,0, +1746046859177,24,1066,4,712.58,1088.42,5.64,5978,421,-78.00,9,5,-60.22,6.48,28.50,28.00,15,11,0.05,0.11,0.17,0.27,0.00,0.00,0,0, +1746046860177,19,1071,1099,723.00,1076.14,1107.74,5928,12868,-65.81,16,106,-34.77,200.65,9.50,26.00,5,10,0.12,0.09,0.19,0.11,0.00,0.00,0,0, +1746046860177,24,1066,4,311.56,1102.35,5.62,5793,412,-78.56,9,5,-60.77,6.46,30.50,25.00,18,11,0.08,0.11,0.17,0.27,0.00,0.00,0,0, +1746046861177,19,1083,1095,691.82,1088.25,1117.58,5837,14494,-65.81,16,94,-35.29,175.30,8.50,27.00,7,13,0.04,0.09,0.19,0.11,0.00,0.00,0,0, +1746046861177,24,1066,4,517.55,1088.22,5.66,5779,412,-78.56,9,5,-60.77,6.46,26.00,26.00,18,11,0.08,0.12,0.17,0.27,0.00,0.00,0,0, +1746046862177,19,1059,1071,530.89,1064.26,1071.73,4678,12107,-66.12,16,106,-35.08,199.81,9.50,27.00,6,12,0.08,0.14,0.19,0.11,0.00,0.00,0,0, +1746046862177,24,1066,4,740.22,1079.82,5.58,5805,370,-77.80,15,5,-60.02,6.48,24.00,26.00,20,11,0.11,0.12,0.17,0.27,0.00,0.00,0,0, +1746046863177,19,1083,1047,441.67,1088.45,1074.46,5155,11843,-66.00,16,5,-48.22,6.84,26.00,27.00,6,12,0.12,0.09,0.19,0.11,0.00,0.00,0,0, +1746046863177,24,1078,4,844.38,1079.74,5.54,5673,392,-78.83,12,5,-61.05,6.46,26.00,27.00,19,11,0.12,0.11,0.17,0.27,0.00,0.00,0,0, +1746046864177,19,1071,1071,615.11,1076.36,1088.18,5132,12439,-65.94,16,5,-48.16,6.85,26.00,29.00,7,12,0.05,0.08,0.19,0.11,0.00,0.00,0,0, +1746046864177,24,1066,4,449.20,1100.13,5.64,5706,402,-75.43,14,5,-57.65,6.54,25.50,25.00,19,11,0.07,0.12,0.17,0.27,0.00,0.00,0,0, +1746046865177,19,1071,1071,876.36,1076.30,1085.70,5209,12113,-66.06,16,5,-48.28,6.84,27.00,27.00,6,12,0.08,0.11,0.19,0.11,0.00,0.00,0,0, +1746046865177,24,1066,4,533.64,1079.98,5.58,5805,417,-77.62,13,5,-59.83,6.49,32.50,26.00,18,11,0.12,0.10,0.17,0.27,0.00,0.00,0,0, +1746046866177,19,1083,1071,499.64,1088.42,1080.21,5137,11891,-66.06,16,5,-48.28,6.84,27.00,26.00,6,12,0.18,0.10,0.19,0.11,0.00,0.00,0,0, +1746046866177,24,1066,4,587.44,1105.20,5.78,5928,368,-77.62,13,5,-59.83,6.49,26.00,26.00,18,11,0.06,0.10,0.17,0.27,0.00,0.00,0,0, +1746046867177,19,1059,1095,729.20,1064.33,1112.78,5093,15019,-66.19,16,106,-35.14,199.64,9.50,26.00,5,12,0.06,0.07,0.19,0.11,0.00,0.00,0,0, +1746046867177,24,1066,4,366.10,1105.16,5.75,5861,402,-70.69,13,5,-52.91,6.68,28.00,29.00,19,11,0.06,0.12,0.17,0.27,0.00,0.00,0,0, +1746046868177,19,1083,1054,579.50,1088.19,1056.55,5209,12178,-66.06,16,5,-48.28,6.84,27.00,26.00,6,12,0.15,0.11,0.19,0.11,0.00,0.00,0,0, +1746046868177,24,1066,4,773.64,1096.89,5.70,6082,407,-79.33,15,5,-61.55,6.44,26.00,27.00,16,11,0.18,0.15,0.17,0.27,0.00,0.00,0,0, +1746046869177,19,1071,1059,601.00,1076.01,1077.61,4904,12361,-66.38,16,5,-48.59,6.83,26.50,27.00,6,12,0.06,0.12,0.19,0.11,0.00,0.00,0,0, +1746046869177,24,1078,4,521.25,1096.77,5.72,5817,426,-73.33,12,5,-55.55,6.60,30.00,27.00,15,11,0.09,0.10,0.17,0.27,0.00,0.00,0,0, +1746046870177,19,1071,1071,575.89,1076.33,1094.62,4987,13906,-66.38,16,5,-48.59,6.83,26.00,27.00,4,12,0.12,0.13,0.19,0.11,0.00,0.00,0,0, +1746046870177,24,1066,4,725.00,1108.84,5.70,5951,423,-73.33,12,5,-55.55,6.60,26.50,27.00,18,11,0.05,0.12,0.17,0.27,0.00,0.00,0,0, +1746046871177,19,1071,1083,660.09,1076.36,1092.60,5251,17638,-66.38,16,5,-48.59,6.83,26.00,28.00,6,12,0.04,0.12,0.19,0.11,0.00,0.00,0,0, +1746046871177,24,1066,4,848.00,1079.82,5.54,5607,416,-80.50,12,5,-62.72,6.42,31.00,25.00,18,11,0.13,0.10,0.17,0.27,0.00,0.00,0,0, +1746046872177,19,1071,1075,758.88,1076.38,1094.97,5181,13868,-66.25,16,94,-35.73,174.31,9.00,27.00,4,12,0.13,0.11,0.19,0.11,0.00,0.00,0,0, +1746046872177,24,1066,4,653.73,1096.77,5.70,6023,417,-81.17,12,5,-63.39,6.40,26.00,27.00,18,11,0.07,0.11,0.17,0.27,0.00,0.00,0,0, +1746046873177,19,1071,1095,588.62,1076.00,1110.90,4820,17674,-66.19,16,106,-35.14,199.64,9.50,27.00,6,12,0.04,0.06,0.19,0.11,0.00,0.00,0,0, +1746046873177,24,1066,4,659.11,1088.22,5.66,5648,402,-77.17,12,5,-59.39,6.50,26.50,30.00,19,11,0.07,0.11,0.17,0.27,0.00,0.00,0,0, +1746046874177,19,1083,1030,616.82,1088.38,1037.47,5290,13801,-66.12,16,5,-48.34,6.84,25.50,26.00,4,12,0.11,0.07,0.19,0.11,0.00,0.00,0,0, +1746046874177,24,1066,4,707.10,1105.20,5.75,5996,407,-80.60,15,5,-62.82,6.42,29.00,27.00,19,11,0.08,0.10,0.17,0.27,0.00,0.00,0,0, +1746046875177,19,1071,1099,571.00,1076.13,1120.85,4854,17390,-66.12,16,5,-48.34,6.84,25.00,26.00,6,12,0.06,0.06,0.19,0.11,0.00,0.00,0,0, +1746046875177,24,1078,4,769.12,1079.70,5.58,5547,426,-80.60,15,5,-62.82,6.42,29.00,26.00,17,11,0.10,0.07,0.17,0.27,0.00,0.00,0,0, +1746046876177,19,1071,1042,568.20,1076.36,1074.44,5349,12508,-66.00,14,106,-34.96,200.14,8.50,28.00,6,12,0.14,0.11,0.19,0.11,0.00,0.00,0,0, +1746046876177,24,1066,4,604.64,1092.10,5.61,6001,421,-78.08,13,5,-60.30,6.47,26.50,26.00,17,11,0.05,0.13,0.17,0.27,0.00,0.00,0,0, +1746046877177,19,1071,1083,826.82,1076.38,1073.78,5110,12257,-66.15,13,5,-48.37,6.84,26.00,26.00,5,12,0.18,0.10,0.19,0.11,0.00,0.00,0,0, +1746046878177,19,1083,1099,533.70,1073.98,1106.62,5235,18118,-66.00,10,5,-48.22,6.84,27.00,27.00,4,12,0.06,0.11,0.19,0.11,0.00,0.00,0,0, +1746046879177,19,1071,1071,546.89,1090.63,1087.29,5954,14647,-66.00,13,106,-34.96,200.14,9.00,27.00,5,9,0.13,0.08,0.19,0.11,0.00,0.00,0,0, +1746046880177,19,1071,1059,1016.25,1076.41,1072.18,5944,14378,-66.00,13,5,-48.22,6.84,25.50,26.00,6,13,0.05,0.10,0.19,0.11,0.00,0.00,0,0, +1746046881177,19,1071,1078,624.11,1076.28,1084.14,5958,12262,-66.36,14,5,-48.58,6.83,26.00,27.00,6,9,0.11,0.08,0.19,0.11,0.00,0.00,0,0, +1746046882177,19,1059,1087,773.56,1064.44,1106.28,6084,12526,-66.33,15,94,-35.81,174.12,8.50,28.00,5,12,0.15,0.05,0.19,0.11,0.00,0.00,0,0, +1746046883177,19,1071,1083,1011.78,1076.36,1098.00,5176,15034,-66.40,15,106,-35.36,199.08,9.00,28.00,5,12,0.05,0.09,0.19,0.11,0.00,0.00,0,0, +1746046884177,19,1083,1083,515.10,1088.30,1087.56,5099,12346,-66.40,15,106,-35.36,199.08,8.50,25.00,6,12,0.11,0.11,0.19,0.11,0.00,0.00,0,0, +1746046885177,19,1083,1018,743.10,1088.39,1027.98,5622,11805,-66.27,15,5,-48.49,6.83,26.50,26.00,6,10,0.11,0.12,0.19,0.11,0.00,0.00,0,0, +1746046886177,19,1071,1087,872.00,1076.32,1100.91,6470,12515,-66.31,13,5,-48.53,6.83,26.50,27.00,6,11,0.12,0.05,0.19,0.11,0.00,0.00,0,0, +1746046887177,19,1071,1078,593.44,1076.26,1092.10,5118,12594,-66.00,14,5,-48.22,6.84,26.50,26.00,6,12,0.05,0.08,0.19,0.11,0.00,0.00,0,0, +1746046887177,24,1078,4,611.62,1078.96,5.61,6352,365,-69.00,3,5,-51.22,6.74,29.00,27.00,20,10,0.14,0.10,0.17,0.27,0.00,0.00,0,0, +1746046888177,19,1059,1087,690.60,1064.19,1097.46,5040,12930,-66.19,16,106,-35.14,199.64,9.50,27.00,5,12,0.10,0.11,0.19,0.11,0.00,0.00,0,0, +1746046888177,24,1066,4,789.00,1083.54,5.53,6376,423,-80.90,10,5,-63.12,6.41,26.00,27.00,16,10,0.11,0.10,0.17,0.27,0.00,0.00,0,0, +1746046889177,19,1083,1083,683.20,1088.31,1094.88,5169,13965,-66.19,16,49,-38.49,84.25,18.50,26.00,7,12,0.12,0.10,0.19,0.11,0.00,0.00,0,0, +1746046889177,24,1066,4,614.90,1079.04,5.58,6418,423,-80.90,10,5,-63.12,6.41,29.00,26.00,16,10,0.05,0.11,0.17,0.27,0.00,0.00,0,0, +1746046890177,19,1071,1083,699.50,1076.28,1098.87,5179,12237,-65.88,16,106,-34.83,200.48,9.50,26.00,6,12,0.06,0.12,0.19,0.11,0.00,0.00,0,0, +1746046890177,24,1066,4,379.73,1071.47,5.55,8134,402,-79.75,12,5,-61.97,6.43,25.50,26.00,17,6,0.17,0.09,0.17,0.27,0.00,0.00,0,0, +1746046891177,19,1083,1047,561.20,1088.34,1054.77,5415,11737,-66.19,16,5,-48.41,6.84,27.00,27.00,6,11,0.09,0.12,0.19,0.11,0.00,0.00,0,0, +1746046891177,24,1066,4,828.11,1071.35,5.49,8089,421,-83.73,11,5,-65.95,6.35,33.00,25.00,16,11,0.08,0.03,0.17,0.27,0.00,0.00,0,0, +1746046892177,19,1071,1071,449.00,1076.43,1109.77,5723,12457,-66.25,16,94,-35.73,174.31,8.50,27.00,7,12,0.14,0.05,0.19,0.11,0.00,0.00,0,0, +1746046892177,24,1066,4,710.40,1090.86,5.62,5139,383,-84.22,9,5,-66.44,6.34,25.50,26.00,18,11,0.09,0.16,0.17,0.27,0.00,0.00,0,0, +1746046893177,19,1071,1071,378.11,1076.22,1086.90,4542,16971,-66.25,16,106,-35.21,199.47,9.50,28.00,4,13,0.07,0.09,0.19,0.11,0.00,0.00,0,0, +1746046893177,24,1078,4,486.00,1087.35,5.56,6342,412,-84.22,9,5,-66.44,6.34,28.50,25.00,18,9,0.13,0.07,0.18,0.27,0.00,0.00,0,0, +1746046894177,19,1059,1095,522.10,1064.37,1104.66,5734,14074,-66.19,16,106,-35.14,199.64,9.50,27.00,6,9,0.15,0.12,0.19,0.11,0.00,0.00,0,0, +1746046894177,24,1066,4,514.60,1084.41,5.58,5973,417,-74.54,13,5,-56.76,6.57,31.00,26.00,18,11,0.08,0.06,0.18,0.27,0.00,0.00,0,0, +1746046895177,19,1083,1030,720.44,1088.10,1039.54,6107,12308,-66.19,16,5,-48.41,6.84,26.00,27.00,6,12,0.05,0.04,0.19,0.11,0.00,0.00,0,0, +1746046895177,24,1066,4,648.46,1096.81,5.72,5953,412,-68.92,12,5,-51.14,6.74,26.50,27.00,18,11,0.06,0.09,0.18,0.27,0.00,0.00,0,0, +1746046896177,19,1083,1059,626.00,1088.43,1076.38,4937,12951,-66.12,16,5,-48.34,6.84,25.50,27.00,5,12,0.11,0.20,0.19,0.11,0.00,0.00,0,0, +1746046896177,24,1066,4,757.09,1100.29,5.66,5786,407,-76.91,11,5,-59.13,6.50,25.50,27.00,19,11,0.06,0.10,0.18,0.27,0.00,0.00,0,0, +1746046897177,19,1071,1095,370.89,1076.25,1099.14,6708,13907,-66.25,16,5,-48.47,6.83,25.50,27.00,7,8,0.07,0.08,0.19,0.11,0.00,0.00,0,0, +1746046897177,24,1066,4,641.30,1080.06,5.54,6002,381,-72.56,9,5,-54.77,6.62,27.50,26.00,19,11,0.07,0.14,0.18,0.27,0.00,0.00,0,0, +1746046898177,19,1071,1071,650.70,1076.48,1106.54,6238,13707,-66.25,16,5,-48.47,6.83,26.00,27.00,5,13,0.08,0.07,0.19,0.11,0.00,0.00,0,0, +1746046898177,24,1066,4,652.30,1079.70,5.58,5607,397,-72.56,9,5,-54.77,6.62,28.50,26.00,19,11,0.07,0.13,0.18,0.27,0.00,0.00,0,0, +1746046899177,19,1071,1087,487.67,1076.28,1104.69,5143,13463,-66.12,16,94,-35.60,174.59,9.00,27.00,7,10,0.14,0.14,0.19,0.11,0.00,0.00,0,0, +1746046899177,24,1078,4,269.00,1096.69,5.70,5830,417,-79.87,15,5,-62.09,6.43,29.00,25.00,18,11,0.12,0.12,0.18,0.27,0.00,0.00,0,0, +1746046900177,19,1071,1071,442.33,1076.42,1085.70,6395,14270,-66.12,16,5,-48.34,6.84,25.00,27.00,5,10,0.07,0.05,0.19,0.11,0.00,0.00,0,0, +1746046900177,24,1066,4,540.70,1100.25,5.66,5706,418,-86.21,14,5,-68.43,6.30,30.00,27.00,17,11,0.11,0.11,0.18,0.27,0.00,0.00,0,0, +1746046901177,19,1071,1083,568.45,1076.64,1089.78,5859,12898,-66.31,16,106,-35.27,199.31,9.50,27.00,4,11,0.16,0.11,0.19,0.11,0.00,0.00,0,0, +1746046901177,24,1066,4,618.55,1088.38,5.58,6044,416,-77.54,13,5,-59.76,6.49,25.50,25.00,17,11,0.08,0.11,0.18,0.27,0.00,0.00,0,0, +1746046902177,19,1083,1042,532.33,1088.33,1061.99,5656,17807,-66.31,16,5,-48.53,6.83,25.00,26.00,4,14,0.06,0.05,0.19,0.11,0.00,0.00,0,0, +1746046902177,24,1066,4,860.64,1133.19,5.77,5926,375,-77.54,13,5,-59.76,6.49,25.50,27.00,19,11,0.16,0.11,0.18,0.27,0.00,0.00,0,0, +1746046903177,19,1059,1111,815.75,1064.03,1117.04,5799,13872,-66.12,16,106,-35.08,199.81,9.50,26.00,5,8,0.13,0.12,0.19,0.11,0.00,0.00,0,0, +1746046903177,24,1066,4,311.18,1088.50,5.64,6044,422,-83.92,12,5,-66.14,6.34,29.50,27.00,18,11,0.08,0.13,0.18,0.27,0.00,0.00,0,0, +1746046904177,19,1083,1030,657.00,1088.41,1043.41,7211,14241,-66.00,16,5,-48.22,6.84,26.00,28.00,6,10,0.05,0.04,0.19,0.11,0.00,0.00,0,0, +1746046904177,24,1066,4,563.20,1088.38,5.64,5911,397,-87.50,14,5,-69.72,6.28,26.00,28.00,17,11,0.15,0.11,0.18,0.27,0.00,0.00,0,0, +1746046905177,19,1059,1111,349.88,1064.34,1144.46,5106,12242,-66.12,16,106,-35.08,199.81,9.50,31.00,6,9,0.09,0.17,0.19,0.11,0.00,0.00,0,0, +1746046905177,24,1066,4,413.50,1105.20,5.75,5923,421,-78.87,15,5,-61.09,6.46,25.00,27.00,17,11,0.11,0.12,0.18,0.27,0.00,0.00,0,0, +1746046906177,19,1071,1083,506.78,1076.29,1088.66,6954,12113,-65.75,16,106,-34.71,200.82,9.50,26.00,6,8,0.16,0.06,0.19,0.11,0.00,0.00,0,0, +1746046906177,24,1078,4,879.00,1100.21,5.66,5640,337,-87.20,15,5,-69.42,6.28,26.50,27.00,19,11,0.04,0.09,0.18,0.27,0.00,0.00,0,0, +1746046907177,19,1071,1059,861.33,1076.34,1072.54,5511,12397,-65.75,16,5,-47.97,6.85,26.00,26.00,6,13,0.06,0.15,0.19,0.11,0.00,0.00,0,0, +1746046907177,24,1066,4,570.09,1096.73,5.70,5887,402,-87.20,15,5,-69.42,6.28,26.50,27.00,16,11,0.21,0.14,0.18,0.27,0.00,0.00,0,0, +1746046908177,19,1095,1054,794.78,1094.18,1062.85,7081,12626,-66.25,16,5,-48.47,6.83,27.50,27.00,5,7,0.12,0.10,0.19,0.11,0.00,0.00,0,0, +1746046908177,24,1066,4,756.27,1096.65,5.70,5772,439,-87.75,16,5,-69.97,6.27,24.50,28.00,12,11,0.11,0.10,0.18,0.27,0.00,0.00,0,0, +1746046909177,19,1071,1087,683.64,1082.70,1099.36,7678,14393,-65.94,16,5,-48.16,6.85,26.00,27.00,7,11,0.04,0.04,0.19,0.11,0.00,0.00,0,0, +1746046909177,24,1066,4,837.45,1088.38,5.66,5911,435,-81.33,12,5,-63.55,6.40,24.50,27.00,14,11,0.04,0.10,0.18,0.27,0.00,0.00,0,0, +1746046910177,19,1071,1071,583.80,1076.46,1093.12,5268,13141,-66.00,16,106,-34.96,200.14,9.50,28.00,5,9,0.10,0.14,0.19,0.11,0.00,0.00,0,0, +1746046910177,24,1066,4,760.30,1071.39,5.50,5632,366,-80.08,13,5,-62.30,6.43,24.50,26.00,21,11,0.14,0.11,0.18,0.27,0.00,0.00,0,0, +1746046911177,19,1071,1083,491.73,1076.39,1094.82,6290,13850,-66.19,16,5,-48.41,6.84,26.00,28.00,7,10,0.08,0.05,0.19,0.11,0.00,0.00,0,0, +1746046911177,24,1066,4,497.11,1088.18,5.62,5711,421,-94.18,11,5,-76.40,6.16,29.00,26.00,13,11,0.17,0.09,0.18,0.27,0.00,0.00,0,0, +1746046912177,19,1059,1071,685.40,1064.06,1074.52,4979,13103,-66.19,16,106,-35.14,199.64,9.50,27.00,5,12,0.09,0.09,0.19,0.11,0.00,0.00,0,0, +1746046912177,24,1078,4,720.60,1108.84,5.67,5879,438,-94.18,11,5,-76.40,6.16,25.00,25.00,11,11,0.07,0.10,0.18,0.27,0.00,0.00,0,0, +1746046913177,19,1083,1042,588.92,1088.39,1055.20,5391,13240,-66.06,16,106,-35.02,199.97,9.50,26.00,7,11,0.14,0.10,0.19,0.11,0.00,0.00,0,0, +1746046913177,24,1066,4,577.10,1113.79,5.83,6110,426,-83.33,9,5,-65.55,6.36,24.00,28.00,16,11,0.04,0.13,0.18,0.27,0.00,0.00,0,0, +1746046914177,19,1083,1071,774.60,1088.34,1090.81,5422,13780,-66.31,16,5,-48.53,6.83,28.00,26.00,5,13,0.07,0.07,0.19,0.11,0.00,0.00,0,0, +1746046914177,24,1066,4,546.20,1079.82,5.58,5739,365,-75.80,10,5,-58.02,6.53,25.50,27.00,18,11,0.21,0.12,0.18,0.27,0.00,0.00,0,0, +1746046915177,19,1071,1083,587.45,1076.30,1089.73,6612,12664,-66.19,16,5,-48.41,6.84,26.50,26.00,6,6,0.14,0.15,0.19,0.11,0.00,0.00,0,0, +1746046915177,24,1066,4,643.75,1105.32,5.78,5999,426,-85.50,12,5,-67.72,6.31,29.50,26.00,15,11,0.11,0.12,0.18,0.27,0.00,0.00,0,0, +1746046916177,19,1059,1099,804.82,1064.42,1119.46,9338,12925,-66.19,16,106,-35.14,199.64,9.50,27.00,6,6,0.05,0.05,0.19,0.11,0.00,0.00,0,0, +1746046916177,24,1066,4,450.10,1071.35,5.49,6213,421,-85.50,12,5,-67.72,6.31,30.00,25.00,15,10,0.05,0.08,0.18,0.27,0.00,0.00,0,0, +1746046917177,19,1083,1071,475.09,1088.50,1087.85,6166,12112,-66.06,16,106,-35.02,199.97,9.50,27.00,6,13,0.09,0.09,0.19,0.11,0.00,0.00,0,0, +1746046917177,24,1066,4,662.90,1091.15,5.58,6415,402,-82.25,8,5,-64.47,6.38,29.00,28.00,18,10,0.15,0.11,0.18,0.27,0.00,0.00,0,0, +1746046918177,19,1071,1071,653.40,1076.04,1072.81,5810,12097,-66.31,16,106,-35.27,199.31,9.50,27.00,6,8,0.15,0.12,0.19,0.11,0.00,0.00,0,0, +1746046918177,24,1078,4,642.80,1083.66,5.55,6382,408,-78.18,11,5,-60.40,6.47,30.50,26.00,16,10,0.20,0.06,0.18,0.27,0.00,0.00,0,0, +1746046919177,19,1071,1042,943.36,1076.48,1062.34,7283,11956,-66.25,16,5,-48.47,6.83,26.00,28.00,6,10,0.05,0.04,0.19,0.11,0.00,0.00,0,0, +1746046919177,24,1066,4,717.18,1088.34,5.64,6163,426,-75.23,13,5,-57.45,6.55,29.50,27.00,14,11,0.09,0.08,0.18,0.27,0.00,0.00,0,0, +1746046920177,19,1071,1111,569.12,1076.29,1121.69,5546,13671,-66.19,16,106,-35.14,199.64,9.50,28.00,5,12,0.09,0.11,0.19,0.11,0.00,0.00,0,0, +1746046920177,24,1066,4,864.50,1105.24,5.75,5998,436,-75.54,13,5,-57.76,6.54,27.00,26.00,14,11,0.06,0.11,0.18,0.27,0.00,0.00,0,0, +1746046921177,19,1071,1071,785.78,1076.29,1082.81,5113,13176,-66.19,16,106,-35.14,199.64,9.00,28.00,6,11,0.16,0.16,0.19,0.11,0.00,0.00,0,0, +1746046921177,24,1066,4,695.82,1096.69,5.70,5755,407,-75.54,13,5,-57.76,6.54,47.50,27.00,20,11,0.06,0.10,0.18,0.27,0.00,0.00,0,0, +1746046922177,19,1071,1083,704.40,1076.33,1087.95,5767,12491,-66.31,16,106,-35.27,199.31,9.50,28.00,6,11,0.06,0.06,0.19,0.11,0.00,0.00,0,0, +1746046922177,24,1066,4,823.78,1088.22,5.64,5714,413,-70.92,13,5,-53.14,6.67,30.00,27.00,14,11,0.18,0.09,0.18,0.27,0.00,0.00,0,0, +1746046923177,19,1083,1042,551.25,1088.14,1054.70,5080,11646,-65.94,16,5,-48.16,6.85,26.50,26.00,6,10,0.12,0.16,0.19,0.11,0.00,0.00,0,0, +1746046923177,24,1066,4,570.30,1096.77,5.70,5953,424,-86.43,7,5,-68.65,6.30,29.00,25.00,13,11,0.08,0.15,0.18,0.27,0.00,0.00,0,0, +1746046924177,19,1071,1075,665.00,1076.46,1086.82,6342,12455,-66.12,16,5,-48.34,6.84,26.50,27.00,7,10,0.05,0.06,0.19,0.11,0.00,0.00,0,0, +1746046924177,24,1078,4,483.80,1108.88,5.72,6010,421,-73.92,12,5,-56.14,6.58,25.50,26.00,18,11,0.04,0.13,0.18,0.27,0.00,0.00,0,0, +1746046925177,19,1059,1095,574.33,1063.89,1107.57,5023,12347,-66.12,16,94,-35.60,174.59,9.00,29.00,6,10,0.08,0.19,0.19,0.11,0.00,0.00,0,0, +1746046925177,24,1066,4,702.27,1083.46,5.55,5622,402,-73.92,12,5,-56.14,6.58,23.50,27.00,18,11,0.10,0.10,0.18,0.27,0.00,0.00,0,0, +1746046926177,19,1095,1030,933.11,1088.43,1047.41,7015,11536,-65.88,16,5,-48.09,6.85,26.50,27.00,6,8,0.13,0.07,0.19,0.11,0.00,0.00,0,0, +1746046926177,24,1066,4,661.00,1096.65,5.70,5887,426,-82.54,13,5,-64.76,6.37,30.50,27.00,15,11,0.11,0.09,0.18,0.27,0.00,0.00,0,0, +1746046927177,19,1071,1071,539.60,1088.26,1084.46,5619,12555,-66.19,16,5,-48.41,6.84,28.00,27.00,7,13,0.05,0.19,0.19,0.11,0.00,0.00,0,0, +1746046927177,24,1066,4,647.89,1071.31,5.53,5699,421,-81.17,12,5,-63.39,6.40,28.50,27.00,15,11,0.06,0.09,0.18,0.27,0.00,0.00,0,0, +1746046928177,19,1071,1071,414.08,1076.25,1078.70,6363,13643,-66.25,16,5,-48.47,6.83,26.00,27.00,5,8,0.09,0.10,0.19,0.11,0.00,0.00,0,0, +1746046928177,24,1066,4,611.73,1096.77,5.72,5887,402,-81.89,9,5,-64.11,6.39,25.00,27.00,19,11,0.09,0.10,0.18,0.27,0.00,0.00,0,0, +1746046929177,19,1059,1111,527.75,1064.46,1125.66,6641,13989,-66.12,16,106,-35.08,199.81,9.50,28.00,7,12,0.11,0.03,0.19,0.11,0.00,0.00,0,0, +1746046929177,24,1066,4,714.91,1071.35,5.49,5693,402,-75.00,9,5,-57.22,6.55,26.50,27.00,19,11,0.06,0.09,0.18,0.27,0.00,0.00,0,0, +1746046930177,19,1083,1054,567.78,1088.33,1063.51,5094,14047,-66.12,16,106,-35.08,199.81,9.50,26.00,5,11,0.08,0.13,0.19,0.11,0.00,0.00,0,0, +1746046930177,24,1078,4,451.40,1108.88,5.70,6011,376,-75.00,9,5,-57.22,6.55,26.50,27.00,17,11,0.15,0.11,0.18,0.27,0.00,0.00,0,0, +1746046931177,19,1059,1087,507.33,1064.30,1100.28,5627,12778,-65.94,16,94,-35.41,175.02,9.50,27.00,5,12,0.17,0.06,0.19,0.11,0.00,0.00,0,0, +1746046931177,24,1066,4,466.44,1113.59,5.81,5903,339,-82.15,13,5,-64.37,6.38,33.50,27.00,17,11,0.08,0.09,0.18,0.27,0.00,0.00,0,0, +1746046932177,19,1095,1059,328.12,1088.41,1072.38,5157,14607,-66.19,16,5,-48.41,6.84,25.00,27.00,5,12,0.06,0.09,0.19,0.11,0.00,0.00,0,0, +1746046932177,24,1066,4,740.10,1096.85,5.72,5960,402,-77.75,16,5,-59.97,6.48,25.50,27.00,19,11,0.06,0.12,0.18,0.27,0.00,0.00,0,0, +1746046933177,19,1071,1071,436.55,1088.58,1092.52,5309,12901,-66.31,16,5,-48.53,6.83,27.50,26.00,5,12,0.13,0.12,0.19,0.11,0.00,0.00,0,0, +1746046933177,24,1066,4,617.55,1088.22,5.62,5665,397,-76.17,12,5,-58.39,6.52,33.50,27.00,19,11,0.08,0.10,0.18,0.27,0.00,0.00,0,0, +1746046934177,19,1071,1054,949.60,1076.40,1064.90,5684,14415,-66.31,16,5,-48.53,6.83,26.50,27.00,6,11,0.05,0.10,0.19,0.11,0.00,0.00,0,0, +1746046934177,24,1066,4,525.40,1105.28,5.78,6125,421,-76.17,12,5,-58.39,6.52,25.00,26.00,17,11,0.13,0.13,0.18,0.27,0.00,0.00,0,0, +1746046935177,19,1059,1099,684.22,1063.98,1113.78,5270,13290,-66.12,16,94,-35.60,174.59,9.50,27.00,4,14,0.13,0.05,0.19,0.11,0.00,0.00,0,0, +1746046935177,24,1066,4,705.44,1088.26,5.60,5709,421,-86.50,12,5,-68.72,6.29,26.00,26.00,17,11,0.06,0.11,0.18,0.27,0.00,0.00,0,0, +1746046936177,19,1083,1083,772.82,1088.39,1092.08,6897,18206,-66.19,16,106,-35.14,199.64,9.50,26.00,4,6,0.05,0.14,0.19,0.11,0.00,0.00,0,0, +1746046936177,24,1078,4,668.75,1092.10,5.58,6448,402,-76.86,14,5,-59.08,6.50,29.50,27.00,19,10,0.13,0.11,0.18,0.27,0.00,0.00,0,0, +1746046937177,19,1071,1042,644.40,1076.45,1052.82,9045,11803,-66.00,16,5,-48.22,6.84,26.50,27.00,6,7,0.11,0.05,0.19,0.11,0.00,0.00,0,0, +1746046937177,24,1066,4,862.11,1071.39,5.55,6244,402,-77.43,14,5,-59.65,6.49,30.50,27.00,19,10,0.10,0.06,0.18,0.27,0.00,0.00,0,0, +1746046938177,19,1083,1087,593.78,1076.34,1102.44,5759,12290,-66.00,16,5,-48.22,6.84,25.50,28.00,7,12,0.12,0.06,0.19,0.11,0.00,0.00,0,0, +1746046938177,24,1066,4,488.09,1096.93,5.70,6250,402,-73.27,15,5,-55.49,6.60,25.50,28.00,19,11,0.08,0.09,0.18,0.27,0.00,0.00,0,0, +1746046939177,19,1071,1083,684.50,1088.23,1088.71,5054,12578,-66.00,16,5,-48.22,6.84,25.00,27.00,6,12,0.06,0.06,0.19,0.11,0.00,0.00,0,0, +1746046939177,24,1066,4,574.00,1079.94,5.61,5871,407,-73.27,15,5,-55.49,6.60,30.00,26.00,17,11,0.16,0.11,0.18,0.27,0.00,0.00,0,0, +1746046940177,19,1071,1042,652.40,1076.25,1058.98,5333,11933,-66.00,16,5,-48.22,6.84,28.00,28.00,5,12,0.13,0.08,0.19,0.11,0.00,0.00,0,0, +1746046940177,24,1066,4,582.91,1113.79,5.81,6036,423,-87.86,14,5,-70.08,6.27,25.50,27.00,16,11,0.14,0.12,0.18,0.27,0.00,0.00,0,0, +1746046941177,19,1059,1087,614.33,1064.16,1093.46,4988,14736,-66.19,16,5,-48.41,6.84,26.00,28.00,7,12,0.04,0.12,0.19,0.11,0.00,0.00,0,0, +1746046941177,24,1066,4,877.55,1079.90,5.58,5745,418,-84.13,15,5,-66.35,6.34,28.00,27.00,16,11,0.06,0.13,0.18,0.27,0.00,0.00,0,0, +1746046942177,19,1083,1054,591.30,1088.37,1070.54,5145,13108,-66.19,16,5,-48.41,6.84,26.00,27.00,5,12,0.09,0.12,0.19,0.11,0.00,0.00,0,0, +1746046942177,24,1078,4,496.25,1088.26,5.58,5845,416,-71.69,16,5,-53.91,6.65,27.50,27.00,18,11,0.05,0.11,0.18,0.27,0.00,0.00,0,0, +1746046943177,19,1071,1111,660.44,1076.14,1121.15,4958,13579,-66.31,16,5,-48.53,6.83,25.50,27.00,7,12,0.12,0.11,0.19,0.11,0.00,0.00,0,0, +1746046943177,24,1066,4,463.60,1108.72,5.71,5813,363,-78.64,11,5,-60.85,6.46,31.50,26.00,19,11,0.07,0.11,0.18,0.27,0.00,0.00,0,0, +1746046944177,19,1071,1095,672.90,1076.33,1113.50,5352,12678,-66.31,16,106,-35.27,199.31,9.50,30.00,6,12,0.07,0.10,0.19,0.11,0.00,0.00,0,0, +1746046944177,24,1066,4,632.36,1119.26,5.78,5861,402,-78.64,11,5,-60.85,6.46,25.00,27.00,19,11,0.10,0.11,0.18,0.27,0.00,0.00,0,0, +1746046945177,19,1083,1035,937.73,1088.32,1041.12,5275,12600,-66.12,16,5,-48.34,6.84,25.50,27.00,5,11,0.11,0.11,0.19,0.11,0.00,0.00,0,0, +1746046945177,24,1066,4,386.36,1088.30,5.64,5787,426,-82.38,13,5,-64.60,6.38,32.00,27.00,17,11,0.10,0.09,0.18,0.27,0.00,0.00,0,0, +1746046946177,19,1059,1095,616.90,1064.17,1109.68,5562,13876,-66.12,16,101,-35.29,189.25,9.50,29.00,7,12,0.10,0.06,0.19,0.11,0.00,0.00,0,0, +1746046946177,24,1066,4,614.27,1113.67,5.83,6035,418,-91.06,16,5,-73.28,6.21,25.50,27.00,17,11,0.07,0.10,0.18,0.27,0.00,0.00,0,0, +1746046947177,19,1071,1071,777.12,1076.28,1081.91,5218,13944,-66.12,16,94,-35.60,174.59,9.50,27.00,5,11,0.08,0.11,0.19,0.11,0.00,0.00,0,0, +1746046947177,24,1066,4,342.00,1088.22,5.60,5718,376,-94.06,16,5,-76.28,6.17,26.50,28.00,20,11,0.05,0.09,0.18,0.27,0.00,0.00,0,0, +1746046948177,19,1083,1059,579.00,1088.36,1069.63,5759,12684,-66.12,16,5,-48.34,6.84,26.50,29.00,6,12,0.13,0.06,0.19,0.11,0.00,0.00,0,0, +1746046948177,24,1078,4,465.45,1105.20,5.70,6059,426,-94.06,16,5,-76.28,6.17,26.00,26.00,13,11,0.14,0.11,0.18,0.27,0.00,0.00,0,0, +1746046949177,19,1071,1095,687.70,1076.33,1107.06,5812,12829,-66.06,16,106,-35.02,199.97,25.50,28.00,6,10,0.05,0.10,0.19,0.11,0.00,0.00,0,0, +1746046949177,24,1066,4,773.00,1075.19,5.53,5851,429,-76.80,15,5,-59.02,6.51,28.50,26.00,13,11,0.06,0.11,0.18,0.27,0.00,0.00,0,0, +1746046950177,19,1071,1047,744.10,1076.37,1067.84,6015,8131,-66.19,16,5,-48.41,6.84,25.50,30.00,16,12,0.02,0.07,0.19,0.11,0.00,0.00,0,0, +1746046950177,24,1066,4,531.20,1079.94,5.58,5805,402,-84.00,16,5,-66.22,6.34,29.00,27.00,20,11,0.09,0.11,0.18,0.27,0.00,0.00,0,0, +1746046951177,19,1083,1042,702.70,1088.38,1048.76,5174,4501,-66.31,16,5,-48.53,6.83,26.50,30.00,20,12,0.14,0.12,0.19,0.11,0.00,0.00,0,0, +1746046951177,24,1066,4,499.33,1105.16,5.78,5931,426,-85.25,16,5,-67.47,6.32,26.00,27.00,17,11,0.09,0.12,0.18,0.27,0.00,0.00,0,0, +1746046952177,19,1071,1083,745.60,1076.24,1100.12,5607,4610,-66.25,16,5,-48.47,6.83,25.50,27.00,17,10,0.07,0.11,0.19,0.11,0.00,0.00,0,0, +1746046952177,24,1066,4,606.73,1079.98,5.58,5876,412,-81.50,16,5,-63.72,6.40,25.50,27.00,19,11,0.05,0.13,0.18,0.27,0.00,0.00,0,0, +1746046953177,19,1071,1087,456.10,1076.32,1090.60,5948,4691,-66.25,16,5,-48.47,6.83,26.50,25.00,19,13,0.08,0.05,0.19,0.11,0.00,0.00,0,0, +1746046953177,24,1066,4,979.33,1105.20,5.71,5862,335,-81.50,16,5,-63.72,6.40,33.00,27.00,19,11,0.12,0.11,0.18,0.27,0.00,0.00,0,0, +1746046954177,19,1071,1078,438.83,1076.41,1090.06,6052,4743,-66.00,16,5,-48.22,6.84,26.50,27.00,18,6,0.07,0.16,0.19,0.11,0.00,0.00,0,0, +1746046954177,24,1078,4,633.20,1083.54,5.53,5762,397,-92.33,12,5,-74.55,6.19,30.00,26.00,18,11,0.18,0.12,0.18,0.27,0.00,0.00,0,0, +1746046955177,19,1071,1075,838.00,1076.46,1093.54,9373,4481,-66.12,16,5,-48.34,6.84,26.00,28.00,19,6,0.14,0.05,0.19,0.11,0.00,0.00,0,0, +1746046955177,24,1066,4,463.33,1096.73,5.70,5820,433,-82.08,13,5,-64.30,6.38,29.00,27.00,17,11,0.07,0.11,0.18,0.27,0.00,0.00,0,0, +1746046956177,19,1059,1083,698.11,1064.29,1090.46,5881,4685,-66.19,16,5,-48.41,6.84,25.50,28.00,18,13,0.06,0.10,0.19,0.11,0.00,0.00,0,0, +1746046956177,24,1066,4,612.40,1096.73,5.72,5887,402,-78.38,16,5,-60.59,6.47,30.00,28.00,19,11,0.13,0.11,0.18,0.27,0.00,0.00,0,0, +1746046957177,19,1095,1095,748.30,1100.22,1107.87,4982,4691,-66.19,16,27,-41.08,43.50,25.50,27.00,18,11,0.16,0.12,0.19,0.11,0.00,0.00,0,0, +1746046957177,24,1066,4,639.91,1105.24,5.75,6060,422,-78.38,16,5,-60.59,6.47,31.50,27.00,18,11,0.10,0.12,0.18,0.27,0.00,0.00,0,0, +1746046958177,19,1071,1018,508.45,1076.13,1032.11,5529,4541,-66.00,16,5,-48.22,6.84,26.00,28.00,18,12,0.06,0.06,0.19,0.11,0.00,0.00,0,0, +1746046958177,24,1066,4,755.91,1113.71,5.83,6048,412,-83.40,15,5,-65.62,6.35,29.50,26.00,18,11,0.06,0.13,0.18,0.27,0.00,0.00,0,0, +1746046959177,19,1071,1087,418.00,1076.22,1098.56,5116,4536,-66.25,16,5,-48.47,6.83,25.50,27.00,17,12,0.14,0.14,0.19,0.11,0.00,0.00,0,0, +1746046959177,24,1066,4,492.90,1105.20,5.71,5931,370,-78.57,14,5,-60.79,6.46,29.50,30.00,19,11,0.18,0.13,0.18,0.27,0.00,0.00,0,0, +1746046960177,19,1071,1083,739.20,1076.57,1088.50,6807,4922,-65.88,16,5,-48.09,6.85,26.50,27.00,18,8,0.05,0.09,0.19,0.11,0.00,0.00,0,0, +1746046960177,24,1078,4,405.55,1096.93,5.66,6024,412,-82.88,8,5,-65.09,6.37,26.00,27.00,18,11,0.10,0.12,0.18,0.27,0.00,0.00,0,0, +1746046961177,19,1071,1083,574.67,1076.26,1104.82,6210,4616,-66.19,16,5,-48.41,6.84,27.00,27.00,17,13,0.14,0.04,0.19,0.11,0.00,0.00,0,0, +1746046961177,24,1066,4,446.70,1108.84,5.75,5946,403,-76.50,12,5,-58.72,6.51,31.00,27.00,19,11,0.05,0.13,0.18,0.27,0.00,0.00,0,0, +1746046962177,19,1059,1083,424.88,1064.35,1088.24,5964,4953,-66.19,16,5,-48.41,6.84,25.50,26.00,18,10,0.05,0.08,0.19,0.11,0.00,0.00,0,0, +1746046962177,24,1066,4,486.64,1096.81,5.70,6290,412,-76.50,12,5,-58.72,6.51,30.50,27.00,18,9,0.11,0.15,0.18,0.27,0.00,0.00,0,0, +1746046963177,19,1095,1042,343.55,1100.42,1050.21,5812,4380,-66.00,16,5,-48.22,6.84,27.00,27.00,19,11,0.10,0.20,0.19,0.11,0.00,0.00,0,0, +1746046963177,24,1066,4,522.73,1071.71,5.55,6532,333,-74.83,12,5,-57.05,6.56,30.50,27.00,18,9,0.07,0.06,0.18,0.27,0.00,0.00,0,0, +1746046964177,19,1071,1087,452.18,1076.26,1107.79,6302,4751,-66.19,16,5,-48.41,6.84,26.50,27.00,18,9,0.10,0.07,0.19,0.11,0.00,0.00,0,0, +1746046964177,24,1066,4,630.00,1093.42,5.64,5370,423,-77.77,13,5,-59.99,6.48,29.00,27.00,16,13,0.10,0.09,0.18,0.27,0.00,0.00,0,0, +1746046965177,19,1059,1083,932.33,1064.38,1096.16,5714,4737,-66.62,16,5,-48.84,6.82,27.00,28.00,19,12,0.06,0.11,0.19,0.11,0.00,0.00,0,0, +1746046965177,24,1066,4,574.00,1123.91,5.81,5501,393,-78.38,8,5,-60.59,6.47,25.00,28.00,18,9,0.04,0.19,0.18,0.27,0.00,0.00,0,0, +1746046966177,19,1083,1030,702.10,1088.16,1084.07,6003,4636,-66.62,16,5,-48.84,6.82,26.00,26.00,19,7,0.15,0.14,0.19,0.11,0.00,0.00,0,0, +1746046966177,24,1078,4,473.33,1071.43,5.53,7680,385,-78.38,8,5,-60.59,6.47,24.50,27.00,18,7,0.21,0.08,0.18,0.27,0.00,0.00,0,0, +1746046967177,19,1071,1083,349.44,1076.43,1041.46,8046,4535,-66.25,16,5,-48.47,6.83,27.50,27.00,18,8,0.06,0.05,0.19,0.11,0.00,0.00,0,0, +1746046967177,24,1066,4,570.40,1083.54,5.53,7481,416,-79.36,11,5,-61.58,6.44,30.50,27.00,15,11,0.09,0.03,0.18,0.27,0.00,0.00,0,0, +1746046968177,19,1059,1099,665.44,1064.13,1117.82,5044,4446,-66.44,16,5,-48.66,6.83,25.50,27.00,18,11,0.15,0.22,0.19,0.11,0.00,0.00,0,0, +1746046968177,24,1066,4,807.00,1082.34,5.58,4654,428,-86.58,12,5,-68.80,6.29,25.50,29.00,19,12,0.03,0.14,0.18,0.27,0.00,0.00,0,0, +1746046969177,19,1083,1083,676.50,1088.46,1090.74,6927,4776,-66.12,16,5,-48.34,6.84,26.00,28.00,18,8,0.05,0.08,0.19,0.11,0.00,0.00,0,0, +1746046969177,24,1066,4,246.56,1102.73,5.66,5234,412,-87.75,16,5,-69.97,6.27,25.00,27.00,16,9,0.21,0.15,0.18,0.27,0.00,0.00,0,0, +1746046970177,19,1083,1018,730.11,1088.49,1036.34,6446,4759,-66.06,16,5,-48.28,6.84,26.00,27.00,16,11,0.12,0.16,0.19,0.11,0.00,0.00,0,0, +1746046970177,24,1066,4,648.00,1071.51,5.49,6325,421,-93.90,10,5,-76.12,6.17,26.50,27.00,13,9,0.09,0.07,0.18,0.27,0.00,0.00,0,0, +1746046971177,19,1059,1135,453.10,1064.44,1147.74,6483,4958,-66.06,16,5,-48.28,6.84,25.50,26.00,17,10,0.05,0.06,0.19,0.11,0.00,0.00,0,0, +1746046971177,24,1066,4,553.11,1079.00,5.58,6415,426,-93.90,10,5,-76.12,6.17,29.50,27.00,17,10,0.03,0.12,0.18,0.27,0.00,0.00,0,0, +1746046972177,19,1083,1083,307.00,1088.36,1092.28,5401,4715,-66.25,16,36,-39.90,59.78,25.50,27.00,16,12,0.13,0.08,0.19,0.11,0.00,0.00,0,0, +1746046972177,24,1078,4,375.11,1071.50,6.51,6260,541,-76.62,8,5,-58.84,6.51,29.50,28.00,20,9,0.18,0.10,0.18,0.27,0.00,0.00,0,0, +1746046973177,19,1071,1018,458.78,1076.29,1030.09,5058,4646,-65.88,16,5,-48.09,6.85,26.00,26.00,17,12,0.05,0.06,0.19,0.11,0.00,0.00,0,0, +1746046973177,24,1066,4,552.36,1083.50,5.55,6445,426,-78.67,9,5,-60.89,6.46,26.00,27.00,15,10,0.11,0.05,0.18,0.27,0.00,0.00,0,0, +1746046974177,19,1071,1099,743.91,1076.14,1102.91,5046,4681,-65.88,16,5,-48.09,6.85,26.50,28.00,16,12,0.14,0.10,0.19,0.11,0.00,0.00,0,0, +1746046974177,24,1066,4,706.09,1105.16,5.75,5995,431,-76.67,9,5,-58.89,6.51,25.50,26.00,16,11,0.05,0.09,0.18,0.27,0.00,0.00,0,0, +1746046975177,19,1083,1071,471.18,1085.86,1089.09,5204,4940,-65.81,16,5,-48.03,6.85,26.00,28.00,17,12,0.05,0.10,0.19,0.11,0.00,0.00,0,0, +1746046975177,24,1066,4,662.36,1096.73,5.70,5952,402,-78.00,11,5,-60.22,6.48,32.00,27.00,19,11,0.05,0.13,0.18,0.27,0.00,0.00,0,0, +1746046976177,19,1059,1083,783.62,1076.22,1093.02,4983,4770,-65.81,16,101,-34.98,190.04,25.00,26.00,19,12,0.13,0.11,0.19,0.11,0.00,0.00,0,0, +1746046976177,24,1066,4,242.73,1079.94,5.58,5874,417,-78.00,11,5,-60.22,6.48,24.50,26.00,18,11,0.18,0.13,0.18,0.27,0.00,0.00,0,0, +1746046977177,19,1071,1083,733.89,1076.30,1092.00,6195,4477,-66.31,16,5,-48.53,6.83,27.00,26.00,18,8,0.08,0.12,0.19,0.11,0.00,0.00,0,0, +1746046977177,24,1066,4,523.82,1096.93,5.70,6520,431,-83.56,9,5,-65.77,6.35,28.00,27.00,15,9,0.09,0.09,0.18,0.27,0.00,0.00,0,0, +1746046978177,19,1083,1018,648.70,1088.31,1037.79,6863,4572,-66.50,16,5,-48.72,6.82,27.00,27.00,18,10,0.22,0.04,0.19,0.11,0.00,0.00,0,0, +1746046978177,24,1078,4,327.67,1071.47,5.55,6315,334,-88.30,10,5,-70.52,6.26,25.50,25.00,17,10,0.04,0.09,0.18,0.27,0.00,0.00,0,0, +1746046979177,19,1071,1083,586.00,1076.37,1085.59,5674,4878,-66.06,16,5,-48.28,6.84,27.50,27.00,15,11,0.08,0.10,0.19,0.11,0.00,0.00,0,0, +1746046979177,24,1066,4,682.27,1083.62,5.53,6643,423,-82.25,12,5,-64.47,6.38,28.00,28.00,15,10,0.17,0.05,0.18,0.27,0.00,0.00,0,0, +1746046980177,19,1071,1071,764.50,1076.38,1090.77,5464,4908,-66.06,16,5,-48.28,6.84,26.50,27.00,20,12,0.10,0.07,0.19,0.11,0.00,0.00,0,0, +1746046980177,24,1066,4,671.70,1071.39,5.55,6275,431,-82.25,12,5,-64.47,6.38,30.50,26.00,14,10,0.07,0.06,0.18,0.27,0.00,0.00,0,0, +1746046981177,19,1083,1087,757.36,1086.06,1092.98,5333,4691,-66.19,16,5,-48.41,6.84,27.50,27.00,18,12,0.08,0.11,0.19,0.11,0.00,0.00,0,0, +1746046981177,24,1066,4,411.45,1096.85,5.67,6004,412,-82.50,12,5,-64.72,6.37,32.00,27.00,20,11,0.03,0.11,0.18,0.27,0.00,0.00,0,0, +1746046982177,19,1071,1083,570.10,1078.53,1092.59,5531,4648,-66.06,16,5,-48.28,6.84,27.00,27.00,19,7,0.08,0.15,0.19,0.11,0.00,0.00,0,0, +1746046982177,24,1066,4,669.22,1110.86,5.73,5829,407,-80.08,13,5,-62.30,6.43,30.00,27.00,19,11,0.11,0.12,0.18,0.27,0.00,0.00,0,0, +1746046983177,19,1071,1083,595.58,1076.37,1094.49,8071,4466,-66.31,16,5,-48.53,6.83,26.50,27.00,19,7,0.08,0.05,0.19,0.11,0.00,0.00,0,0, +1746046983177,24,1066,4,743.91,1088.38,5.64,6046,407,-83.20,10,5,-65.42,6.36,24.50,26.00,19,11,0.09,0.12,0.18,0.27,0.00,0.00,0,0, +1746046984177,19,1071,1083,564.60,1076.02,1093.83,5355,4497,-65.94,16,13,-44.01,19.48,25.00,26.00,19,12,0.13,0.22,0.19,0.11,0.00,0.00,0,0, +1746046984177,24,1078,4,796.11,1088.22,5.64,5774,376,-78.00,12,5,-60.22,6.48,25.00,27.00,19,11,0.06,0.14,0.18,0.27,0.00,0.00,0,0, +1746046985177,19,1059,1071,460.00,1064.25,1091.58,6550,4721,-65.94,16,5,-48.16,6.85,26.50,26.00,18,8,0.07,0.09,0.19,0.11,0.00,0.00,0,0, +1746046985177,24,1066,4,572.10,1091.86,5.61,5745,375,-78.00,12,5,-60.22,6.48,26.50,27.00,18,11,0.16,0.10,0.18,0.27,0.00,0.00,0,0, +1746046986177,19,1083,1030,885.11,1088.40,1038.11,6321,4530,-65.88,16,5,-48.09,6.85,26.50,28.00,18,12,0.11,0.05,0.19,0.11,0.00,0.00,0,0, +1746046986177,24,1066,4,786.82,1088.46,5.64,5918,412,-76.82,11,5,-59.04,6.51,32.00,27.00,18,11,0.07,0.11,0.18,0.27,0.00,0.00,0,0, +1746046987177,19,1083,1099,549.46,1088.29,1105.34,5644,4867,-65.81,16,5,-48.03,6.85,26.50,27.00,19,11,0.05,0.07,0.19,0.11,0.00,0.00,0,0, +1746046987177,24,1066,4,890.45,1071.59,5.53,6299,412,-72.12,8,5,-54.34,6.64,26.50,29.00,19,7,0.13,0.15,0.18,0.27,0.00,0.00,0,0, +1746046988177,19,1071,1071,518.89,1076.40,1090.90,5363,4659,-65.88,16,5,-48.09,6.85,26.50,27.00,18,12,0.10,0.17,0.19,0.11,0.00,0.00,0,0, +1746046988177,24,1066,4,831.91,1071.51,5.55,7898,402,-103.71,7,5,-85.93,6.03,26.00,26.00,19,7,0.05,0.07,0.18,0.27,0.00,0.00,0,0, +1746046989177,19,1059,1083,696.50,1064.26,1091.63,6124,4675,-65.88,16,5,-48.09,6.85,26.00,28.00,19,10,0.07,0.07,0.19,0.11,0.00,0.00,0,0, +1746046989177,24,1066,4,705.00,1071.59,5.49,7333,378,-103.71,7,5,-85.93,6.03,30.00,26.00,18,11,0.11,0.04,0.18,0.27,0.00,0.00,0,0, +1746046990177,19,1083,1042,386.00,1088.26,1050.46,5651,4397,-66.31,16,5,-48.53,6.83,27.00,26.00,19,10,0.10,0.16,0.19,0.11,0.00,0.00,0,0, +1746046990177,24,1078,4,484.70,1096.93,5.66,6277,393,-79.25,12,5,-61.47,6.45,30.50,27.00,18,11,0.05,0.12,0.18,0.27,0.00,0.00,0,0, +1746046991177,19,1071,1083,661.73,1076.38,1092.73,6260,4665,-66.25,16,5,-48.47,6.83,26.50,27.00,18,10,0.08,0.06,0.19,0.11,0.00,0.00,0,0, +1746046991177,24,1066,4,476.00,1117.15,5.75,5919,407,-74.71,14,5,-56.93,6.56,28.00,27.00,19,11,0.07,0.12,0.18,0.27,0.00,0.00,0,0, +1746046992177,19,1059,1087,868.00,1064.47,1104.99,5760,4548,-66.25,16,5,-48.47,6.83,26.50,27.00,18,9,0.16,0.14,0.19,0.11,0.00,0.00,0,0, +1746046992177,24,1066,4,431.60,1122.22,5.85,6208,381,-83.50,12,5,-65.72,6.35,29.50,26.00,20,11,0.09,0.14,0.18,0.27,0.00,0.00,0,0, +1746046993177,19,1083,1083,462.55,1088.44,1090.26,6522,4791,-66.06,16,5,-48.28,6.84,24.50,29.00,18,10,0.06,0.05,0.19,0.11,0.00,0.00,0,0, +1746046993177,24,1066,4,792.09,1105.16,5.71,5928,402,-75.86,14,5,-58.08,6.53,28.50,24.00,19,11,0.11,0.11,0.18,0.27,0.00,0.00,0,0, +1746046994177,19,1083,1018,644.60,1088.25,1034.56,5897,4549,-66.06,16,5,-48.28,6.84,25.50,27.00,19,7,0.11,0.16,0.19,0.11,0.00,0.00,0,0, +1746046994177,24,1066,4,394.82,1096.77,5.72,5888,402,-75.86,14,5,-58.08,6.53,29.50,27.00,17,11,0.17,0.11,0.18,0.27,0.00,0.00,0,0, +1746046995177,19,1059,1135,623.73,1064.29,1150.86,7912,4544,-66.19,16,5,-48.41,6.84,26.50,26.00,18,7,0.13,0.05,0.19,0.11,0.00,0.00,0,0, +1746046995177,24,1066,4,667.00,1096.73,5.66,5769,372,-75.43,7,5,-57.65,6.54,26.00,26.00,17,11,0.11,0.11,0.18,0.27,0.00,0.00,0,0, +1746046996177,19,1083,1083,524.89,1088.19,1090.21,5519,4784,-66.19,16,13,-44.26,19.44,25.00,27.00,19,12,0.05,0.25,0.19,0.11,0.00,0.00,0,0, +1746046996177,24,1078,4,552.22,1079.86,5.54,5796,421,-74.75,12,5,-56.97,6.56,26.00,27.00,17,11,0.05,0.11,0.18,0.27,0.00,0.00,0,0, +1746046997177,19,1071,1035,542.36,1076.30,1040.05,7683,4281,-66.25,16,5,-48.47,6.83,26.00,27.00,18,6,0.11,0.10,0.19,0.11,0.00,0.00,0,0, +1746046997177,24,1066,4,705.60,1108.68,5.70,5750,402,-85.17,12,5,-67.39,6.32,30.00,27.00,17,11,0.18,0.09,0.18,0.27,0.00,0.00,0,0, +1746046998177,19,1059,1131,645.25,1064.42,1151.42,8498,4844,-66.25,16,5,-48.47,6.83,26.50,26.00,19,10,0.05,0.03,0.19,0.11,0.00,0.00,0,0, +1746046998177,24,1066,4,463.42,1105.32,5.75,6060,423,-85.17,12,5,-67.39,6.32,25.50,27.00,16,11,0.08,0.10,0.18,0.27,0.00,0.00,0,0, +1746046999177,19,1095,982,606.30,1088.36,1040.38,5238,4376,-66.00,16,5,-48.22,6.84,27.50,27.00,19,11,0.12,0.14,0.19,0.11,0.00,0.00,0,0, +1746046999177,24,1066,4,484.70,1088.26,5.64,5845,377,-77.25,8,5,-59.47,6.50,29.00,27.00,21,11,0.04,0.12,0.18,0.27,0.00,0.00,0,0, +1746047000177,19,1071,1083,521.20,1088.30,1044.23,5758,4227,-65.81,16,5,-48.03,6.85,26.00,27.00,19,11,0.13,0.06,0.19,0.11,0.00,0.00,0,0, +1746047000177,24,1066,4,656.92,1136.24,5.90,6272,428,-75.08,12,5,-57.30,6.55,29.50,27.00,17,11,0.13,0.13,0.18,0.27,0.00,0.00,0,0, +1746047001177,19,1071,1083,785.30,1076.37,1091.77,4960,4687,-65.81,16,5,-48.03,6.85,25.50,26.00,18,13,0.08,0.13,0.19,0.11,0.00,0.00,0,0, +1746047001177,24,1066,4,653.50,1088.22,5.64,5709,433,-87.33,9,5,-69.55,6.28,26.00,28.00,17,11,0.05,0.10,0.18,0.27,0.00,0.00,0,0, +1746047002177,19,1071,1135,376.09,1076.30,1151.08,5435,4799,-65.94,16,5,-48.16,6.85,25.50,27.00,19,11,0.09,0.10,0.19,0.11,0.00,0.00,0,0, +1746047002177,24,1078,4,732.70,1088.34,5.60,5841,370,-87.93,15,5,-70.15,6.27,25.50,27.00,20,11,0.11,0.10,0.18,0.27,0.00,0.00,0,0, +1746047003177,19,1071,1035,239.73,1076.34,1048.98,5766,4373,-65.94,16,5,-48.16,6.85,25.50,27.00,17,13,0.17,0.05,0.19,0.11,0.00,0.00,0,0, +1746047003177,24,1066,4,411.60,1100.41,5.66,5838,426,-87.93,15,5,-70.15,6.27,29.50,27.00,15,11,0.13,0.11,0.18,0.27,0.00,0.00,0,0, +1746047004177,19,1059,1083,794.89,1064.30,1088.45,5908,4964,-66.06,16,5,-48.28,6.84,27.50,26.00,16,9,0.06,0.10,0.19,0.11,0.00,0.00,0,0, +1746047004177,24,1066,4,551.27,1079.94,5.58,5936,426,-94.42,12,5,-76.64,6.16,25.50,26.00,16,11,0.05,0.13,0.18,0.27,0.00,0.00,0,0, +1746047005177,19,1083,1083,753.50,1088.22,1092.38,6094,4631,-66.19,16,5,-48.41,6.84,27.00,27.00,18,12,0.19,0.04,0.19,0.11,0.00,0.00,0,0, +1746047005177,24,1066,4,691.55,1079.82,5.58,5722,365,-84.89,9,5,-67.11,6.32,29.50,26.00,20,10,0.13,0.17,0.18,0.27,0.00,0.00,0,0, +1746047006177,19,1083,1018,600.64,1088.67,1030.38,6075,4943,-66.31,16,5,-48.53,6.83,25.50,27.00,16,8,0.07,0.13,0.19,0.11,0.00,0.00,0,0, +1746047006177,24,1066,4,626.75,1071.55,5.55,8529,412,-80.62,8,5,-62.84,6.41,31.50,27.00,18,6,0.09,0.09,0.18,0.27,0.00,0.00,0,0, +1746047007177,19,1071,1087,644.00,1076.46,1105.62,6881,4585,-66.00,16,5,-48.22,6.84,26.50,26.00,17,9,0.15,0.05,0.19,0.11,0.00,0.00,0,0, +1746047007177,24,1066,4,486.40,1083.46,5.55,8130,359,-70.29,7,5,-52.50,6.69,31.50,27.00,19,10,0.06,0.09,0.18,0.27,0.00,0.00,0,0, +1746047008177,19,1071,1083,652.33,1076.25,1088.27,5452,4935,-66.00,16,5,-48.22,6.84,26.00,28.00,17,10,0.05,0.21,0.19,0.11,0.00,0.00,0,0, +1746047008177,24,1066,4,687.91,1083.82,5.55,7131,412,-70.29,7,5,-52.50,6.69,25.00,28.00,16,8,0.19,0.08,0.18,0.27,0.00,0.00,0,0, +1746047009177,19,1071,1095,740.20,1076.32,1105.53,7581,4814,-65.81,16,36,-39.46,60.05,25.50,25.00,16,7,0.15,0.07,0.19,0.11,0.00,0.00,0,0, +1746047009177,24,1078,4,372.20,1091.86,5.58,6526,421,-78.25,8,5,-60.47,6.47,25.50,27.00,14,11,0.07,0.07,0.18,0.27,0.00,0.00,0,0, +1746047010177,19,1059,1071,606.20,1064.61,1088.90,6682,4926,-66.06,16,5,-48.28,6.84,25.50,28.00,16,14,0.06,0.05,0.19,0.11,0.00,0.00,0,0, +1746047010177,24,1066,4,390.00,1088.38,5.64,5912,418,-79.67,6,5,-61.89,6.44,26.50,26.00,18,11,0.07,0.11,0.18,0.27,0.00,0.00,0,0, +1746047011177,19,1083,1083,282.80,1088.26,1098.10,5615,4602,-66.38,16,5,-48.59,6.83,27.00,25.00,17,10,0.21,0.09,0.19,0.11,0.00,0.00,0,0, +1746047011177,24,1066,4,566.00,1088.42,5.66,5974,375,-72.40,10,5,-54.62,6.63,30.00,26.00,18,11,0.22,0.11,0.18,0.27,0.00,0.00,0,0, +1746047012177,19,1071,1071,601.11,1076.35,1082.14,5809,5372,-66.38,16,5,-48.59,6.83,24.50,26.00,14,13,0.07,0.13,0.19,0.11,0.00,0.00,0,0, +1746047012177,24,1066,4,804.36,1088.38,5.64,5912,426,-72.40,10,5,-54.62,6.63,30.00,27.00,14,11,0.09,0.11,0.18,0.27,0.00,0.00,0,0, +1746047013177,19,1083,1018,648.20,1088.26,1029.13,6765,4927,-66.38,16,5,-48.59,6.83,25.50,27.00,19,7,0.09,0.10,0.19,0.11,0.00,0.00,0,0, +1746047013177,24,1066,4,617.40,1088.30,5.66,5845,426,-78.17,12,5,-60.39,6.47,29.00,27.00,16,11,0.04,0.10,0.18,0.27,0.00,0.00,0,0, +1746047014177,19,1071,1083,601.30,1076.29,1092.77,7441,4357,-66.19,16,5,-48.41,6.84,25.50,26.00,18,10,0.11,0.04,0.19,0.11,0.00,0.00,0,0, +1746047014177,24,1066,4,503.70,1105.20,5.75,6117,380,-77.21,14,5,-59.43,6.50,31.00,27.00,17,11,0.19,0.11,0.18,0.27,0.00,0.00,0,0, +1746047015177,19,1071,1135,477.09,1087.34,1151.03,5067,4857,-66.06,16,5,-48.28,6.84,26.50,28.00,19,10,0.07,0.16,0.19,0.11,0.00,0.00,0,0, +1746047015177,24,1078,4,695.00,1100.33,5.64,5775,431,-76.18,11,5,-58.40,6.52,31.00,27.00,15,11,0.08,0.10,0.18,0.27,0.00,0.00,0,0, +1746047016177,19,1059,1083,765.00,1064.22,1093.62,6258,4380,-66.25,16,106,-35.21,199.47,25.50,29.00,19,10,0.12,0.05,0.19,0.11,0.00,0.00,0,0, +1746047016177,24,1066,4,416.33,1105.28,5.73,6060,422,-89.57,14,23,-65.16,31.62,25.50,27.00,20,11,0.03,0.10,0.18,0.27,0.00,0.00,0,0, +1746047017177,19,1083,1047,753.38,1093.08,1048.25,5244,4566,-66.25,16,5,-48.47,6.83,26.00,27.00,18,11,0.09,0.12,0.19,0.11,0.00,0.00,0,0, +1746047017177,24,1066,4,594.30,1096.73,5.72,5951,431,-89.57,14,5,-71.79,6.24,26.50,30.00,15,11,0.13,0.11,0.18,0.27,0.00,0.00,0,0, +1746047018177,19,1083,1035,600.00,1088.38,1047.46,5776,4526,-66.25,16,5,-48.47,6.83,25.50,27.00,19,12,0.09,0.05,0.19,0.11,0.00,0.00,0,0, +1746047018177,24,1066,4,356.50,1079.74,5.54,5673,346,-87.69,16,5,-69.91,6.27,25.50,26.00,15,11,0.05,0.10,0.18,0.27,0.00,0.00,0,0, +1746047019177,19,1071,1071,463.55,1076.24,1092.21,4949,4698,-65.88,16,5,-48.09,6.85,24.50,28.00,18,12,0.09,0.12,0.19,0.11,0.00,0.00,0,0, +1746047019177,24,1066,4,502.22,1105.20,5.75,6058,380,-84.44,16,5,-66.66,6.33,29.50,27.00,20,11,0.13,0.12,0.18,0.27,0.00,0.00,0,0, +1746047020177,19,1059,1083,683.90,1064.22,1140.46,4951,4793,-66.00,16,13,-44.07,19.47,24.50,26.00,19,12,0.09,0.08,0.19,0.11,0.00,0.00,0,0, +1746047020177,24,1066,4,663.00,1079.94,5.58,5807,431,-92.69,16,5,-74.91,6.19,27.00,28.00,13,11,0.13,0.09,0.18,0.27,0.00,0.00,0,0, +1746047021177,19,1083,1083,710.08,1088.41,1041.10,5926,4570,-66.00,16,5,-48.22,6.84,25.50,27.00,17,8,0.11,0.13,0.19,0.11,0.00,0.00,0,0, +1746047021177,24,1078,4,335.82,1104.05,5.63,5986,431,-92.69,16,5,-74.91,6.19,29.50,27.00,13,10,0.06,0.17,0.18,0.27,0.00,0.00,0,0, diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/start_grafana_with_csv_only.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/start_grafana_with_csv_only.sh new file mode 100755 index 0000000..32355d3 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/start_grafana_with_csv_only.sh @@ -0,0 +1,118 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Exit immediately if a command fails +set -e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +echo "# Script: $(realpath $0)..." + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +GRAFANA_LOG_FILE="$PARENT_DIR/logs/KPI_Metrics.csv" +SERVER_LOG_FILE="$PARENT_DIR/logs/python_server.log" + +if ! command -v grafana-server &>/dev/null; then + echo "Grafana not found, installing..." + # Code from (https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian): + sudo apt-get install -y apt-transport-https software-properties-common wget + sudo mkdir -p /etc/apt/keyrings/ + wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg >/dev/null + echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list + # Updates the list of available packages + sudo apt-get update + # Installs the latest OSS release: + sudo apt-get install -y grafana +fi + +# Installing and configuring Grafana to use the CSV data source plugin +if ! sudo grafana-cli plugins ls | grep -q yesoreyeram-infinity-datasource; then + echo "CSV data source plugin not found, installing..." + sudo grafana-cli plugins install yesoreyeram-infinity-datasource +fi + +if [ ! -f "$GRAFANA_LOG_FILE" ]; then + echo "Creating Grafana log file at $GRAFANA_LOG_FILE..." + sudo mkdir -p "$(dirname "$GRAFANA_LOG_FILE")" + touch "$GRAFANA_LOG_FILE" +fi + +if ! command -v python3 &>/dev/null; then + echo "Python3 not found, installing..." + sudo apt-get install -y python3 +fi + +cd additional_scripts +if ! pgrep -f "grafana_host_kpi_metrics_over_http.py" >/dev/null; then + echo "Hosting file: http://localhost:3030/KPI_Metrics.csv" + >"$SERVER_LOG_FILE" # Clear the log file + nohup python3 -u grafana_host_kpi_metrics_over_http.py >"$SERVER_LOG_FILE" 2>&1 & +else + echo "Already hosting file: http://localhost:3030/KPI_Metrics.csv" +fi +cd .. +if ! systemctl is-active grafana-server &>/dev/null; then + echo "Starting Grafana server..." + if [ "$(find /etc/systemd/system -type f -newer /run/systemd/system 2>/dev/null)" ]; then + echo "Detected changes in systemd service files. Reloading systemd daemon..." + sudo systemctl daemon-reload + fi + sudo systemctl start grafana-server +else + if $NEEDS_RESTART; then + echo "Restarting Grafana server due to configuration changes..." + sudo systemctl restart grafana-server + fi +fi +sleep 3 + +if command -v google-chrome &>/dev/null; then + echo "Opening Grafana in Google Chrome..." + google-chrome "http://localhost:3000" >/dev/null 2>&1 & +elif command -v firefox &>/dev/null; then + echo "Opening Grafana in Firefox..." + firefox "http://localhost:3000" >/dev/null 2>&1 & +else + echo "No supported browser detected. Visit http://localhost:3000 to access the WebUI." +fi + +echo +echo "The default login credentials are as follows." +echo " - U: \"admin\"" +echo " - P: \"admin\"" +echo + +cd "$PARENT_DIR/flexric/" diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/start_grafana_with_csv_xapp_kpm_moni.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/start_grafana_with_csv_xapp_kpm_moni.sh new file mode 100755 index 0000000..4b03794 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/start_grafana_with_csv_xapp_kpm_moni.sh @@ -0,0 +1,111 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Exit immediately if a command fails +set -e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +echo "# Script: $(realpath $0)..." + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +SERVER_LOG_FILE="$PARENT_DIR/logs/python_server.log" + +if ! command -v grafana-server &>/dev/null; then + echo "Grafana not found, installing..." + # Code from (https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian): + sudo apt-get install -y apt-transport-https software-properties-common wget + sudo mkdir -p /etc/apt/keyrings/ + wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg >/dev/null + echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list + # Updates the list of available packages + sudo apt-get update + # Installs the latest OSS release: + sudo apt-get install -y grafana +fi + +# Installing and configuring Grafana to use the CSV data source plugin +if ! sudo grafana-cli plugins ls | grep -q yesoreyeram-infinity-datasource; then + echo "CSV data source plugin not found, installing..." + sudo grafana-cli plugins install yesoreyeram-infinity-datasource +fi + +if ! command -v python3 &>/dev/null; then + echo "Python3 not found, installing..." + sudo apt-get install -y python3 +fi + +cd additional_scripts +if ! pgrep -f "grafana_host_kpi_metrics_over_http.py" >/dev/null; then + echo "Hosting file: http://localhost:3030/KPI_Metrics.csv" + >"$SERVER_LOG_FILE" # Clear the log file + nohup python3 -u grafana_host_kpi_metrics_over_http.py >"$SERVER_LOG_FILE" 2>&1 & +else + echo "Already hosting file: http://localhost:3030/KPI_Metrics.csv" +fi +cd .. +if ! systemctl is-active grafana-server &>/dev/null; then + echo "Starting Grafana server..." + if [ "$(find /etc/systemd/system -type f -newer /run/systemd/system 2>/dev/null)" ]; then + echo "Detected changes in systemd service files. Reloading systemd daemon..." + sudo systemctl daemon-reload + fi + sudo systemctl start grafana-server +else + if $NEEDS_RESTART; then + echo "Restarting Grafana server due to configuration changes..." + sudo systemctl restart grafana-server + fi +fi +sleep 3 + +if command -v google-chrome &>/dev/null; then + echo "Opening Grafana in Google Chrome..." + google-chrome "http://localhost:3000/dashboards" >/dev/null 2>&1 & +elif command -v firefox &>/dev/null; then + echo "Opening Grafana in Firefox..." + firefox "http://localhost:3000/dashboards" >/dev/null 2>&1 & +else + echo "No supported browser detected. Visit http://localhost:3000/dashboards to access the WebUI." +fi + +echo +echo "The default login credentials are as follows." +echo " - U: \"admin\"" +echo " - P: \"admin\"" +echo + +"$PARENT_DIR/additional_scripts/run_xapp_kpm_moni_write_to_csv.sh" diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/start_grafana_with_influxdb_only.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/start_grafana_with_influxdb_only.sh new file mode 100755 index 0000000..d48d204 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/start_grafana_with_influxdb_only.sh @@ -0,0 +1,132 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Exit immediately if a command fails +set -e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +echo "# Script: $(realpath $0)..." + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +if ! command -v grafana-server &>/dev/null; then + echo "Grafana not found, installing..." + # Code from (https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian): + sudo apt-get install -y apt-transport-https software-properties-common wget + sudo mkdir -p /etc/apt/keyrings/ + wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg >/dev/null + echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list + # Updates the list of available packages + sudo apt-get update + # Installs the latest OSS release: + sudo apt-get install -y grafana +fi + +# # Installing and configuring Grafana to use the CSV data source plugin +# if ! sudo grafana-cli plugins ls | grep -q bekaeljo15340f; then +# echo "CSV data source plugin not found, installing..." +# sudo grafana-cli plugins install bekaeljo15340f +# fi + +INFLUXDB_ORG="xapp-kpm-moni" +INFLUXDB_BUCKET="xapp-kpm-moni" +INFLUXDB_TOKEN_PATH="$PARENT_DIR/influxdb_auth_token.json" + +# Check if influxdb is even installed: +if ! command -v influx &>/dev/null; then + echo "InfluxDB is not installed. Installing InfluxDB..." + ./install_scripts/install_influxdb.sh +fi + +if ! systemctl is-active --quiet influxdb; then + echo "Starting InfluxDB service..." + ./install_scripts/start_influxdb_service.sh + sleep 5 + # Check if the service is running + if ! systemctl is-active --quiet influxdb; then + echo "Failed to start InfluxDB service." + exit 1 + fi + echo "InfluxDB service started." +fi + +# Ensure that an InfluxDB token is created +if [ -f "$INFLUXDB_TOKEN_PATH" ]; then + if [ ! -s "$INFLUXDB_TOKEN_PATH" ]; then + echo "Deleting empty InfluxDB token file..." + sudo rm -f "$INFLUXDB_TOKEN_PATH" + fi +else + echo "InfluxDB token file does not exist." +fi +if [ ! -f "$INFLUXDB_TOKEN_PATH" ]; then + echo "Creating an InfluxDB token to influxdb_auth_token.json..." + influx auth create --all-access --json >"$INFLUXDB_TOKEN_PATH" +fi +INFLUXDB_TOKEN=$(jq -r '.token' "$INFLUXDB_TOKEN_PATH") + +if ! systemctl is-active grafana-server &>/dev/null; then + echo "Starting Grafana server..." + if [ "$(find /etc/systemd/system -type f -newer /run/systemd/system 2>/dev/null)" ]; then + echo "Detected changes in systemd service files. Reloading systemd daemon..." + sudo systemctl daemon-reload + fi + sudo systemctl start grafana-server +else + if $NEEDS_RESTART; then + echo "Restarting Grafana server due to configuration changes..." + sudo systemctl restart grafana-server + fi +fi +sleep 3 + +if command -v google-chrome &>/dev/null; then + echo "Opening Grafana in Google Chrome..." + google-chrome "http://localhost:3000" >/dev/null 2>&1 & +elif command -v firefox &>/dev/null; then + echo "Opening Grafana in Firefox..." + firefox "http://localhost:3000" >/dev/null 2>&1 & +else + echo "No supported browser detected. Visit http://localhost:3000 to access the WebUI." +fi + +echo +echo "The default login credentials are as follows." +echo " - U: \"admin\"" +echo " - P: \"admin\"" +echo + +cd "$PARENT_DIR/flexric/" diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/start_grafana_with_influxdb_xapp_kpm_moni.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/start_grafana_with_influxdb_xapp_kpm_moni.sh new file mode 100755 index 0000000..b0fd9a9 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/start_grafana_with_influxdb_xapp_kpm_moni.sh @@ -0,0 +1,111 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Exit immediately if a command fails +set -e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +echo "# Script: $(realpath $0)..." + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +SERVER_LOG_FILE="$PARENT_DIR/logs/python_server.log" + +if ! command -v grafana-server &>/dev/null; then + echo "Grafana not found, installing..." + # Code from (https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian): + sudo apt-get install -y apt-transport-https software-properties-common wget + sudo mkdir -p /etc/apt/keyrings/ + wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg >/dev/null + echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list + # Updates the list of available packages + sudo apt-get update + # Installs the latest OSS release: + sudo apt-get install -y grafana +fi + +# # Installing and configuring Grafana to use the CSV data source plugin +# if ! sudo grafana-cli plugins ls | grep -q bekaeljo15340f; then +# echo "CSV data source plugin not found, installing..." +# sudo grafana-cli plugins install bekaeljo15340f +# fi + +if ! command -v python3 &>/dev/null; then + echo "Python3 not found, installing..." + sudo apt-get install -y python3 +fi + +cd additional_scripts +if ! pgrep -f "grafana_host_kpi_metrics_over_http.py" >/dev/null; then + echo "Hosting file: http://localhost:3030/KPI_Metrics.csv" + >"$SERVER_LOG_FILE" # Clear the log file + nohup python3 -u grafana_host_kpi_metrics_over_http.py >"$SERVER_LOG_FILE" 2>&1 & +else + echo "Already hosting file: http://localhost:3030/KPI_Metrics.csv" +fi +cd .. +if ! systemctl is-active grafana-server &>/dev/null; then + echo "Starting Grafana server..." + if [ "$(find /etc/systemd/system -type f -newer /run/systemd/system 2>/dev/null)" ]; then + echo "Detected changes in systemd service files. Reloading systemd daemon..." + sudo systemctl daemon-reload + fi + sudo systemctl start grafana-server +else + if $NEEDS_RESTART; then + echo "Restarting Grafana server due to configuration changes..." + sudo systemctl restart grafana-server + fi +fi +sleep 3 + +if command -v google-chrome &>/dev/null; then + echo "Opening Grafana in Google Chrome..." + google-chrome "http://localhost:3000/dashboards" >/dev/null 2>&1 & +elif command -v firefox &>/dev/null; then + echo "Opening Grafana in Firefox..." + firefox "http://localhost:3000/dashboards" >/dev/null 2>&1 & +else + echo "No supported browser detected. Visit http://localhost:3000/dashboards to access the WebUI." +fi + +echo +echo "The default login credentials are as follows." +echo " - U: \"admin\"" +echo " - P: \"admin\"" +echo + +"$PARENT_DIR/additional_scripts/run_xapp_kpm_moni_write_to_influxdb.sh" diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/stop_grafana.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/stop_grafana.sh new file mode 100755 index 0000000..00a7321 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/stop_grafana.sh @@ -0,0 +1,64 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +# Upon exit, restore the terminal to a sane state +trap 'stty sane; exit' EXIT SIGINT SIGTERM + +# Check if the components are already stopped +if ! $(./is_running.sh | grep -q ": RUNNING"); then + ./is_running.sh + exit 0 +fi + +pkill -9 -f "grafana_host_kpi_metrics_over_http.py" + +# Stop Grafana server if it's running and disable it from auto-starting on boot +if systemctl is-active grafana-server &>/dev/null; then + echo "Stopping Grafana server..." + set -x + sudo systemctl stop grafana-server +fi +if sudo systemctl is-enabled grafana-server &>/dev/null; then + echo "Disabling Grafana server auto-start..." + set -x + sudo systemctl disable grafana-server +fi + +sleep 1 +./is_running.sh diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/stop_xapps.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/stop_xapps.sh new file mode 100755 index 0000000..d2a682e --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/stop_xapps.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +if pgrep -f "xapp_kpm_moni_write_to_csv" >/dev/null; then + echo "Stopping xApp KPM Moni (CSV)..." + pkill -f "xapp_kpm_moni_write_to_csv" +fi + +if pgrep -f "xapp_kpm_moni " >/dev/null; then + echo "Stopping xApp KPM Moni..." + pkill -f "xapp_kpm_moni" +fi + +if pgrep -f "xapp_rc_moni" >/dev/null; then + echo "Stopping xApp RC Moni..." + pkill -f "xapp_rc_moni" +fi + +if pgrep -f "xapp_kpm_rc" >/dev/null; then + echo "Stopping xApp KPM RC..." + pkill -f "xapp_kpm_rc" +fi + +if pgrep -f "xapp_gtp_mac_rlc_pdcp_moni" >/dev/null; then + echo "Stopping xApp GTP MAC RLC PDCP Moni..." + pkill -f "xapp_gtp_mac_rlc_pdcp_moni" +fi diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/full_install.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/full_install.sh similarity index 59% rename from OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/full_install.sh rename to OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/full_install.sh index f36574e..47f7d0b 100755 --- a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/full_install.sh +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/full_install.sh @@ -31,7 +31,7 @@ # Exit immediately if a command fails set -e -# Guide: https://gitlab.eurecom.fr/mosaic5g/flexric +CLEAN_INSTALL=false if ! command -v realpath &>/dev/null; then echo "Package \"coreutils\" not found, installing..." @@ -42,10 +42,14 @@ SCRIPT_DIR=$(dirname "$(realpath "$0")") cd "$SCRIPT_DIR" # Check for gnb binary to determine if srsRAN_Project is already installed -if [ -f "flexric/build/examples/ric/nearRT-RIC" ]; then +if [ "$CLEAN_INSTALL" != "true" ] && [ -f "flexric/build/examples/ric/nearRT-RIC" ]; then echo "FlexRIC is already installed, skipping." exit 0 fi +# Remove the build directory if it exists and CLEAN_INSTALL is true +if [ "$CLEAN_INSTALL" = "true" ] && [ -d "flexric/build" ]; then + rm -rf flexric/build +fi # Run a sudo command every minute to ensure script execution without user interaction ./install_scripts/start_sudo_refresh.sh @@ -54,17 +58,12 @@ fi INSTALL_START_TIME=$(date +%s) echo "Installing dependencies..." -sudo apt-get update || true -sudo apt-get install -y build-essential - -echo "Installing GCC 13..." -sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test -sudo apt-get update -sudo apt-get install -y gcc-13 g++-13 -sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 -sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100 - -sudo apt-get install -y libsctp-dev python3 cmake-curses-gui libpcre2-dev python3-dev +if ! command -v gcc-10 &>/dev/null || ! command -v g++-10 &>/dev/null || ! command -v swig &>/dev/null; then + sudo apt-get update || true + sudo apt-get install -y build-essential automake + sudo apt-get install -y gcc-10 g++-10 + sudo apt-get install -y libsctp-dev python3 cmake-curses-gui libpcre2-dev python3-dev +fi if [ ! -d "swig" ]; then echo "Cloning SWIG..." @@ -92,12 +91,51 @@ if [ ! -d "flexric" ]; then ./install_scripts/git_clone.sh https://gitlab.eurecom.fr/mosaic5g/flexric.git fi +# Apply patch to xApps to correct the type printing (as of commit hash 596a1ae67309618a74e09e56dff9a723ea7d99c5) +echo +echo "Patching xApp type printing..." +cd flexric +sudo rm -rf examples/xApp/c +git restore examples/xApp/c/* +git apply --verbose --ignore-whitespace "$SCRIPT_DIR/install_patch_files/flexric/examples/xApp/c/fix_type_printing_in_c_xapps.patch" || true +cd .. + +# Apply patch to FlexRIC to add support for RSRP in the KPI report +if [ ! -f "flexric/examples/xApp/c/monitor/xapp_kpm_moni.c.previous" ]; then + cp flexric/examples/xApp/c/monitor/xapp_kpm_moni.c flexric/examples/xApp/c/monitor/xapp_kpm_moni.c.previous +fi +echo +echo "Patching xapp_kpm_moni.c..." +cd flexric +git restore examples/xApp/c/monitor/xapp_kpm_moni.c +git apply --verbose --ignore-whitespace "$SCRIPT_DIR/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni.c.patch" +cd .. + +echo +echo "Adding xapp_kpm_moni_write_to_csv.c..." +cp "$SCRIPT_DIR/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni_write_to_csv.c" flexric/examples/xApp/c/monitor/ + +echo +echo "Adding xapp_kpm_moni_write_to_influxdb.c..." +cp "$SCRIPT_DIR/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni_write_to_influxdb.c" flexric/examples/xApp/c/monitor/ + +# Apply patch to add new xApp KPI monitor that logs output to logs/KPI_Monitor.csv +if [ ! -f "flexric/examples/xApp/c/monitor/CMakeLists.txt.previous" ]; then + cp flexric/examples/xApp/c/monitor/CMakeLists.txt flexric/examples/xApp/c/monitor/CMakeLists.txt.previous +fi +echo +echo "Patching CMakeLists.txt..." +cd flexric +git restore examples/xApp/c/monitor/CMakeLists.txt +git apply --verbose --ignore-whitespace "$SCRIPT_DIR/install_patch_files/flexric/examples/xApp/c/monitor/CMakeLists.txt.patch" +cd .. + echo "Building FlexRIC..." cd flexric sudo rm -rf build mkdir build cd build -cmake .. +CC=gcc-10 CXX=g++-10 cmake .. -DE2AP_VERSION=E2AP_V3 -DKPM_VERSION=KPM_V3_00 make -j$(nproc) echo "Installing FlexRIC..." @@ -115,7 +153,7 @@ INSTALL_END_TIME=$(date +%s) if [ -n "$INSTALL_START_TIME" ]; then DURATION=$((INSTALL_END_TIME - INSTALL_START_TIME)) DURATION_MINUTES=$(echo "scale=5; $DURATION/ 60" | bc) - echo "The gNodeB installation process took $DURATION_MINUTES minutes to complete." + echo "The FlexRIC installation process took $DURATION_MINUTES minutes to complete." mkdir -p logs echo "$DURATION_MINUTES minutes" >>install_time.txt fi diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/full_uninstall.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/full_uninstall.sh new file mode 100755 index 0000000..5190531 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/full_uninstall.sh @@ -0,0 +1,89 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Do not exit immediately if a command fails +set +e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +cd "$SCRIPT_DIR" + +echo "Stopping Near-RT RIC..." +./stop.sh +./additional_scripts/stop_grafana.sh + +if [ -d swig ]; then + echo "Uninstalling Swig..." + cd swig + sudo make uninstall + cd .. +fi +sudo rm -rf swig + +if [ -d flexric/build ]; then + echo "Uninstalling FlexRIC..." + cd flexric/build + sudo make uninstall + cd ../.. +fi +sudo rm -rf flexric +sudo rm -rf /usr/local/lib/flexric/ +sudo rm -rf /usr/local/etc/flexric/ + +if command -v grafana-server &>/dev/null; then + echo "Uninstalling Grafana..." + sudo systemctl stop grafana-server + sudo apt-get remove --purge -y grafana + sudo rm -f /etc/apt/sources.list.d/grafana.list + sudo rm -rf /etc/apt/keyrings/grafana.gpg + sudo apt-get autoremove --purge -y +fi + +sudo rm -rf logs/ +sudo rm -rf configs/ +sudo rm -rf install_time.txt + +if [ -f influxdb_auth_token.json ]; then + echo "Uninstalling InfluxDB..." + ./install_scripts/uninstall_influxdb.sh + + echo "Deleting InfluxDB auth token..." + sudo rm -f influxdb_auth_token.json +fi + +echo +echo +echo "################################################################################" +echo "# Successfully uninstalled FlexRIC #" +echo "################################################################################" diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/generate_configurations.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/generate_configurations.sh similarity index 89% rename from OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/generate_configurations.sh rename to OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/generate_configurations.sh index 5f749a2..6dc17c6 100755 --- a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/generate_configurations.sh +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/generate_configurations.sh @@ -58,9 +58,15 @@ update_conf() { } echo "Saving configuration file example..." -rm -rf "$SCRIPT_DIR/configs" -mkdir "$SCRIPT_DIR/configs" -rm -rf "$SCRIPT_DIR/logs" +rm -rf configs +mkdir configs + +# Only remove the logs if not running +RUNNING_STATUS=$(./is_running.sh) +if [[ $RUNNING_STATUS != *": RUNNING"* ]]; then + rm -rf logs + mkdir logs +fi if [ -f /usr/local/etc/flexric/flexric.conf ]; then cp /usr/local/etc/flexric/flexric.conf "$SCRIPT_DIR/configs/flexric.conf" @@ -70,13 +76,4 @@ fi update_conf "configs/flexric.conf" "XAPP" "DB_NAME" "xapp_db1" -# # supported name = NearRT_RIC, E2_Agent, E2_Proxy_Agent, xApp -# Name = "NearRT_RIC" -# NearRT_RIC_IP = "127.0.0.1" -# E2_Port = 36421 -# E42_Port = 36422 - -# Configure the xApps: -#wget -O "$SCRIPT_DIR/configs/xapp_oran_sm.conf" "https://gitlab.eurecom.fr/mosaic5g/flexric/-/raw/br-flexric/conf_files/xapp_oran_sm.conf" - echo "Successfully configured the FlexRIC. The configuration file is located in the configs/ directory." diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/fix_type_printing_in_c_xapps.patch b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/fix_type_printing_in_c_xapps.patch new file mode 100644 index 0000000..9be6332 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/fix_type_printing_in_c_xapps.patch @@ -0,0 +1,390 @@ +diff --git a/examples/xApp/c/ctrl/mac_ctrl.c b/examples/xApp/c/ctrl/mac_ctrl.c +index c6580972..43aeee17 100644 +--- a/examples/xApp/c/ctrl/mac_ctrl.c ++++ b/examples/xApp/c/ctrl/mac_ctrl.c +@@ -42,13 +42,13 @@ int main(int argc, char *argv[]) + + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len); ++ printf("Connected E2 nodes = %u\n", nodes.len); + + for (int i = 0; i < nodes.len; i++) { + e2_node_connected_xapp_t* n = &nodes.n[i]; + + for (size_t j = 0; j < n->len_rf; j++) +- printf("Registered node %d ran func id = %d \n ", i, n->rf[j].id); ++ printf("Registered node %d ran func id = %u \n ", i, n->rf[j].id); + + if(n->id.type == ngran_gNB || n->id.type == ngran_gNB_DU){ + mac_ctrl_req_data_t wr = {.hdr.dummy = 1, .msg.action = 42 }; +diff --git a/examples/xApp/c/helloworld/hw.c b/examples/xApp/c/helloworld/hw.c +index 52c50aec..a2137bc5 100644 +--- a/examples/xApp/c/helloworld/hw.c ++++ b/examples/xApp/c/helloworld/hw.c +@@ -42,11 +42,11 @@ int main(int argc, char *argv[]) + + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len); +- for (size_t i = 0; i < nodes.len; i++) { ++ printf("Connected E2 nodes = %u\n", nodes.len); ++ for (int i = 0; i < nodes.len; i++) { + ngran_node_t ran_type = nodes.n[i].id.type; + if (NODE_IS_MONOLITHIC(ran_type)) +- printf("E2 node %ld info: nb_id %d, mcc %d, mnc %d, mnc_digit_len %d, ran_type %s\n", ++ printf("E2 node %d info: nb_id %u, mcc %u, mnc %u, mnc_digit_len %u, ran_type %s\n", + i, + nodes.n[i].id.nb_id.nb_id, + nodes.n[i].id.plmn.mcc, +@@ -54,7 +54,7 @@ int main(int argc, char *argv[]) + nodes.n[i].id.plmn.mnc_digit_len, + get_ngran_name(ran_type)); + else +- printf("E2 node %ld info: nb_id %d, mcc %d, mnc %d, mnc_digit_len %d, ran_type %s, cu_du_id %lu\n", ++ printf("E2 node %d info: nb_id %u, mcc %u, mnc %u, mnc_digit_len %u, ran_type %s, cu_du_id %lu\n", + i, + nodes.n[i].id.nb_id.nb_id, + nodes.n[i].id.plmn.mcc, +@@ -63,9 +63,9 @@ int main(int argc, char *argv[]) + get_ngran_name(ran_type), + *nodes.n[i].id.cu_du_id); + +- printf("E2 node %ld supported RAN function's IDs:", i); ++ printf("E2 node %zu supported RAN function's IDs:", i); + for (size_t j = 0; j < nodes.n[i].len_rf; j++) +- printf(", %d", nodes.n[i].rf[j].id); ++ printf(", %u", nodes.n[i].rf[j].id); + printf("\n"); + } + +diff --git a/examples/xApp/c/keysight/xapp_keysight_kpm_rc.c b/examples/xApp/c/keysight/xapp_keysight_kpm_rc.c +index 9898b6ea..aaa84b25 100644 +--- a/examples/xApp/c/keysight/xapp_keysight_kpm_rc.c ++++ b/examples/xApp/c/keysight/xapp_keysight_kpm_rc.c +@@ -180,14 +180,14 @@ static void sm_cb_kpm_1(sm_ag_if_rd_t const *rd) + { + if (strcmp(meas_info_name_str, "RRU.PrbTotDl") == 0) + { +- printf("RRU.PrbTotDl = %d [%%]\n", msg_frm_1->meas_data_lst[j].meas_record_lst[z].int_val); ++ printf("RRU.PrbTotDl = %u [%%]\n", msg_frm_1->meas_data_lst[j].meas_record_lst[z].int_val); + lock_guard(&mtx); + last_prb_usage_dl = msg_frm_1->meas_data_lst[j].meas_record_lst[z].int_val; + prb_usage_all[counter_1-1] = msg_frm_1->meas_data_lst[j].meas_record_lst[z].int_val; + } + else if (strcmp(meas_info_name_str, "RRU.PrbTotUl") == 0) + { +- // printf("RRU.PrbTotUl = %d [%%]\n", msg_frm_1->meas_data_lst[j].meas_record_lst[z].int_val); ++ // printf("RRU.PrbTotUl = %u [%%]\n", msg_frm_1->meas_data_lst[j].meas_record_lst[z].int_val); + } + else + { +@@ -296,15 +296,15 @@ static void sm_cb_kpm_3(sm_ag_if_rd_t const *rd) + { + if (strcmp(meas_info_name_str, "DRB.UEThpDl") == 0) + { +- printf("DRB.UEThpDl = %d [kb/s]\n", msg_frm_2->meas_data_lst[0].meas_record_lst[j].int_val); ++ printf("DRB.UEThpDl = %u [kb/s]\n", msg_frm_2->meas_data_lst[0].meas_record_lst[j].int_val); + } + else if (strcmp(meas_info_name_str, "DRB.UEThpUl") == 0) + { +- printf("DRB.UEThpUl = %d [kb/s]\n", msg_frm_2->meas_data_lst[0].meas_record_lst[j + msg_frm_2->meas_info_cond_ue_lst[i].ue_id_matched_lst_len].int_val); ++ printf("DRB.UEThpUl = %u [kb/s]\n", msg_frm_2->meas_data_lst[0].meas_record_lst[j + msg_frm_2->meas_info_cond_ue_lst[i].ue_id_matched_lst_len].int_val); + } + else if (strcmp(meas_info_name_str, "DRB.UEThpDl.QOS") == 0) + { +- printf("DRB.UEThpDl.QOS = %d [kb/s], with 5QI = %hhu\n", msg_frm_2->meas_data_lst[0].meas_record_lst[j].int_val, *msg_frm_2->meas_info_cond_ue_lst[i].matching_cond_lst[0].label_info_lst.fiveQI); ++ printf("DRB.UEThpDl.QOS = %ld [kb/s], with 5QI = %hhu\n", msg_frm_2->meas_data_lst[0].meas_record_lst[j].int_val, *msg_frm_2->meas_info_cond_ue_lst[i].matching_cond_lst[0].label_info_lst.fiveQI); + assert(num_matched_ues_dl >= 0 && num_matched_ues_dl < 5); + + if (*msg_frm_2->meas_info_cond_ue_lst[i].matching_cond_lst[0].label_info_lst.fiveQI == 131){ +@@ -324,7 +324,7 @@ static void sm_cb_kpm_3(sm_ag_if_rd_t const *rd) + } + else if (strcmp(meas_info_name_str, "DRB.UEThpUl.QOS") == 0) + { +- // printf("DRB.UEThpUl.QOS = %d [kb/s], with 5QI = %hhu\n", msg_frm_2->meas_data_lst[0].meas_record_lst[j + msg_frm_2->meas_info_cond_ue_lst[i].ue_id_matched_lst_len].int_val, *msg_frm_2->meas_info_cond_ue_lst[i].matching_cond_lst[0].label_info_lst.fiveQI); ++ // printf("DRB.UEThpUl.QOS = %ld [kb/s], with 5QI = %hhu\n", msg_frm_2->meas_data_lst[0].meas_record_lst[j + msg_frm_2->meas_info_cond_ue_lst[i].ue_id_matched_lst_len].int_val, *msg_frm_2->meas_info_cond_ue_lst[i].matching_cond_lst[0].label_info_lst.fiveQI); + } + break; + } +@@ -891,7 +891,7 @@ int main(int argc, char *argv[]) + defer({ free_e2_node_arr_xapp(&nodes); }); + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len); ++ printf("Connected E2 nodes = %u\n", nodes.len); + + pthread_mutexattr_t attr = {0}; + int rc = pthread_mutex_init(&mtx, &attr); +@@ -910,7 +910,7 @@ int main(int argc, char *argv[]) + { + + for (size_t j = 0; j < nodes.n[i].len_rf; j++) +- printf("Registered node ID %d ran func id = %d \n ", nodes.n[i].id.nb_id.nb_id, nodes.n[i].rf[j].id); ++ printf("Registered node ID %u ran func id = %u \n ", nodes.n[i].id.nb_id.nb_id, nodes.n[i].rf[j].id); + + // RC REPORT Service Style 2: Call Process Outcome + rc_sub_data_t rc_sub = gen_rc_sub_style_2(); +diff --git a/examples/xApp/c/kpm_rc/xapp_kpm_rc.c b/examples/xApp/c/kpm_rc/xapp_kpm_rc.c +index a091eefb..ef50042a 100644 +--- a/examples/xApp/c/kpm_rc/xapp_kpm_rc.c ++++ b/examples/xApp/c/kpm_rc/xapp_kpm_rc.c +@@ -90,13 +90,13 @@ static + void log_int_value(byte_array_t name, meas_record_lst_t meas_record) + { + if (cmp_str_ba("RRU.PrbTotDl", name) == 0) { +- printf("RRU.PrbTotDl = %d [PRBs]\n", meas_record.int_val); ++ printf("RRU.PrbTotDl = %u [PRBs]\n", meas_record.int_val); + } else if (cmp_str_ba("RRU.PrbTotUl", name) == 0) { +- printf("RRU.PrbTotUl = %d [PRBs]\n", meas_record.int_val); ++ printf("RRU.PrbTotUl = %u [PRBs]\n", meas_record.int_val); + } else if (cmp_str_ba("DRB.PdcpSduVolumeDL", name) == 0) { +- printf("DRB.PdcpSduVolumeDL = %d [kb]\n", meas_record.int_val); ++ printf("DRB.PdcpSduVolumeDL = %u [kb]\n", meas_record.int_val); + } else if (cmp_str_ba("DRB.PdcpSduVolumeUL", name) == 0) { +- printf("DRB.PdcpSduVolumeUL = %d [kb]\n", meas_record.int_val); ++ printf("DRB.PdcpSduVolumeUL = %u [kb]\n", meas_record.int_val); + } else { + printf("Measurement Name not yet supported\n"); + } +@@ -538,7 +538,7 @@ int main(int argc, char* argv[]) + e2_node_arr_xapp_t nodes = e2_nodes_xapp_api(); + assert(nodes.len > 0); + +- printf("[KPM RC]: Connected E2 nodes = %d\n", nodes.len); ++ printf("[KPM RC]: Connected E2 nodes = %u\n", nodes.len); + + pthread_mutexattr_t attr = {0}; + int rc = pthread_mutex_init(&mtx, &attr); +diff --git a/examples/xApp/c/monitor/xapp_gtp_mac_rlc_pdcp_moni.c b/examples/xApp/c/monitor/xapp_gtp_mac_rlc_pdcp_moni.c +index a9eaa1d5..a83c5738 100644 +--- a/examples/xApp/c/monitor/xapp_gtp_mac_rlc_pdcp_moni.c ++++ b/examples/xApp/c/monitor/xapp_gtp_mac_rlc_pdcp_moni.c +@@ -115,7 +115,7 @@ int main(int argc, char *argv[]) + + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len); ++ printf("Connected E2 nodes = %u\n", nodes.len); + + // MAC indication + const char* i_0 = "1_ms"; +@@ -145,7 +145,7 @@ int main(int argc, char *argv[]) + for (int i = 0; i < nodes.len; i++) { + e2_node_connected_xapp_t* n = &nodes.n[i]; + for (size_t j = 0; j < n->len_rf; j++) +- printf("Registered node %d ran func id = %d \n ", i, n->rf[j].id); ++ printf("Registered node %d ran func id = %u \n ", i, n->rf[j].id); + + if(n->id.type == ngran_gNB || n->id.type == ngran_eNB){ + // MAC Control is not yet implemented in OAI RAN +diff --git a/examples/xApp/c/monitor/xapp_kpm_moni.c b/examples/xApp/c/monitor/xapp_kpm_moni.c +index 5fa00cc2..ab81af2f 100644 +--- a/examples/xApp/c/monitor/xapp_kpm_moni.c ++++ b/examples/xApp/c/monitor/xapp_kpm_moni.c +@@ -88,13 +88,13 @@ static + void log_int_value(byte_array_t name, meas_record_lst_t meas_record) + { + if (cmp_str_ba("RRU.PrbTotDl", name) == 0) { +- printf("RRU.PrbTotDl = %d [PRBs]\n", meas_record.int_val); ++ printf("RRU.PrbTotDl = %u [PRBs]\n", meas_record.int_val); + } else if (cmp_str_ba("RRU.PrbTotUl", name) == 0) { +- printf("RRU.PrbTotUl = %d [PRBs]\n", meas_record.int_val); ++ printf("RRU.PrbTotUl = %u [PRBs]\n", meas_record.int_val); + } else if (cmp_str_ba("DRB.PdcpSduVolumeDL", name) == 0) { +- printf("DRB.PdcpSduVolumeDL = %d [kb]\n", meas_record.int_val); ++ printf("DRB.PdcpSduVolumeDL = %u [kb]\n", meas_record.int_val); + } else if (cmp_str_ba("DRB.PdcpSduVolumeUL", name) == 0) { +- printf("DRB.PdcpSduVolumeUL = %d [kb]\n", meas_record.int_val); ++ printf("DRB.PdcpSduVolumeUL = %u [kb]\n", meas_record.int_val); + } else { + printf("Measurement Name not yet supported\n"); + } +@@ -382,7 +382,7 @@ int main(int argc, char* argv[]) + + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len); ++ printf("Connected E2 nodes = %u\n", nodes.len); + + pthread_mutexattr_t attr = {0}; + int rc = pthread_mutex_init(&mtx, &attr); +diff --git a/examples/xApp/c/monitor/xapp_rc_moni.c b/examples/xApp/c/monitor/xapp_rc_moni.c +index 284b2b20..a2aff9c1 100644 +--- a/examples/xApp/c/monitor/xapp_rc_moni.c ++++ b/examples/xApp/c/monitor/xapp_rc_moni.c +@@ -244,7 +244,7 @@ void log_ind_1_1(const e2sm_rc_ind_hdr_frmt_1_t *hdr, const e2sm_rc_ind_msg_frmt + seq_ran_param_t* const ran_param_item = &msg->seq_ran_param[j]; + + log_ran_param_name_frmt_1(ran_param_item->ran_param_id); +- printf("RAN Parameter ID = %d\n", ran_param_item->ran_param_id); ++ printf("RAN Parameter ID = %u\n", ran_param_item->ran_param_id); + + switch (ran_param_item->ran_param_val.type) { + case ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE: +@@ -299,7 +299,7 @@ void log_ind_1_2(const e2sm_rc_ind_hdr_frmt_1_t *hdr, const e2sm_rc_ind_msg_frmt + seq_ran_param_t* const ran_param_item = &ue_id_item->seq_ran_param[j]; + + log_ran_param_name_frmt_2(ran_param_item->ran_param_id); +- printf("RAN Parameter ID is: %d\n", ran_param_item->ran_param_id); ++ printf("RAN Parameter ID is: %u\n", ran_param_item->ran_param_id); + + switch (ran_param_item->ran_param_val.type) { + case ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE: +@@ -640,7 +640,7 @@ int main(int argc, char* argv[]) + + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len); ++ printf("Connected E2 nodes = %u\n", nodes.len); + + pthread_mutexattr_t attr = {0}; + int rc = pthread_mutex_init(&mtx, &attr); +diff --git a/examples/xApp/c/slice/xapp_slice_moni_ctrl.c b/examples/xApp/c/slice/xapp_slice_moni_ctrl.c +index 1540c05d..b591ee98 100644 +--- a/examples/xApp/c/slice/xapp_slice_moni_ctrl.c ++++ b/examples/xApp/c/slice/xapp_slice_moni_ctrl.c +@@ -236,7 +236,7 @@ int main(int argc, char *argv[]) + defer({ free_e2_node_arr_xapp(&nodes); }); + + assert(nodes.len > 0); +- printf("Connected E2 nodes len = %d\n", nodes.len); ++ printf("Connected E2 nodes len = %u\n", nodes.len); + + // SLICE indication + const char* inter_t = "5_ms"; +@@ -250,7 +250,7 @@ int main(int argc, char *argv[]) + for(size_t i = 0; i < nodes.len; ++i) { + e2_node_connected_xapp_t *n = &nodes.n[i]; + for (size_t j = 0; j < n->len_rf; ++j) +- printf("Registered ran func id = %d \n ", n->rf[j].id); ++ printf("Registered ran func id = %u \n ", n->rf[j].id); + + slice_handle[i] = report_sm_xapp_api(&nodes.n[i].id, SM_SLICE_ID, (void*)inter_t, sm_cb_slice); + assert(slice_handle[i].success == true); +diff --git a/examples/xApp/c/tc/xapp_tc_all.c b/examples/xApp/c/tc/xapp_tc_all.c +index 440fc1df..d93b7811 100644 +--- a/examples/xApp/c/tc/xapp_tc_all.c ++++ b/examples/xApp/c/tc/xapp_tc_all.c +@@ -199,11 +199,11 @@ int main() + + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len ); ++ printf("Connected E2 nodes = %u\n", nodes.len ); + + e2_node_connected_xapp_t* n = &nodes.n[0]; + for(size_t i = 0; i < n->len_rf; ++i) +- printf("Registered ran func id = %d \n ", n->rf[i].id ); ++ printf("Registered ran func id = %u \n ", n->rf[i].id ); + + + const char* i = "5_ms"; +diff --git a/examples/xApp/c/tc/xapp_tc_codel.c b/examples/xApp/c/tc/xapp_tc_codel.c +index 393a5cef..24ec17af 100644 +--- a/examples/xApp/c/tc/xapp_tc_codel.c ++++ b/examples/xApp/c/tc/xapp_tc_codel.c +@@ -94,11 +94,11 @@ int main(int argc, char* argv[]) + + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len ); ++ printf("Connected E2 nodes = %u\n", nodes.len ); + + e2_node_connected_xapp_t* n = &nodes.n[0]; + for(size_t i = 0; i < n->len_rf; ++i) +- printf("Registered ran func id = %d \n ", n->rf[i].id ); ++ printf("Registered ran func id = %u \n ", n->rf[i].id ); + + uint32_t TC_SM_ID_TEST = 146; + // Pacer +diff --git a/examples/xApp/c/tc/xapp_tc_ecn.c b/examples/xApp/c/tc/xapp_tc_ecn.c +index fac428a0..fe65d0d7 100644 +--- a/examples/xApp/c/tc/xapp_tc_ecn.c ++++ b/examples/xApp/c/tc/xapp_tc_ecn.c +@@ -89,11 +89,11 @@ int main(int argc, char *argv[]) + + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len ); ++ printf("Connected E2 nodes = %u\n", nodes.len ); + + e2_node_connected_xapp_t* n = &nodes.n[0]; + for(size_t i = 0; i < n->len_rf; ++i) +- printf("Registered ran func id = %d \n ", n->rf[i].id ); ++ printf("Registered ran func id = %u \n ", n->rf[i].id ); + + const int TC_SM_ID_TEST = 146; + +diff --git a/examples/xApp/c/tc/xapp_tc_osi_codel.c b/examples/xApp/c/tc/xapp_tc_osi_codel.c +index 6fe70b40..8c0e2f69 100644 +--- a/examples/xApp/c/tc/xapp_tc_osi_codel.c ++++ b/examples/xApp/c/tc/xapp_tc_osi_codel.c +@@ -94,11 +94,11 @@ int main(int argc, char* argv[]) + + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len ); ++ printf("Connected E2 nodes = %u\n", nodes.len ); + + e2_node_connected_xapp_t* n = &nodes.n[0]; + for(size_t i = 0; i < n->len_rf; ++i) +- printf("Registered ran func id = %d \n ", n->rf[i].id ); ++ printf("Registered ran func id = %u \n ", n->rf[i].id ); + + uint32_t TC_SM_ID_TEST = 146; + // Pacer +diff --git a/examples/xApp/c/tc/xapp_tc_partition.c b/examples/xApp/c/tc/xapp_tc_partition.c +index 7bb416a1..75b816cb 100644 +--- a/examples/xApp/c/tc/xapp_tc_partition.c ++++ b/examples/xApp/c/tc/xapp_tc_partition.c +@@ -89,11 +89,11 @@ int main(int argc, char* argv[]) + + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len ); ++ printf("Connected E2 nodes = %u\n", nodes.len ); + + e2_node_connected_xapp_t* n = &nodes.n[0]; + for(size_t i = 0; i < n->len_rf; ++i) +- printf("Registered ran func id = %d \n ", n->rf[i].id ); ++ printf("Registered ran func id = %u \n ", n->rf[i].id ); + + const int TC_SM_ID_TEST = 146; + +diff --git a/examples/xApp/c/tc/xapp_tc_segregate.c b/examples/xApp/c/tc/xapp_tc_segregate.c +index 6f7a9141..a0e4bfd4 100644 +--- a/examples/xApp/c/tc/xapp_tc_segregate.c ++++ b/examples/xApp/c/tc/xapp_tc_segregate.c +@@ -90,11 +90,11 @@ int main(int argc, char* argv[]) + + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len ); ++ printf("Connected E2 nodes = %u\n", nodes.len ); + + e2_node_connected_t* n = &nodes.n[0]; + for(size_t i = 0; i < n->len_rf; ++i) +- printf("Registered ran func id = %d \n ", n->ack_rf[i].id ); ++ printf("Registered ran func id = %u \n ", n->ack_rf[i].id ); + + const int TC_SM_ID_TEST = 146; + +diff --git a/examples/xApp/c/tc/xapp_tc_shaper.c b/examples/xApp/c/tc/xapp_tc_shaper.c +index 92a214f8..a6444eba 100644 +--- a/examples/xApp/c/tc/xapp_tc_shaper.c ++++ b/examples/xApp/c/tc/xapp_tc_shaper.c +@@ -90,11 +90,11 @@ int main(int argc, char *argv[]) + + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len ); ++ printf("Connected E2 nodes = %u\n", nodes.len ); + + e2_node_connected_t* n = &nodes.n[0]; + for(size_t i = 0; i < n->len_rf; ++i) +- printf("Registered ran func id = %d \n ", n->ack_rf[i].id ); ++ printf("Registered ran func id = %u \n ", n->ack_rf[i].id ); + + const int TC_SM_ID_TEST = 146; + diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/CMakeLists.previous.txt b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/CMakeLists.previous.txt new file mode 100644 index 0000000..c109188 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/CMakeLists.previous.txt @@ -0,0 +1,38 @@ +add_executable(xapp_kpm_moni + xapp_kpm_moni.c + ../../../../src/util/alg_ds/alg/defer.c + ) + + target_link_libraries(xapp_kpm_moni + PUBLIC + e42_xapp + -pthread + -lsctp + -ldl + ) + +add_executable(xapp_gtp_mac_rlc_pdcp_moni + xapp_gtp_mac_rlc_pdcp_moni.c + ../../../../src/util/alg_ds/alg/defer.c + ) + + target_link_libraries(xapp_gtp_mac_rlc_pdcp_moni + PUBLIC + e42_xapp + -pthread + -lsctp + -ldl + ) + +add_executable(xapp_rc_moni + xapp_rc_moni.c + ../../../../src/util/alg_ds/alg/defer.c + ) + +target_link_libraries(xapp_rc_moni + PUBLIC + e42_xapp + -pthread + -lsctp + -ldl + ) diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/CMakeLists.txt.patch b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/CMakeLists.txt.patch new file mode 100644 index 0000000..d81fa33 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/CMakeLists.txt.patch @@ -0,0 +1,36 @@ +diff --git a/examples/xApp/c/monitor/CMakeLists.txt b/examples/xApp/c/monitor/CMakeLists.txt +index b2148e05..2d387c6d 100644 +--- a/examples/xApp/c/monitor/CMakeLists.txt ++++ b/examples/xApp/c/monitor/CMakeLists.txt +@@ -80,3 +80,30 @@ target_link_libraries(xapp_rc_moni + -lsctp + -ldl + ) ++ ++add_executable(xapp_kpm_moni_write_to_csv ++ xapp_kpm_moni_write_to_csv.c ++ ../../../../src/util/alg_ds/alg/defer.c ++ ) ++ ++target_link_libraries(xapp_kpm_moni_write_to_csv ++ PUBLIC ++ e42_xapp ++ -pthread ++ -lsctp ++ -ldl ++ ) ++ ++ ++add_executable(xapp_kpm_moni_write_to_influxdb ++ xapp_kpm_moni_write_to_influxdb.c ++ ../../../../src/util/alg_ds/alg/defer.c ++ ) ++ ++target_link_libraries(xapp_kpm_moni_write_to_influxdb ++ PUBLIC ++ e42_xapp ++ -pthread ++ -lsctp ++ -ldl ++ ) +\ No newline at end of file diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni.c.patch b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni.c.patch new file mode 100644 index 0000000..660b9c6 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni.c.patch @@ -0,0 +1,94 @@ +diff --git a/examples/xApp/c/monitor/xapp_kpm_moni.c b/examples/xApp/c/monitor/xapp_kpm_moni.c +index 5fa00cc2..ef62de00 100644 +--- a/examples/xApp/c/monitor/xapp_kpm_moni.c ++++ b/examples/xApp/c/monitor/xapp_kpm_moni.c +@@ -32,6 +32,8 @@ + #include + #include + ++bool run_forever = true; ++ + static + uint64_t const period_ms = 1000; + +@@ -88,13 +90,27 @@ static + void log_int_value(byte_array_t name, meas_record_lst_t meas_record) + { + if (cmp_str_ba("RRU.PrbTotDl", name) == 0) { +- printf("RRU.PrbTotDl = %d [PRBs]\n", meas_record.int_val); ++ printf("RRU.PrbTotDl = %u [PRBs]\n", meas_record.int_val); + } else if (cmp_str_ba("RRU.PrbTotUl", name) == 0) { +- printf("RRU.PrbTotUl = %d [PRBs]\n", meas_record.int_val); ++ printf("RRU.PrbTotUl = %u [PRBs]\n", meas_record.int_val); + } else if (cmp_str_ba("DRB.PdcpSduVolumeDL", name) == 0) { +- printf("DRB.PdcpSduVolumeDL = %d [kb]\n", meas_record.int_val); ++ printf("DRB.PdcpSduVolumeDL = %u [kb]\n", meas_record.int_val); + } else if (cmp_str_ba("DRB.PdcpSduVolumeUL", name) == 0) { +- printf("DRB.PdcpSduVolumeUL = %d [kb]\n", meas_record.int_val); ++ printf("DRB.PdcpSduVolumeUL = %u [kb]\n", meas_record.int_val); ++ ++ // Added int metrics deviating from FlexRIC: ++ } else if (cmp_str_ba("N_RSRP_MEAS", name) == 0) { ++ printf("N_RSRP_MEAS = %u\n", meas_record.int_val); ++ } else if (cmp_str_ba("N_PRB", name) == 0) { ++ printf("N_PRB = %u\n", meas_record.int_val); ++ } else if (cmp_str_ba("DRB.HarqMcsUl", name) == 0) { ++ printf("DRB.HarqMcsUl = %u\n", meas_record.int_val); ++ } else if (cmp_str_ba("DRB.HarqMcsDl", name) == 0) { ++ printf("DRB.HarqMcsDl = %u\n", meas_record.int_val); ++ } else if (cmp_str_ba("CQI_SINGLE_CODEWORD", name) == 0) { ++ printf("CQI_SINGLE_CODEWORD = %u\n", meas_record.int_val); ++ } else if (cmp_str_ba("CQI_DUAL_CODEWORD", name) == 0) { ++ printf("CQI_DUAL_CODEWORD = %u\n", meas_record.int_val); + } else { + printf("Measurement Name not yet supported\n"); + } +@@ -109,6 +125,30 @@ void log_real_value(byte_array_t name, meas_record_lst_t meas_record) + printf("DRB.UEThpDl = %.2f [kbps]\n", meas_record.real_val); + } else if (cmp_str_ba("DRB.UEThpUl", name) == 0) { + printf("DRB.UEThpUl = %.2f [kbps]\n", meas_record.real_val); ++ ++ // Added float metrics deviating from FlexRIC: ++ } else if (cmp_str_ba("RSRP", name) == 0) { ++ printf("RSRP = %.2f [dBm]\n", meas_record.real_val); ++ } else if (cmp_str_ba("RSSI", name) == 0) { ++ printf("RSSI = %.2f [dBm]\n", meas_record.real_val); ++ } else if (cmp_str_ba("RSRQ", name) == 0) { ++ printf("RSRQ = %.2f [dB]\n", meas_record.real_val); ++ } else if (cmp_str_ba("PUSCH_SNR", name) == 0) { ++ printf("PUSCH_SNR = %.2f [dB]\n", meas_record.real_val); ++ } else if (cmp_str_ba("PUCCH_SNR", name) == 0) { ++ printf("PUCCH_SNR = %.2f [dB]\n", meas_record.real_val); ++ } else if (cmp_str_ba("DRB.HarqBlockErrorRateUl", name) == 0) { ++ printf("DRB.HarqBlockErrorRateUl = %.2f [%%]\n", meas_record.real_val); ++ } else if (cmp_str_ba("DRB.HarqBlockErrorRateDl", name) == 0) { ++ printf("DRB.HarqBlockErrorRateDl = %.2f [%%]\n", meas_record.real_val); ++ } else if (cmp_str_ba("DRB.MacSduRetransmissionRateUl", name) == 0) { ++ printf("DRB.MacSduRetransmissionRateUl = %.2f [%%]\n", meas_record.real_val); ++ } else if (cmp_str_ba("DRB.MacSduRetransmissionRateDl", name) == 0) { ++ printf("DRB.MacSduRetransmissionRateDl = %.2f [%%]\n", meas_record.real_val); ++ } else if (cmp_str_ba("DRB.MacSduErrorRateUl", name) == 0) { ++ printf("DRB.MacSduErrorRateUl = %.2f [%%]\n", meas_record.real_val); ++ } else if (cmp_str_ba("DRB.MacSduErrorRateDl", name) == 0) { ++ printf("DRB.MacSduErrorRateDl = %.2f [%%]\n", meas_record.real_val); + } else { + printf("Measurement Name not yet supported\n"); + } +@@ -382,7 +422,7 @@ int main(int argc, char* argv[]) + + assert(nodes.len > 0); + +- printf("Connected E2 nodes = %d\n", nodes.len); ++ printf("Connected E2 nodes = %u\n", nodes.len); + + pthread_mutexattr_t attr = {0}; + int rc = pthread_mutex_init(&mtx, &attr); +@@ -418,6 +458,8 @@ int main(int argc, char* argv[]) + //////////// + + sleep(10); ++ while (run_forever) ++ sleep(10); + + for (int i = 0; i < nodes.len; ++i) { + // Remove the handle previously returned diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni.previous.c b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni.previous.c new file mode 100644 index 0000000..5fa00cc --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni.previous.c @@ -0,0 +1,434 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BAS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "../../../../src/xApp/e42_xapp_api.h" +#include "../../../../src/util/alg_ds/alg/defer.h" +#include "../../../../src/util/time_now_us.h" +#include "../../../../src/util/alg_ds/ds/lock_guard/lock_guard.h" +#include "../../../../src/util/e.h" + +#include +#include +#include +#include +#include +#include + +static +uint64_t const period_ms = 1000; + +static +pthread_mutex_t mtx; + +static +void log_gnb_ue_id(ue_id_e2sm_t ue_id) +{ + if (ue_id.gnb.gnb_cu_ue_f1ap_lst != NULL) { + for (size_t i = 0; i < ue_id.gnb.gnb_cu_ue_f1ap_lst_len; i++) { + printf("UE ID type = gNB-CU, gnb_cu_ue_f1ap = %u\n", ue_id.gnb.gnb_cu_ue_f1ap_lst[i]); + } + } else { + printf("UE ID type = gNB, amf_ue_ngap_id = %lu\n", ue_id.gnb.amf_ue_ngap_id); + } + if (ue_id.gnb.ran_ue_id != NULL) { + printf("ran_ue_id = %lx\n", *ue_id.gnb.ran_ue_id); // RAN UE NGAP ID + } +} + +static +void log_du_ue_id(ue_id_e2sm_t ue_id) +{ + printf("UE ID type = gNB-DU, gnb_cu_ue_f1ap = %u\n", ue_id.gnb_du.gnb_cu_ue_f1ap); + if (ue_id.gnb_du.ran_ue_id != NULL) { + printf("ran_ue_id = %lx\n", *ue_id.gnb_du.ran_ue_id); // RAN UE NGAP ID + } +} + +static +void log_cuup_ue_id(ue_id_e2sm_t ue_id) +{ + printf("UE ID type = gNB-CU-UP, gnb_cu_cp_ue_e1ap = %u\n", ue_id.gnb_cu_up.gnb_cu_cp_ue_e1ap); + if (ue_id.gnb_cu_up.ran_ue_id != NULL) { + printf("ran_ue_id = %lx\n", *ue_id.gnb_cu_up.ran_ue_id); // RAN UE NGAP ID + } +} + +typedef void (*log_ue_id)(ue_id_e2sm_t ue_id); + +static +log_ue_id log_ue_id_e2sm[END_UE_ID_E2SM] = { + log_gnb_ue_id, // common for gNB-mono, CU and CU-CP + log_du_ue_id, + log_cuup_ue_id, + NULL, + NULL, + NULL, + NULL, +}; + +static +void log_int_value(byte_array_t name, meas_record_lst_t meas_record) +{ + if (cmp_str_ba("RRU.PrbTotDl", name) == 0) { + printf("RRU.PrbTotDl = %d [PRBs]\n", meas_record.int_val); + } else if (cmp_str_ba("RRU.PrbTotUl", name) == 0) { + printf("RRU.PrbTotUl = %d [PRBs]\n", meas_record.int_val); + } else if (cmp_str_ba("DRB.PdcpSduVolumeDL", name) == 0) { + printf("DRB.PdcpSduVolumeDL = %d [kb]\n", meas_record.int_val); + } else if (cmp_str_ba("DRB.PdcpSduVolumeUL", name) == 0) { + printf("DRB.PdcpSduVolumeUL = %d [kb]\n", meas_record.int_val); + } else { + printf("Measurement Name not yet supported\n"); + } +} + +static +void log_real_value(byte_array_t name, meas_record_lst_t meas_record) +{ + if (cmp_str_ba("DRB.RlcSduDelayDl", name) == 0) { + printf("DRB.RlcSduDelayDl = %.2f [μs]\n", meas_record.real_val); + } else if (cmp_str_ba("DRB.UEThpDl", name) == 0) { + printf("DRB.UEThpDl = %.2f [kbps]\n", meas_record.real_val); + } else if (cmp_str_ba("DRB.UEThpUl", name) == 0) { + printf("DRB.UEThpUl = %.2f [kbps]\n", meas_record.real_val); + } else { + printf("Measurement Name not yet supported\n"); + } +} + +typedef void (*log_meas_value)(byte_array_t name, meas_record_lst_t meas_record); + +static +log_meas_value get_meas_value[END_MEAS_VALUE] = { + log_int_value, + log_real_value, + NULL, +}; + +static +void match_meas_name_type(meas_type_t meas_type, meas_record_lst_t meas_record) +{ + // Get the value of the Measurement + get_meas_value[meas_record.value](meas_type.name, meas_record); +} + +static +void match_id_meas_type(meas_type_t meas_type, meas_record_lst_t meas_record) +{ + (void)meas_type; + (void)meas_record; + assert(false && "ID Measurement Type not yet supported"); +} + +typedef void (*check_meas_type)(meas_type_t meas_type, meas_record_lst_t meas_record); + +static +check_meas_type match_meas_type[END_MEAS_TYPE] = { + match_meas_name_type, + match_id_meas_type, +}; + +static +void log_kpm_measurements(kpm_ind_msg_format_1_t const* msg_frm_1) +{ + assert(msg_frm_1->meas_info_lst_len > 0 && "Cannot correctly print measurements"); + + // UE Measurements per granularity period + for (size_t j = 0; j < msg_frm_1->meas_data_lst_len; j++) { + meas_data_lst_t const data_item = msg_frm_1->meas_data_lst[j]; + + for (size_t z = 0; z < data_item.meas_record_len; z++) { + meas_type_t const meas_type = msg_frm_1->meas_info_lst[z].meas_type; + meas_record_lst_t const record_item = data_item.meas_record_lst[z]; + + match_meas_type[meas_type.type](meas_type, record_item); + + if (data_item.incomplete_flag && *data_item.incomplete_flag == TRUE_ENUM_VALUE) + printf("Measurement Record not reliable"); + } + } + +} + +static +void sm_cb_kpm(sm_ag_if_rd_t const* rd) +{ + assert(rd != NULL); + assert(rd->type == INDICATION_MSG_AGENT_IF_ANS_V0); + assert(rd->ind.type == KPM_STATS_V3_0); + + // Reading Indication Message Format 3 + kpm_ind_data_t const* ind = &rd->ind.kpm.ind; + kpm_ric_ind_hdr_format_1_t const* hdr_frm_1 = &ind->hdr.kpm_ric_ind_hdr_format_1; + kpm_ind_msg_format_3_t const* msg_frm_3 = &ind->msg.frm_3; + + int64_t const now = time_now_us(); + static int counter = 1; + { + lock_guard(&mtx); + + printf("\n%7d KPM ind_msg latency = %ld [μs]\n", counter, now - hdr_frm_1->collectStartTime); // xApp <-> E2 Node + + // Reported list of measurements per UE + for (size_t i = 0; i < msg_frm_3->ue_meas_report_lst_len; i++) { + // log UE ID + ue_id_e2sm_t const ue_id_e2sm = msg_frm_3->meas_report_per_ue[i].ue_meas_report_lst; + ue_id_e2sm_e const type = ue_id_e2sm.type; + log_ue_id_e2sm[type](ue_id_e2sm); + + // log measurements + log_kpm_measurements(&msg_frm_3->meas_report_per_ue[i].ind_msg_format_1); + + } + counter++; + } +} + +static +test_info_lst_t filter_predicate(test_cond_type_e type, test_cond_e cond, int value) +{ + test_info_lst_t dst = {0}; + + dst.test_cond_type = type; + // It can only be TRUE_TEST_COND_TYPE so it does not matter the type + // but ugly ugly... + dst.S_NSSAI = TRUE_TEST_COND_TYPE; + + dst.test_cond = calloc(1, sizeof(test_cond_e)); + assert(dst.test_cond != NULL && "Memory exhausted"); + *dst.test_cond = cond; + + dst.test_cond_value = calloc(1, sizeof(test_cond_value_t)); + assert(dst.test_cond_value != NULL && "Memory exhausted"); + dst.test_cond_value->type = OCTET_STRING_TEST_COND_VALUE; + + dst.test_cond_value->octet_string_value = calloc(1, sizeof(byte_array_t)); + assert(dst.test_cond_value->octet_string_value != NULL && "Memory exhausted"); + const size_t len_nssai = 1; + dst.test_cond_value->octet_string_value->len = len_nssai; + dst.test_cond_value->octet_string_value->buf = calloc(len_nssai, sizeof(uint8_t)); + assert(dst.test_cond_value->octet_string_value->buf != NULL && "Memory exhausted"); + dst.test_cond_value->octet_string_value->buf[0] = value; + + return dst; +} + +static +label_info_lst_t fill_kpm_label(void) +{ + label_info_lst_t label_item = {0}; + + label_item.noLabel = ecalloc(1, sizeof(enum_value_e)); + *label_item.noLabel = TRUE_ENUM_VALUE; + + return label_item; +} + +static +kpm_act_def_format_1_t fill_act_def_frm_1(ric_report_style_item_t const* report_item) +{ + assert(report_item != NULL); + + kpm_act_def_format_1_t ad_frm_1 = {0}; + + size_t const sz = report_item->meas_info_for_action_lst_len; + + // [1, 65535] + ad_frm_1.meas_info_lst_len = sz; + ad_frm_1.meas_info_lst = calloc(sz, sizeof(meas_info_format_1_lst_t)); + assert(ad_frm_1.meas_info_lst != NULL && "Memory exhausted"); + + for (size_t i = 0; i < sz; i++) { + meas_info_format_1_lst_t* meas_item = &ad_frm_1.meas_info_lst[i]; + // 8.3.9 + // Measurement Name + meas_item->meas_type.type = NAME_MEAS_TYPE; + meas_item->meas_type.name = copy_byte_array(report_item->meas_info_for_action_lst[i].name); + + // [1, 2147483647] + // 8.3.11 + meas_item->label_info_lst_len = 1; + meas_item->label_info_lst = ecalloc(1, sizeof(label_info_lst_t)); + meas_item->label_info_lst[0] = fill_kpm_label(); + } + + // 8.3.8 [0, 4294967295] + ad_frm_1.gran_period_ms = period_ms; + + // 8.3.20 - OPTIONAL + ad_frm_1.cell_global_id = NULL; + +#if defined KPM_V2_03 || defined KPM_V3_00 + // [0, 65535] + ad_frm_1.meas_bin_range_info_lst_len = 0; + ad_frm_1.meas_bin_info_lst = NULL; +#endif + + return ad_frm_1; +} + +static +kpm_act_def_t fill_report_style_4(ric_report_style_item_t const* report_item) +{ + assert(report_item != NULL); + assert(report_item->act_def_format_type == FORMAT_4_ACTION_DEFINITION); + + kpm_act_def_t act_def = {.type = FORMAT_4_ACTION_DEFINITION}; + + // Fill matching condition + // [1, 32768] + act_def.frm_4.matching_cond_lst_len = 1; + act_def.frm_4.matching_cond_lst = calloc(act_def.frm_4.matching_cond_lst_len, sizeof(matching_condition_format_4_lst_t)); + assert(act_def.frm_4.matching_cond_lst != NULL && "Memory exhausted"); + // Filter connected UEs by S-NSSAI criteria + test_cond_type_e const type = S_NSSAI_TEST_COND_TYPE; // CQI_TEST_COND_TYPE + test_cond_e const condition = EQUAL_TEST_COND; // GREATERTHAN_TEST_COND + int const value = 1; + act_def.frm_4.matching_cond_lst[0].test_info_lst = filter_predicate(type, condition, value); + + // Fill Action Definition Format 1 + // 8.2.1.2.1 + act_def.frm_4.action_def_format_1 = fill_act_def_frm_1(report_item); + + return act_def; +} + +typedef kpm_act_def_t (*fill_kpm_act_def)(ric_report_style_item_t const* report_item); + +static +fill_kpm_act_def get_kpm_act_def[END_RIC_SERVICE_REPORT] = { + NULL, + NULL, + NULL, + fill_report_style_4, + NULL, +}; + +static +kpm_sub_data_t gen_kpm_subs(kpm_ran_function_def_t const* ran_func) +{ + assert(ran_func != NULL); + assert(ran_func->ric_event_trigger_style_list != NULL); + + kpm_sub_data_t kpm_sub = {0}; + + // Generate Event Trigger + assert(ran_func->ric_event_trigger_style_list[0].format_type == FORMAT_1_RIC_EVENT_TRIGGER); + kpm_sub.ev_trg_def.type = FORMAT_1_RIC_EVENT_TRIGGER; + kpm_sub.ev_trg_def.kpm_ric_event_trigger_format_1.report_period_ms = period_ms; + + // Generate Action Definition + kpm_sub.sz_ad = 1; + kpm_sub.ad = calloc(kpm_sub.sz_ad, sizeof(kpm_act_def_t)); + assert(kpm_sub.ad != NULL && "Memory exhausted"); + + // Multiple Action Definitions in one SUBSCRIPTION message is not supported in this project + // Multiple REPORT Styles = Multiple Action Definition = Multiple SUBSCRIPTION messages + ric_report_style_item_t* const report_item = &ran_func->ric_report_style_list[0]; + ric_service_report_e const report_style_type = report_item->report_style_type; + *kpm_sub.ad = get_kpm_act_def[report_style_type](report_item); + + return kpm_sub; +} + +static +bool eq_sm(sm_ran_function_t const* elem, int const id) +{ + if (elem->id == id) + return true; + + return false; +} + +static +size_t find_sm_idx(sm_ran_function_t* rf, size_t sz, bool (*f)(sm_ran_function_t const*, int const), int const id) +{ + for (size_t i = 0; i < sz; i++) { + if (f(&rf[i], id)) + return i; + } + + assert(0 != 0 && "SM ID could not be found in the RAN Function List"); +} + +int main(int argc, char* argv[]) +{ + fr_args_t args = init_fr_args(argc, argv); + + // Init the xApp + init_xapp_api(&args); + sleep(1); + + e2_node_arr_xapp_t nodes = e2_nodes_xapp_api(); + defer({ free_e2_node_arr_xapp(&nodes); }); + + assert(nodes.len > 0); + + printf("Connected E2 nodes = %d\n", nodes.len); + + pthread_mutexattr_t attr = {0}; + int rc = pthread_mutex_init(&mtx, &attr); + assert(rc == 0); + + sm_ans_xapp_t* hndl = calloc(nodes.len, sizeof(sm_ans_xapp_t)); + assert(hndl != NULL); + + //////////// + // START KPM + //////////// + int const KPM_ran_function = 2; + + for (size_t i = 0; i < nodes.len; ++i) { + e2_node_connected_xapp_t* n = &nodes.n[i]; + + size_t const idx = find_sm_idx(n->rf, n->len_rf, eq_sm, KPM_ran_function); + assert(n->rf[idx].defn.type == KPM_RAN_FUNC_DEF_E && "KPM is not the received RAN Function"); + // if REPORT Service is supported by E2 node, send SUBSCRIPTION + // e.g. OAI CU-CP + if (n->rf[idx].defn.kpm.ric_report_style_list != NULL) { + // Generate KPM SUBSCRIPTION message + kpm_sub_data_t kpm_sub = gen_kpm_subs(&n->rf[idx].defn.kpm); + + hndl[i] = report_sm_xapp_api(&n->id, KPM_ran_function, &kpm_sub, sm_cb_kpm); + assert(hndl[i].success == true); + + free_kpm_sub_data(&kpm_sub); + } + } + //////////// + // END KPM + //////////// + + sleep(10); + + for (int i = 0; i < nodes.len; ++i) { + // Remove the handle previously returned + if (hndl[i].success == true) + rm_report_sm_xapp_api(hndl[i].u.handle); + } + free(hndl); + + // Stop the xApp + while (try_stop_xapp_api() == false) + usleep(1000); + + printf("Test xApp run SUCCESSFULLY\n"); +} diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni_write_to_csv.c b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni_write_to_csv.c new file mode 100644 index 0000000..3af30b7 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni_write_to_csv.c @@ -0,0 +1,737 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BAS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "../../../../src/xApp/e42_xapp_api.h" +#include "../../../../src/util/alg_ds/alg/defer.h" +#include "../../../../src/util/time_now_us.h" +#include "../../../../src/util/alg_ds/ds/lock_guard/lock_guard.h" +#include "../../../../src/util/e.h" + +#include +#include +#include +#include +#include +#include +#include + +bool run_forever = true; + +static uint64_t const period_ms = 1000; + +static pthread_mutex_t mtx; +bool csv_wrote_header = false; +const char *csv_file_path = NULL; +char csv_header_buffer[1024]; +char csv_line_buffer[1024]; +unsigned int csv_num_rows = 0; +uint64_t current_ue_id = 0; +bool filter_invalid_sample = false; + +static void log_gnb_ue_id(ue_id_e2sm_t ue_id) +{ + if (ue_id.gnb.gnb_cu_ue_f1ap_lst != NULL) + { + for (size_t i = 0; i < ue_id.gnb.gnb_cu_ue_f1ap_lst_len; i++) + { + printf("UE ID type = gNB-CU, gnb_cu_ue_f1ap = %u\n", ue_id.gnb.gnb_cu_ue_f1ap_lst[i]); + } + } + else + { + printf("UE ID type = gNB, amf_ue_ngap_id = %lu\n", ue_id.gnb.amf_ue_ngap_id); + } + if (ue_id.gnb.ran_ue_id != NULL) + { + printf("ran_ue_id = %lx\n", *ue_id.gnb.ran_ue_id); // RAN UE NGAP ID + } + current_ue_id = ue_id.gnb.amf_ue_ngap_id; // Update the global UE ID +} + +static void log_du_ue_id(ue_id_e2sm_t ue_id) +{ + printf("UE ID type = gNB-DU, gnb_cu_ue_f1ap = %u\n", ue_id.gnb_du.gnb_cu_ue_f1ap); + if (ue_id.gnb_du.ran_ue_id != NULL) + { + printf("ran_ue_id = %lx\n", *ue_id.gnb_du.ran_ue_id); // RAN UE NGAP ID + } + current_ue_id = ue_id.gnb_du.gnb_cu_ue_f1ap; // Update the global UE ID +} + +static void log_cuup_ue_id(ue_id_e2sm_t ue_id) +{ + printf("UE ID type = gNB-CU-UP, gnb_cu_cp_ue_e1ap = %u\n", ue_id.gnb_cu_up.gnb_cu_cp_ue_e1ap); + if (ue_id.gnb_cu_up.ran_ue_id != NULL) + { + printf("ran_ue_id = %lx\n", *ue_id.gnb_cu_up.ran_ue_id); // RAN UE NGAP ID + } + current_ue_id = ue_id.gnb_cu_up.gnb_cu_cp_ue_e1ap; // Update the global UE ID +} + +typedef void (*log_ue_id)(ue_id_e2sm_t ue_id); + +static log_ue_id log_ue_id_e2sm[END_UE_ID_E2SM] = { + log_gnb_ue_id, // common for gNB-mono, CU and CU-CP + log_du_ue_id, + log_cuup_ue_id, + NULL, + NULL, + NULL, + NULL, +}; + +static void csv_append_name_to_csv_header(byte_array_t name, byte_array_t unit) +{ + size_t current_len = strlen(csv_header_buffer); + size_t name_len = name.len; + size_t unit_len = unit.len; + + // Don't overflow the buffer + if (current_len + name_len + unit_len + 4 < sizeof(csv_header_buffer)) // +4 for " ()", comma, and null terminator + { + if (unit.buf != NULL && unit_len > 0) + { + snprintf(csv_header_buffer + current_len, sizeof(csv_header_buffer) - current_len, "%.*s (%.*s),", (int)name_len, name.buf, (int)unit_len, unit.buf); + } + else + { + snprintf(csv_header_buffer + current_len, sizeof(csv_header_buffer) - current_len, "%.*s,", (int)name_len, name.buf); + } + } + else + { + fprintf(stderr, "CSV header buffer is full, cannot append more names.\n"); + } +} + +static void csv_append_int_to_csv_line(meas_record_lst_t meas_record) +{ + size_t current_len = strlen(csv_line_buffer); + + if (current_len + 32 < sizeof(csv_line_buffer)) // Reserve space for int/float and comma + { + snprintf(csv_line_buffer + current_len, sizeof(csv_line_buffer) - current_len, "%d,", meas_record.int_val); + } + else + { + fprintf(stderr, "CSV line buffer is full, cannot append more values.\n"); + } +} + +static void csv_append_real_to_csv_line(meas_record_lst_t meas_record) +{ + size_t current_len = strlen(csv_line_buffer); + + if (current_len + 32 < sizeof(csv_line_buffer)) // Reserve space for float and comma + { + snprintf(csv_line_buffer + current_len, sizeof(csv_line_buffer) - current_len, "%.2f,", meas_record.real_val); + } + else + { + fprintf(stderr, "CSV line buffer is full, cannot append more values.\n"); + } +} + +static void csv_prepend_ue_id() +{ + // Ensure the current UE ID is valid + if (current_ue_id == 0) + { + fprintf(stderr, "Error: No valid UE ID found.\n"); + return; + } + + // Ensure the buffer won't overflow + char ue_id_buffer[32]; + snprintf(ue_id_buffer, sizeof(ue_id_buffer), "%" PRIu64 ",", current_ue_id); + size_t ue_id_len = strlen(ue_id_buffer); + size_t current_len = strlen(csv_line_buffer); + + if (ue_id_len + current_len < sizeof(csv_line_buffer)) + { + // Use a temporary buffer to construct the new line + char temp_buffer[sizeof(csv_line_buffer)]; + snprintf(temp_buffer, sizeof(temp_buffer), "%s%s", ue_id_buffer, csv_line_buffer); + strncpy(csv_line_buffer, temp_buffer, sizeof(csv_line_buffer) - 1); + } + else + { + fprintf(stderr, "CSV line buffer is full, cannot prepend UE ID.\n"); + fprintf(stderr, "CSV line buffer is full (current size: %zu, required size: %zu), cannot prepend UE ID.\n", current_len, ue_id_len + current_len); + } +} + +static void csv_prepend_timestamp() +{ + int64_t now = time_now_us(); + // Convert to milliseconds + now /= 1000; + + // Ensure the timestamp is non-negative + if (now < 0) + { + fprintf(stderr, "Error: Negative timestamp value encountered.\n"); + return; + } + + char timestamp_buffer[32]; + snprintf(timestamp_buffer, sizeof(timestamp_buffer), "%" PRId64 ",", now); + + // Ensure the buffer won't overflow + size_t timestamp_len = strlen(timestamp_buffer); + size_t current_len = strlen(csv_line_buffer); + + if (timestamp_len + current_len < sizeof(csv_line_buffer)) + { + // Use a temporary buffer to construct the new line + char temp_buffer[sizeof(csv_line_buffer)]; + snprintf(temp_buffer, sizeof(temp_buffer), "%s%s", timestamp_buffer, csv_line_buffer); + strncpy(csv_line_buffer, temp_buffer, sizeof(csv_line_buffer) - 1); + csv_line_buffer[sizeof(csv_line_buffer) - 1] = '\0'; // Ensure null termination + } + else + { + fprintf(stderr, "CSV line buffer is full, cannot prepend timestamp.\n"); + } +} + +static void log_int_value(byte_array_t name, meas_record_lst_t meas_record) +{ + byte_array_t unit = {.buf = "", .len = 0}; + + if (!csv_wrote_header) + { + if (cmp_str_ba("RRU.PrbTotDl", name) == 0) + { + unit.buf = "PRBs"; + unit.len = strlen("PRBs"); + } + else if (cmp_str_ba("RRU.PrbTotUl", name) == 0) + { + unit.buf = "PRBs"; + unit.len = strlen("PRBs"); + } + else if (cmp_str_ba("DRB.PdcpSduVolumeDL", name) == 0) + { + unit.buf = "kb"; + unit.len = strlen("kb"); + } + else if (cmp_str_ba("DRB.PdcpSduVolumeUL", name) == 0) + { + unit.buf = "kb"; + unit.len = strlen("kb"); + } + else if (cmp_str_ba("N_RSRP_MEAS", name) == 0) + { + unit.buf = ""; + unit.len = 0; + } + else if (cmp_str_ba("N_PRB", name) == 0) + { + unit.buf = ""; + unit.len = 0; + } + else if (cmp_str_ba("CQI_SINGLE_CODEWORD", name) == 0) + { + unit.buf = ""; + unit.len = 0; + } + else if (cmp_str_ba("CQI_DUAL_CODEWORD", name) == 0) + { + unit.buf = ""; + unit.len = 0; + } + else + { + unit.buf = ""; + unit.len = 0; + } + csv_append_name_to_csv_header(name, unit); + } + csv_append_int_to_csv_line(meas_record); + // if (cmp_str_ba("RRU.PrbTotDl", name) == 0) { + // printf("RRU.PrbTotDl = %d [PRBs]\n", meas_record.int_val); + // } else if (cmp_str_ba("RRU.PrbTotUl", name) == 0) { + // printf("RRU.PrbTotUl = %d [PRBs]\n", meas_record.int_val); + // } else if (cmp_str_ba("DRB.PdcpSduVolumeDL", name) == 0) { + // printf("DRB.PdcpSduVolumeDL = %d [kb]\n", meas_record.int_val); + // } else if (cmp_str_ba("DRB.PdcpSduVolumeUL", name) == 0) { + // printf("DRB.PdcpSduVolumeUL = %d [kb]\n", meas_record.int_val); + // } else if (...) { + // } else { + // printf("Measurement Name not yet supported\n"); + // } + + // If the measurement is N_RSRP_MEAS and the value is 0, the data is invalid + if (cmp_str_ba("N_RSRP_MEAS", name) == 0) + { + if (meas_record.int_val == 0) + { + filter_invalid_sample = true; + printf("\n\tNumber of RSRP measurements was zero, skipping sample to avoid divide by zero.\n\n"); + } + } +} + +static void log_real_value(byte_array_t name, meas_record_lst_t meas_record) +{ + byte_array_t unit = {.buf = "", .len = 0}; + + if (!csv_wrote_header) + { + if (cmp_str_ba("DRB.RlcSduDelayDl", name) == 0) + { + unit.buf = "μs"; + unit.len = strlen("μs"); + } + else if (cmp_str_ba("DRB.UEThpDl", name) == 0) + { + unit.buf = "kbps"; + unit.len = strlen("kbps"); + } + else if (cmp_str_ba("DRB.UEThpUl", name) == 0) + { + unit.buf = "kbps"; + unit.len = strlen("kbps"); + } + else if (cmp_str_ba("RSRP", name) == 0) + { + unit.buf = "dBm"; + unit.len = strlen("dBm"); + } + else if (cmp_str_ba("RSSI", name) == 0) + { + unit.buf = "dBm"; + unit.len = strlen("dBm"); + } + else if (cmp_str_ba("RSRQ", name) == 0) + { + unit.buf = "dB"; + unit.len = strlen("dB"); + } + else if (cmp_str_ba("PUSCH_SNR", name) == 0) + { + unit.buf = "dB"; + unit.len = strlen("dB"); + } + else if (cmp_str_ba("PUCCH_SNR", name) == 0) + { + unit.buf = "dB"; + unit.len = strlen("dB"); + } + csv_append_name_to_csv_header(name, unit); + } + csv_append_real_to_csv_line(meas_record); + // if (cmp_str_ba("DRB.RlcSduDelayDl", name) == 0) { + // printf("DRB.RlcSduDelayDl = %.2f [μs]\n", meas_record.real_val); + // } else if (cmp_str_ba("DRB.UEThpDl", name) == 0) { + // printf("DRB.UEThpDl = %.2f [kbps]\n", meas_record.real_val); + // } else if (cmp_str_ba("DRB.UEThpUl", name) == 0) { + // printf("DRB.UEThpUl = %.2f [kbps]\n", meas_record.real_val); + // } else if (...) { + // } else { + // printf("Measurement Name not yet supported\n"); + // } +} + +typedef void (*log_meas_value)(byte_array_t name, meas_record_lst_t meas_record); + +static log_meas_value get_meas_value[END_MEAS_VALUE] = { + log_int_value, + log_real_value, + NULL, +}; + +static void match_meas_name_type(meas_type_t meas_type, meas_record_lst_t meas_record) +{ + // Get the value of the Measurement + get_meas_value[meas_record.value](meas_type.name, meas_record); +} + +static void match_id_meas_type(meas_type_t meas_type, meas_record_lst_t meas_record) +{ + (void)meas_type; + (void)meas_record; + assert(false && "ID Measurement Type not yet supported"); +} + +typedef void (*check_meas_type)(meas_type_t meas_type, meas_record_lst_t meas_record); + +static check_meas_type match_meas_type[END_MEAS_TYPE] = { + match_meas_name_type, + match_id_meas_type, +}; + +static void write_csv_header_to_file() +{ + if (!csv_wrote_header && csv_file_path != NULL) + { + FILE *file = fopen(csv_file_path, "w"); + if (file == NULL) + { + fprintf(stderr, "Failed to open CSV file: %s\n", csv_file_path); + return; + } + fprintf(file, "%s\n", csv_header_buffer); + fclose(file); + + csv_wrote_header = true; + printf("CSV header written to file: %s\n", csv_file_path); + } +} + +static void write_csv_line_to_file() +{ + if (csv_wrote_header && csv_file_path != NULL) + { + FILE *file = fopen(csv_file_path, "a"); + if (file == NULL) + { + fprintf(stderr, "Failed to open CSV file for appending: %s\n", csv_file_path); + return; + } + fprintf(file, "%s\n", csv_line_buffer); + fclose(file); + + printf("CSV line written to file: %s\n", csv_file_path); + } + // Reset the line buffer for the next entry + memset(csv_line_buffer, 0, sizeof(csv_line_buffer)); +} + +static void log_kpm_measurements(kpm_ind_msg_format_1_t const *msg_frm_1) +{ + assert(msg_frm_1->meas_info_lst_len > 0 && "Cannot correctly print measurements"); + + // UE Measurements per granularity period + for (size_t j = 0; j < msg_frm_1->meas_data_lst_len; j++) + { + meas_data_lst_t const data_item = msg_frm_1->meas_data_lst[j]; + + for (size_t z = 0; z < data_item.meas_record_len; z++) + { + meas_type_t const meas_type = msg_frm_1->meas_info_lst[z].meas_type; + meas_record_lst_t const record_item = data_item.meas_record_lst[z]; + + match_meas_type[meas_type.type](meas_type, record_item); + + if (data_item.incomplete_flag && *data_item.incomplete_flag == TRUE_ENUM_VALUE) + printf("Measurement Record not reliable"); + } + } + write_csv_header_to_file(); + + if (!filter_invalid_sample) + { + csv_prepend_ue_id(); + csv_prepend_timestamp(); + write_csv_line_to_file(); + } + else + { + // Clear the line buffer for the next entry + memset(csv_line_buffer, 0, sizeof(csv_line_buffer)); + } + + filter_invalid_sample = false; + csv_num_rows++; + printf("Samples collected = %u\n", csv_num_rows); +} + +static void sm_cb_kpm(sm_ag_if_rd_t const *rd) +{ + assert(rd != NULL); + assert(rd->type == INDICATION_MSG_AGENT_IF_ANS_V0); + assert(rd->ind.type == KPM_STATS_V3_0); + + // Reading Indication Message Format 3 + kpm_ind_data_t const *ind = &rd->ind.kpm.ind; + kpm_ric_ind_hdr_format_1_t const *hdr_frm_1 = &ind->hdr.kpm_ric_ind_hdr_format_1; + kpm_ind_msg_format_3_t const *msg_frm_3 = &ind->msg.frm_3; + + int64_t const now = time_now_us(); + static int counter = 1; + { + lock_guard(&mtx); + + printf("\n%7d KPM ind_msg latency = %ld [μs]\n", counter, now - hdr_frm_1->collectStartTime); // xApp <-> E2 Node + + // Reported list of measurements per UE + for (size_t i = 0; i < msg_frm_3->ue_meas_report_lst_len; i++) + { + // log UE ID + ue_id_e2sm_t const ue_id_e2sm = msg_frm_3->meas_report_per_ue[i].ue_meas_report_lst; + ue_id_e2sm_e const type = ue_id_e2sm.type; + log_ue_id_e2sm[type](ue_id_e2sm); + + // log measurements + log_kpm_measurements(&msg_frm_3->meas_report_per_ue[i].ind_msg_format_1); + } + counter++; + } +} + +static test_info_lst_t filter_predicate(test_cond_type_e type, test_cond_e cond, int value) +{ + test_info_lst_t dst = {0}; + + dst.test_cond_type = type; + // It can only be TRUE_TEST_COND_TYPE so it does not matter the type + // but ugly ugly... + dst.S_NSSAI = TRUE_TEST_COND_TYPE; + + dst.test_cond = calloc(1, sizeof(test_cond_e)); + assert(dst.test_cond != NULL && "Memory exhausted"); + *dst.test_cond = cond; + + dst.test_cond_value = calloc(1, sizeof(test_cond_value_t)); + assert(dst.test_cond_value != NULL && "Memory exhausted"); + dst.test_cond_value->type = OCTET_STRING_TEST_COND_VALUE; + + dst.test_cond_value->octet_string_value = calloc(1, sizeof(byte_array_t)); + assert(dst.test_cond_value->octet_string_value != NULL && "Memory exhausted"); + const size_t len_nssai = 1; + dst.test_cond_value->octet_string_value->len = len_nssai; + dst.test_cond_value->octet_string_value->buf = calloc(len_nssai, sizeof(uint8_t)); + assert(dst.test_cond_value->octet_string_value->buf != NULL && "Memory exhausted"); + dst.test_cond_value->octet_string_value->buf[0] = value; + + return dst; +} + +static label_info_lst_t fill_kpm_label(void) +{ + label_info_lst_t label_item = {0}; + + label_item.noLabel = ecalloc(1, sizeof(enum_value_e)); + *label_item.noLabel = TRUE_ENUM_VALUE; + + return label_item; +} + +static kpm_act_def_format_1_t fill_act_def_frm_1(ric_report_style_item_t const *report_item) +{ + assert(report_item != NULL); + + kpm_act_def_format_1_t ad_frm_1 = {0}; + + size_t const sz = report_item->meas_info_for_action_lst_len; + + // [1, 65535] + ad_frm_1.meas_info_lst_len = sz; + ad_frm_1.meas_info_lst = calloc(sz, sizeof(meas_info_format_1_lst_t)); + assert(ad_frm_1.meas_info_lst != NULL && "Memory exhausted"); + + for (size_t i = 0; i < sz; i++) + { + meas_info_format_1_lst_t *meas_item = &ad_frm_1.meas_info_lst[i]; + // 8.3.9 + // Measurement Name + meas_item->meas_type.type = NAME_MEAS_TYPE; + meas_item->meas_type.name = copy_byte_array(report_item->meas_info_for_action_lst[i].name); + + // [1, 2147483647] + // 8.3.11 + meas_item->label_info_lst_len = 1; + meas_item->label_info_lst = ecalloc(1, sizeof(label_info_lst_t)); + meas_item->label_info_lst[0] = fill_kpm_label(); + } + + // 8.3.8 [0, 4294967295] + ad_frm_1.gran_period_ms = period_ms; + + // 8.3.20 - OPTIONAL + ad_frm_1.cell_global_id = NULL; + +#if defined KPM_V2_03 || defined KPM_V3_00 + // [0, 65535] + ad_frm_1.meas_bin_range_info_lst_len = 0; + ad_frm_1.meas_bin_info_lst = NULL; +#endif + + return ad_frm_1; +} + +static kpm_act_def_t fill_report_style_4(ric_report_style_item_t const *report_item) +{ + assert(report_item != NULL); + assert(report_item->act_def_format_type == FORMAT_4_ACTION_DEFINITION); + + kpm_act_def_t act_def = {.type = FORMAT_4_ACTION_DEFINITION}; + + // Fill matching condition + // [1, 32768] + act_def.frm_4.matching_cond_lst_len = 1; + act_def.frm_4.matching_cond_lst = calloc(act_def.frm_4.matching_cond_lst_len, sizeof(matching_condition_format_4_lst_t)); + assert(act_def.frm_4.matching_cond_lst != NULL && "Memory exhausted"); + // Filter connected UEs by S-NSSAI criteria + test_cond_type_e const type = S_NSSAI_TEST_COND_TYPE; // CQI_TEST_COND_TYPE + test_cond_e const condition = EQUAL_TEST_COND; // GREATERTHAN_TEST_COND + int const value = 1; + act_def.frm_4.matching_cond_lst[0].test_info_lst = filter_predicate(type, condition, value); + + // Fill Action Definition Format 1 + // 8.2.1.2.1 + act_def.frm_4.action_def_format_1 = fill_act_def_frm_1(report_item); + + return act_def; +} + +typedef kpm_act_def_t (*fill_kpm_act_def)(ric_report_style_item_t const *report_item); + +static fill_kpm_act_def get_kpm_act_def[END_RIC_SERVICE_REPORT] = { + NULL, + NULL, + NULL, + fill_report_style_4, + NULL, +}; + +static kpm_sub_data_t gen_kpm_subs(kpm_ran_function_def_t const *ran_func) +{ + assert(ran_func != NULL); + assert(ran_func->ric_event_trigger_style_list != NULL); + + kpm_sub_data_t kpm_sub = {0}; + + // Generate Event Trigger + assert(ran_func->ric_event_trigger_style_list[0].format_type == FORMAT_1_RIC_EVENT_TRIGGER); + kpm_sub.ev_trg_def.type = FORMAT_1_RIC_EVENT_TRIGGER; + kpm_sub.ev_trg_def.kpm_ric_event_trigger_format_1.report_period_ms = period_ms; + + // Generate Action Definition + kpm_sub.sz_ad = 1; + kpm_sub.ad = calloc(kpm_sub.sz_ad, sizeof(kpm_act_def_t)); + assert(kpm_sub.ad != NULL && "Memory exhausted"); + + // Multiple Action Definitions in one SUBSCRIPTION message is not supported in this project + // Multiple REPORT Styles = Multiple Action Definition = Multiple SUBSCRIPTION messages + ric_report_style_item_t *const report_item = &ran_func->ric_report_style_list[0]; + ric_service_report_e const report_style_type = report_item->report_style_type; + *kpm_sub.ad = get_kpm_act_def[report_style_type](report_item); + + return kpm_sub; +} + +static bool eq_sm(sm_ran_function_t const *elem, int const id) +{ + if (elem->id == id) + return true; + + return false; +} + +static size_t find_sm_idx(sm_ran_function_t *rf, size_t sz, bool (*f)(sm_ran_function_t const *, int const), int const id) +{ + for (size_t i = 0; i < sz; i++) + { + if (f(&rf[i], id)) + return i; + } + + assert(0 != 0 && "SM ID could not be found in the RAN Function List"); +} + +int main(int argc, char *argv[]) +{ + if (argc < 2) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + return EXIT_FAILURE; + } + + csv_wrote_header = false; + byte_array_t timestamp_name = {.buf = "Time", .len = strlen("Time")}; + byte_array_t timestamp_unit = {.buf = "UNIX ms", .len = strlen("UNIX ms")}; + csv_append_name_to_csv_header(timestamp_name, timestamp_unit); + byte_array_t ue_id_name = {.buf = "UE ID", .len = strlen("UE ID")}; + byte_array_t ue_id_unit = {.buf = "", .len = 0}; + csv_append_name_to_csv_header(ue_id_name, ue_id_unit); + + csv_file_path = argv[1]; + printf("CSV file path provided: %s\n", csv_file_path); + + fr_args_t args = init_fr_args(argc, argv); + + // Init the xApp + init_xapp_api(&args); + sleep(1); + + e2_node_arr_xapp_t nodes = e2_nodes_xapp_api(); + defer({ free_e2_node_arr_xapp(&nodes); }); + + assert(nodes.len > 0); + + printf("Connected E2 nodes = %d\n", nodes.len); + + pthread_mutexattr_t attr = {0}; + int rc = pthread_mutex_init(&mtx, &attr); + assert(rc == 0); + + sm_ans_xapp_t *hndl = calloc(nodes.len, sizeof(sm_ans_xapp_t)); + assert(hndl != NULL); + + //////////// + // START KPM + //////////// + int const KPM_ran_function = 2; + + for (size_t i = 0; i < nodes.len; ++i) + { + e2_node_connected_xapp_t *n = &nodes.n[i]; + + size_t const idx = find_sm_idx(n->rf, n->len_rf, eq_sm, KPM_ran_function); + assert(n->rf[idx].defn.type == KPM_RAN_FUNC_DEF_E && "KPM is not the received RAN Function"); + // if REPORT Service is supported by E2 node, send SUBSCRIPTION + // e.g. OAI CU-CP + if (n->rf[idx].defn.kpm.ric_report_style_list != NULL) + { + // Generate KPM SUBSCRIPTION message + kpm_sub_data_t kpm_sub = gen_kpm_subs(&n->rf[idx].defn.kpm); + + hndl[i] = report_sm_xapp_api(&n->id, KPM_ran_function, &kpm_sub, sm_cb_kpm); + assert(hndl[i].success == true); + + free_kpm_sub_data(&kpm_sub); + } + } + //////////// + // END KPM + //////////// + + sleep(10); + while (run_forever) + sleep(10); + + for (int i = 0; i < nodes.len; ++i) + { + // Remove the handle previously returned + if (hndl[i].success == true) + rm_report_sm_xapp_api(hndl[i].u.handle); + } + free(hndl); + + // Stop the xApp + while (try_stop_xapp_api() == false) + usleep(1000); + + printf("Test xApp run SUCCESSFULLY\n"); +} diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni_write_to_influxdb.c b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni_write_to_influxdb.c new file mode 100644 index 0000000..1231ece --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_patch_files/flexric/examples/xApp/c/monitor/xapp_kpm_moni_write_to_influxdb.c @@ -0,0 +1,697 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BAS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "../../../../src/xApp/e42_xapp_api.h" +#include "../../../../src/util/alg_ds/alg/defer.h" +#include "../../../../src/util/time_now_us.h" +#include "../../../../src/util/alg_ds/ds/lock_guard/lock_guard.h" +#include "../../../../src/util/e.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +bool run_forever = true; +static uint64_t const period_ms = 1000; + +bool clear_database_on_startup = true; +char influxdb_url[256] = "http://localhost:8086"; +char influxdb_org[64] = "xapp-kpm-moni"; +char influxdb_bucket[64] = "xapp-kpm-moni"; +char influxdb_token[128]; // argv[1] + +static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; +char influx_fields_buffer[1024]; +unsigned int influx_num_samples = 0; +uint64_t current_ue_id = 0; +bool filter_invalid_sample = false; + +static void log_gnb_ue_id(ue_id_e2sm_t ue_id) +{ + if (ue_id.gnb.gnb_cu_ue_f1ap_lst != NULL) + { + for (size_t i = 0; i < ue_id.gnb.gnb_cu_ue_f1ap_lst_len; i++) + { + printf("UE ID type = gNB-CU, gnb_cu_ue_f1ap = %u\n", ue_id.gnb.gnb_cu_ue_f1ap_lst[i]); + } + } + else + { + printf("UE ID type = gNB, amf_ue_ngap_id = %lu\n", ue_id.gnb.amf_ue_ngap_id); + } + if (ue_id.gnb.ran_ue_id != NULL) + { + printf("ran_ue_id = %lx\n", *ue_id.gnb.ran_ue_id); // RAN UE NGAP ID + } + current_ue_id = ue_id.gnb.amf_ue_ngap_id; // Update the global UE ID +} + +static void log_du_ue_id(ue_id_e2sm_t ue_id) +{ + printf("UE ID type = gNB-DU, gnb_cu_ue_f1ap = %u\n", ue_id.gnb_du.gnb_cu_ue_f1ap); + if (ue_id.gnb_du.ran_ue_id != NULL) + { + printf("ran_ue_id = %lx\n", *ue_id.gnb_du.ran_ue_id); // RAN UE NGAP ID + } + current_ue_id = ue_id.gnb_du.gnb_cu_ue_f1ap; // Update the global UE ID +} + +static void log_cuup_ue_id(ue_id_e2sm_t ue_id) +{ + printf("UE ID type = gNB-CU-UP, gnb_cu_cp_ue_e1ap = %u\n", ue_id.gnb_cu_up.gnb_cu_cp_ue_e1ap); + if (ue_id.gnb_cu_up.ran_ue_id != NULL) + { + printf("ran_ue_id = %lx\n", *ue_id.gnb_cu_up.ran_ue_id); // RAN UE NGAP ID + } + current_ue_id = ue_id.gnb_cu_up.gnb_cu_cp_ue_e1ap; // Update the global UE ID +} + +typedef void (*log_ue_id)(ue_id_e2sm_t ue_id); + +static log_ue_id log_ue_id_e2sm[END_UE_ID_E2SM] = { + log_gnb_ue_id, // common for gNB-mono, CU and CU-CP + log_du_ue_id, + log_cuup_ue_id, + NULL, + NULL, + NULL, + NULL, +}; + +void reset_measurement_buffers() +{ + memset(influx_fields_buffer, 0, sizeof(influx_fields_buffer)); +} + +void influxdb_clear_bucket() +{ + char cmd[2048]; + char current_time_iso[64]; + + // Get current time in ISO 8601 format (UTC) + time_t now = time(NULL); + struct tm *utc_time = gmtime(&now); + strftime(current_time_iso, sizeof(current_time_iso), "%Y-%m-%dT%H:%M:%SZ", utc_time); + + snprintf(cmd, sizeof(cmd), + "curl --request POST '%s/api/v2/delete?org=%s&bucket=%s' " + "--header 'Authorization: Token %s' " + "--header 'Content-Type: application/json' " + "--data '{\"start\":\"1970-01-01T00:00:00Z\",\"stop\":\"%s\"}' || echo 'InfluxDB delete failed'", + influxdb_url, influxdb_org, influxdb_bucket, influxdb_token, current_time_iso); + + printf("Clearing InfluxDB data from previous runs...\n"); + system(cmd); + printf("InfluxDB data cleared successfully up to %s.\n", current_time_iso); +} + +void influxdb_write(char *line_protocol) +{ + char cmd[2048]; + + snprintf(cmd, sizeof(cmd), + "curl -XPOST '%s/api/v2/write?org=%s&bucket=%s&precision=ms' " + "--header 'Authorization: Token %s' " + "--data-raw '%s' || echo 'InfluxDB write failed'", + influxdb_url, influxdb_org, influxdb_bucket, influxdb_token, line_protocol); + + system(cmd); +} + +// At the end of the measurement cycle, send the metrics to InfluxDB +void send_metrics_to_influxdb(uint64_t ue_id, int64_t timestamp_ms, char *fields_buffer) +{ + char line_protocol[1024]; + + // Ensure there's a trailing comma if not already present + size_t len = strlen(fields_buffer); + if (len > 0 && fields_buffer[len - 1] != ',') + { + strcat(fields_buffer, ","); + } + + // Round down the timestamp to the nearest multiple of 1000 so that multiple UEs in the same window can share the same timestamp + timestamp_ms = timestamp_ms - (timestamp_ms % 1000); + + // Construct Line Protocol (measurement: kpm_measurements) with UE_ID as a field + snprintf(line_protocol, sizeof(line_protocol), + "kpm_measurements %sUE_ID=%" PRIu64 "i %ld", + fields_buffer, ue_id, timestamp_ms); + + // Print metrics to the console + printf("Metrics for UE ID %" PRIu64 ": %s (timestamp: %ld ms)\n", ue_id, fields_buffer, timestamp_ms); + + // Send metrics to InfluxDB + influxdb_write(line_protocol); +} + +bool sanitize_metric_name(const byte_array_t *name, char *out, size_t out_size) +{ + size_t j = 0; + for (size_t i = 0; i < name->len && j < out_size - 1; i++) + { + char c = name->buf[i]; + if ((c >= 'A' && c <= 'Z') || + (c >= 'a' && c <= 'z') || + (c >= '0' && c <= '9') || + c == '_' || c == '-' || c == '.') + { + out[j++] = c; + } + // Skip invalid characters + } + out[j] = '\0'; + return j > 0; +} + +static void log_int_value(byte_array_t name, meas_record_lst_t meas_record) +{ + byte_array_t unit = {.buf = "", .len = 0}; + + if (cmp_str_ba("RRU.PrbTotDl", name) == 0) + { + unit.buf = "PRBs"; + unit.len = strlen("PRBs"); + } + else if (cmp_str_ba("RRU.PrbTotUl", name) == 0) + { + unit.buf = "PRBs"; + unit.len = strlen("PRBs"); + } + else if (cmp_str_ba("DRB.PdcpSduVolumeDL", name) == 0) + { + unit.buf = "kb"; + unit.len = strlen("kb"); + } + else if (cmp_str_ba("DRB.PdcpSduVolumeUL", name) == 0) + { + unit.buf = "kb"; + unit.len = strlen("kb"); + } + else if (cmp_str_ba("N_RSRP_MEAS", name) == 0) + { + unit.buf = ""; + unit.len = 0; + } + else if (cmp_str_ba("N_PRB", name) == 0) + { + unit.buf = ""; + unit.len = 0; + } + else if (cmp_str_ba("CQI_SINGLE_CODEWORD", name) == 0) + { + unit.buf = ""; + unit.len = 0; + } + else if (cmp_str_ba("CQI_DUAL_CODEWORD", name) == 0) + { + unit.buf = ""; + unit.len = 0; + } + else + { + unit.buf = ""; + unit.len = 0; + } + // if (cmp_str_ba("RRU.PrbTotDl", name) == 0) { + // printf("RRU.PrbTotDl = %d [PRBs]\n", meas_record.int_val); + // } else if (cmp_str_ba("RRU.PrbTotUl", name) == 0) { + // printf("RRU.PrbTotUl = %d [PRBs]\n", meas_record.int_val); + // } else if (cmp_str_ba("DRB.PdcpSduVolumeDL", name) == 0) { + // printf("DRB.PdcpSduVolumeDL = %d [kb]\n", meas_record.int_val); + // } else if (cmp_str_ba("DRB.PdcpSduVolumeUL", name) == 0) { + // printf("DRB.PdcpSduVolumeUL = %d [kb]\n", meas_record.int_val); + // } else if (...) { + // } else { + // printf("Measurement Name not yet supported\n"); + // } + char safe_metric_name[128]; + if (!sanitize_metric_name(&name, safe_metric_name, sizeof(safe_metric_name))) + { + fprintf(stderr, "Invalid metric name detected.\n"); + return; + } + + char influx_field_name[128]; + if (unit.len > 0) + { + snprintf(influx_field_name, sizeof(influx_field_name), "%s_%.*s", safe_metric_name, (int)unit.len, unit.buf); + } + else + { + snprintf(influx_field_name, sizeof(influx_field_name), "%s", safe_metric_name); + } + + char influx_field[256]; + snprintf(influx_field, sizeof(influx_field), "%s=%di,", influx_field_name, meas_record.int_val); + strncat(influx_fields_buffer, influx_field, sizeof(influx_fields_buffer) - strlen(influx_fields_buffer) - 1); + + // If the measurement is N_RSRP_MEAS and the value is 0, the data is invalid + if (cmp_str_ba("N_RSRP_MEAS", name) == 0) + { + if (meas_record.int_val == 0) + { + filter_invalid_sample = true; + printf("\n\t!!! Invalid N_RSRP_MEAS value detected !!!\n\n"); + } + } +} + +static void log_real_value(byte_array_t name, meas_record_lst_t meas_record) +{ + byte_array_t unit = {.buf = "", .len = 0}; + + if (cmp_str_ba("DRB.RlcSduDelayDl", name) == 0) + { + unit.buf = "μs"; + unit.len = strlen("μs"); + } + else if (cmp_str_ba("DRB.UEThpDl", name) == 0) + { + unit.buf = "kbps"; + unit.len = strlen("kbps"); + } + else if (cmp_str_ba("DRB.UEThpUl", name) == 0) + { + unit.buf = "kbps"; + unit.len = strlen("kbps"); + } + else if (cmp_str_ba("RSRP", name) == 0) + { + unit.buf = "dBm"; + unit.len = strlen("dBm"); + } + else if (cmp_str_ba("RSSI", name) == 0) + { + unit.buf = "dBm"; + unit.len = strlen("dBm"); + } + else if (cmp_str_ba("RSRQ", name) == 0) + { + unit.buf = "dB"; + unit.len = strlen("dB"); + } + else if (cmp_str_ba("PUSCH_SNR", name) == 0) + { + unit.buf = "dB"; + unit.len = strlen("dB"); + } + else if (cmp_str_ba("PUCCH_SNR", name) == 0) + { + unit.buf = "dB"; + unit.len = strlen("dB"); + } + // if (cmp_str_ba("DRB.RlcSduDelayDl", name) == 0) { + // printf("DRB.RlcSduDelayDl = %.2f [μs]\n", meas_record.real_val); + // } else if (cmp_str_ba("DRB.UEThpDl", name) == 0) { + // printf("DRB.UEThpDl = %.2f [kbps]\n", meas_record.real_val); + // } else if (cmp_str_ba("DRB.UEThpUl", name) == 0) { + // printf("DRB.UEThpUl = %.2f [kbps]\n", meas_record.real_val); + // } else if (...) { + // } else { + // printf("Measurement Name not yet supported\n"); + // } + + char safe_metric_name[128]; + if (!sanitize_metric_name(&name, safe_metric_name, sizeof(safe_metric_name))) + { + fprintf(stderr, "Invalid metric name detected.\n"); + return; + } + + char influx_field_name[128]; + if (unit.len > 0) + { + snprintf(influx_field_name, sizeof(influx_field_name), "%s_%.*s", safe_metric_name, (int)unit.len, unit.buf); + } + else + { + snprintf(influx_field_name, sizeof(influx_field_name), "%s", safe_metric_name); + } + + char influx_field[256]; + snprintf(influx_field, sizeof(influx_field), "%s=%.2f,", influx_field_name, meas_record.real_val); + strncat(influx_fields_buffer, influx_field, sizeof(influx_fields_buffer) - strlen(influx_fields_buffer) - 1); +} + +typedef void (*log_meas_value)(byte_array_t name, meas_record_lst_t meas_record); + +static log_meas_value get_meas_value[END_MEAS_VALUE] = { + log_int_value, + log_real_value, + NULL, +}; + +static void match_meas_name_type(meas_type_t meas_type, meas_record_lst_t meas_record) +{ + // Get the value of the Measurement + get_meas_value[meas_record.value](meas_type.name, meas_record); +} + +static void match_id_meas_type(meas_type_t meas_type, meas_record_lst_t meas_record) +{ + (void)meas_type; + (void)meas_record; + assert(false && "ID Measurement Type not yet supported"); +} + +typedef void (*check_meas_type)(meas_type_t meas_type, meas_record_lst_t meas_record); + +static check_meas_type match_meas_type[END_MEAS_TYPE] = { + match_meas_name_type, + match_id_meas_type, +}; + +static void log_kpm_measurements(kpm_ind_msg_format_1_t const *msg_frm_1) +{ + assert(msg_frm_1->meas_info_lst_len > 0 && "Cannot correctly print measurements"); + + reset_measurement_buffers(); + + // UE Measurements per granularity period + for (size_t j = 0; j < msg_frm_1->meas_data_lst_len; j++) + { + meas_data_lst_t const data_item = msg_frm_1->meas_data_lst[j]; + + for (size_t z = 0; z < data_item.meas_record_len; z++) + { + meas_type_t const meas_type = msg_frm_1->meas_info_lst[z].meas_type; + meas_record_lst_t const record_item = data_item.meas_record_lst[z]; + + match_meas_type[meas_type.type](meas_type, record_item); + + if (data_item.incomplete_flag && *data_item.incomplete_flag == TRUE_ENUM_VALUE) + printf("Measurement Record not reliable"); + } + } + + if (!filter_invalid_sample) + { + // InfluxDB send: + int64_t now_ms = time_now_us() / 1000; + send_metrics_to_influxdb(current_ue_id, now_ms, influx_fields_buffer); + } + + filter_invalid_sample = false; + influx_num_samples++; + printf("Samples collected = %u\n", influx_num_samples); +} + +static void sm_cb_kpm(sm_ag_if_rd_t const *rd) +{ + assert(rd != NULL); + assert(rd->type == INDICATION_MSG_AGENT_IF_ANS_V0); + assert(rd->ind.type == KPM_STATS_V3_0); + + // Reading Indication Message Format 3 + kpm_ind_data_t const *ind = &rd->ind.kpm.ind; + kpm_ric_ind_hdr_format_1_t const *hdr_frm_1 = &ind->hdr.kpm_ric_ind_hdr_format_1; + kpm_ind_msg_format_3_t const *msg_frm_3 = &ind->msg.frm_3; + + int64_t const now = time_now_us(); + static int counter = 1; + { + lock_guard(&mtx); + + printf("\n%7d KPM ind_msg latency = %ld [μs]\n", counter, now - hdr_frm_1->collectStartTime); // xApp <-> E2 Node + + // Reported list of measurements per UE + for (size_t i = 0; i < msg_frm_3->ue_meas_report_lst_len; i++) + { + // log UE ID + ue_id_e2sm_t const ue_id_e2sm = msg_frm_3->meas_report_per_ue[i].ue_meas_report_lst; + ue_id_e2sm_e const type = ue_id_e2sm.type; + log_ue_id_e2sm[type](ue_id_e2sm); + + // log measurements + log_kpm_measurements(&msg_frm_3->meas_report_per_ue[i].ind_msg_format_1); + } + counter++; + } +} + +static test_info_lst_t filter_predicate(test_cond_type_e type, test_cond_e cond, int value) +{ + test_info_lst_t dst = {0}; + + dst.test_cond_type = type; + // It can only be TRUE_TEST_COND_TYPE so it does not matter the type + // but ugly ugly... + dst.S_NSSAI = TRUE_TEST_COND_TYPE; + + dst.test_cond = calloc(1, sizeof(test_cond_e)); + assert(dst.test_cond != NULL && "Memory exhausted"); + *dst.test_cond = cond; + + dst.test_cond_value = calloc(1, sizeof(test_cond_value_t)); + assert(dst.test_cond_value != NULL && "Memory exhausted"); + dst.test_cond_value->type = OCTET_STRING_TEST_COND_VALUE; + + dst.test_cond_value->octet_string_value = calloc(1, sizeof(byte_array_t)); + assert(dst.test_cond_value->octet_string_value != NULL && "Memory exhausted"); + const size_t len_nssai = 1; + dst.test_cond_value->octet_string_value->len = len_nssai; + dst.test_cond_value->octet_string_value->buf = calloc(len_nssai, sizeof(uint8_t)); + assert(dst.test_cond_value->octet_string_value->buf != NULL && "Memory exhausted"); + dst.test_cond_value->octet_string_value->buf[0] = value; + + return dst; +} + +static label_info_lst_t fill_kpm_label(void) +{ + label_info_lst_t label_item = {0}; + + label_item.noLabel = ecalloc(1, sizeof(enum_value_e)); + *label_item.noLabel = TRUE_ENUM_VALUE; + + return label_item; +} + +static kpm_act_def_format_1_t fill_act_def_frm_1(ric_report_style_item_t const *report_item) +{ + assert(report_item != NULL); + + kpm_act_def_format_1_t ad_frm_1 = {0}; + + size_t const sz = report_item->meas_info_for_action_lst_len; + + // [1, 65535] + ad_frm_1.meas_info_lst_len = sz; + ad_frm_1.meas_info_lst = calloc(sz, sizeof(meas_info_format_1_lst_t)); + assert(ad_frm_1.meas_info_lst != NULL && "Memory exhausted"); + + for (size_t i = 0; i < sz; i++) + { + meas_info_format_1_lst_t *meas_item = &ad_frm_1.meas_info_lst[i]; + // 8.3.9 + // Measurement Name + meas_item->meas_type.type = NAME_MEAS_TYPE; + meas_item->meas_type.name = copy_byte_array(report_item->meas_info_for_action_lst[i].name); + + // [1, 2147483647] + // 8.3.11 + meas_item->label_info_lst_len = 1; + meas_item->label_info_lst = ecalloc(1, sizeof(label_info_lst_t)); + meas_item->label_info_lst[0] = fill_kpm_label(); + } + + // 8.3.8 [0, 4294967295] + ad_frm_1.gran_period_ms = period_ms; + + // 8.3.20 - OPTIONAL + ad_frm_1.cell_global_id = NULL; + +#if defined KPM_V2_03 || defined KPM_V3_00 + // [0, 65535] + ad_frm_1.meas_bin_range_info_lst_len = 0; + ad_frm_1.meas_bin_info_lst = NULL; +#endif + + return ad_frm_1; +} + +static kpm_act_def_t fill_report_style_4(ric_report_style_item_t const *report_item) +{ + assert(report_item != NULL); + assert(report_item->act_def_format_type == FORMAT_4_ACTION_DEFINITION); + + kpm_act_def_t act_def = {.type = FORMAT_4_ACTION_DEFINITION}; + + // Fill matching condition + // [1, 32768] + act_def.frm_4.matching_cond_lst_len = 1; + act_def.frm_4.matching_cond_lst = calloc(act_def.frm_4.matching_cond_lst_len, sizeof(matching_condition_format_4_lst_t)); + assert(act_def.frm_4.matching_cond_lst != NULL && "Memory exhausted"); + // Filter connected UEs by S-NSSAI criteria + test_cond_type_e const type = S_NSSAI_TEST_COND_TYPE; // CQI_TEST_COND_TYPE + test_cond_e const condition = EQUAL_TEST_COND; // GREATERTHAN_TEST_COND + int const value = 1; + act_def.frm_4.matching_cond_lst[0].test_info_lst = filter_predicate(type, condition, value); + + // Fill Action Definition Format 1 + // 8.2.1.2.1 + act_def.frm_4.action_def_format_1 = fill_act_def_frm_1(report_item); + + return act_def; +} + +typedef kpm_act_def_t (*fill_kpm_act_def)(ric_report_style_item_t const *report_item); + +static fill_kpm_act_def get_kpm_act_def[END_RIC_SERVICE_REPORT] = { + NULL, + NULL, + NULL, + fill_report_style_4, + NULL, +}; + +static kpm_sub_data_t gen_kpm_subs(kpm_ran_function_def_t const *ran_func) +{ + assert(ran_func != NULL); + assert(ran_func->ric_event_trigger_style_list != NULL); + + kpm_sub_data_t kpm_sub = {0}; + + // Generate Event Trigger + assert(ran_func->ric_event_trigger_style_list[0].format_type == FORMAT_1_RIC_EVENT_TRIGGER); + kpm_sub.ev_trg_def.type = FORMAT_1_RIC_EVENT_TRIGGER; + kpm_sub.ev_trg_def.kpm_ric_event_trigger_format_1.report_period_ms = period_ms; + + // Generate Action Definition + kpm_sub.sz_ad = 1; + kpm_sub.ad = calloc(kpm_sub.sz_ad, sizeof(kpm_act_def_t)); + assert(kpm_sub.ad != NULL && "Memory exhausted"); + + // Multiple Action Definitions in one SUBSCRIPTION message is not supported in this project + // Multiple REPORT Styles = Multiple Action Definition = Multiple SUBSCRIPTION messages + ric_report_style_item_t *const report_item = &ran_func->ric_report_style_list[0]; + ric_service_report_e const report_style_type = report_item->report_style_type; + *kpm_sub.ad = get_kpm_act_def[report_style_type](report_item); + + return kpm_sub; +} + +static bool eq_sm(sm_ran_function_t const *elem, int const id) +{ + if (elem->id == id) + return true; + + return false; +} + +static size_t find_sm_idx(sm_ran_function_t *rf, size_t sz, bool (*f)(sm_ran_function_t const *, int const), int const id) +{ + for (size_t i = 0; i < sz; i++) + { + if (f(&rf[i], id)) + return i; + } + + assert(0 != 0 && "SM ID could not be found in the RAN Function List"); +} + +int main(int argc, char *argv[]) +{ + if (argc < 2) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + return EXIT_FAILURE; + } + + strncpy(influxdb_token, argv[1], sizeof(influxdb_token) - 1); + + fr_args_t args = init_fr_args(argc, argv); + + if (clear_database_on_startup == true) + { + influxdb_clear_bucket(); + } + + // Init the xApp + init_xapp_api(&args); + sleep(1); + + e2_node_arr_xapp_t nodes = e2_nodes_xapp_api(); + defer({ free_e2_node_arr_xapp(&nodes); }); + + assert(nodes.len > 0); + + printf("Connected E2 nodes = %d\n", nodes.len); + + pthread_mutexattr_t attr = {0}; + int rc = pthread_mutex_init(&mtx, &attr); + assert(rc == 0); + + sm_ans_xapp_t *hndl = calloc(nodes.len, sizeof(sm_ans_xapp_t)); + assert(hndl != NULL); + + //////////// + // START KPM + //////////// + int const KPM_ran_function = 2; + + for (size_t i = 0; i < nodes.len; ++i) + { + e2_node_connected_xapp_t *n = &nodes.n[i]; + + size_t const idx = find_sm_idx(n->rf, n->len_rf, eq_sm, KPM_ran_function); + assert(n->rf[idx].defn.type == KPM_RAN_FUNC_DEF_E && "KPM is not the received RAN Function"); + // if REPORT Service is supported by E2 node, send SUBSCRIPTION + // e.g. OAI CU-CP + if (n->rf[idx].defn.kpm.ric_report_style_list != NULL) + { + // Generate KPM SUBSCRIPTION message + kpm_sub_data_t kpm_sub = gen_kpm_subs(&n->rf[idx].defn.kpm); + + hndl[i] = report_sm_xapp_api(&n->id, KPM_ran_function, &kpm_sub, sm_cb_kpm); + assert(hndl[i].success == true); + + free_kpm_sub_data(&kpm_sub); + } + } + //////////// + // END KPM + //////////// + + sleep(10); + while (run_forever) + sleep(10); + + for (int i = 0; i < nodes.len; ++i) + { + // Remove the handle previously returned + if (hndl[i].success == true) + rm_report_sm_xapp_api(hndl[i].u.handle); + } + free(hndl); + + // Stop the xApp + while (try_stop_xapp_api() == false) + usleep(1000); + + printf("Test xApp run SUCCESSFULLY\n"); +} diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/git_clone.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/git_clone.sh similarity index 100% rename from OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/git_clone.sh rename to OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/git_clone.sh diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/install_influxdb.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/install_influxdb.sh new file mode 100755 index 0000000..a589710 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/install_influxdb.sh @@ -0,0 +1,91 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Exit immediately if a command fails +set -e +set -x + +# Initial configuration parameters for InfluxDB initialization +INFLUXDB_ORG="xapp-kpm-moni" +INFLUXDB_BUCKET="xapp-kpm-moni" +INFLUXDB_ROOT_USER="root" +INFLUXDB_ROOT_PASS="g10bNbAj31@K" +INFLUXDB_ROOT_TOKEN="A684h862N3b01j3KJC04Ssf2K1H95L2" + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +echo "# Script: $(realpath $0)..." + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +# Code from (https://docs.influxdata.com/influxdb/v2/install/?t=Linux): +# Ubuntu and Debian +# Add the InfluxData key to verify downloads and add the repository +curl --silent --location -O \ + https://repos.influxdata.com/influxdata-archive.key +echo "943666881a1b8d9b849b74caebf02d3465d6beb716510d86a39f6c8e8dac7515 influxdata-archive.key" | + sha256sum --check - && cat influxdata-archive.key | + gpg --dearmor | + sudo tee /etc/apt/trusted.gpg.d/influxdata-archive.gpg >/dev/null && + echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive.gpg] https://repos.influxdata.com/debian stable main' | + sudo tee /etc/apt/sources.list.d/influxdata.list +# Install influxdb +sudo apt-get update && sudo apt-get install -y influxdb2 + +# Make sure InfluxDB does not start on boot (manual start only) +sudo systemctl disable influxdb + +# Stop the InfluxDB service if it is running +sudo systemctl stop influxdb + +# Start the InfluxDB service manually +sudo service influxdb start + +if [ -f influxdata-archive.key ]; then + echo "Initializing InfluxDB 2.x..." + influx setup \ + --username "$INFLUXDB_ROOT_USER" \ + --password "$INFLUXDB_ROOT_PASS" \ + --org "$INFLUXDB_ORG" \ + --bucket "$INFLUXDB_BUCKET" \ + --retention 0 \ + --token "$INFLUXDB_ROOT_TOKEN" \ + --force + # Clean up the key file + sudo rm -f influxdata-archive.key +fi + +echo "Successfully installed InfluxDB 2.x" +echo "InfluxDB 2.x is running on port 8086 and will not start on boot." diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/start_influxdb_service.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/start_influxdb_service.sh new file mode 100755 index 0000000..b9f6bbd --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/start_influxdb_service.sh @@ -0,0 +1,56 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Exit immediately if a command fails +set -e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +echo "# Script: $(realpath $0)..." + +if systemctl is-active --quiet influxdb; then + echo "InfluxDB is already running." + exit 0 +fi + +# Start the InfluxDB service manually +sudo service influxdb start + +echo "InfluxDB status:" +sudo systemctl status influxdb +if [ $? -ne 0 ]; then + echo "Failed to start InfluxDB service." + exit 1 +fi + +echo "InfluxDB service started." diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/start_sudo_refresh.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/start_sudo_refresh.sh similarity index 100% rename from OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/start_sudo_refresh.sh rename to OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/start_sudo_refresh.sh diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/stop_influxdb_service.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/stop_influxdb_service.sh new file mode 100755 index 0000000..b6f0bc8 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/stop_influxdb_service.sh @@ -0,0 +1,52 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Exit immediately if a command fails +set -e + +# This script will stop the InfluxDB service. + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +echo "# Script: $(realpath $0)..." + +# Stop the InfluxDB service if it is running +sudo systemctl stop influxdb + +# Check if the service is stopped +if systemctl is-active --quiet influxdb; then + echo "Failed to stop InfluxDB service." + exit 1 +fi + +echo "InfluxDB service stopped." diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/stop_sudo_refresh.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/stop_sudo_refresh.sh similarity index 100% rename from OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/stop_sudo_refresh.sh rename to OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/stop_sudo_refresh.sh diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/stop_xapps.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/stop_xapps.sh new file mode 100755 index 0000000..d2a682e --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/stop_xapps.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +if pgrep -f "xapp_kpm_moni_write_to_csv" >/dev/null; then + echo "Stopping xApp KPM Moni (CSV)..." + pkill -f "xapp_kpm_moni_write_to_csv" +fi + +if pgrep -f "xapp_kpm_moni " >/dev/null; then + echo "Stopping xApp KPM Moni..." + pkill -f "xapp_kpm_moni" +fi + +if pgrep -f "xapp_rc_moni" >/dev/null; then + echo "Stopping xApp RC Moni..." + pkill -f "xapp_rc_moni" +fi + +if pgrep -f "xapp_kpm_rc" >/dev/null; then + echo "Stopping xApp KPM RC..." + pkill -f "xapp_kpm_rc" +fi + +if pgrep -f "xapp_gtp_mac_rlc_pdcp_moni" >/dev/null; then + echo "Stopping xApp GTP MAC RLC PDCP Moni..." + pkill -f "xapp_gtp_mac_rlc_pdcp_moni" +fi diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/sudo_stay_validated.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/sudo_stay_validated.sh similarity index 100% rename from OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/sudo_stay_validated.sh rename to OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/sudo_stay_validated.sh diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/uninstall_influxdb.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/uninstall_influxdb.sh new file mode 100755 index 0000000..31c7bce --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/install_scripts/uninstall_influxdb.sh @@ -0,0 +1,63 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Do not exit immediately if a command fails +set +e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +echo "# Script: $(realpath $0)..." + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +INFLUXDB_TOKEN_PATH="$PARENT_DIR/influxdb_auth_token.json" + +echo "Uninstalling InfluxDB 2.x..." + +sudo ./install_scripts/stop_influxdb_service.sh + +sudo apt remove -y influxdb +sudo apt remove -y influxdb-client +sudo apt remove -y influxdb2 +sudo apt autoclean -y && sudo apt autoremove -y + +sudo rm -rf /var/lib/influxdb/ +sudo rm -rf /var/log/influxdb/ +sudo rm -rf /etc/influxdb/ +sudo rm -rf ~/.influxdbv2/configs + +if [ -f "$INFLUXDB_TOKEN_PATH" ]; then + sudo rm -rf "$INFLUXDB_TOKEN_PATH" +fi diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/is_running.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/is_running.sh new file mode 100755 index 0000000..69a6062 --- /dev/null +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/is_running.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +cd "$SCRIPT_DIR" + +if pgrep -x "nearRT-RIC" >/dev/null; then + echo "FlexRIC: RUNNING" +else + echo "FlexRIC: NOT_RUNNING" +fi + +if systemctl is-active grafana-server &>/dev/null; then + if pgrep -f "grafana_host_kpi_metrics_over_http.py" >/dev/null; then + echo "Grafana: RUNNING (with HTTP server)" + else + echo "Grafana: RUNNING" + fi +else + if pgrep -f "grafana_host_kpi_metrics_over_http.py" >/dev/null; then + echo "Grafana: NOT_RUNNING (with HTTP server)" + fi +fi + +if pgrep -f "xapp_kpm_moni_write_to_csv" >/dev/null; then + echo "xApp KPM Moni (CSV): RUNNING" +fi + +if pgrep -f "xapp_kpm_moni " >/dev/null; then + echo "xApp KPM Moni: RUNNING" +fi + +if pgrep -f "xapp_rc_moni" >/dev/null; then + echo "xApp RC Moni: RUNNING" +fi + +if pgrep -f "xapp_kpm_rc" >/dev/null; then + echo "xApp KPM RC: RUNNING" +fi + +if pgrep -f "xapp_gtp_mac_rlc_pdcp_moni" >/dev/null; then + echo "xApp GTP MAC RLC PDCP Moni: RUNNING" +fi diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/run.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/run.sh similarity index 97% rename from OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/run.sh rename to OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/run.sh index e18fdfa..b10aadb 100755 --- a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/run.sh +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/run.sh @@ -31,8 +31,6 @@ # Exit immediately if a command fails set -e -# Guide: https://gitlab.eurecom.fr/mosaic5g/flexric - if ! command -v realpath &>/dev/null; then echo "Package \"coreutils\" not found, installing..." sudo apt-get install -y coreutils diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/run_background.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/run_background.sh similarity index 93% rename from OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/run_background.sh rename to OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/run_background.sh index 3779dff..e6e6203 100755 --- a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/run_background.sh +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/run_background.sh @@ -46,11 +46,10 @@ else echo "Starting flexric in background..." mkdir -p logs - sudo chown -R $USER:$USER logs >logs/flexric_stdout.txt cd "$SCRIPT_DIR/flexric" - sudo setsid bash -c "stdbuf -oL -eL ./build/examples/ric/nearRT-RIC -c \"../configs/flexric.conf\" > ../logs/flexric_stdout.txt 2>&1" ../logs/flexric_stdout.txt 2>&1" /dev/null; then echo "Package \"coreutils\" not found, installing..." sudo apt-get install -y coreutils fi SCRIPT_DIR=$(dirname "$(realpath "$0")") -PARENT_DIR=$(dirname "$SCRIPT_DIR") -cd "$PARENT_DIR/flexric/" +cd "$SCRIPT_DIR/flexric/" + +CONFIG_PATH="" +if [ -f "../configs/flexric.conf" ]; then + CONFIG_PATH="-c ../configs/flexric.conf" +fi -./build/examples/xApp/c/monitor/xapp_kpm_moni +./build/examples/xApp/c/monitor/xapp_kpm_moni $CONFIG_PATH diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/stop.sh b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/stop.sh similarity index 90% rename from OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/stop.sh rename to OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/stop.sh index 074ce9b..1cc87c0 100755 --- a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/stop.sh +++ b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/stop.sh @@ -39,12 +39,21 @@ cd "$SCRIPT_DIR" # Upon exit, restore the terminal to a sane state trap 'stty sane; exit' EXIT SIGINT SIGTERM -# Check if the FlexRIC is already stopped -if $(./is_running.sh | grep -q "FlexRIC: NOT_RUNNING"); then +# Check if the components are already stopped +if ! $(./is_running.sh | grep -q ": RUNNING"); then ./is_running.sh exit 0 fi +echo "Stopping xApps..." +./additional_scripts/stop_xapps.sh + +echo "Stopping Grafana..." +./additional_scripts/stop_grafana.sh + +# Prevent the subsequent command from requiring credential input +sudo ls >/dev/null 2>&1 + # Send a graceful shutdown signal to the FlexRIC process sudo pkill -f "nearRT-RIC" >/dev/null 2>&1 & diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/README.md b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/README.md deleted file mode 100755 index f4db0ee..0000000 --- a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/README.md +++ /dev/null @@ -1,34 +0,0 @@ -## Flexible RAN Intelligent Controller (FlexRIC) - -The Near-RT RIC, conceptualized by the O-RAN Alliance's Working Group 3 (WG3) [[1]][oran-wg3] and implemented by Mosaic5G [[2]][publication-nearrtric][[3]][mosaic5g-nearrtric], enables dynamic management and optimization of Radio Access Networks (RAN). - -## Usage - -- **Compile**: Use `./full_install.sh` to build the Near-RT RIC software. -- **Generate Configurations**: Use `./generate_configurations.sh` to create configuration files. - - Configuration files can be accessed and modified in the `configs` directory. -- **Start the Near-RT RIC**: Use `./run.sh` to start the Near-RT RIC application. -- **Stop the Near-RT RIC**: Terminate the Near-RT RIC with `./stop.sh`. -- **Status**: Check if the Near-RT RIC is running with `./is_running.sh`. -- **Logs**: Access logs by navigating to the `logs` directory. - -## Installing an xApp -This implementation of the Near-RT RIC showcases two xApps. - -- **KPI Monitoring xApp (xapp_kpm_moni)**: - - Run with `./additional_scripts/run_xapp_kpi_monitor.sh`. -- **RIC Control xApp (xapp_kpm_rc)**: - - Run with `./additional_scripts/run_xapp_ric_control.sh`. - -## References - -1. Working Group 3: Near-Real-time RAN Intelligent Controller and E2 Interface Workgroup. O-RAN Alliance. [https://public.o-ran.org/display/WG3/Introduction][oran-wg3] -2. FlexRIC: an SDK for next-generation SD-RANs. R. Schmidt, M. Irazabal, N. Nikaein. [https://dl.acm.org/doi/10.1145/3485983.3494870][publication-nearrtric] -3. Flexible RAN Intelligent Controller (FlexRIC) and E2 Agent. Mosaic5G. [https://gitlab.eurecom.fr/mosaic5g/flexric][mosaic5g-nearrtric] - - - -[oran-wg3]: https://public.o-ran.org/display/WG3/Introduction -[publication-nearrtric]: https://dl.acm.org/doi/10.1145/3485983.3494870 -[mosaic5g-nearrtric]: https://gitlab.eurecom.fr/mosaic5g/flexric - diff --git a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/configs/flexric.conf b/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/configs/flexric.conf deleted file mode 100755 index 3355124..0000000 --- a/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Near-Real-Time-RIC/configs/flexric.conf +++ /dev/null @@ -1,6 +0,0 @@ -[NEAR-RIC] -NEAR_RIC_IP = 127.0.0.1 - -[XAPP] -DB_NAME = xapp_db1 -DB_DIR = /tmp/ diff --git a/OpenAirInterface_Testbed/README.md b/OpenAirInterface_Testbed/README.md old mode 100755 new mode 100644 index 0b95d0b..85c2f95 --- a/OpenAirInterface_Testbed/README.md +++ b/OpenAirInterface_Testbed/README.md @@ -1,17 +1,34 @@ ## OpenAirInterface Testbed -This testbed consists of the 5G Core Network by Open5GS [[1]][open5gs-core], gNodeB and 5G UE by OpenAirInterface [[2]][oai-ue-gnb], and FlexRIC by Mosaic5G [[3]][mosaic-flexric]. +This testbed deployment consists of a 5G Core Network by Open5GS [[1]][open5gs-core], gNodeB and 5G UE by OpenAirInterface [[2]][oai-ue-gnb], and FlexRIC by Mosaic5G [[3]][mosaic-flexric]. ## Usage -- **Installation**: Use `./full_install.sh` to build the testbed components. +- **Installation**: Use `./full_install.sh` to build and install the testbed components, and `./full_uninstall.sh` to remove them. - **Generate Configurations**: Use `./generate_configurations.sh` to create configuration files for each testbed component. -- **Start the Testbed**: Use `./run.sh` to start the testbed components. +- **Start the Testbed**: Use `./run.sh` to start the 5G Core, FlexRIC, gNodeB, and UE as background processes, and KPI monitoring xApp in the foreground. + - To start the testbed components but use a modified KPI monitor xApp that logs the metrics to file and a Grafana dashboard to fetch and visualize the metrics in real-time, use `./run_with_grafana_dashboard.sh`. +- **Run an xApp**: Once all components are running and properly connected, use the `./run_xapp_*` scripts within the RAN_Intelligent_Controllers/FlexRIC/additional_scripts directory to interact with the gNodeB and UE. - **Stop the Testbed**: Terminate the testbed components with `./stop.sh`. -- **Status**: Check if the testbed components are running with `./is_running.sh`. - -> [!IMPORTANT] -> OpenAirInterface's support for Linux Mint is limited. It is recommended to use Ubuntu. +- **Status**: Check which testbed components are running with `./is_running.sh`. +- **Debugging Information**: Configuration files are in the `configs/` directory, and log files are located in the `logs/` directory for each component. + +## Potential Cause for Build Errors +It may be required for the AVX2 instruction set to be available on the host machine installing the OpenAirInterface testbed. + +
+ Enabling VT-x/AMD-V for the AVX2 instruction set +
+ When running a VM to build OpenAirInterface5G, compilation errors may occur if not using VT-x/AMD-V due to an unsupported AVX2 instruction set. In VirtualBox, the lower right corner will show a "V" icon if using VT-x/AMD-V, otherwise, it will show a turtle icon. Additionally, AVX2 support can be verified by checking that `cat /proc/cpuinfo | grep avx2` is not empty. The following steps can be taken to ensure that VT-x/AMD-V is enabled in a VirtualBox VM. + + - **CPU Virtualization Support**: Look up if the CPU model supports virtualization and ensure that it is enabled in the BIOS. + - **Disable Hyper-V**: Hyper-V may prevent VT-x/AMD-V from being enabled. If using Windows, the following options should be unchecked in the "Turn Windows features on or off" settings: "Hyper-V", "Windows Hypervisor Platform", and "Virtual Machine Platform". If a change is made, a reboot is required. + - **VirtualBox**: From the VirtualBox Manager, select the VM and click the "Information" tab. Look for "Acceleration: VT-x/AMD-V". + - If the VM shows this but the AVX2 instruction set is still disabled, then disabling core isolation is a potential reason. Please exercise extreme caution as it is not advised to disable core isolation. However, it can be disabled in the "Windows Security" settings by unchecking "Memory Integrity" and rebooting. + - If `cat /proc/cpuinfo | grep avx2` is not empty, then OpenAirInterface should be able to build without issues. +
+ +--- ## References diff --git a/OpenAirInterface_Testbed/User_Equipment/.gitignore b/OpenAirInterface_Testbed/User_Equipment/.gitignore old mode 100755 new mode 100644 index da8a86b..f6a49f7 --- a/OpenAirInterface_Testbed/User_Equipment/.gitignore +++ b/OpenAirInterface_Testbed/User_Equipment/.gitignore @@ -1,4 +1,7 @@ # Ignore testbed subdirectories +/configs/ /logs/ /openairinterface5g/ +openairinterface5g install_time.txt +!install_patch_files/ diff --git a/OpenAirInterface_Testbed/User_Equipment/README.md b/OpenAirInterface_Testbed/User_Equipment/README.md old mode 100755 new mode 100644 index 3e4b66c..1a2b998 --- a/OpenAirInterface_Testbed/User_Equipment/README.md +++ b/OpenAirInterface_Testbed/User_Equipment/README.md @@ -4,13 +4,27 @@ The following scripts operationalize a 5G User Equipment (UE) configured with Op ## Usage -- **Compile**: Use `./full_install.sh` to build the UE software. +- **Compile**: Use `./full_install.sh` to build and install the UE software. - **Generate Configurations**: Use `./generate_configurations.sh` to create configuration files. - Configuration files can be accessed and modified in the `configs` directory. - **Start the UE**: Use `./run.sh` to start the UE, or `./run_background.sh` to run it as a background process where the output is redirected to `logs/ue1_stdout.txt`. + - To operate multiple UEs, execute `./run.sh ` or `./run_background.sh `, where `` is an identifying number for the UE. If the subscriber information for `` is not registered with the 5G Core, the script will automatically generate and register the subscriber information before starting the UE. - **Stop the UE**: Terminate the UE with `./stop.sh`. -- **Status**: Check is a UE is running with `./is_running.sh`. + - To stop an individual UE, use `./stop.sh `. +- **Status**: Check running UEs with `./is_running.sh`. The output will display which UEs are running. - **Logs**: Access logs by navigating to the `logs` directory. +- **Uninstall**: Use `./uninstall.sh` to remove the UE/gNodeB software. + +## Multiple UEs + +The `run.sh`, `run_background.sh`, and `stop.sh` scripts can be given an optional `` argument (default: 1) to specify which UE to run or stop. Each UE is assigned the following unique parameters: + +- IMEI +- IMSI +- Key +- Network namespace + +For UE 1, UE 2, and UE 3, the SIM subscriber information is pre-registered with the 5G Core Network. For `` values greater than 3, the unique values are generated dynamically, registered with the 5G Core, and stored in the `configs` directory as their own `ue.conf` file before starting the UE software. For more information about the parameters refer to the `run.sh` script source code. ## References diff --git a/OpenAirInterface_Testbed/User_Equipment/additional_scripts/open_ue_shell.sh b/OpenAirInterface_Testbed/User_Equipment/additional_scripts/open_ue_shell.sh new file mode 100755 index 0000000..3d0f280 --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/additional_scripts/open_ue_shell.sh @@ -0,0 +1,70 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +UE_NUMBER=1 +if [ "$#" -eq 1 ]; then + UE_NUMBER=$1 +fi +if ! [[ $UE_NUMBER =~ ^[0-9]+$ ]]; then + echo "Error: UE number must be a number." + exit 1 +fi +if [ $UE_NUMBER -lt 1 ]; then + echo "Error: UE number must be greater than or equal to 1." + exit 1 +fi + +if [ ! -f "configs/ue1.conf" ]; then + echo "Configuration was not found for nr-uesoftmodem. Please run ./generate_configurations.sh first." + exit 1 +fi + +UE_NAMESPACE="ue$UE_NUMBER" + +# If the namespace doesn't exist +if ! ip netns list | grep -q "$UE_NAMESPACE"; then + echo "Error: Namespace $UE_NAMESPACE does not exist. Please start the UE first with: ./run_background.sh $UE_NUMBER" + exit 1 +fi + +echo "Opening shell in UE $UE_NUMBER namespace..." + +sudo ip netns exec $UE_NAMESPACE bash + +echo "Shell in UE $UE_NUMBER namespace closed." diff --git a/OpenAirInterface_Testbed/User_Equipment/additional_scripts/simulate_ue_traffic_to_core.sh b/OpenAirInterface_Testbed/User_Equipment/additional_scripts/simulate_ue_traffic_to_core.sh new file mode 100755 index 0000000..bb1092a --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/additional_scripts/simulate_ue_traffic_to_core.sh @@ -0,0 +1,119 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +UE_NUMBER=$1 +BANDWIDTH=${2:-1M} +DURATION=${3:-60} + +if [[ -z "$UE_NUMBER" ]]; then + echo "Error: No UE number provided." + echo "Usage: $0 [BANDWIDTH] [DURATION]" + echo " BANDWIDTH is optional and can be specified in units [k, K, m, M]. Default is 1M." + echo " DURATION is optional and specifies the duration in seconds. Default is 60." + exit 1 +fi + +if ! [[ $UE_NUMBER =~ ^[0-9]+$ ]]; then + echo "Error: UE number must be a number." + exit 1 +fi + +if [ $UE_NUMBER -lt 1 ]; then + echo "Error: UE number must be greater than or equal to 1." + exit 1 +fi + +if ! [[ $BANDWIDTH =~ ^[0-9]+[kKmM]$ ]]; then + echo "Error: BANDWIDTH must be a number followed by a unit [k, K, m, M]." + exit 1 +fi + +if ! [[ $DURATION =~ ^[0-9]+$ ]]; then + echo "Error: DURATION must be a positive integer." + exit 1 +fi + +if [ $DURATION -lt 1 ]; then + echo "Error: DURATION must be greater than or equal to 1." + exit 1 +fi + +if [ ! -f "configs/ue1.conf" ]; then + echo "Configuration was not found for nr-uesoftmodem. Please run ./generate_configurations.sh first." + exit 1 +fi + +UE_NAMESPACE="ue$UE_NUMBER" + +# If the namespace doesn't exist +if ! ip netns list | grep -q "$UE_NAMESPACE"; then + echo "Error: Namespace $UE_NAMESPACE does not exist. Please start the UE first with: ./run_background.sh $UE_NUMBER" + exit 1 +fi + +# Extract the first IPv4 address from a CIDR block by replacing the last octet with '.1' +# For example, 10.45.0.0/16 --> 10.45.0.1/16 +grab_first_ipv4_address() { + local IP=$1 + echo ${IP%.*}.1/${IP#*/} +} + +# Remove the CIDR suffix from an IP address +# For example, 10.45.0.1/16 --> 10.45.0.1 +remove_cidr_suffix() { + local IP=$1 + echo ${IP%/*} +} + +LOG_FILE="logs/ue${UE_NUMBER}_stdout.txt" +PDU_SESSION_IP=$(cat $LOG_FILE | grep "Received PDU Session Establishment Accept" | cut -d ':' -f2 | xargs) + +if [ -z "$PDU_SESSION_IP" ]; then + echo "Error: Unable to find PDU Session IP from the log file $LOG_FILE." + exit 1 +fi + +echo "Successfully found PDU Session IP: $PDU_SESSION_IP" + +if ! command -v iperf &>/dev/null; then + echo "Package \"iperf\" not found, installing..." + sudo apt-get install -y iperf +fi + +sudo ip netns exec ue$UE_NUMBER iperf -c $PDU_SESSION_IP -u -i 1 -b $BANDWIDTH -t $DURATION diff --git a/OpenAirInterface_Testbed/User_Equipment/configs/channelmod_rfsimu_LEO_satellite.conf b/OpenAirInterface_Testbed/User_Equipment/configs/channelmod_rfsimu_LEO_satellite.conf deleted file mode 100755 index 47acf0e..0000000 --- a/OpenAirInterface_Testbed/User_Equipment/configs/channelmod_rfsimu_LEO_satellite.conf +++ /dev/null @@ -1,16 +0,0 @@ -channelmod = { - max_chan=10; - modellist="modellist_rfsimu_1"; - modellist_rfsimu_1 = ( - { - model_name = "rfsimu_channel_enB0" - type = "SAT_LEO_TRANS"; - noise_power_dB = -100; - }, - { - model_name = "rfsimu_channel_ue0" - type = "SAT_LEO_TRANS"; - noise_power_dB = -100; - } - ); -}; diff --git a/OpenAirInterface_Testbed/User_Equipment/configs/ue1.conf b/OpenAirInterface_Testbed/User_Equipment/configs/ue1.conf deleted file mode 100755 index 556d99e..0000000 --- a/OpenAirInterface_Testbed/User_Equipment/configs/ue1.conf +++ /dev/null @@ -1,16 +0,0 @@ -uicc0 = { -imsi = "001010123456780"; -key = "00112233445566778899AABBCCDDEEFF"; -opc= "63BFA50EE6523365FF14C1F45F88737D"; -dnn= "srsapn"; -nssai_sst= 1; -#nssai_sd= 0xFFFFFF; -} - -position0 = { - x = 0.0; - y = 0.0; - z = 6377900.0; -} - -@include "channelmod_rfsimu_LEO_satellite.conf" diff --git a/OpenAirInterface_Testbed/User_Equipment/configs/ue2.conf b/OpenAirInterface_Testbed/User_Equipment/configs/ue2.conf deleted file mode 100755 index b596988..0000000 --- a/OpenAirInterface_Testbed/User_Equipment/configs/ue2.conf +++ /dev/null @@ -1,16 +0,0 @@ -uicc0 = { -imsi = "001010123456790"; -key = "00112233445566778899AABBCCDDEF00"; -opc= "63BFA50EE6523365FF14C1F45F88737D"; -dnn= "srsapn"; -nssai_sst= 1; -#nssai_sd= 0xFFFFFF; -} - -position0 = { - x = 0.0; - y = 0.0; - z = 6377900.0; -} - -@include "channelmod_rfsimu_LEO_satellite.conf" diff --git a/OpenAirInterface_Testbed/User_Equipment/configs/ue3.conf b/OpenAirInterface_Testbed/User_Equipment/configs/ue3.conf deleted file mode 100755 index 691530e..0000000 --- a/OpenAirInterface_Testbed/User_Equipment/configs/ue3.conf +++ /dev/null @@ -1,16 +0,0 @@ -uicc0 = { -imsi = "001010123456791"; -key = "00112233445566778899AABBCCDDEF01"; -opc= "63BFA50EE6523365FF14C1F45F88737D"; -dnn= "srsapn"; -nssai_sst= 1; -#nssai_sd= 0xFFFFFF; -} - -position0 = { - x = 0.0; - y = 0.0; - z = 6377900.0; -} - -@include "channelmod_rfsimu_LEO_satellite.conf" diff --git a/OpenAirInterface_Testbed/User_Equipment/full_install.sh b/OpenAirInterface_Testbed/User_Equipment/full_install.sh index cb4ad70..461936a 100755 --- a/OpenAirInterface_Testbed/User_Equipment/full_install.sh +++ b/OpenAirInterface_Testbed/User_Equipment/full_install.sh @@ -31,6 +31,8 @@ # Exit immediately if a command fails set -e +CLEAN_INSTALL=false + if ! command -v realpath &>/dev/null; then echo "Package \"coreutils\" not found, installing..." sudo apt-get install -y coreutils @@ -39,18 +41,26 @@ fi SCRIPT_DIR=$(dirname "$(realpath "$0")") cd "$SCRIPT_DIR" +if ! grep -q avx2 /proc/cpuinfo; then + echo "Warning: Support for AVX2 is not available on this machine. Errors may occur when building due to unsupported AVX instructions." + echo "Please consider following the instructions \"Enabling VT-x/AMD-V for the AVX2 instruction set\" in OpenAirInterface_Testbed/README.md." + echo + echo "Press any key to continue." + read -r -n 1 -s +fi + # Check if a symbolic link can be created to the openairinterface5g directory if [ ! -f "openairinterface5g/cmake_targets/build_oai" ]; then + sudo rm -rf openairinterface5g if [ -f "../Next_Generation_Node_B/openairinterface5g/cmake_targets/build_oai" ]; then - sudo rm -rf openairinterface5g echo "Creating symbolic link to openairinterface5g..." ln -s "../Next_Generation_Node_B/openairinterface5g" openairinterface5g fi fi # Check for UE binary to determine if srsRAN_Project is already installed -if [ -f "openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem" ]; then - echo "Open Air Interface UE is already installed, skipping." +if [ "$CLEAN_INSTALL" = false ] && [ -f "openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem" ]; then + echo "OpenAirInterface UE is already installed, skipping." exit 0 fi @@ -65,23 +75,12 @@ if [ ! -d "openairinterface5g" ]; then ./install_scripts/git_clone.sh https://gitlab.eurecom.fr/oai/openairinterface5g.git openairinterface5g fi -# Add support for Linux Mint 20, 21, and 22 to OpenAirInterface -if grep -q "Linux Mint" /etc/os-release; then - echo - echo "Linux Mint detected, attempting to patching OpenAirInterface to support Linux Mint 20, 21, and 22..." - cd openairinterface5g - git apply --verbose --ignore-whitespace "$SCRIPT_DIR/install_patch_files/openairinterface/cmake_targets/tools/build_helper.patch" || true - cd .. - echo "Patching completed." - echo -fi - -echo "Updating package lists..." -sudo apt-get update +echo "Patching OpenAirInterface..." +./install_scripts/apply_patches.sh echo echo -echo "Installing Open Air Interface User Equipment..." +echo "Installing OpenAirInterface User Equipment..." export DEBIAN_FRONTEND=noninteractive # Modifies the needrestart configuration to suppress interactive prompts if [ -f "/etc/needrestart/needrestart.conf" ]; then @@ -92,11 +91,43 @@ if [ -f "/etc/needrestart/needrestart.conf" ]; then fi export NEEDRESTART_SUSPEND=1 +# Check if GCC 13 is installed, if not, install it and set it as the default +GCC_VERSION=$(gcc -v 2>&1 | grep "gcc version" | awk '{print $3}') +if [[ -z "$GCC_VERSION" || ! "$GCC_VERSION" == 13.* ]]; then + echo "Installing GCC 13..." + sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + sudo apt-get update + sudo apt-get install -y gcc-13 g++-13 + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100 +fi + +if ! command -v cmake &>/dev/null; then + echo "Installing CMake..." + sudo apt-get update + sudo apt-get install -y cmake +fi +CMAKE_VERSION=$(cmake --version | head -n1 | awk '{print $3}') +if [[ "$CMAKE_VERSION" == 3.16.* ]]; then + echo "Detected CMake 3.16. Updating CMake for compatibility with OpenAirInterface..." + # Add Kitware's APT repository + wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc | sudo apt-key add - + sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main' + sudo apt update + sudo apt-get install -y cmake +fi + +ADDITIONAL_FLAGS="" +# if clean install is true, add flag -C +if [ "$CLEAN_INSTALL" = true ]; then + ADDITIONAL_FLAGS="-C" +fi + cd "$SCRIPT_DIR" echo echo -echo "Compiling and Installing Open Air Interface UE..." +echo "Compiling and Installing OpenAirInterface UE..." # Install OAI dependencies cd "$SCRIPT_DIR/openairinterface5g/cmake_targets" @@ -104,7 +135,7 @@ cd "$SCRIPT_DIR/openairinterface5g/cmake_targets" # Build OAI 5G UE cd "$SCRIPT_DIR/openairinterface5g/cmake_targets" -./build_oai --ninja --nrUE -w SIMU # -w USRP +./build_oai --ninja --nrUE -w SIMU $ADDITIONAL_FLAGS # -w USRP cd "$SCRIPT_DIR" diff --git a/OpenAirInterface_Testbed/User_Equipment/full_uninstall.sh b/OpenAirInterface_Testbed/User_Equipment/full_uninstall.sh new file mode 100755 index 0000000..8ec840c --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/full_uninstall.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Do not exit immediately if a command fails +set +e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +cd "$SCRIPT_DIR" + +echo "Stopping User Equipment..." +./stop.sh + +if [ -d openairinterface5g ]; then + cd "openairinterface5g/cmake_targets" + ./build_oai -C --clean-kernel + cd ../.. +fi +sudo rm -rf openairinterface5g + +sudo rm -rf logs/ +sudo rm -rf configs/ +sudo rm -rf install_time.txt + +cd ../Next_Generation_Node_B + +if [ -d openairinterface5g ]; then + cd "openairinterface5g/cmake_targets" + ./build_oai -C --clean-kernel + cd ../.. +fi +sudo rm -rf openairinterface5g + +sudo rm -rf logs/ +sudo rm -rf configs/ +sudo rm -rf install_time.txt + +cd "$SCRIPT_DIR" + +echo +echo +echo "################################################################################" +echo "# Successfully uninstalled OpenAirInterface UE and gNodeB #" +echo "################################################################################" diff --git a/OpenAirInterface_Testbed/User_Equipment/generate_configurations.sh b/OpenAirInterface_Testbed/User_Equipment/generate_configurations.sh index e6db735..3600952 100755 --- a/OpenAirInterface_Testbed/User_Equipment/generate_configurations.sh +++ b/OpenAirInterface_Testbed/User_Equipment/generate_configurations.sh @@ -63,7 +63,7 @@ comment_out() { sed -i "s|^\(\s*\)$STRING|#\1$STRING|" "$FILE_PATH" } -# Define the path to the YAML file +# Define the path to the 5G Core YAML file YAML_PATH="../../5G_Core_Network/options.yaml" if [ ! -f "$YAML_PATH" ]; then echo "Configuration not found in $YAML_PATH, please generate the configuration for 5G_Core_Network first." @@ -82,13 +82,14 @@ if [ -z "$TAC" ]; then exit 1 fi +# Parse Mobile Country Code (MCC) and Mobile Network Code (MNC) from PLMN MCC="${PLMN:0:3}" -MNC="${PLMN:3:2}" -if [ ${#MNC} -eq 2 ]; then - MNC_LENGTH=2 -else - MNC_LENGTH=3 +if [ ${#PLMN} -eq 5 ]; then + MNC="${PLMN:3:2}" +elif [ ${#PLMN} -eq 6 ]; then + MNC="${PLMN:3:3}" fi +MNC_LENGTH=${#MNC} echo "PLMN value: $PLMN" echo "TAC value: $TAC" @@ -102,9 +103,15 @@ if ! command -v yq &>/dev/null; then fi echo "Saving configuration file example..." -rm -rf "$SCRIPT_DIR/configs" -mkdir "$SCRIPT_DIR/configs" -rm -rf "$SCRIPT_DIR/logs" +rm -rf configs +mkdir configs + +# Only remove the logs if not running +RUNNING_STATUS=$(./is_running.sh) +if [[ $RUNNING_STATUS != *": RUNNING"* ]]; then + rm -rf logs + mkdir logs +fi for UE_NUMBER in {1..3}; do cp openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.conf "configs/ue$UE_NUMBER.conf" @@ -147,6 +154,12 @@ for UE_NUMBER in {1..3}; do UE_NAMESPACE="ue$UE_NUMBER" fi + # Ensure that the beginning of the IMSI is the correct PLMN + if [ ! -z "$PLMN" ]; then + PLMN_LENGTH=${#PLMN} + UE_IMSI="${PLMN}${UE_IMSI:$PLMN_LENGTH}" + fi + # Unique identifier for the UE within the mobile network. Used by the network to identify the UE during authentication. It ensures that the UE is correctly identified by the network. update_conf "configs/ue$UE_NUMBER.conf" "imsi" "\"$UE_IMSI\"" @@ -169,7 +182,4 @@ done cp openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/channelmod_rfsimu_LEO_satellite.conf "$SCRIPT_DIR/configs/channelmod_rfsimu_LEO_satellite.conf" -mkdir -p "$SCRIPT_DIR/logs" -sudo chown $USER:$USER -R "$SCRIPT_DIR/logs" - echo "Successfully configured the UE. The configuration file is located in the configs/ directory." diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/cmake_targets/tools/build_helper.patch b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/cmake_targets/tools/build_helper.patch old mode 100755 new mode 100644 index cf5a694..b7ce1fb --- a/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/cmake_targets/tools/build_helper.patch +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/cmake_targets/tools/build_helper.patch @@ -18,7 +18,7 @@ index 3fc1db7b56..9f68588ea6 100755 + if [[ $OS_RELEASE == 22* ]]; then + OS_DISTRO="ubuntu" + OS_RELEASE="24.04" -+ elif [[ $OS_RELEASE == 22* ]]; then ++ elif [[ $OS_RELEASE == 21* ]]; then + OS_DISTRO="ubuntu" + OS_RELEASE="22.04" + elif [[ $OS_RELEASE == 20* ]]; then diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/cmake_targets/tools/build_helper.previous b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/cmake_targets/tools/build_helper.previous new file mode 100644 index 0000000..3fc1db7 --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/cmake_targets/tools/build_helper.previous @@ -0,0 +1,843 @@ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +# file build_helper +# brief +# authors Laurent Thomas, Lionel GAUTHIER +# +####################################### +if [ ! -f /etc/os-release ]; then + echo "No /etc/os-release file found. You're likely on an unsupported distro." + exit -1 +fi +OS_DISTRO=$(grep "^ID=" /etc/os-release | sed "s/ID=//" | sed "s/\"//g") +OS_RELEASE=$(grep "^VERSION_ID=" /etc/os-release | sed "s/VERSION_ID=//" | sed "s/\"//g") +case "$OS_DISTRO" in + fedora) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;; + rhel) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake3" ;; + rocky) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;; + centos) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake3" ;; # CentOS Stream + debian) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;; + ubuntu) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;; +esac +KERNEL_VERSION=$(uname -r | cut -d '.' -f1) +KERNEL_MAJOR=$(uname -r | cut -d '.' -f2) + +#check if we run inside a container +IS_CONTAINER=`grep -E -c "docker|podman|kubepods|libpod|buildah" /proc/self/cgroup || true` +#sudo is not needed when we are root +if [ "$UID" = 0 ] +then + SUDO='' +else + SUDO='sudo -S -E' +fi + +############################### +## echo and family +############################### +# only emit color if connected to a terminal, and if it supports colors +if [ -t 1 ]; then + num_colors=$(tput colors) + if [ -n "$num_colors" ] && [ "$num_colors" -ge 8 ]; then + red='\E[31m' + green='\E[32m' + yellow='\E[33m' + blue='\E[1;34m' + reset_color='\E[00m' + fi +fi + +cecho() { + # Color-echo + # arg1 = message + # arg2 = color + local default_msg="No Message." + message=${1:-$default_msg} + color=${2:-$green} + echo -e "$color$message$reset_color" + return +} + +echo_error() { cecho "$*" $red ;} +echo_fatal() { cecho "$*" $red; exit -1 ;} +echo_warning() { cecho "$*" $yellow ;} +echo_success() { cecho "$*" $green ;} +echo_info() { cecho "$*" $blue ;} + +######################## +# distribution helpers # +######################## + +# This function return a string to identify the distribution we are running +# If we can't check the distribution, it returns "Unknown" +# This function return always true as exit code by design +# Examples: +# debian8.5 +get_distribution_release() { + if [[ ! -z "$OS_DISTRO$OS_RELEASE" ]]; then + echo "$OS_DISTRO$OS_RELEASE" + else + echo Unknown + fi +} + +check_supported_distribution() { + local distribution=$(get_distribution_release) + case "$distribution" in + "ubuntu24.04") return 0 ;; + "ubuntu22.04") return 0 ;; + "ubuntu20.04") return 0 ;; + "debian11") return 0 ;; + "fedora41") return 0 ;; + "fedora40") return 0 ;; + "rhel8.2") return 0 ;; + "rhel8.3") return 0 ;; + "rhel8.4") return 0 ;; + "rhel8.5") return 0 ;; + "rhel8.6") return 0 ;; + "rhel8.7") return 0 ;; + "rhel8.8") return 0 ;; + "rhel8.9") return 0 ;; + "rhel9.0") return 0 ;; + "rhel9.1") return 0 ;; + "rhel9.2") return 0 ;; + "rhel9.3") return 0 ;; + "rhel9.4") return 0 ;; + "rhel9.5") return 0 ;; + "centos9") return 0 ;; # CentOS stream + "rocky8.7") return 0 ;; + "rocky8.8") return 0 ;; + "rocky8.9") return 0 ;; + "rocky9.1") return 0 ;; + "rocky9.2") return 0 ;; + "rocky9.3") return 0 ;; + "rocky9.4") return 0 ;; + "rocky9.5") return 0 ;; + esac + return 1 +} + +################## +# Error handlers # +################## + +handler_EXIT() { + local exit_code=$? + [ "$exit_code" -eq 0 ] || echo_error "build have failed" + exit $exit_code +} + +trap handler_EXIT EXIT + +########################### +# Cleaners +########################### + +clean_kernel() { + $SUDO modprobe ip_tables + $SUDO modprobe x_tables + $SUDO iptables -P INPUT ACCEPT + $SUDO iptables -F INPUT + $SUDO iptables -P OUTPUT ACCEPT + $SUDO iptables -F OUTPUT + $SUDO iptables -P FORWARD ACCEPT + $SUDO iptables -F FORWARD + $SUDO iptables -t nat -F + $SUDO iptables -t mangle -F + $SUDO iptables -t filter -F + $SUDO iptables -t raw -F + echo_info "Flushed iptables" +} + +clean_all_files() { + set_openair_env + dir=$OPENAIR_DIR/cmake_targets + rm -rf $dir/ran_build $dir/ran_build_noLOG + rm -rf $dir/lte-simulators/build + rm -rf $dir/nas_sim_tools/build + rm -rf $dir/oaisim_build_oai/build $dir/oaisim_build_oai/CMakeLists.txt + rm -rf $dir/autotests/bin $dir/autotests/log $dir/autotests/*/build +} + +################################### +# Compilers +################################### + +#check_warnings: +# print error message if the compilation had warnings +#argument: +# $1: log file +check_warnings() { + #we look for 'warning:' in the compilation log file + #this is how gcc starts a warning + #this is not perfect, we may get false positive + warning_count=`grep "warning:" "$1" | grep -E -v "jobserver unavailable|disabling jobserver mode" | wc -l` + if [ $warning_count -gt 0 ]; then + echo_error "WARNING: $warning_count warnings. See $1" + fi +} + +#check_errors: +# print error message if the compilation had errors +#argument: +# $1: log file +check_errors() { + #we look for 'error:' in the compilation log file + error_count=`grep -c "error:" "$1"` + if [ $error_count -gt 0 ]; then + echo_error "ERROR: $error_count error. See $1" + fi +} + +compilations() { + [[ $# -eq 4 ]] || echo_fatal "compilations " + local dir=$1 + local logfile=$2 + local targets=$3 + local build_tool_opt=$4 + local verbose=$([ "$VERBOSE_COMPILE" == "1" ] && echo "-v" || echo "") + echo cd $OPENAIR_DIR/cmake_targets/$dir/build + cd $OPENAIR_DIR/cmake_targets/$dir/build + cmd="$CMAKE --build . ${verbose} --target ${targets} -- ${build_tool_opt}" + echo_info "Running \"${cmd}\"" $green + echo "Log file for compilation is being written to: $dlog/$logfile" + set +e + { + eval ${cmd} + ret=$? + } > $dlog/$logfile 2>&1 + # Print the errors and warnings for CI purposes + grep -E -A5 -B5 "warning:|error:| Error " $dlog/$logfile || true + check_warnings "$dlog/$logfile" + if [[ $ret -eq 0 ]]; then + echo_success "$targets compiled" + else + check_errors "$dlog/$logfile" + echo_error "compilation of $targets failed" + exit 1 + fi +} + +############################################ +# External packages installers +############################################ + +install_usrp_uhd_driver_from_source(){ + uhd_install_log=$OPENAIR_DIR/cmake_targets/log/uhd_install_log.txt + echo_info "\nInstalling UHD driver from sources. The log file for UHD driver installation is here: $uhd_install_log " + ( + pushd /tmp + echo "Cloning UHD driver repository" + rm -rf /tmp/uhd + git clone https://github.com/EttusResearch/uhd.git + cd uhd + # For our legacy TDD eNB running with a B2xx RF board + # the following patch has to be applied + if [[ -v UHD_VERSION ]]; then + git checkout tags/v${UHD_VERSION} + # We recommend to use not older than 3.15.0.0 + if [[ "$UHD_VERSION" == "3.15.0.0" ]]; then + # Tested that patch for the following versions: + # - 3.15.0.0 + git apply $OPENAIR_DIR/cmake_targets/tools/uhd-3.15-tdd-patch.diff + ret=$?;[[ $ret -ne 0 ]] && echo_fatal "Could not apply the TDD patch" + elif [[ "$UHD_VERSION" == "4.7.0.0" || "$UHD_VERSION" == "4.6.0.0" || "$UHD_VERSION" == "4.5.0.0" ]]; then + # Tested that patch for the following versions: + # - 4.7.0.0 + cp $OPENAIR_DIR/cmake_targets/tools/uhd-4.x-tdd-patch.diff $OPENAIR_DIR/cmake_targets/tools/uhd-4.5plus-tdd-patch.diff + sed -i '9,13 s/STATE_OFF/STATE_RX1_OFF/' $OPENAIR_DIR/cmake_targets/tools/uhd-4.5plus-tdd-patch.diff + sed -i '24,28 s/STATE_OFF/STATE_RX2_OFF/' $OPENAIR_DIR/cmake_targets/tools/uhd-4.5plus-tdd-patch.diff + git apply $OPENAIR_DIR/cmake_targets/tools/uhd-4.5plus-tdd-patch.diff + ret=$?;[[ $ret -ne 0 ]] && echo_fatal "Could not apply the TDD patch" + else + # Tested that patch for the following versions: + # - 4.0.0.0 + # - 4.1.0.0 + # - 4.1.0.5 + # - 4.2.0.0 + # - 4.2.0.1 + # - 4.3.0.0-rc1 + # - 4.4.0.0 + git apply $OPENAIR_DIR/cmake_targets/tools/uhd-4.x-tdd-patch.diff + ret=$?;[[ $ret -ne 0 ]] && echo_fatal "Could not apply the TDD patch" + fi + else + git checkout tags/v4.0.0.0 + git apply $OPENAIR_DIR/cmake_targets/tools/uhd-4.x-tdd-patch.diff + ret=$?;[[ $ret -ne 0 ]] && echo_fatal "Could not apply the TDD patch" + fi + # Printing out the results of the patch to make sure it was properly applied + git diff + mkdir -p host/build + cd host/build || true + $CMAKE ../ -GNinja -DENABLE_TESTS=OFF -DENABLE_EXAMPLES=OFF + echo "Compiling UHD" + ninja + $SUDO ninja install + $SUDO ldconfig -v + if [ $IS_CONTAINER -eq 0 ]; then + if [[ "$OS_DISTRO" == "ubuntu" ]]; then + $SUDO /usr/local/lib/uhd/utils/uhd_images_downloader.py + fi + if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then + $SUDO /usr/local/lib64/uhd/utils/uhd_images_downloader.py + fi + fi + popd + rm -rf /tmp/uhd + ) >& $uhd_install_log +} + +check_install_usrp_uhd_driver(){ + if [[ "$OS_BASEDISTRO" == "debian" ]]; then + boost_libs_ubuntu="libboost-chrono-dev libboost-date-time-dev libboost-filesystem-dev libboost-program-options-dev libboost-thread-dev libboost-test-dev libboost-regex-dev" + #first we remove old installation + $SUDO apt-get remove uhd -y || true + $SUDO apt-get remove uhd-host -y || true + $SUDO apt-get remove libuhd-dev -y || true + $SUDO apt-get remove libuhd003 -y || true + $SUDO apt-get remove libuhd3.13.1 -y || true + $SUDO apt-get remove libuhd3.14.0 -y || true + $SUDO apt-get remove libuhd3.14.1 -y || true + $SUDO apt-get remove libuhd3.15.0 -y || true + local distribution=$(get_distribution_release) + if [[ "$distribution" == "ubuntu20.04" || "$distribution" == "ubuntu22.04" ]]; then + $SUDO apt-get remove libuhd4.?.? -y || true + fi + v=$(lsb_release -cs) + $SUDO apt-add-repository --remove "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main" + if [[ -v BUILD_UHD_FROM_SOURCE ]] || [[ "$OS_DISTRO" == "debian" ]]; then + $SUDO apt-get install -y $boost_libs_ubuntu libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-setuptools ninja-build + install_usrp_uhd_driver_from_source + return + fi + # The new USRP repository + # Raphael Defosseux: Adding a loop on adding PPA because in CI the gpg key retrieve may + # timeout due to proxy / network latencies in Eurecom on VM + echo_info "\nAdding PPA repository ettusresearch/uhd\n" + x=0 + while [ $x -le 5 ] + do + if $SUDO add-apt-repository ppa:ettusresearch/uhd -y + then + echo_info "add-apt-repository successful\n" + break + else + echo_info "add-apt-repository failed, retrying...\n" + sleep 30 + fi + x=$((x + 1)) + done + $SUDO apt-get update + $SUDO apt-get -y install python-tk $boost_libs_ubuntu libusb-1.0-0-dev + case "$(get_distribution_release)" in + "ubuntu20.04" | "ubuntu22.04") + $SUDO apt-get -y install libuhd-dev libuhd4.5.0 uhd-host + ;; + esac + elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then + boost_libs_fedora="boost-chrono boost-date-time boost-filesystem boost-program-options boost-thread boost-test boost-regex boost-devel" + if [ $IS_CONTAINER -eq 0 ] + then + $SUDO $INSTALLER -y install python3 $boost_libs_fedora libusb-devel libusbx-devel python3-mako python3-docutils python3-pip $CMAKE + $SUDO pip3 install requests + else + $SUDO $INSTALLER -y install $boost_libs_fedora $CMAKE + $SUDO pip3 install mako requests + fi + if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then + if [ $IS_CONTAINER -eq 0 ] + then + # until EPEL repo hasn't bumped UHD driver to >=3.10 in EPEL, build driver from source + $SUDO $INSTALLER -y remove uhd uhd-devel uhd-firmware + fi + install_usrp_uhd_driver_from_source + else + $SUDO $INSTALLER -y install uhd uhd-devel uhd-firmware + fi + fi +} + +install_usrp_uhd_driver() { + if [[ "$OS_DISTRO" == "ubuntu" ]]; then + # We move uhd-host apart because it depends on linux kernel version + # On newer kernels, it fails to install + $SUDO apt-get -y install uhd-host + fi + # quick workaround for below distributions + local distribution=$(get_distribution_release) + if [ -z $1 ]; then + if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "rocky" ]] || [[ "$OS_DISTRO" == "centos" ]]; then + $SUDO /usr/local/bin/uhd_images_downloader + else + $SUDO uhd_images_downloader + fi + else + if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "rocky" ]] || [[ "$OS_DISTRO" == "centos" ]]; then + $SUDO /usr/local/bin/uhd_images_downloader -i $1 + else + $SUDO uhd_images_downloader -i $1 + fi + fi +} + +install_bladerf_driver_from_source(){ + bladerf_install_log=$OPENAIR_DIR/cmake_targets/log/bladerf_install_log.txt + echo_info "\nInstalling BladeRF driver from sources. The log file for BladeRF driver installation is here: $bladerf_install_log " + ( + cd /tmp + echo "Downloading BladeRF driver" + rm -rf /tmp/bladeRF + git clone https://github.com/Nuand/bladeRF.git + cd bladeRF + git checkout tags/2016.06 + mkdir -p build + cd build + $CMAKE ../ + echo "Compiling BladeRF driver" + make + $SUDO make install + $SUDO ldconfig + echo "Downloading FPGA and firmware images" + cd /tmp/bladeRF + #wget has been removed from default dependencies, so we must be sure that's installed + $SUDO $INSTALLER -y install wget + wget --tries=3 --retry-connrefused https://www.nuand.com/fx3/bladeRF_fw_latest.img + wget --tries=3 --retry-connrefused https://www.nuand.com/fpga/hostedx40-latest.rbf + sudo mkdir -p /usr/share/Nuand/bladeRF + sudo mv bladeRF_fw_latest.img /usr/share/Nuand/bladeRF/bladeRF_fw.img + sudo mv hostedx40-latest.rbf /usr/share/Nuand/bladeRF/hostedx40.rbf + ) >& $bladerf_install_log +} + +check_install_bladerf_driver(){ + if [[ "$OS_DISTRO" == "ubuntu" ]]; then + $SUDO apt-get install -y bladerf libbladerf-dev + $SUDO apt-get install -y bladerf-firmware-fx3 + $SUDO apt-get install -y bladerf-fpga-hostedx40 + elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then + install_bladerf_driver_from_source + else + echo_error "BladeRF Installer for OAI does not support automatic build. Install BladeRF compiling sources manually from BladeRF website" + fi +} + +flash_firmware_bladerf() { + $SUDO bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img +} + +check_install_lmssdr_driver(){ + if ( [ -d "/usr/local/include/lime" ] && + [ -f "/usr/local/include/lime/LimeSuite.h" ] ) + then + echo_success "Found lmssdr drivers and tools installed from source" + else + echo_error "lmssdr support implies installing lmssdr drivers and tools" \ + " from sources. check:" + echo_info "https://wiki.myriadrf.org/Lime_Suite" + echo_fatal "Cannot compile lmssdr device" + fi + + +} + +install_soapy_from_source(){ + soapy_install_log=$OPENAIR_DIR/cmake_targets/log/soapy_install_log.txt + echo_info "\nInstalling Soapy EcoSystem from source. The log file for Soapy installation is here: $soapy_install_log " + ( + cd /tmp + echo "Downloading SoapySDR" + rm -rf /tmp/SoapySDR + git clone -b soapy-sdr-0.7.0 --single-branch https://github.com/pothosware/SoapySDR.git + cd SoapySDR + #git checkout tags/release_003_010_001_001 + mkdir -p build + cd build + $CMAKE ../ + echo "Compiling SoapySDR" + make -j`nproc` + $SUDO make install + $SUDO ldconfig + cd /tmp + echo "Downloading SoapyRemote" + rm -rf /tmp/SoapyRemote + git clone -b soapy-remote-0.5.0 --single-branch https://github.com/pothosware/SoapyRemote.git + cd SoapyRemote + #git checkout tags/release_003_010_001_001 + mkdir -p build + cd build + $CMAKE ../ + echo "Compiling SoapyRemote" + make -j`nproc` + $SUDO make install + $SUDO ldconfig + ) >& $soapy_install_log +} + +install_soapy_iris_from_source(){ + iris_install_log=$OPENAIR_DIR/cmake_targets/log/iris_install_log.txt + echo_info "\nInstalling Iris driver from source. The log file for Iris driver installation is here: $iris_install_log " + ( + cd /tmp + echo "Downloading SoapyIris" + rm -rf /tmp/sklk-soapyiris + git clone -b soapy-iris-2018.08.0.1 --single-branch https://github.com/skylarkwireless/sklk-soapyiris.git + cd sklk-soapyiris + mkdir -p build + cd build + $CMAKE ../ + echo "Compiling SoapyIris" + make -j`nproc` + $SUDO make install + $SUDO ldconfig + ) >& $iris_install_log +} + +check_install_soapy () { + #if [[ "$OS_DISTRO" == "ubuntu" ]]; then + #first we remove old installation + $SUDO apt-get remove -y soapysdr soapysdr-server libsoapysdr-dev python-soapysdr python3-soapysdr soapysdr-module-remote || true + #$SUDO add-apt-repository -y ppa:myriadrf/drivers + #$SUDO apt-get update + #$SUDO apt-get install -y soapysdr soapysdr-server libsoapysdr-dev python-soapysdr python3-soapysdr soapysdr-module-remote + + #elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then + # $SUDO $INSTALLER -y install software-properties-common python3-software-properties python-software-properties subversion git python3 python-numpy python3-numpy cmake swig python-dev + install_soapy_from_source + #fi + install_soapy_iris_from_source +} + +check_install_additional_tools (){ + $SUDO $INSTALLER update -y + local optional_packages="" + if [[ "$OS_BASEDISTRO" == "debian" ]]; then + case "$(get_distribution_release)" in + "ubuntu20.04" | "ubuntu22.04" | "debian11" ) + optional_packages="python3 python3-pip python3-dev python3-scipy python3-matplotlib python3-pyroute2 universal-ctags" + ;; + esac + PACKAGE_LIST="\ + doxygen \ + libgnutls28-dev \ + libpthread-stubs0-dev \ + tshark \ + uml-utilities \ + iperf3 \ + libforms-bin \ + libforms-dev \ + libxft-dev \ + xmlstarlet" + elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]] || [[ "$OS_DISTRO" == "rocky" ]] || [[ "$OS_DISTRO" == "fedora" ]]; then + PACKAGE_LIST="\ + doxygen \ + ctags \ + iperf3 \ + gnutls-devel \ + libXft-devel \ + xforms \ + xforms-devel \ + xmlstarlet" + fi + $SUDO $INSTALLER install -y $PACKAGE_LIST $optional_packages +} + +check_install_oai_software() { + local specific_packages="" + if ! check_supported_distribution; then + echo_error "Your distribution $(get_distribution_release) is not supported by oai !" + exit 1 + fi + $SUDO $INSTALLER update -y + if [[ "$OS_BASEDISTRO" == "debian" ]]; then + $SUDO apt install -y software-properties-common + case "$(get_distribution_release)" in + "debian11") + specific_packages="libz-dev" + ;; + esac + $SUDO apt-get install -y \ + $specific_packages \ + automake \ + build-essential \ + $CMAKE \ + ninja-build \ + pkg-config \ + git \ + libblas-dev \ + liblapack-dev \ + liblapacke-dev \ + libreadline-dev \ + libconfig-dev \ + libsctp-dev \ + libssl-dev \ + libtool \ + patch \ + openssl \ + zlib1g-dev \ + xxd \ + libyaml-cpp-dev + + elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then + if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then + if rpm -q epel-release > /dev/null; then + echo "EPEL repos already present. Good." + else + echo "EPEL repos not present. Installing them." + $SUDO $INSTALLER install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm + fi + fi + + $SUDO $INSTALLER install -y \ + automake \ + $CMAKE \ + gcc \ + gcc-c++ \ + git \ + pkgconfig \ + libconfig-devel \ + lksctp-tools \ + lksctp-tools-devel \ + libtool \ + ninja-build \ + make \ + openssl-devel \ + patch \ + readline-devel \ + lapack \ + lapack-devel \ + blas \ + blas-devel \ + vim-common \ + zlib-devel \ + yaml-cpp-devel + fi + + install_asn1c_from_source $1 + install_simde_from_source $1 +} + +install_asn1c_from_source(){ + mkdir -p $OPENAIR_DIR/cmake_targets/log + asn1_install_log=$OPENAIR_DIR/cmake_targets/log/asn1c_install_log.txt + echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_log " + ( + $SUDO $INSTALLER -y install bison flex + $SUDO rm -rf /tmp/asn1c + # GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c + git clone https://github.com/mouse07410/asn1c /tmp/asn1c + cd /tmp/asn1c + #git checkout vlm_master + # hotfix: current vlm_master (5fa129cf3161da9ff2d67341e6277e818c0f5d6a) + # breaks F1, NG, so use the one before. + git checkout 940dd5fa9f3917913fd487b13dfddfacd0ded06e + # Showing which version is used + git log -n1 + autoreconf -iv + ./configure --prefix /opt/asn1c/ + make -j`nproc` + $SUDO make install + cd - + $SUDO ldconfig + if [[ -v CI_ENV ]]; then + $SUDO rm -rf /tmp/asn1c + fi + ) > $asn1_install_log 2>&1 +} + +install_simde_from_source(){ + echo_info "\nInstalling SIMDE from source without test cases (header files only)" + cd /tmp + $SUDO rm -rf /tmp/simde + git clone https://github.com/simd-everywhere/simde-no-tests.git /tmp/simde + cd /tmp/simde + # we can specify a given version of SIMDE (sha-one or tag) + if [[ -v SIMDE_VERSION ]]; then + git checkout -f $SIMDE_VERSION + else + # At time of writing, last working commit for OAI: c7f26b7 + git checkout c7f26b73ba8e874b95c2cec2b497826ad2188f68 + fi + # Showing which version is used + git log -n1 + # brute force copy into /usr/include + $SUDO \cp -rv ../simde /usr/include +} + +install_lttng() { + if [[ "$OS_DISTRO" != "ubuntu" ]]; then + echo_info "LTTng is supported only for ubuntu at the moment." + echo_info $distribution + return + fi + + set +e + $SUDO apt-add-repository ppa:lttng/stable-2.13 -y && apt-get update + $SUDO apt-get install -y lttng-tools lttng-modules-dkms liblttng-ust-dev + if [[ $? > 0 ]]; then + echo "Failed to install LTTng using apt. Installing from source" + install_lttng_deps + install_lttng_from_source + fi + set -e +} + +install_lttng_deps() { + echo "installing dependencies of LTTng" + $SUDO apt-get install uuid-dev libxml2-dev -y +} + +install_lttng_from_source() { + echo "installing LTTng from source" + install_popt_1_18_from_source + install_userspace_rcu + install_lttng_ust_2_13_from_source + install_lttng_tools_2_13_from_source +} + +install_popt_1_18_from_source() { + $SUDO $INSTALLER -y install wget + echo_info "\nInstalling popt_1_18." + cd $(mktemp -d) && + wget http://ftp.rpm.org/popt/releases/popt-1.x/popt-1.18.tar.gz + tar -xf popt-1.18.tar.gz && cd popt-1.18 + ./configure && make -j16 && $SUDO make install +} + +install_userspace_rcu() { + echo_info "\nInstalling U-RCU from source." + cd /tmp + $SUDO rm -rf /tmp/urcu + git clone https://github.com/urcu/userspace-rcu.git /tmp/urcu + cd /tmp/urcu + git checkout stable-0.12 + ./bootstrap && ./configure && make + $SUDO make install + $SUDO ldconfig +} + + +install_lttng_modules_2_13_from_source() { + $SUDO $INSTALLER -y install wget + echo_info "\nInstalling LTTng Modules." + cd $(mktemp -d) && + wget https://lttng.org/files/lttng-modules/lttng-modules-latest-2.13.tar.bz2 && + tar -xf lttng-modules-latest-2.13.tar.bz2 && + cd lttng-modules-2.13.* && + make && + $SUDO make modules_install && + $SUDO depmod -a +} + +install_lttng_ust_2_13_from_source() { + $SUDO $INSTALLER -y install wget + echo_info "\nInstalling LTTng UST." + cd $(mktemp -d) && + wget https://lttng.org/files/lttng-ust/lttng-ust-latest-2.13.tar.bz2 && + tar -xf lttng-ust-latest-2.13.tar.bz2 && + cd lttng-ust-2.13.* && + ./configure --disable-numa && + make && + $SUDO make install && + $SUDO ldconfig +} + +install_lttng_tools_2_13_from_source() { + $SUDO $INSTALLER -y install wget + echo_info "\nInstalling LTTng Tools." + cd $(mktemp -d) && + wget https://lttng.org/files/lttng-tools/lttng-tools-latest-2.13.tar.bz2 && + tar -xf lttng-tools-latest-2.13.tar.bz2 && + cd lttng-tools-2.13.* && + ./configure && + make && + $SUDO make install && + $SUDO ldconfig +} + +################################################# +# 2. compile +################################################ + +install_nas_tools() { + echo_success "generate .ue_emm.nvram .ue.nvram" + ./nvram --gen -c $1 -o $2 > "$3" + echo_success "generate .usim.nvram" + ./usim --gen -c $1 -o $2 >> "$3" +} + + +################################ +# set_openair_env +############################### +set_openair_env(){ + fullpath=`readlink -f $BASH_SOURCE` + [ -f "/.$fullpath" ] || fullpath=`readlink -f $PWD/$fullpath` + openair_path=${fullpath%/cmake_targets/*} + openair_path=${openair_path%/targets/*} + openair_path=${openair_path%/openair[123]/*} + export OPENAIR_DIR=$openair_path + export OPENAIR1_DIR=$openair_path/openair1 + export OPENAIR2_DIR=$openair_path/openair2 + export OPENAIR3_DIR=$openair_path/openair3 + export OPENAIR_TARGETS=$openair_path/targets +} + +################################ +# Function to killall the subprocesses when Ctrl-C Key is hit +############################### +function handle_ctrl_c(){ +CURPID=$$ +ppid=$$ +arraycounter=1 +echo_info "** Trapped CTRL-C. Killing all subprocesses now..." +echo_info "** Calling sync now..." +sync +while true +do + FORLOOP=FALSE + # Get all the child process id + for i in `ps -ef| awk '$3 == '$ppid' { print $2 }'` + do + if [ $i -ne $CURPID ] ; then + procid[$arraycounter]=$i + arraycounter=`expr $arraycounter + 1` + ppid=$i + FORLOOP=TRUE + fi + done + if [ "$FORLOOP" = "FALSE" ] ; then + arraycounter=`expr $arraycounter - 1` + ## We want to kill child process id first and then parent id's + while [ $arraycounter -ne 0 ] + do + echo "first we send ctrl-c to program" + $SUDO kill -INT "${procid[$arraycounter]}" + sleep 5 + echo "Now we force kill if that didn't work" + $SUDO kill -9 "${procid[$arraycounter]}" >/dev/null + arraycounter=`expr $arraycounter - 1` + done + exit + fi +done +} diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c.patch b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c.patch new file mode 100644 index 0000000..3857b69 --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c.patch @@ -0,0 +1,52 @@ +diff --git a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c +index c9620e871f..5cefdc122a 100644 +--- a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c ++++ b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c +@@ -426,6 +426,23 @@ static const char* kpm_meas_du[] = { + "DRB.UEThpUl", + "RRU.PrbTotDl", + "RRU.PrbTotUl", ++ "RSRP", ++ "N_RSRP_MEAS", ++ "N_PRB", ++ "RSSI", ++ "RSRQ", ++ "PUSCH_SNR", ++ "PUCCH_SNR", ++ "DRB.HarqMcsUl", ++ "DRB.HarqMcsDl", ++ "DRB.HarqBlockErrorRateUl", ++ "DRB.HarqBlockErrorRateDl", ++ "DRB.MacSduRetransmissionRateUl", ++ "DRB.MacSduRetransmissionRateDl", ++ "DRB.MacSduErrorRateUl", ++ "DRB.MacSduErrorRateDl", ++ "CQI_SINGLE_CODEWORD", ++ "CQI_DUAL_CODEWORD", + NULL, + }; + +@@ -437,6 +454,23 @@ static const char* kpm_meas_gnb[] = { + "DRB.UEThpUl", + "RRU.PrbTotDl", + "RRU.PrbTotUl", ++ "RSRP", ++ "N_RSRP_MEAS", ++ "N_PRB", ++ "RSSI", ++ "RSRQ", ++ "PUSCH_SNR", ++ "PUCCH_SNR", ++ "DRB.HarqMcsUl", ++ "DRB.HarqMcsDl", ++ "DRB.HarqBlockErrorRateUl", ++ "DRB.HarqBlockErrorRateDl", ++ "DRB.MacSduRetransmissionRateUl", ++ "DRB.MacSduRetransmissionRateDl", ++ "DRB.MacSduErrorRateUl", ++ "DRB.MacSduErrorRateDl", ++ "CQI_SINGLE_CODEWORD", ++ "CQI_DUAL_CODEWORD", + NULL, + }; + diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.previous.c b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.previous.c new file mode 100644 index 0000000..c9620e8 --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.previous.c @@ -0,0 +1,545 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "ran_func_kpm.h" +#include "ran_func_kpm_subs.h" +#include "ran_e2sm_ue_id.h" + +#include "common/utils/ds/byte_array.h" +#include "openair2/E1AP/e1ap_common.h" +#include "openair2/E2AP/flexric/src/util/time_now_us.h" +#include "openair2/F1AP/f1ap_ids.h" + +static pthread_once_t once_kpm_mutex = PTHREAD_ONCE_INIT; + +static void init_once_kpm(void) +{ + init_kpm_subs_data(); +} + +static ngran_node_t get_e2_node_type(void) +{ + ngran_node_t node_type = 0; + +#if defined(NGRAN_GNB_DU) && defined(NGRAN_GNB_CUUP) && defined(NGRAN_GNB_CUCP) + node_type = RC.nrrrc[0]->node_type; +#elif defined (NGRAN_GNB_CUUP) + node_type = ngran_gNB_CUUP; +#endif + + return node_type; +} + +typedef struct { + size_t sz; + ue_id_e2sm_t* ue_id; + + // Optional + // only used to retreive MAC/RLC stats + NR_UE_info_t** ue_info_list; +}arr_ue_id_t; + +static meas_data_lst_t fill_kpm_meas_data_item(const meas_info_format_1_lst_t* meas_info_lst, const size_t len, const uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_data_lst_t data_item = {0}; + + // Measurement Record + data_item.meas_record_len = len; // record data list length corresponds to info list length from action definition + + data_item.meas_record_lst = calloc(len, sizeof(meas_record_lst_t)); + assert(data_item.meas_record_lst != NULL && "Memory exhausted"); + + for (size_t i = 0; i < len; i++) { + // Measurement Type as requested in Action Definition + assert(meas_info_lst[i].meas_type.type == NAME_MEAS_TYPE && "Only NAME supported"); + + char* meas_info_name_str = cp_ba_to_str(meas_info_lst[i].meas_type.name); + + data_item.meas_record_lst[i] = get_kpm_meas_value(meas_info_name_str, gran_period_ms, ue_info, ue_idx); + + free(meas_info_name_str); + } + + return data_item; +} + +static kpm_ind_msg_format_1_t fill_kpm_ind_msg_frm_1(cudu_ue_info_pair_t ue_info, const size_t ue_idx, const kpm_act_def_format_1_t* act_def_fr_1) +{ + kpm_ind_msg_format_1_t msg_frm_1 = {0}; + + // Measurement Data contains a set of Meas Records, each collected at each granularity period + msg_frm_1.meas_data_lst_len = 1; /* this value is equal to (kpm_ric_event_trigger_format_1.report_period_ms/act_def_fr_1->gran_period_ms) + please, check their values in xApp */ + + msg_frm_1.meas_data_lst = calloc(msg_frm_1.meas_data_lst_len, sizeof(*msg_frm_1.meas_data_lst)); + assert(msg_frm_1.meas_data_lst != NULL && "Memory exhausted" ); + + msg_frm_1.meas_data_lst[0] = fill_kpm_meas_data_item(act_def_fr_1->meas_info_lst, + act_def_fr_1->meas_info_lst_len, + act_def_fr_1->gran_period_ms, + ue_info, + ue_idx); + + // Measurement Information - OPTIONAL + msg_frm_1.meas_info_lst_len = act_def_fr_1->meas_info_lst_len; + msg_frm_1.meas_info_lst = calloc(msg_frm_1.meas_info_lst_len, sizeof(meas_info_format_1_lst_t)); + assert(msg_frm_1.meas_info_lst != NULL && "Memory exhausted"); + for (size_t i = 0; i < msg_frm_1.meas_info_lst_len; i++) { + msg_frm_1.meas_info_lst[i] = cp_meas_info_format_1_lst(&act_def_fr_1->meas_info_lst[i]); + } + + return msg_frm_1; +} + +static cudu_ue_info_pair_t fill_ue_related_info(arr_ue_id_t* arr_ue_id, const size_t ue_idx) +{ + cudu_ue_info_pair_t ue_info = {0}; + + if (arr_ue_id->ue_id[ue_idx].type == GNB_UE_ID_E2SM) { + ue_info.rrc_ue_id = *arr_ue_id->ue_id[ue_idx].gnb.ran_ue_id; // rrc_ue_id + ue_info.ue = arr_ue_id->ue_info_list[ue_idx]; + } else if (arr_ue_id->ue_id[ue_idx].type == GNB_CU_UP_UE_ID_E2SM) { + /* in OAI implementation, CU-UP ue id = CU-CP ue id + => CU-UP ue id = rrc_ue_id, but it should not be the case by the spec */ + ue_info.rrc_ue_id = *arr_ue_id->ue_id[ue_idx].gnb_cu_up.ran_ue_id; // cucp_ue_id = rrc_ue_id + } else if (arr_ue_id->ue_id[ue_idx].type == GNB_DU_UE_ID_E2SM) { + ue_info.rrc_ue_id = *arr_ue_id->ue_id[ue_idx].gnb_du.ran_ue_id; // rrc_ue_id + ue_info.ue = arr_ue_id->ue_info_list[ue_idx]; + } + + return ue_info; +} + +static kpm_ind_msg_format_3_t fill_kpm_ind_msg_frm_3(arr_ue_id_t* arr_ue_id, const kpm_act_def_format_1_t* act_def_fr_1) +{ + assert(act_def_fr_1 != NULL); + + kpm_ind_msg_format_3_t msg_frm_3 = {0}; + + // Fill UE Measurement Reports + msg_frm_3.ue_meas_report_lst_len = arr_ue_id->sz; + msg_frm_3.meas_report_per_ue = calloc(msg_frm_3.ue_meas_report_lst_len, sizeof(meas_report_per_ue_t)); + assert(msg_frm_3.meas_report_per_ue != NULL && "Memory exhausted"); + + for (size_t i = 0; iue_id[i]); + + // Fill UE related info + cudu_ue_info_pair_t ue_info = fill_ue_related_info(arr_ue_id, i); + + // Fill UE measurements + msg_frm_3.meas_report_per_ue[i].ind_msg_format_1 = fill_kpm_ind_msg_frm_1(ue_info, i, act_def_fr_1); + } + + return msg_frm_3; +} + +static void capture_sst_sd(test_cond_value_t* test_cond_value, uint8_t *sst, uint32_t **sd) +{ + DevAssert(sst != NULL); + DevAssert(sd != NULL); + + // S-NSSAI is an OCTET_STRING, as defined by spec + switch (test_cond_value->type) { + case OCTET_STRING_TEST_COND_VALUE: { + if (test_cond_value->octet_string_value->len == 1) { + *sst = test_cond_value->octet_string_value->buf[0]; + *sd = NULL; + } else { + DevAssert(test_cond_value->octet_string_value->len == 4); + uint8_t *buf = test_cond_value->octet_string_value->buf; + *sst = buf[0]; + *sd = malloc(**sd); + **sd = buf[1] << 16 | buf[2] << 8 | buf[3]; + } + break; + } + default: + AssertFatal(false, "test condition value %d impossible\n", test_cond_value->type); + } +} + +static bool nssai_matches(nssai_t a_nssai, uint8_t b_sst, const uint32_t *b_sd) +{ + if (b_sd == NULL) { + return a_nssai.sst == b_sst && a_nssai.sd == 0xffffff; + } else { + AssertFatal(*b_sd <= 0xffffff, "illegal SD %d\n", *b_sd); + return a_nssai.sst == b_sst && a_nssai.sd == *b_sd; + } +} + +static arr_ue_id_t filter_ues_by_s_nssai_in_cu(const test_info_lst_t test_info) +{ + assert(test_info.S_NSSAI == TRUE_TEST_COND_TYPE && "Must be true"); + assert(test_info.test_cond != NULL && "Must be filled, even though it's optional by the specification"); + assert(*test_info.test_cond == EQUAL_TEST_COND && "Currently support EQUAL test condition"); + assert(test_info.test_cond_value != NULL && "Must be filled, even though it's optional by the specification"); + + uint8_t sst = 0; + uint32_t *sd = NULL; + capture_sst_sd(test_info.test_cond_value, &sst, &sd); + + arr_ue_id_t arr_ue_id = {.sz = 0}; + arr_ue_id.ue_id = calloc(MAX_MOBILES_PER_GNB, sizeof(ue_id_e2sm_t)); + assert(arr_ue_id.ue_id != NULL); + + struct rrc_gNB_ue_context_s* rrc_ue_context = NULL; + RB_FOREACH(rrc_ue_context, rrc_nr_ue_tree_s, &RC.nrrrc[0]->rrc_ue_head) { + gNB_RRC_UE_t *ue = &rrc_ue_context->ue_context; + for (int p = 0; p < ue->nb_of_pdusessions; ++p) { + pdusession_t *pdu = &ue->pduSession[p].param; + if (nssai_matches(pdu->nssai, sst, sd)) { + arr_ue_id.ue_id[arr_ue_id.sz] = fill_ue_id_data[ngran_gNB_CU](ue, 0, 0); + + arr_ue_id.sz++; + break; + } + } + AssertFatal(arr_ue_id.sz < MAX_MOBILES_PER_GNB, "cannot have more UEs than global UE number maximum\n"); + } + + free(sd); // if NULL, nothing happens + + return arr_ue_id; +} + +static arr_ue_id_t filter_ues_by_s_nssai_in_cuup(const test_info_lst_t test_info) +{ + assert(test_info.S_NSSAI == TRUE_TEST_COND_TYPE && "Must be true"); + assert(test_info.test_cond != NULL && "Must be filled, even though it's optional by the specification"); + assert(*test_info.test_cond == EQUAL_TEST_COND && "Currently support EQUAL test condition"); + assert(test_info.test_cond_value != NULL && "Must be filled, even though it's optional by the specification"); + + uint8_t sst = 0; + uint32_t *sd = NULL; + capture_sst_sd(test_info.test_cond_value, &sst, &sd); + + arr_ue_id_t arr_ue_id = {.sz = 0}; + arr_ue_id.ue_id = calloc(MAX_MOBILES_PER_GNB, sizeof(ue_id_e2sm_t)); + assert(arr_ue_id.ue_id != NULL); + + // Get NSSAI info from E1 context + const instance_t e1_inst = 0; + const e1ap_upcp_inst_t *e1inst = getCxtE1(e1_inst); + + // currently the CU-UP does not store the slices, so we can only do this "coarse filtering" + for(int s = 0; s < e1inst->cuup.setupReq.plmn[0].supported_slices; s++) { + if (nssai_matches(e1inst->cuup.setupReq.plmn[0].slice[s], sst, sd)) { + ue_id_t *pdcp_ue_id_list = calloc(MAX_MOBILES_PER_GNB, sizeof(ue_id_t)); + assert(pdcp_ue_id_list != NULL); + + arr_ue_id.sz = nr_pdcp_get_num_ues(pdcp_ue_id_list, MAX_MOBILES_PER_GNB); + for (size_t i = 0; i < arr_ue_id.sz; i++) { + arr_ue_id.ue_id[i] = fill_ue_id_data[ngran_gNB_CUUP](NULL, 0, pdcp_ue_id_list[i]); + } + free(pdcp_ue_id_list); + } + } + + free(sd); // if NULL, nothing happens + + return arr_ue_id; +} + +static arr_ue_id_t filter_ues_by_s_nssai_in_du_or_monolithic(const test_info_lst_t test_info) +{ + assert(test_info.S_NSSAI == TRUE_TEST_COND_TYPE && "Must be true"); + assert(test_info.test_cond != NULL && "Must be filled, even though it's optional by the specification"); + assert(*test_info.test_cond == EQUAL_TEST_COND && "Currently support EQUAL test condition"); + assert(test_info.test_cond_value != NULL && "Must be filled, even though it's optional by the specification"); + + uint8_t sst = 0; + uint32_t *sd = NULL; + capture_sst_sd(test_info.test_cond_value, &sst, &sd); + + arr_ue_id_t arr_ue_id = {.sz = 0}; + arr_ue_id.ue_id = calloc(MAX_MOBILES_PER_GNB, sizeof(ue_id_e2sm_t)); + assert(arr_ue_id.ue_id != NULL); + + arr_ue_id.ue_info_list = calloc(MAX_MOBILES_PER_GNB, sizeof(*arr_ue_id.ue_info_list)); + assert(arr_ue_id.ue_info_list != NULL); + + const ngran_node_t node_type = get_e2_node_type(); + + // Take MAC info + UE_iterator (RC.nrmac[0]->UE_info.list, ue) { + NR_UE_sched_ctrl_t *sched_ctrl = &ue->UE_sched_ctrl; + // UE matches if any of its DRBs matches + for (size_t l = 0; l < seq_arr_size(&sched_ctrl->lc_config); ++l) { + const nr_lc_config_t *c = seq_arr_at(&sched_ctrl->lc_config, l); + if (nssai_matches(c->nssai, sst, sd)) { + if (node_type == ngran_gNB_DU) { + f1_ue_data_t rrc_ue_id = du_get_f1_ue_data(ue->rnti); // gNB CU UE ID = rrc_ue_id + arr_ue_id.ue_id[arr_ue_id.sz] = fill_ue_id_data[ngran_gNB_DU](NULL, rrc_ue_id.secondary_ue, 0); + } else { + rrc_gNB_ue_context_t* rrc_ue_context = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], -1, ue->rnti); + arr_ue_id.ue_id[arr_ue_id.sz] = fill_ue_id_data[ngran_gNB](&rrc_ue_context->ue_context, 0, 0); + } + + // store NR_UE_info_t + arr_ue_id.ue_info_list[arr_ue_id.sz] = ue; + + arr_ue_id.sz++; + break; + } + } + AssertFatal(arr_ue_id.sz < MAX_MOBILES_PER_GNB, "cannot have more UEs than global UE number maximum\n"); + } + + free(sd); // if NULL, nothing happens + + return arr_ue_id; +} + +typedef arr_ue_id_t (*ue_type_matcher)(const test_info_lst_t test_info); + +static ue_type_matcher match_s_nssai_test_cond_type[END_NGRAN_NODE_TYPE] = +{ + NULL, + NULL, + filter_ues_by_s_nssai_in_du_or_monolithic, + NULL, + NULL, + filter_ues_by_s_nssai_in_cu, + NULL, + filter_ues_by_s_nssai_in_du_or_monolithic, + NULL, + NULL, // for CU-CP we don't use this + filter_ues_by_s_nssai_in_cuup, +}; + +typedef ue_type_matcher (*filter_ues)[END_NGRAN_NODE_TYPE]; + +static filter_ues match_cond_arr[END_TEST_COND_TYPE_KPM_V2_01] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + &match_s_nssai_test_cond_type, +}; + + +static kpm_ric_ind_hdr_format_1_t kpm_ind_hdr_frm_1(void) +{ + kpm_ric_ind_hdr_format_1_t hdr_frm_1 = {0}; + + int64_t const t = time_now_us(); +#if defined KPM_V2_03 + hdr_frm_1.collectStartTime = t/1000000; // seconds +#elif defined KPM_V3_00 + hdr_frm_1.collectStartTime = t; // microseconds +#else + static_assert(0!=0, "Undefined KPM SM Version"); +#endif + + hdr_frm_1.fileformat_version = NULL; + + // Check E2 Node NG-RAN Type + const ngran_node_t node_type = get_e2_node_type(); + const char* sender_name = get_ngran_name(node_type); + hdr_frm_1.sender_name = calloc(1, sizeof(byte_array_t)); + *hdr_frm_1.sender_name = cp_str_to_ba(sender_name); + + return hdr_frm_1; +} + +kpm_ind_hdr_t kpm_ind_hdr(void) +{ + kpm_ind_hdr_t hdr = {0}; + + hdr.type = FORMAT_1_INDICATION_HEADER; + hdr.kpm_ric_ind_hdr_format_1 = kpm_ind_hdr_frm_1(); + + return hdr; +} + +bool read_kpm_sm(void* data) +{ + assert(data != NULL); + // assert(data->type == KPM_STATS_V3_0); + + kpm_rd_ind_data_t* const kpm = (kpm_rd_ind_data_t*)data; + + assert(kpm->act_def != NULL && "Cannot be NULL"); + + // 7.8 Supported RIC Styles and E2SM IE Formats + // Action Definition Format 4 corresponds to Indication Message Format 3 + switch (kpm->act_def->type) { + case FORMAT_4_ACTION_DEFINITION: { + kpm->ind.hdr = kpm_ind_hdr(); + + kpm->ind.msg.type = FORMAT_3_INDICATION_MESSAGE; + // Filter the UE by the test condition criteria + kpm_act_def_format_4_t const* frm_4 = &kpm->act_def->frm_4; // 8.2.1.2.4 + for (size_t i = 0; i < frm_4->matching_cond_lst_len; i++) { + const test_info_lst_t test_info = frm_4->matching_cond_lst[i].test_info_lst; + const ngran_node_t node_type = get_e2_node_type(); + + /* Based on the node type (gNB-mono, CU, DU,...) and matching condition (S-NSSAI, DL RSRP, GBR,...) + get array of E2SM UE IDs with optionally their MAC info */ + ue_type_matcher fp_match_cond_type = (*match_cond_arr[test_info.test_cond_type])[node_type]; + arr_ue_id_t arr_ue_id = fp_match_cond_type(test_info); + + if (arr_ue_id.sz == 0) return false; + kpm->ind.msg.frm_3 = fill_kpm_ind_msg_frm_3(&arr_ue_id, &frm_4->action_def_format_1); + } + break; + } + + default: { + AssertFatal(kpm->act_def->type == FORMAT_4_ACTION_DEFINITION, "Action Definition Format %d not yet implemented", kpm->act_def->type); + } + } + + return true; +} + +static const char* kpm_meas_du[] = { + "DRB.RlcSduDelayDl", + "DRB.UEThpDl", + "DRB.UEThpUl", + "RRU.PrbTotDl", + "RRU.PrbTotUl", + NULL, +}; + +static const char* kpm_meas_gnb[] = { + "DRB.PdcpSduVolumeDL", + "DRB.PdcpSduVolumeUL", + "DRB.RlcSduDelayDl", + "DRB.UEThpDl", + "DRB.UEThpUl", + "RRU.PrbTotDl", + "RRU.PrbTotUl", + NULL, +}; + +static const char* kpm_meas_cuup[] = { + "DRB.PdcpSduVolumeDL", + "DRB.PdcpSduVolumeUL", + NULL, +}; + +typedef const char** meas_list; + +static const meas_list ran_def_kpm[END_NGRAN_NODE_TYPE] = { + NULL, + NULL, + kpm_meas_gnb, + NULL, + NULL, + kpm_meas_cuup, // at the moment, for CU, we use the same function as for CU-UP + NULL, + kpm_meas_du, + NULL, + NULL, // at the moment, no measurement is implemented in CU-CP + kpm_meas_cuup, +}; + +void read_kpm_setup_sm(void* e2ap) +{ + assert(e2ap != NULL); +// assert(e2ap->type == KPM_V3_0_AGENT_IF_E2_SETUP_ANS_V0); + + kpm_e2_setup_t* kpm = (kpm_e2_setup_t*)(e2ap); + + /* Fill the RAN Function Definition with currently supported measurements */ + + // RAN Function Name is already filled in fill_ran_function_name() in kpm_sm_agent.c + + // Fill supported measurements depending on the E2 node + // [1, 65535] + // 3GPP TS 28.552 + const ngran_node_t node_type = get_e2_node_type(); + const char** kpm_meas = ran_def_kpm[node_type]; + if (kpm_meas == NULL) return; // e.g. CU-CP node, doesn't support any measurements + size_t sz = 0; + while (kpm_meas[sz] != NULL) { + sz++; + } + + // Sequence of Report styles + const size_t sz_report = 1; + kpm->ran_func_def.sz_ric_report_style_list = sz_report; + kpm->ran_func_def.ric_report_style_list = calloc(sz_report, sizeof(ric_report_style_item_t)); + assert(kpm->ran_func_def.ric_report_style_list != NULL && "Memory exhausted"); + + ric_report_style_item_t* report_item = &kpm->ran_func_def.ric_report_style_list[0]; + + report_item->report_style_type = STYLE_4_RIC_SERVICE_REPORT; + const char report_style_name[] = "Common Condition-based, UE-level Measurement"; + report_item->report_style_name = cp_str_to_ba(report_style_name); + report_item->act_def_format_type = FORMAT_4_ACTION_DEFINITION; + + report_item->meas_info_for_action_lst_len = sz; + report_item->meas_info_for_action_lst = calloc(sz, sizeof(meas_info_for_action_lst_t)); + assert(report_item->meas_info_for_action_lst != NULL && "Memory exhausted"); + + for(size_t i = 0; i < sz; i++) { + meas_info_for_action_lst_t* meas_item = &report_item->meas_info_for_action_lst[i]; + // 8.3.9 + meas_item->name = cp_str_to_ba(kpm_meas[i]); + + // 8.3.10 - OPTIONAL + meas_item->id = NULL; + + // 8.3.26 - OPTIONAL + meas_item->bin_range_def = NULL; + } + + // Sequence of Event Trigger styles + const size_t sz_ev_tr = 1; + kpm->ran_func_def.sz_ric_event_trigger_style_list = sz_ev_tr; + kpm->ran_func_def.ric_event_trigger_style_list = calloc(sz_ev_tr, sizeof(ric_event_trigger_style_item_t)); + assert(kpm->ran_func_def.ric_event_trigger_style_list != NULL && "Memory exhausted"); + + ric_event_trigger_style_item_t* ev_tr_item = &kpm->ran_func_def.ric_event_trigger_style_list[0]; + + ev_tr_item->style_type = STYLE_1_RIC_EVENT_TRIGGER; + const char ev_style_name[] = "Periodic Report"; + ev_tr_item->style_name = cp_str_to_ba(ev_style_name); + ev_tr_item->format_type = FORMAT_1_RIC_EVENT_TRIGGER; + + // Supported RIC Indication Formats + report_item->ind_hdr_format_type = FORMAT_1_INDICATION_HEADER; // 8.3.5 + report_item->ind_msg_format_type = FORMAT_3_INDICATION_MESSAGE; // 8.3.5 + + // E2 Setup Request is sent periodically until the connection is established + // RC subscritpion data should be initialized only once + const int ret = pthread_once(&once_kpm_mutex, init_once_kpm); + DevAssert(ret == 0); +} + +sm_ag_if_ans_t write_ctrl_kpm_sm(void const* src) +{ + printf("write_ctrl callback for KPM SM: operation not supported\n"); + (void)src; + sm_ag_if_ans_t ans = {0}; + return ans; +} diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c.patch b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c.patch new file mode 100644 index 0000000..1863fbf --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c.patch @@ -0,0 +1,286 @@ +diff --git a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c +index 80579e1754..07b8974aa0 100644 +--- a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c ++++ b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c +@@ -22,6 +22,7 @@ + #include "ran_func_kpm_subs.h" + + #include ++#include // For log10 in fill_RSRQ + + /* measurements that need to store values from previous reporting period have a limitation + when it comes to multiple subscriptions to the same UEs; ric_req_id is unique per subscription */ +@@ -82,6 +83,249 @@ static meas_record_lst_t fill_DRB_PdcpSduVolumeUL(__attribute__((unused))uint32_ + return meas_record; + } + ++// Added metric for research purposes only ++static meas_record_lst_t fill_RSRP(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = REAL_MEAS_VALUE; ++ ++ // Calculate the average value of RSRP ++ if (ue_info.ue->mac_stats.prev_num_rsrp_meas > 0) { ++ meas_record.real_val = (double)ue_info.ue->mac_stats.prev_cumul_rsrp / (double)ue_info.ue->mac_stats.prev_num_rsrp_meas; // [dBm] ++ } else { ++ meas_record.real_val = 0.0; ++ } ++ ++ return meas_record; ++} ++ ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_N_RSRP_MEAS(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = INTEGER_MEAS_VALUE; ++ ++ // Get the value of the number of RSRP measurements ++ meas_record.int_val = ue_info.ue->mac_stats.prev_num_rsrp_meas; ++ ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_N_PRB(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = INTEGER_MEAS_VALUE; ++ ++ // Get the value of NPRB ++ meas_record.int_val = ue_info.ue->mac_stats.NPRB; ++ ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_RSSI(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = REAL_MEAS_VALUE; ++ ++ // Retrieve the cumulative RSRP in dBm averaged over the number of measurements ++ double RSRP = ue_info.ue->mac_stats.prev_num_rsrp_meas > 0 ? (double)ue_info.ue->mac_stats.prev_cumul_rsrp / ue_info.ue->mac_stats.prev_num_rsrp_meas : 0.0; ++ ++ // Retrieve the number of Resource Blocks over which RSSI is measured ++ double N = ue_info.ue->mac_stats.NPRB; ++ ++ ++ // RSRP (dBM) = RSSI - 10*log(12*N) ++ double RSSI = RSRP + 10 * log10(12 * N); ++ ++ meas_record.real_val = RSSI; ++ ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_RSRQ(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = REAL_MEAS_VALUE; ++ ++ // Retrieve the cumulative RSRP in dBm averaged over the number of measurements ++ double RSRP = ue_info.ue->mac_stats.prev_num_rsrp_meas > 0 ? (double)ue_info.ue->mac_stats.prev_cumul_rsrp / ue_info.ue->mac_stats.prev_num_rsrp_meas : 0.0; ++ ++ // Retrieve the number of Resource Blocks over which RSSI is measured ++ double N = ue_info.ue->mac_stats.NPRB; ++ ++ // RSRP (dBM) = RSSI - 10*log(12*N) ++ double RSSI = RSRP + 10 * log10(12 * N); ++ ++ // RSRQ=(N*RSRP)/RSSI ++ double RSRQ = (N * RSRP) / RSSI; ++ ++ meas_record.real_val = RSRQ; ++ ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_PUSCH_SNR(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = REAL_MEAS_VALUE; ++ ++ // Calculate SNR from pusch_snrx10, which is SNR * 10; divide by 10 to get the actual SNR ++ meas_record.real_val = ue_info.ue->UE_sched_ctrl.pusch_snrx10 / 10.0; // [dB] ++ ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_PUCCH_SNR(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = REAL_MEAS_VALUE; ++ ++ // Calculate SNR from pusch_snrx10, which is SNR * 10; divide by 10 to get the actual SNR ++ meas_record.real_val = ue_info.ue->UE_sched_ctrl.pucch_snrx10 / 10.0; // [dB] ++ ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_MCS_UL(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = INTEGER_MEAS_VALUE; ++ ++ // Fetch the MCS value ++ meas_record.int_val = ue_info.ue->UE_sched_ctrl.ul_bler_stats.mcs; ++ ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_MCS_DL(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = INTEGER_MEAS_VALUE; ++ ++ // Fetch the MCS value ++ meas_record.int_val = ue_info.ue->UE_sched_ctrl.dl_bler_stats.mcs; ++ // Fetch the MCS table index ++ return meas_record; ++} ++// Added metric for research purposes only ++static meas_record_lst_t fill_BLER_UL(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = REAL_MEAS_VALUE; ++ ++ // Calculate the Block Error Rate (BLER) for UL ++ meas_record.real_val = (double)ue_info.ue->UE_sched_ctrl.ul_bler_stats.bler; ++ ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_BLER_DL(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = REAL_MEAS_VALUE; ++ ++ // Calculate the Block Error Rate (BLER) for DL ++ meas_record.real_val = (double)ue_info.ue->UE_sched_ctrl.dl_bler_stats.bler; ++ ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_DRB_MacSduRetransmissionRateDl(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = REAL_MEAS_VALUE; ++ ++ // Calculate the RB retransmission rate (RBs retransmitted / total RBs allocated for initial transmissions) ++ meas_record.real_val = (double)ue_info.ue->mac_stats.dl.total_rbs_retx / (double)ue_info.ue->mac_stats.dl.total_rbs; ++ ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_DRB_MacSduErrorRateDl(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = REAL_MEAS_VALUE; ++ ++ // Calculate the SDU-level packet drop rate (SDUs failed due to HARQ failures / total SDUs transmitted) ++ meas_record.real_val = (double)ue_info.ue->mac_stats.dl.sdu_errors / (double)ue_info.ue->mac_stats.dl.num_mac_sdu; ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_DRB_MacSduRetransmissionRateUl(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = REAL_MEAS_VALUE; ++ ++ // Calculate the RB retransmission rate (RBs retransmitted / total RBs allocated for initial transmissions) ++ meas_record.real_val = (double)ue_info.ue->mac_stats.ul.total_rbs_retx / (double)ue_info.ue->mac_stats.ul.total_rbs; ++ ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_DRB_MacSduErrorRateUl(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = REAL_MEAS_VALUE; ++ ++ // Calculate the SDU-level packet drop rate (SDUs failed due to HARQ failures / total SDUs transmitted) ++ meas_record.real_val = (double)ue_info.ue->mac_stats.ul.sdu_errors / (double)ue_info.ue->mac_stats.ul.num_mac_sdu; ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_CQI_SINGLE_CODEWORD(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = INTEGER_MEAS_VALUE; ++ ++ // Fetch the CQI value ++ meas_record.int_val = ue_info.ue->UE_sched_ctrl.CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb; ++ ++ return meas_record; ++} ++ ++// Added metric for research purposes only ++static meas_record_lst_t fill_CQI_DUAL_CODEWORD(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = INTEGER_MEAS_VALUE; ++ ++ // Fetch the CQI value ++ meas_record.int_val = ue_info.ue->UE_sched_ctrl.CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_2tb; ++ ++ return meas_record; ++} ++ + #if defined (NGRAN_GNB_DU) + static uldlcounter_t last_rlc_pdu_total_bytes[MAX_MOBILES_PER_GNB] = {0}; + static uldlcounter_t last_total_prbs[MAX_MOBILES_PER_GNB] = {0}; +@@ -194,6 +438,23 @@ static meas_record_lst_t fill_RRU_PrbTotUl(__attribute__((unused))uint32_t gran_ + static kv_measure_t lst_measure[] = { + {.key = "DRB.PdcpSduVolumeDL", .value = fill_DRB_PdcpSduVolumeDL }, + {.key = "DRB.PdcpSduVolumeUL", .value = fill_DRB_PdcpSduVolumeUL }, ++ {.key = "RSRP", .value = fill_RSRP }, ++ {.key = "N_RSRP_MEAS", .value = fill_N_RSRP_MEAS }, ++ {.key = "N_PRB", .value = fill_N_PRB }, ++ {.key = "RSSI", .value = fill_RSSI }, ++ {.key = "RSRQ", .value = fill_RSRQ }, ++ {.key = "PUSCH_SNR", .value = fill_PUSCH_SNR }, ++ {.key = "PUCCH_SNR", .value = fill_PUCCH_SNR }, ++ {.key = "DRB.HarqMcsUl", .value = fill_MCS_UL }, ++ {.key = "DRB.HarqMcsDl", .value = fill_MCS_DL }, ++ {.key = "DRB.HarqBlockErrorRateUl", .value = fill_BLER_UL }, ++ {.key = "DRB.HarqBlockErrorRateDl", .value = fill_BLER_DL }, ++ {.key = "DRB.MacSduRetransmissionRateUl", .value = fill_DRB_MacSduRetransmissionRateUl }, ++ {.key = "DRB.MacSduRetransmissionRateDl", .value = fill_DRB_MacSduRetransmissionRateDl }, ++ {.key = "DRB.MacSduErrorRateUl", .value = fill_DRB_MacSduErrorRateUl }, ++ {.key = "DRB.MacSduErrorRateDl", .value = fill_DRB_MacSduErrorRateDl }, ++ {.key = "CQI_SINGLE_CODEWORD", .value = fill_CQI_SINGLE_CODEWORD }, ++ {.key = "CQI_DUAL_CODEWORD", .value = fill_CQI_DUAL_CODEWORD }, + #if defined (NGRAN_GNB_DU) + {.key = "DRB.RlcSduDelayDl", .value = fill_DRB_RlcSduDelayDl }, + {.key = "DRB.UEThpDl", .value = fill_DRB_UEThpDl }, diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.previous.c b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.previous.c new file mode 100644 index 0000000..80579e1 --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.previous.c @@ -0,0 +1,232 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "ran_func_kpm_subs.h" + +#include + +/* measurements that need to store values from previous reporting period have a limitation + when it comes to multiple subscriptions to the same UEs; ric_req_id is unique per subscription */ +typedef struct uldlcounter { + uint32_t dl; + uint32_t ul; +} uldlcounter_t; + +static uldlcounter_t last_pdcp_sdu_total_bytes[MAX_MOBILES_PER_GNB] = {0}; + +static nr_pdcp_statistics_t get_pdcp_stats_per_drb(const uint32_t rrc_ue_id, const int rb_id) +{ + nr_pdcp_statistics_t pdcp = {0}; + const int srb_flag = 0; + + // Get PDCP stats for specific DRB + const bool rc = nr_pdcp_get_statistics(rrc_ue_id, srb_flag, rb_id, &pdcp); + assert(rc == true && "Cannot get PDCP stats\n"); + + return pdcp; +} + +/* 3GPP TS 28.522 - section 5.1.2.1.1.1 + note: this measurement is calculated as per spec */ +static meas_record_lst_t fill_DRB_PdcpSduVolumeDL(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + // Get PDCP stats per DRB + const int rb_id = 1; // at the moment, only 1 DRB is supported + nr_pdcp_statistics_t pdcp = get_pdcp_stats_per_drb(ue_info.rrc_ue_id, rb_id); + + meas_record.value = INTEGER_MEAS_VALUE; + + // Get DL data volume delivered to PDCP layer + meas_record.int_val = (pdcp.rxsdu_bytes - last_pdcp_sdu_total_bytes[ue_idx].dl)*8/1000; // [kb] + last_pdcp_sdu_total_bytes[ue_idx].dl = pdcp.rxsdu_bytes; + + return meas_record; +} + +/* 3GPP TS 28.522 - section 5.1.2.1.2.1 + note: this measurement is calculated as per spec */ +static meas_record_lst_t fill_DRB_PdcpSduVolumeUL(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + // Get PDCP stats per DRB + const int rb_id = 1; // at the moment, only 1 DRB is supported + nr_pdcp_statistics_t pdcp = get_pdcp_stats_per_drb(ue_info.rrc_ue_id, rb_id); + + meas_record.value = INTEGER_MEAS_VALUE; + + // Get UL data volume delivered from PDCP layer + meas_record.int_val = (pdcp.txsdu_bytes - last_pdcp_sdu_total_bytes[ue_idx].ul)*8/1000; // [kb] + last_pdcp_sdu_total_bytes[ue_idx].ul = pdcp.txsdu_bytes; + + return meas_record; +} + +#if defined (NGRAN_GNB_DU) +static uldlcounter_t last_rlc_pdu_total_bytes[MAX_MOBILES_PER_GNB] = {0}; +static uldlcounter_t last_total_prbs[MAX_MOBILES_PER_GNB] = {0}; + +static nr_rlc_statistics_t get_rlc_stats_per_drb(const rnti_t rnti, const int rb_id) +{ + nr_rlc_statistics_t rlc = {0}; + const int srb_flag = 0; + + // Get RLC stats for specific DRB + const bool rc = nr_rlc_get_statistics(rnti, srb_flag, rb_id, &rlc); + assert(rc == true && "Cannot get RLC stats\n"); + + // Activate average sojourn time at the RLC buffer for specific DRB + nr_rlc_activate_avg_time_to_tx(rnti, rb_id+3, 1); + + return rlc; +} + +/* 3GPP TS 28.522 - section 5.1.3.3.3 + note: by default this measurement is calculated for previous 100ms (openair2/LAYER2/nr_rlc/nr_rlc_entity.c:118, 173, 213); please, update according to your needs */ +static meas_record_lst_t fill_DRB_RlcSduDelayDl(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + // Get RLC stats per DRB + const int rb_id = 1; // at the moment, only 1 DRB is supported + nr_rlc_statistics_t rlc = get_rlc_stats_per_drb(ue_info.ue->rnti, rb_id); + + meas_record.value = REAL_MEAS_VALUE; + + // Get the value of sojourn time at the RLC buffer + meas_record.real_val = rlc.txsdu_avg_time_to_tx; // [μs] + + return meas_record; +} + +/* 3GPP TS 28.522 - section 5.1.1.3.1 + note: per spec, average UE throughput in DL (taken into consideration values from all UEs, and averaged) + here calculated as: UE specific throughput in DL */ +static meas_record_lst_t fill_DRB_UEThpDl(uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + // Get RLC stats per DRB + const int rb_id = 1; // at the moment, only 1 DRB is supported + nr_rlc_statistics_t rlc = get_rlc_stats_per_drb(ue_info.ue->rnti, rb_id); + meas_record.value = REAL_MEAS_VALUE; + + // Calculate DL Thp + meas_record.real_val = (double)(rlc.txpdu_bytes - last_rlc_pdu_total_bytes[ue_idx].dl)*8/gran_period_ms; // [kbps] + last_rlc_pdu_total_bytes[ue_idx].dl = rlc.txpdu_bytes; + + return meas_record; +} + +/* 3GPP TS 28.522 - section 5.1.1.3.3 + note: per spec, average UE throughput in UL (taken into consideration values from all UEs, and averaged) + here calculated as: UE specific throughput in UL */ +static meas_record_lst_t fill_DRB_UEThpUl(uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + // Get RLC stats per DRB + const int rb_id = 1; // at the moment, only 1 DRB is supported + nr_rlc_statistics_t rlc = get_rlc_stats_per_drb(ue_info.ue->rnti, rb_id); + + meas_record.value = REAL_MEAS_VALUE; + + // Calculate UL Thp + meas_record.real_val = (double)(rlc.rxpdu_bytes - last_rlc_pdu_total_bytes[ue_idx].ul)*8/gran_period_ms; // [kbps] + last_rlc_pdu_total_bytes[ue_idx].ul = rlc.rxpdu_bytes; + + return meas_record; +} + +/* 3GPP TS 28.522 - section 5.1.1.2.1 + note: per spec, DL PRB usage [%] = (total used PRBs for DL traffic / total available PRBs for DL traffic) * 100 + here calculated as: aggregated DL PRBs (t) - aggregated DL PRBs (t-gran_period) */ +static meas_record_lst_t fill_RRU_PrbTotDl(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + meas_record.value = INTEGER_MEAS_VALUE; + + // Get the number of DL PRBs + meas_record.int_val = ue_info.ue->mac_stats.dl.total_rbs - last_total_prbs[ue_idx].dl; // [PRBs] + last_total_prbs[ue_idx].dl = ue_info.ue->mac_stats.dl.total_rbs; + + return meas_record; +} + +/* 3GPP TS 28.522 - section 5.1.1.2.2 + note: per spec, UL PRB usage [%] = (total used PRBs for UL traffic / total available PRBs for UL traffic) * 100 + here calculated as: aggregated UL PRBs (t) - aggregated UL PRBs (t-gran_period) */ +static meas_record_lst_t fill_RRU_PrbTotUl(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + meas_record.value = INTEGER_MEAS_VALUE; + + // Get the number of UL PRBs + meas_record.int_val = ue_info.ue->mac_stats.ul.total_rbs - last_total_prbs[ue_idx].ul; // [PRBs] + last_total_prbs[ue_idx].ul = ue_info.ue->mac_stats.ul.total_rbs; + + return meas_record; +} +#endif + +static kv_measure_t lst_measure[] = { + {.key = "DRB.PdcpSduVolumeDL", .value = fill_DRB_PdcpSduVolumeDL }, + {.key = "DRB.PdcpSduVolumeUL", .value = fill_DRB_PdcpSduVolumeUL }, +#if defined (NGRAN_GNB_DU) + {.key = "DRB.RlcSduDelayDl", .value = fill_DRB_RlcSduDelayDl }, + {.key = "DRB.UEThpDl", .value = fill_DRB_UEThpDl }, + {.key = "DRB.UEThpUl", .value = fill_DRB_UEThpUl }, + {.key = "RRU.PrbTotDl", .value = fill_RRU_PrbTotDl }, + {.key = "RRU.PrbTotUl", .value = fill_RRU_PrbTotUl }, +#endif +}; + +void init_kpm_subs_data(void) +{ + const size_t ht_len = sizeof(lst_measure) / sizeof(lst_measure[0]); + hcreate(ht_len); + + ENTRY kv_pair; + + for (size_t i = 0; i < ht_len; i++) { + kv_pair.key = lst_measure[i].key; + kv_pair.data = &lst_measure[i]; + hsearch(kv_pair, ENTER); + } +} + +meas_record_lst_t get_kpm_meas_value(char* kpm_meas_name, uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + assert(kpm_meas_name != NULL); + + ENTRY search_entry = {.key = kpm_meas_name}; + ENTRY *found_entry = hsearch(search_entry, FIND); + assert(found_entry != NULL && "Unsupported KPM measurement name"); + + kv_measure_t *kv_found = (kv_measure_t *)found_entry->data; + meas_record_lst_t meas_record = kv_found->value(gran_period_ms, ue_info, ue_idx); + + return meas_record; +} diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c.patch b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c.patch new file mode 100644 index 0000000..e95b9ca --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c.patch @@ -0,0 +1,22 @@ +diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +index b69490fbc9..f36b111a6e 100644 +--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c ++++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +@@ -379,6 +379,9 @@ void abort_nr_dl_harq(NR_UE_info_t* UE, int8_t harq_pid) + + finish_nr_dl_harq(sched_ctrl, harq_pid); + UE->mac_stats.dl.errors++; ++ ++ NR_UE_harq_t *harq = &sched_ctrl->harq_processes[harq_pid]; ++ UE->mac_stats.dl.sdu_errors += harq->num_sdus; // SDU-level failures + } + + typedef struct { +@@ -1370,6 +1373,7 @@ void nr_schedule_ue_spec(module_id_t module_id, + gNB_mac->mac_stats.used_prb_aggregate += sched_pdsch->rbSize; + + /* save retransmission information */ ++ harq->num_sdus = sdus; + harq->sched_pdsch = *sched_pdsch; + /* save which time allocation has been used, to be used on + * retransmissions */ diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c.previous b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c.previous new file mode 100644 index 0000000..b69490f --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c.previous @@ -0,0 +1,1402 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file gNB_scheduler_dlsch.c + * \brief procedures related to gNB for the DLSCH transport channel + * \author Guido Casati + * \date 2019 + * \email: guido.casati@iis.fraunhofe.de + * \version 1.0 + * @ingroup _mac + + */ + +#include "common/utils/nr/nr_common.h" +/*MAC*/ +#include "NR_MAC_COMMON/nr_mac.h" +#include "NR_MAC_gNB/nr_mac_gNB.h" +#include "LAYER2/NR_MAC_gNB/mac_proto.h" +#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h" + +/*TAG*/ +#include "NR_TAG-Id.h" + +/*Softmodem params*/ +#include "executables/softmodem-common.h" +#include "../../../nfapi/oai_integration/vendor_ext.h" + +//////////////////////////////////////////////////////// +/////* DLSCH MAC PDU generation (6.1.2 TS 38.321) *///// +//////////////////////////////////////////////////////// +#define OCTET 8 +#define HALFWORD 16 +#define WORD 32 +//#define SIZE_OF_POINTER sizeof (void *) + +int get_dl_tda(const gNB_MAC_INST *nrmac, int slot) +{ + /* we assume that this function is mutex-protected from outside */ + const frame_structure_t *fs = &nrmac->frame_structure; + + // Use special TDA in case of CSI-RS + if (nrmac->UE_info.sched_csirs > 0) + return 1; + + if (fs->frame_type == TDD) { + int s = get_slot_idx_in_period(slot, fs); + // if there is a mixed slot where we can transmit DL + const tdd_bitmap_t *tdd_slot_bitmap = fs->period_cfg.tdd_slot_bitmap; + if (tdd_slot_bitmap[s].num_dl_symbols > 1 && is_mixed_slot(s, fs)) { + return 2; + } + } + return 0; // if FDD or not mixed slot in TDD, for now use default TDA +} + +// Compute and write all MAC CEs and subheaders, and return number of written +// bytes +int nr_write_ce_dlsch_pdu(module_id_t module_idP, + const NR_UE_sched_ctrl_t *ue_sched_ctl, + unsigned char *mac_pdu, + unsigned char drx_cmd, + unsigned char *ue_cont_res_id) +{ + gNB_MAC_INST *gNB = RC.nrmac[module_idP]; + /* already mutex protected: called below and in _RA.c */ + NR_SCHED_ENSURE_LOCKED(&gNB->sched_lock); + + NR_MAC_SUBHEADER_FIXED *mac_pdu_ptr = (NR_MAC_SUBHEADER_FIXED *) mac_pdu; + uint8_t last_size = 0; + int offset = 0, mac_ce_size, i, timing_advance_cmd, tag_id = 0; + // MAC CEs + uint8_t mac_header_control_elements[16], *ce_ptr; + ce_ptr = &mac_header_control_elements[0]; + + // DRX command subheader (MAC CE size 0) + if (drx_cmd != 255) { + mac_pdu_ptr->R = 0; + mac_pdu_ptr->LCID = DL_SCH_LCID_DRX; + //last_size = 1; + mac_pdu_ptr++; + } + + // Timing Advance subheader + /* This was done only when timing_advance_cmd != 31 + // now TA is always send when ta_timer resets regardless of its value + // this is done to avoid issues with the timeAlignmentTimer which is + // supposed to monitor if the UE received TA or not */ + if (ue_sched_ctl->ta_apply) { + mac_pdu_ptr->R = 0; + mac_pdu_ptr->LCID = DL_SCH_LCID_TA_COMMAND; + //last_size = 1; + mac_pdu_ptr++; + // TA MAC CE (1 octet) + timing_advance_cmd = ue_sched_ctl->ta_update; + AssertFatal(timing_advance_cmd < 64, "timing_advance_cmd %d > 63\n", timing_advance_cmd); + ((NR_MAC_CE_TA *) ce_ptr)->TA_COMMAND = timing_advance_cmd; //(timing_advance_cmd+31)&0x3f; + + tag_id = gNB->tag->tag_Id; + ((NR_MAC_CE_TA *) ce_ptr)->TAGID = tag_id; + + LOG_D(NR_MAC, "NR MAC CE timing advance command = %d (%d) TAG ID = %d\n", timing_advance_cmd, ((NR_MAC_CE_TA *) ce_ptr)->TA_COMMAND, tag_id); + mac_ce_size = sizeof(NR_MAC_CE_TA); + // Copying bytes for MAC CEs to the mac pdu pointer + memcpy((void *) mac_pdu_ptr, (void *) ce_ptr, mac_ce_size); + ce_ptr += mac_ce_size; + mac_pdu_ptr += (unsigned char) mac_ce_size; + } + + // Contention resolution fixed subheader and MAC CE + if (ue_cont_res_id) { + mac_pdu_ptr->R = 0; + mac_pdu_ptr->LCID = DL_SCH_LCID_CON_RES_ID; + mac_pdu_ptr++; + //last_size = 1; + // contention resolution identity MAC ce has a fixed 48 bit size + // this contains the UL CCCH SDU. If UL CCCH SDU is longer than 48 bits, + // it contains the first 48 bits of the UL CCCH SDU + LOG_D(NR_MAC, + "[gNB ][RAPROC] Generate contention resolution msg: %x.%x.%x.%x.%x.%x\n", + ue_cont_res_id[0], + ue_cont_res_id[1], + ue_cont_res_id[2], + ue_cont_res_id[3], + ue_cont_res_id[4], + ue_cont_res_id[5]); + // Copying bytes (6 octects) to CEs pointer + mac_ce_size = 6; + memcpy(ce_ptr, ue_cont_res_id, mac_ce_size); + // Copying bytes for MAC CEs to mac pdu pointer + memcpy((void *) mac_pdu_ptr, (void *) ce_ptr, mac_ce_size); + ce_ptr += mac_ce_size; + mac_pdu_ptr += (unsigned char) mac_ce_size; + } + + //TS 38.321 Sec 6.1.3.15 TCI State indication for UE Specific PDCCH MAC CE SubPDU generation + if (ue_sched_ctl->UE_mac_ce_ctrl.pdcch_state_ind.is_scheduled) { + //filling subheader + mac_pdu_ptr->R = 0; + mac_pdu_ptr->LCID = DL_SCH_LCID_TCI_STATE_IND_UE_SPEC_PDCCH; + mac_pdu_ptr++; + //Creating the instance of CE structure + NR_TCI_PDCCH nr_UESpec_TCI_StateInd_PDCCH; + //filling the CE structre + nr_UESpec_TCI_StateInd_PDCCH.CoresetId1 = ((ue_sched_ctl->UE_mac_ce_ctrl.pdcch_state_ind.coresetId) & 0xF) >> 1; //extracting MSB 3 bits from LS nibble + nr_UESpec_TCI_StateInd_PDCCH.ServingCellId = (ue_sched_ctl->UE_mac_ce_ctrl.pdcch_state_ind.servingCellId) & 0x1F; //extracting LSB 5 Bits + nr_UESpec_TCI_StateInd_PDCCH.TciStateId = (ue_sched_ctl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId) & 0x7F; //extracting LSB 7 bits + nr_UESpec_TCI_StateInd_PDCCH.CoresetId2 = (ue_sched_ctl->UE_mac_ce_ctrl.pdcch_state_ind.coresetId) & 0x1; //extracting LSB 1 bit + LOG_D(NR_MAC, "NR MAC CE TCI state indication for UE Specific PDCCH = %d \n", nr_UESpec_TCI_StateInd_PDCCH.TciStateId); + mac_ce_size = sizeof(NR_TCI_PDCCH); + // Copying bytes for MAC CEs to the mac pdu pointer + memcpy((void *) mac_pdu_ptr, (void *)&nr_UESpec_TCI_StateInd_PDCCH, mac_ce_size); + //incrementing the PDU pointer + mac_pdu_ptr += (unsigned char) mac_ce_size; + } + + //TS 38.321 Sec 6.1.3.16, SP CSI reporting on PUCCH Activation/Deactivation MAC CE + if (ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.is_scheduled) { + //filling the subheader + mac_pdu_ptr->R = 0; + mac_pdu_ptr->LCID = DL_SCH_LCID_SP_CSI_REP_PUCCH_ACT; + mac_pdu_ptr++; + //creating the instance of CE structure + NR_PUCCH_CSI_REPORTING nr_PUCCH_CSI_reportingActDeact; + //filling the CE structure + nr_PUCCH_CSI_reportingActDeact.BWP_Id = (ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.bwpId) & 0x3; //extracting LSB 2 bibs + nr_PUCCH_CSI_reportingActDeact.ServingCellId = (ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.servingCellId) & 0x1F; //extracting LSB 5 bits + nr_PUCCH_CSI_reportingActDeact.S0 = ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.s0tos3_actDeact[0]; + nr_PUCCH_CSI_reportingActDeact.S1 = ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.s0tos3_actDeact[1]; + nr_PUCCH_CSI_reportingActDeact.S2 = ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.s0tos3_actDeact[2]; + nr_PUCCH_CSI_reportingActDeact.S3 = ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.s0tos3_actDeact[3]; + nr_PUCCH_CSI_reportingActDeact.R2 = 0; + mac_ce_size = sizeof(NR_PUCCH_CSI_REPORTING); + // Copying MAC CE data to the mac pdu pointer + memcpy((void *) mac_pdu_ptr, (void *)&nr_PUCCH_CSI_reportingActDeact, mac_ce_size); + //incrementing the PDU pointer + mac_pdu_ptr += (unsigned char) mac_ce_size; + } + + //TS 38.321 Sec 6.1.3.14, TCI State activation/deactivation for UE Specific PDSCH MAC CE + if (ue_sched_ctl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.is_scheduled) { + //Computing the number of octects to be allocated for Flexible array member + //of MAC CE structure + uint8_t num_octects = (ue_sched_ctl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.highestTciStateActivated) / 8 + 1; //Calculating the number of octects for allocating the memory + //filling the subheader + ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0; + ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0; + ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = DL_SCH_LCID_TCI_STATE_ACT_UE_SPEC_PDSCH; + ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->L = sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t); + last_size = 2; + //Incrementing the PDU pointer + mac_pdu_ptr += last_size; + //allocating memory for CE Structure + NR_TCI_PDSCH_APERIODIC_CSI *nr_UESpec_TCI_StateInd_PDSCH = (NR_TCI_PDSCH_APERIODIC_CSI *)malloc(sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t)); + //initializing to zero + memset((void *)nr_UESpec_TCI_StateInd_PDSCH, 0, sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t)); + //filling the CE Structure + nr_UESpec_TCI_StateInd_PDSCH->BWP_Id = (ue_sched_ctl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.bwpId) & 0x3; //extracting LSB 2 Bits + nr_UESpec_TCI_StateInd_PDSCH->ServingCellId = (ue_sched_ctl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.servingCellId) & 0x1F; //extracting LSB 5 bits + + for(i = 0; i < (num_octects * 8); i++) { + if(ue_sched_ctl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.tciStateActDeact[i]) + nr_UESpec_TCI_StateInd_PDSCH->T[i / 8] = nr_UESpec_TCI_StateInd_PDSCH->T[i / 8] | (1 << (i % 8)); + } + + mac_ce_size = sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t); + //Copying bytes for MAC CEs to the mac pdu pointer + memcpy((void *) mac_pdu_ptr, (void *)nr_UESpec_TCI_StateInd_PDSCH, mac_ce_size); + //incrementing the mac pdu pointer + mac_pdu_ptr += (unsigned char) mac_ce_size; + //freeing the allocated memory + free(nr_UESpec_TCI_StateInd_PDSCH); + } + + //TS38.321 Sec 6.1.3.13 Aperiodic CSI Trigger State Subselection MAC CE + if (ue_sched_ctl->UE_mac_ce_ctrl.aperi_CSI_trigger.is_scheduled) { + //Computing the number of octects to be allocated for Flexible array member + //of MAC CE structure + uint8_t num_octects = (ue_sched_ctl->UE_mac_ce_ctrl.aperi_CSI_trigger.highestTriggerStateSelected) / 8 + 1; //Calculating the number of octects for allocating the memory + //filling the subheader + ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0; + ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0; + ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = DL_SCH_LCID_APERIODIC_CSI_TRI_STATE_SUBSEL; + ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->L = sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t); + last_size = 2; + //Incrementing the PDU pointer + mac_pdu_ptr += last_size; + //allocating memory for CE structure + NR_TCI_PDSCH_APERIODIC_CSI *nr_Aperiodic_CSI_Trigger = (NR_TCI_PDSCH_APERIODIC_CSI *)malloc(sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t)); + //initializing to zero + memset((void *)nr_Aperiodic_CSI_Trigger, 0, sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t)); + //filling the CE Structure + nr_Aperiodic_CSI_Trigger->BWP_Id = (ue_sched_ctl->UE_mac_ce_ctrl.aperi_CSI_trigger.bwpId) & 0x3; //extracting LSB 2 bits + nr_Aperiodic_CSI_Trigger->ServingCellId = (ue_sched_ctl->UE_mac_ce_ctrl.aperi_CSI_trigger.servingCellId) & 0x1F; //extracting LSB 5 bits + nr_Aperiodic_CSI_Trigger->R = 0; + + for(i = 0; i < (num_octects * 8); i++) { + if(ue_sched_ctl->UE_mac_ce_ctrl.aperi_CSI_trigger.triggerStateSelection[i]) + nr_Aperiodic_CSI_Trigger->T[i / 8] = nr_Aperiodic_CSI_Trigger->T[i / 8] | (1 << (i % 8)); + } + + mac_ce_size = sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t); + // Copying bytes for MAC CEs to the mac pdu pointer + memcpy((void *) mac_pdu_ptr, (void *)nr_Aperiodic_CSI_Trigger, mac_ce_size); + //incrementing the mac pdu pointer + mac_pdu_ptr += (unsigned char) mac_ce_size; + //freeing the allocated memory + free(nr_Aperiodic_CSI_Trigger); + } + + if (ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.is_scheduled) { + ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->R = 0; + ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->LCID = DL_SCH_LCID_SP_ZP_CSI_RS_RES_SET_ACT; + mac_pdu_ptr++; + ((NR_MAC_CE_SP_ZP_CSI_RS_RES_SET *) mac_pdu_ptr)->A_D = ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.act_deact; + ((NR_MAC_CE_SP_ZP_CSI_RS_RES_SET *) mac_pdu_ptr)->CELLID = ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.serv_cell_id & 0x1F; //5 bits + ((NR_MAC_CE_SP_ZP_CSI_RS_RES_SET *) mac_pdu_ptr)->BWPID = ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.bwpid & 0x3; //2 bits + ((NR_MAC_CE_SP_ZP_CSI_RS_RES_SET *) mac_pdu_ptr)->CSIRS_RSC_ID = ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.rsc_id & 0xF; //4 bits + ((NR_MAC_CE_SP_ZP_CSI_RS_RES_SET *) mac_pdu_ptr)->R = 0; + LOG_D(NR_MAC, "NR MAC CE of ZP CSIRS Serv cell ID = %d BWPID= %d Rsc set ID = %d\n", ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.serv_cell_id, ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.bwpid, + ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.rsc_id); + mac_ce_size = sizeof(NR_MAC_CE_SP_ZP_CSI_RS_RES_SET); + mac_pdu_ptr += (unsigned char) mac_ce_size; + } + + if (ue_sched_ctl->UE_mac_ce_ctrl.csi_im.is_scheduled) { + mac_pdu_ptr->R = 0; + mac_pdu_ptr->LCID = DL_SCH_LCID_SP_CSI_RS_CSI_IM_RES_SET_ACT; + mac_pdu_ptr++; + CSI_RS_CSI_IM_ACT_DEACT_MAC_CE csi_rs_im_act_deact_ce; + csi_rs_im_act_deact_ce.A_D = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.act_deact; + csi_rs_im_act_deact_ce.SCID = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.serv_cellid & 0x3F;//gNB_PHY -> ssb_pdu.ssb_pdu_rel15.PhysCellId; + csi_rs_im_act_deact_ce.BWP_ID = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.bwp_id; + csi_rs_im_act_deact_ce.R1 = 0; + csi_rs_im_act_deact_ce.IM = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.im;// IF set CSI IM Rsc id will presesent else CSI IM RSC ID is abscent + csi_rs_im_act_deact_ce.SP_CSI_RSID = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.nzp_csi_rsc_id; + + if ( csi_rs_im_act_deact_ce.IM ) { //is_scheduled if IM is 1 else this field will not present + csi_rs_im_act_deact_ce.R2 = 0; + csi_rs_im_act_deact_ce.SP_CSI_IMID = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.csi_im_rsc_id; + mac_ce_size = sizeof ( csi_rs_im_act_deact_ce ) - sizeof ( csi_rs_im_act_deact_ce.TCI_STATE ); + } else { + mac_ce_size = sizeof ( csi_rs_im_act_deact_ce ) - sizeof ( csi_rs_im_act_deact_ce.TCI_STATE ) - 1; + } + + memcpy ((void *) mac_pdu_ptr, (void *) & ( csi_rs_im_act_deact_ce), mac_ce_size); + mac_pdu_ptr += (unsigned char) mac_ce_size; + + if (csi_rs_im_act_deact_ce.A_D ) { //Following IE is_scheduled only if A/D is 1 + mac_ce_size = sizeof ( struct TCI_S); + + for ( i = 0; i < ue_sched_ctl->UE_mac_ce_ctrl.csi_im.nb_tci_resource_set_id; i++) { + csi_rs_im_act_deact_ce.TCI_STATE.R = 0; + csi_rs_im_act_deact_ce.TCI_STATE.TCI_STATE_ID = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.tci_state_id [i] & 0x7F; + memcpy ((void *) mac_pdu_ptr, (void *) & (csi_rs_im_act_deact_ce.TCI_STATE), mac_ce_size); + mac_pdu_ptr += (unsigned char) mac_ce_size; + } + } + } + + // compute final offset + offset = ((unsigned char *) mac_pdu_ptr - mac_pdu); + //printf("Offset %d \n", ((unsigned char *) mac_pdu_ptr - mac_pdu)); + return offset; +} + +static void nr_store_dlsch_buffer(module_id_t module_id, frame_t frame, slot_t slot) +{ + UE_iterator(RC.nrmac[module_id]->UE_info.list, UE) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + sched_ctrl->num_total_bytes = 0; + sched_ctrl->dl_pdus_total = 0; + + /* loop over all activated logical channels */ + // Note: DL_SCH_LCID_DCCH, DL_SCH_LCID_DCCH1, DL_SCH_LCID_DTCH + for (int i = 0; i < seq_arr_size(&sched_ctrl->lc_config); ++i) { + const nr_lc_config_t *c = seq_arr_at(&sched_ctrl->lc_config, i); + const int lcid = c->lcid; + const uint16_t rnti = UE->rnti; + LOG_D(NR_MAC, "In %s: UE %x: LCID %d\n", __FUNCTION__, rnti, lcid); + if (lcid == DL_SCH_LCID_DTCH && nr_timer_is_active(&sched_ctrl->transm_interrupt)) + continue; + start_meas(&RC.nrmac[module_id]->rlc_status_ind); + sched_ctrl->rlc_status[lcid] = nr_mac_rlc_status_ind(rnti, frame, lcid); + stop_meas(&RC.nrmac[module_id]->rlc_status_ind); + + if (sched_ctrl->rlc_status[lcid].bytes_in_buffer == 0) + continue; + + sched_ctrl->dl_pdus_total += sched_ctrl->rlc_status[lcid].pdus_in_buffer; + sched_ctrl->num_total_bytes += sched_ctrl->rlc_status[lcid].bytes_in_buffer; + LOG_D(MAC, + "[gNB %d][%4d.%2d] %s%d->DLSCH, RLC status for UE %d: %d bytes in buffer, total DL buffer size = %d bytes, %d total PDU bytes, %s TA command\n", + module_id, + frame, + slot, + lcid < 4 ? "DCCH":"DTCH", + lcid, + UE->rnti, + sched_ctrl->rlc_status[lcid].bytes_in_buffer, + sched_ctrl->num_total_bytes, + sched_ctrl->dl_pdus_total, + sched_ctrl->ta_apply ? "send":"do not send"); + } + } +} + +void finish_nr_dl_harq(NR_UE_sched_ctrl_t *sched_ctrl, int harq_pid) +{ + NR_UE_harq_t *harq = &sched_ctrl->harq_processes[harq_pid]; + + harq->ndi ^= 1; + harq->round = 0; + + add_tail_nr_list(&sched_ctrl->available_dl_harq, harq_pid); +} + +void abort_nr_dl_harq(NR_UE_info_t* UE, int8_t harq_pid) +{ + /* already mutex protected through handle_dl_harq() */ + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + + finish_nr_dl_harq(sched_ctrl, harq_pid); + UE->mac_stats.dl.errors++; +} + +typedef struct { + int bwpStart; + int bwpSize; +} dl_bwp_info_t; + +static dl_bwp_info_t get_bwp_start_size(gNB_MAC_INST *mac, NR_UE_info_t *UE) +{ + NR_UE_DL_BWP_t *dl_bwp = &UE->current_DL_BWP; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + // UE is scheduled in a set of contiguously allocated resource blocks within the active bandwidth part of size N_BWP PRBs + // except for the case when DCI format 1_0 is decoded in any common search space + // in which case the size of CORESET 0 shall be used if CORESET 0 is configured for the cell + // and the size of initial DL bandwidth part shall be used if CORESET 0 is not configured for the cell. + // TS 38.214 Section 5.1.2.2.2 + dl_bwp_info_t bwp_info; + bwp_info.bwpSize = dl_bwp->BWPSize; + bwp_info.bwpStart = dl_bwp->BWPStart; + if (sched_ctrl->search_space->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_common && + dl_bwp->dci_format == NR_DL_DCI_FORMAT_1_0) { + if (mac->cset0_bwp_size != 0) { + bwp_info.bwpStart = mac->cset0_bwp_start; + bwp_info.bwpSize = mac->cset0_bwp_size; + } + else { + // TODO this is not entirely correct + // start would be the start of CORESET not of the initial BWP + bwp_info.bwpStart = UE->sc_info.initial_dl_BWPStart; + bwp_info.bwpSize = UE->sc_info.initial_dl_BWPSize; + } + } + return bwp_info; +} + +static bool allocate_dl_retransmission(module_id_t module_id, + frame_t frame, + slot_t slot, + int *n_rb_sched, + NR_UE_info_t *UE, + int beam_idx, + int current_harq_pid) +{ + + int CC_id = 0; + gNB_MAC_INST *nr_mac = RC.nrmac[module_id]; + const NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels->ServingCellConfigCommon; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + NR_UE_DL_BWP_t *dl_bwp = &UE->current_DL_BWP; + NR_UE_UL_BWP_t *ul_bwp = &UE->current_UL_BWP; + NR_sched_pdsch_t *retInfo = &sched_ctrl->harq_processes[current_harq_pid].sched_pdsch; + NR_sched_pdsch_t *curInfo = &sched_ctrl->sched_pdsch; + + // If the RI changed between current rtx and a previous transmission + // we need to verify if it is not decreased + // othwise it wouldn't be possible to transmit the same TBS + int layers = (curInfo->nrOfLayers < retInfo->nrOfLayers) ? curInfo->nrOfLayers : retInfo->nrOfLayers; + int pm_index = (curInfo->nrOfLayers < retInfo->nrOfLayers) ? curInfo->pm_index : retInfo->pm_index; + + const int coresetid = sched_ctrl->coreset->controlResourceSetId; + const int tda = get_dl_tda(nr_mac, slot); + AssertFatal(tda >= 0,"Unable to find PDSCH time domain allocation in list\n"); + + /* Check first whether the old TDA can be reused + * this helps allocate retransmission when TDA changes (e.g. new nrOfSymbols > old nrOfSymbols) */ + NR_tda_info_t temp_tda = get_dl_tda_info(dl_bwp, + sched_ctrl->search_space->searchSpaceType->present, + tda, + scc->dmrs_TypeA_Position, + 1, + TYPE_C_RNTI_, + coresetid, + false); + if (!temp_tda.valid_tda) + return false; + + bool reuse_old_tda = (retInfo->tda_info.startSymbolIndex == temp_tda.startSymbolIndex) && (retInfo->tda_info.nrOfSymbols <= temp_tda.nrOfSymbols); + LOG_D(NR_MAC, "[UE %x] %s old TDA, %s number of layers\n", + UE->rnti, + reuse_old_tda ? "reuse" : "do not reuse", + layers == retInfo->nrOfLayers ? "same" : "different"); + + uint16_t *rballoc_mask = nr_mac->common_channels[CC_id].vrb_map[beam_idx]; + + dl_bwp_info_t bwp_info = get_bwp_start_size(nr_mac, UE); + int rbStart = bwp_info.bwpStart; + int rbStop = bwp_info.bwpStart + bwp_info.bwpSize - 1; + int rbSize = 0; + + if (reuse_old_tda && layers == retInfo->nrOfLayers) { + /* Check that there are enough resources for retransmission */ + while (rbSize < retInfo->rbSize) { + rbStart += rbSize; /* last iteration rbSize was not enough, skip it */ + rbSize = 0; + + const uint16_t slbitmap = SL_to_bitmap(retInfo->tda_info.startSymbolIndex, retInfo->tda_info.nrOfSymbols); + while (rbStart < rbStop && (rballoc_mask[rbStart] & slbitmap)) + rbStart++; + + if (rbStart >= rbStop) { + LOG_D(NR_MAC, "[UE %04x][%4d.%2d] could not allocate DL retransmission: no resources\n", UE->rnti, frame, slot); + return false; + } + + while (rbStart + rbSize <= rbStop && !(rballoc_mask[rbStart + rbSize] & slbitmap) && rbSize < retInfo->rbSize) + rbSize++; + } + } else { + /* the retransmission will use a different time domain allocation, check + * that we have enough resources */ + NR_pdsch_dmrs_t temp_dmrs = get_dl_dmrs_params(scc, dl_bwp, &temp_tda, layers); + + const uint16_t slbitmap = SL_to_bitmap(temp_tda.startSymbolIndex, temp_tda.nrOfSymbols); + while (rbStart < rbStop && (rballoc_mask[rbStart] & slbitmap)) + rbStart++; + + while (rbStart + rbSize <= rbStop && !(rballoc_mask[rbStart + rbSize] & slbitmap)) + rbSize++; + + uint32_t new_tbs; + uint16_t new_rbSize; + bool success = nr_find_nb_rb(retInfo->Qm, + retInfo->R, + 1, // no transform precoding for DL + layers, + temp_tda.nrOfSymbols, + temp_dmrs.N_PRB_DMRS * temp_dmrs.N_DMRS_SLOT, + retInfo->tb_size, + 1, /* minimum of 1RB: need to find exact TBS, don't preclude any number */ + rbSize, + &new_tbs, + &new_rbSize); + + if (!success || new_tbs != retInfo->tb_size) { + LOG_D(NR_MAC, "[UE %04x][%4d.%2d] allocation of DL retransmission failed: new TBS %d of new TDA does not match old TBS %d\n", + UE->rnti, + frame, + slot, + new_tbs, + retInfo->tb_size); + return false; /* the maximum TBsize we might have is smaller than what we need */ + } + + /* we can allocate it. Overwrite the time_domain_allocation, the number + * of RBs, and the new TB size. The rest is done below */ + retInfo->tb_size = new_tbs; + retInfo->rbSize = new_rbSize; + retInfo->time_domain_allocation = tda; + retInfo->nrOfLayers = layers; + retInfo->pm_index = pm_index; + retInfo->dmrs_parms = temp_dmrs; + retInfo->tda_info = temp_tda; + } + + /* Find a free CCE */ + int CCEIndex = get_cce_index(nr_mac, + CC_id, + slot, + UE->rnti, + &sched_ctrl->aggregation_level, + beam_idx, + sched_ctrl->search_space, + sched_ctrl->coreset, + &sched_ctrl->sched_pdcch, + false, + sched_ctrl->pdcch_cl_adjust); + if (CCEIndex<0) { + LOG_D(NR_MAC, "[UE %04x][%4d.%2d] could not find free CCE for DL DCI retransmission\n", UE->rnti, frame, slot); + return false; + } + + /* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH + * allocation after CCE alloc fail would be more complex) */ + + int alloc = -1; + if (!get_FeedbackDisabled(UE->sc_info.downlinkHARQ_FeedbackDisabled_r17, current_harq_pid)) { + int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, ul_bwp->pucch_Config, CCEIndex); + alloc = nr_acknack_scheduling(nr_mac, UE, frame, slot, UE->UE_beam_index, r_pucch, 0); + if (alloc < 0) { + LOG_D(NR_MAC, "[UE %04x][%4d.%2d] could not find PUCCH for DL DCI retransmission\n", UE->rnti, frame, slot); + return false; + } + } + + sched_ctrl->cce_index = CCEIndex; + fill_pdcch_vrb_map(nr_mac, CC_id, &sched_ctrl->sched_pdcch, CCEIndex, sched_ctrl->aggregation_level, beam_idx); + /* just reuse from previous scheduling opportunity, set new start RB */ + sched_ctrl->sched_pdsch = *retInfo; + sched_ctrl->sched_pdsch.rbStart = rbStart - bwp_info.bwpStart; + sched_ctrl->sched_pdsch.pucch_allocation = alloc; + /* retransmissions: directly allocate */ + *n_rb_sched -= sched_ctrl->sched_pdsch.rbSize; + + for (int rb = rbStart; rb < sched_ctrl->sched_pdsch.rbSize; rb++) + rballoc_mask[rb] |= SL_to_bitmap(retInfo->tda_info.startSymbolIndex, retInfo->tda_info.nrOfSymbols); + + return true; +} + +static uint32_t pf_tbs[3][29]; // pre-computed, approximate TBS values for PF coefficient +typedef struct UEsched_s { + float coef; + NR_UE_info_t * UE; +} UEsched_t; + +static int comparator(const void *p, const void *q) { + return ((UEsched_t*)p)->coef < ((UEsched_t*)q)->coef; +} + +static void pf_dl(module_id_t module_id, + frame_t frame, + slot_t slot, + NR_UE_info_t **UE_list, + int max_num_ue, + int num_beams, + int n_rb_sched[num_beams]) +{ + gNB_MAC_INST *mac = RC.nrmac[module_id]; + NR_ServingCellConfigCommon_t *scc=mac->common_channels[0].ServingCellConfigCommon; + // UEs that could be scheduled + UEsched_t UE_sched[MAX_MOBILES_PER_GNB + 1] = {0}; + int remainUEs[num_beams]; + for (int i = 0; i < num_beams; i++) + remainUEs[i] = max_num_ue; + int curUE = 0; + int CC_id = 0; + int slots_per_frame = mac->frame_structure.numb_slots_frame; + + /* Loop UE_info->list to check retransmission */ + UE_iterator(UE_list, UE) { + if (!UE->Msg4_MsgB_ACKed) + continue; + + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + NR_UE_DL_BWP_t *current_BWP = &UE->current_DL_BWP; + + if (sched_ctrl->ul_failure) + continue; + + const NR_mac_dir_stats_t *stats = &UE->mac_stats.dl; + NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch; + /* get the PID of a HARQ process awaiting retrnasmission, or -1 otherwise */ + sched_pdsch->dl_harq_pid = sched_ctrl->retrans_dl_harq.head; + /* Calculate Throughput */ + const float a = 0.01f; + const uint32_t b = UE->mac_stats.dl.current_bytes; + UE->dl_thr_ue = (1 - a) * UE->dl_thr_ue + a * b; + + int total_rem_ues = 0; + for (int i = 0; i < num_beams; i++) + total_rem_ues += remainUEs[i]; + if (total_rem_ues == 0) + continue; + + /* retransmission */ + if (sched_pdsch->dl_harq_pid >= 0) { + NR_beam_alloc_t beam = beam_allocation_procedure(&mac->beam_info, frame, slot, UE->UE_beam_index, slots_per_frame); + bool sch_ret = beam.idx >= 0; + /* Allocate retransmission */ + if (sch_ret) + sch_ret = allocate_dl_retransmission(module_id, frame, slot, &n_rb_sched[beam.idx], UE, beam.idx, sched_pdsch->dl_harq_pid); + if (!sch_ret) { + LOG_D(NR_MAC, "[UE %04x][%4d.%2d] DL retransmission could not be allocated\n", UE->rnti, frame, slot); + reset_beam_status(&mac->beam_info, frame, slot, UE->UE_beam_index, slots_per_frame, beam.new_beam); + continue; + } + /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */ + remainUEs[beam.idx]--; + + } else { + /* skip this UE if there are no free HARQ processes. This can happen e.g. + * if the UE disconnected in L2sim, in which case the gNB is not notified + * (this can be considered a design flaw) */ + if (sched_ctrl->available_dl_harq.head < 0) { + LOG_D(NR_MAC, "[UE %04x][%4d.%2d] UE has no free DL HARQ process, skipping\n", + UE->rnti, + frame, + slot); + continue; + } + + /* Check DL buffer and skip this UE if no bytes and no TA necessary */ + if (sched_ctrl->num_total_bytes == 0 && frame != (sched_ctrl->ta_frame + 100) % 1024) + continue; + + /* Calculate coeff */ + const NR_bler_options_t *bo = &mac->dl_bler; + const int max_mcs_table = current_BWP->mcsTableIdx == 1 ? 27 : 28; + const int max_mcs = min(sched_ctrl->dl_max_mcs, max_mcs_table); + if (bo->harq_round_max == 1) { + sched_pdsch->mcs = min(bo->max_mcs, max_mcs); + sched_ctrl->dl_bler_stats.mcs = sched_pdsch->mcs; + } else + sched_pdsch->mcs = get_mcs_from_bler(bo, stats, &sched_ctrl->dl_bler_stats, max_mcs, frame); + sched_pdsch->nrOfLayers = get_dl_nrOfLayers(sched_ctrl, current_BWP->dci_format); + sched_pdsch->pm_index = + get_pm_index(mac, UE, current_BWP->dci_format, sched_pdsch->nrOfLayers, mac->radio_config.pdsch_AntennaPorts.XP); + const uint8_t Qm = nr_get_Qm_dl(sched_pdsch->mcs, current_BWP->mcsTableIdx); + const uint16_t R = nr_get_code_rate_dl(sched_pdsch->mcs, current_BWP->mcsTableIdx); + uint32_t tbs = nr_compute_tbs(Qm, + R, + 1, /* rbSize */ + 10, /* hypothetical number of slots */ + 0, /* N_PRB_DMRS * N_DMRS_SLOT */ + 0 /* N_PRB_oh, 0 for initialBWP */, + 0 /* tb_scaling */, + sched_pdsch->nrOfLayers) >> 3; + float coeff_ue = (float) tbs / UE->dl_thr_ue; + LOG_D(NR_MAC, "[UE %04x][%4d.%2d] b %d, thr_ue %f, tbs %d, coeff_ue %f\n", + UE->rnti, + frame, + slot, + b, + UE->dl_thr_ue, + tbs, + coeff_ue); + /* Create UE_sched list for UEs eligible for new transmission*/ + UE_sched[curUE].coef=coeff_ue; + UE_sched[curUE].UE=UE; + curUE++; + } + } + + qsort(UE_sched, sizeofArray(UE_sched), sizeof(UEsched_t), comparator); + UEsched_t *iterator = UE_sched; + + const int min_rbSize = 5; + + /* Loop UE_sched to find max coeff and allocate transmission */ + while (iterator->UE != NULL) { + + NR_UE_sched_ctrl_t *sched_ctrl = &iterator->UE->UE_sched_ctrl; + const uint16_t rnti = iterator->UE->rnti; + + NR_UE_DL_BWP_t *dl_bwp = &iterator->UE->current_DL_BWP; + NR_UE_UL_BWP_t *ul_bwp = &iterator->UE->current_UL_BWP; + + if (sched_ctrl->available_dl_harq.head < 0) { + LOG_D(NR_MAC, "[UE %04x][%4d.%2d] UE has no free DL HARQ process, skipping\n", + iterator->UE->rnti, + frame, + slot); + iterator++; + continue; + } + + NR_beam_alloc_t beam = beam_allocation_procedure(&mac->beam_info, frame, slot, iterator->UE->UE_beam_index, slots_per_frame); + + if (beam.idx < 0) { + // no available beam + iterator++; + continue; + } + if (remainUEs[beam.idx] == 0 || n_rb_sched[beam.idx] < min_rbSize) { + reset_beam_status(&mac->beam_info, frame, slot, iterator->UE->UE_beam_index, slots_per_frame, beam.new_beam); + iterator++; + continue; + } + + NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch; + sched_pdsch->dl_harq_pid = sched_ctrl->available_dl_harq.head; + + /* MCS has been set above */ + sched_pdsch->time_domain_allocation = get_dl_tda(mac, slot); + AssertFatal(sched_pdsch->time_domain_allocation>=0,"Unable to find PDSCH time domain allocation in list\n"); + + const int coresetid = sched_ctrl->coreset->controlResourceSetId; + sched_pdsch->tda_info = get_dl_tda_info(dl_bwp, + sched_ctrl->search_space->searchSpaceType->present, + sched_pdsch->time_domain_allocation, + scc->dmrs_TypeA_Position, + 1, + TYPE_C_RNTI_, + coresetid, + false); + AssertFatal(sched_pdsch->tda_info.valid_tda, "Invalid TDA from get_dl_tda_info\n"); + + NR_tda_info_t *tda_info = &sched_pdsch->tda_info; + + const uint16_t slbitmap = SL_to_bitmap(tda_info->startSymbolIndex, tda_info->nrOfSymbols); + + uint16_t *rballoc_mask = mac->common_channels[CC_id].vrb_map[beam.idx]; + dl_bwp_info_t bwp_info = get_bwp_start_size(mac, iterator->UE); + int rbStart = 0; // WRT BWP start + int rbStop = bwp_info.bwpSize - 1; + int bwp_start = bwp_info.bwpStart; + // Freq-demain allocation + while (rbStart < rbStop && (rballoc_mask[rbStart + bwp_start] & slbitmap)) + rbStart++; + + uint16_t max_rbSize = 1; + + while (rbStart + max_rbSize <= rbStop && !(rballoc_mask[rbStart + max_rbSize + bwp_start] & slbitmap)) + max_rbSize++; + + if (max_rbSize < min_rbSize) { + LOG_D(NR_MAC, + "(%d.%d) Cannot schedule RNTI %04x, rbStart %d, rbSize %d, rbStop %d\n", + frame, + slot, + rnti, + rbStart, + max_rbSize, + rbStop); + iterator++; + continue; + } + + int CCEIndex = get_cce_index(mac, + CC_id, + slot, + iterator->UE->rnti, + &sched_ctrl->aggregation_level, + beam.idx, + sched_ctrl->search_space, + sched_ctrl->coreset, + &sched_ctrl->sched_pdcch, + false, + sched_ctrl->pdcch_cl_adjust); + if (CCEIndex < 0) { + LOG_D(NR_MAC, "[UE %04x][%4d.%2d] could not find free CCE for DL DCI\n", rnti, frame, slot); + reset_beam_status(&mac->beam_info, frame, slot, iterator->UE->UE_beam_index, slots_per_frame, beam.new_beam); + iterator++; + continue; + } + + /* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH + * allocation after CCE alloc fail would be more complex) */ + + int alloc = -1; + if (!get_FeedbackDisabled(iterator->UE->sc_info.downlinkHARQ_FeedbackDisabled_r17, sched_pdsch->dl_harq_pid)) { + int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, ul_bwp->pucch_Config, CCEIndex); + alloc = nr_acknack_scheduling(mac, iterator->UE, frame, slot, iterator->UE->UE_beam_index, r_pucch, 0); + if (alloc < 0) { + LOG_D(NR_MAC, "[UE %04x][%4d.%2d] could not find PUCCH for DL DCI\n", rnti, frame, slot); + reset_beam_status(&mac->beam_info, frame, slot, iterator->UE->UE_beam_index, slots_per_frame, beam.new_beam); + iterator++; + continue; + } + } + + sched_ctrl->cce_index = CCEIndex; + fill_pdcch_vrb_map(mac, CC_id, &sched_ctrl->sched_pdcch, CCEIndex, sched_ctrl->aggregation_level, beam.idx); + + sched_pdsch->dmrs_parms = get_dl_dmrs_params(scc, dl_bwp, tda_info, sched_pdsch->nrOfLayers); + sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, dl_bwp->mcsTableIdx); + sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, dl_bwp->mcsTableIdx); + sched_pdsch->pucch_allocation = alloc; + uint32_t TBS = 0; + uint16_t rbSize; + // Fix me: currently, the RLC does not give us the total number of PDUs + // awaiting. Therefore, for the time being, we put a fixed overhead of 12 + // (for 4 PDUs) and optionally + 2 for TA. Once RLC gives the number of + // PDUs, we replace with 3 * numPDUs + const int oh = 3 * 4 + 2 * (frame == (sched_ctrl->ta_frame + 100) % 1024); + //const int oh = 3 * sched_ctrl->dl_pdus_total + 2 * (frame == (sched_ctrl->ta_frame + 100) % 1024); + nr_find_nb_rb(sched_pdsch->Qm, + sched_pdsch->R, + 1, // no transform precoding for DL + sched_pdsch->nrOfLayers, + tda_info->nrOfSymbols, + sched_pdsch->dmrs_parms.N_PRB_DMRS * sched_pdsch->dmrs_parms.N_DMRS_SLOT, + sched_ctrl->num_total_bytes + oh, + min_rbSize, + max_rbSize, + &TBS, + &rbSize); + sched_pdsch->rbSize = rbSize; + sched_pdsch->rbStart = rbStart; + sched_pdsch->tb_size = TBS; + /* transmissions: directly allocate */ + n_rb_sched[beam.idx] -= sched_pdsch->rbSize; + + for (int rb = bwp_start; rb < sched_pdsch->rbSize; rb++) + rballoc_mask[rb + sched_pdsch->rbStart] |= slbitmap; + + remainUEs[beam.idx]--; + iterator++; + } +} + +static void nr_dlsch_preprocessor(module_id_t module_id, frame_t frame, slot_t slot) +{ + gNB_MAC_INST *mac = RC.nrmac[module_id]; + NR_UEs_t *UE_info = &mac->UE_info; + + if (UE_info->list[0] == NULL) + return; + + NR_ServingCellConfigCommon_t *scc = mac->common_channels[0].ServingCellConfigCommon; + int bw = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; + int num_beams = mac->beam_info.beam_allocation ? mac->beam_info.beams_per_period : 1; + int n_rb_sched[num_beams]; + for (int i = 0; i < num_beams; i++) + n_rb_sched[i] = bw; + + /* Retrieve amount of data to send for this UE */ + nr_store_dlsch_buffer(module_id, frame, slot); + + int average_agg_level = 4; // TODO find a better estimation + int max_sched_ues = bw / (average_agg_level * NR_NB_REG_PER_CCE); + + // FAPI cannot handle more than MAX_DCI_CORESET DCIs + max_sched_ues = min(max_sched_ues, MAX_DCI_CORESET); + + /* proportional fair scheduling algorithm */ + pf_dl(module_id, frame, slot, UE_info->list, max_sched_ues, num_beams, n_rb_sched); +} + +nr_pp_impl_dl nr_init_dlsch_preprocessor(int CC_id) { + /* during initialization: no mutex needed */ + /* in the PF algorithm, we have to use the TBsize to compute the coefficient. + * This would include the number of DMRS symbols, which in turn depends on + * the time domain allocation. In case we are in a mixed slot, we do not want + * to recalculate all these values just, and therefore we provide a look-up + * table which should approximately give us the TBsize */ + for (int mcsTableIdx = 0; mcsTableIdx < 3; ++mcsTableIdx) { + for (int mcs = 0; mcs < 29; ++mcs) { + if (mcs > 27 && mcsTableIdx == 1) + continue; + + const uint8_t Qm = nr_get_Qm_dl(mcs, mcsTableIdx); + const uint16_t R = nr_get_code_rate_dl(mcs, mcsTableIdx); + pf_tbs[mcsTableIdx][mcs] = nr_compute_tbs(Qm, + R, + 1, /* rbSize */ + 10, /* hypothetical number of slots */ + 0, /* N_PRB_DMRS * N_DMRS_SLOT */ + 0 /* N_PRB_oh, 0 for initialBWP */, + 0 /* tb_scaling */, + 1 /* nrOfLayers */) >> 3; + } + } + + return nr_dlsch_preprocessor; +} + +void nr_schedule_ue_spec(module_id_t module_id, + frame_t frame, + slot_t slot, + nfapi_nr_dl_tti_request_t *DL_req, + nfapi_nr_tx_data_request_t *TX_req) +{ + gNB_MAC_INST *gNB_mac = RC.nrmac[module_id]; + /* already mutex protected: held in gNB_dlsch_ulsch_scheduler() */ + AssertFatal(pthread_mutex_trylock(&gNB_mac->sched_lock) == EBUSY, + "this function should be called with the scheduler mutex locked\n"); + + if (!is_dl_slot(slot, &gNB_mac->frame_structure)) + return; + + /* PREPROCESSOR */ + gNB_mac->pre_processor_dl(module_id, frame, slot); + const int CC_id = 0; + NR_ServingCellConfigCommon_t *scc = gNB_mac->common_channels[CC_id].ServingCellConfigCommon; + NR_UEs_t *UE_info = &gNB_mac->UE_info; + nfapi_nr_dl_tti_request_body_t *dl_req = &DL_req->dl_tti_request_body; + + const NR_BWP_t *initialDL = &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters; + gNB_mac->mac_stats.total_prb_aggregate += NRRIV2BW(initialDL->locationAndBandwidth, MAX_BWP_SIZE); + + UE_iterator(UE_info->list, UE) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + NR_UE_DL_BWP_t *current_BWP = &UE->current_DL_BWP; + + if (sched_ctrl->ul_failure && !get_softmodem_params()->phy_test) + continue; + + NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch; + UE->mac_stats.dl.current_bytes = 0; + UE->mac_stats.dl.current_rbs = 0; + + /* update TA and set ta_apply every 100 frames. + * Possible improvement: take the periodicity from input file. + * If such UE is not scheduled now, it will be by the preprocessor later. + * If we add the CE, ta_apply will be reset */ + if (frame == ((sched_ctrl->ta_frame + 100) % 1024) && !nr_timer_is_active(&sched_ctrl->transm_interrupt)) { + sched_ctrl->ta_apply = true; /* the timer is reset once TA CE is scheduled */ + LOG_D(NR_MAC, "[UE %04x][%d.%d] UL timing alignment procedures: setting flag for Timing Advance command\n", UE->rnti, frame, slot); + } + + if (sched_pdsch->rbSize <= 0) + continue; + + const rnti_t rnti = UE->rnti; + + /* POST processing */ + const uint8_t nrOfLayers = sched_pdsch->nrOfLayers; + const uint16_t R = sched_pdsch->R; + const uint8_t Qm = sched_pdsch->Qm; + const uint32_t TBS = sched_pdsch->tb_size; + int8_t current_harq_pid = sched_pdsch->dl_harq_pid; + + if (current_harq_pid < 0) { + /* PP has not selected a specific HARQ Process, get a new one */ + current_harq_pid = sched_ctrl->available_dl_harq.head; + AssertFatal(current_harq_pid >= 0, + "no free HARQ process available for UE %04x\n", + UE->rnti); + remove_front_nr_list(&sched_ctrl->available_dl_harq); + sched_pdsch->dl_harq_pid = current_harq_pid; + } else { + /* PP selected a specific HARQ process. Check whether it will be a new + * transmission or a retransmission, and remove from the corresponding + * list */ + if (sched_ctrl->harq_processes[current_harq_pid].round == 0) + remove_nr_list(&sched_ctrl->available_dl_harq, current_harq_pid); + else + remove_nr_list(&sched_ctrl->retrans_dl_harq, current_harq_pid); + } + + NR_tda_info_t *tda_info = &sched_pdsch->tda_info; + NR_pdsch_dmrs_t *dmrs_parms = &sched_pdsch->dmrs_parms; + NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid]; + NR_sched_pucch_t *pucch = NULL; + DevAssert(!harq->is_waiting); + if (sched_pdsch->pucch_allocation < 0) { + finish_nr_dl_harq(sched_ctrl, current_harq_pid); + } else { + pucch = &sched_ctrl->sched_pucch[sched_pdsch->pucch_allocation]; + add_tail_nr_list(&sched_ctrl->feedback_dl_harq, current_harq_pid); + harq->feedback_frame = pucch->frame; + harq->feedback_slot = pucch->ul_slot; + harq->is_waiting = true; + } + UE->mac_stats.dl.rounds[harq->round]++; + LOG_D(NR_MAC, + "%4d.%2d [DLSCH/PDSCH/PUCCH] RNTI %04x DCI L %d start %3d RBs %3d startSymbol %2d nb_symbol %2d dmrspos %x MCS %2d nrOfLayers %d TBS %4d HARQ PID %2d round %d RV %d NDI %d dl_data_to_ULACK %d (%d.%d) PUCCH allocation %d TPC %d\n", + frame, + slot, + rnti, + sched_ctrl->aggregation_level, + sched_pdsch->rbStart, + sched_pdsch->rbSize, + tda_info->startSymbolIndex, + tda_info->nrOfSymbols, + dmrs_parms->dl_dmrs_symb_pos, + sched_pdsch->mcs, + nrOfLayers, + TBS, + current_harq_pid, + harq->round, + nr_get_rv(harq->round % 4), + harq->ndi, + pucch ? pucch->timing_indicator : 0, + pucch ? pucch->frame : 0, + pucch ? pucch->ul_slot : 0, + sched_pdsch->pucch_allocation, + sched_ctrl->tpc1); + + const int bwp_id = current_BWP->bwp_id; + const int coresetid = sched_ctrl->coreset->controlResourceSetId; + + /* look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it */ + nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu = gNB_mac->pdcch_pdu_idx[CC_id][coresetid]; + + if (!pdcch_pdu) { + LOG_D(NR_MAC, "creating pdcch pdu, pdcch_pdu = NULL. \n"); + nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; + memset(dl_tti_pdcch_pdu, 0, sizeof(nfapi_nr_dl_tti_request_pdu_t)); + dl_tti_pdcch_pdu->PDUType = NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE; + dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu)); + dl_req->nPDUs += 1; + pdcch_pdu = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15; + LOG_D(NR_MAC,"Trying to configure DL pdcch for UE %04x, bwp %d, cs %d\n", UE->rnti, bwp_id, coresetid); + NR_ControlResourceSet_t *coreset = sched_ctrl->coreset; + nr_configure_pdcch(pdcch_pdu, coreset, &sched_ctrl->sched_pdcch); + gNB_mac->pdcch_pdu_idx[CC_id][coresetid] = pdcch_pdu; + } + + nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; + memset(dl_tti_pdsch_pdu, 0, sizeof(nfapi_nr_dl_tti_request_pdu_t)); + dl_tti_pdsch_pdu->PDUType = NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE; + dl_tti_pdsch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdsch_pdu)); + dl_req->nPDUs += 1; + nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15; + pdsch_pdu->pduBitmap = 0; + pdsch_pdu->rnti = rnti; + /* SCF222: PDU index incremented for each PDSCH PDU sent in TX control + * message. This is used to associate control information to data and is + * reset every slot. */ + const int pduindex = gNB_mac->pdu_index[CC_id]++; + pdsch_pdu->pduIndex = pduindex; + + dl_bwp_info_t bwp_info = get_bwp_start_size(gNB_mac, UE); + pdsch_pdu->BWPSize = bwp_info.bwpSize; + pdsch_pdu->BWPStart = bwp_info.bwpStart; + + pdsch_pdu->SubcarrierSpacing = current_BWP->scs; + pdsch_pdu->CyclicPrefix = current_BWP->cyclicprefix ? *current_BWP->cyclicprefix : 0; + // Codeword information + pdsch_pdu->NrOfCodewords = 1; + //number of information bits per 1024 coded bits expressed in 0.1 bit units + pdsch_pdu->targetCodeRate[0] = R; + pdsch_pdu->qamModOrder[0] = Qm; + pdsch_pdu->mcsIndex[0] = sched_pdsch->mcs; + pdsch_pdu->mcsTable[0] = current_BWP->mcsTableIdx; + // NVIDIA: Workaround for MCSTableIdx mismatch error + if (nr_get_code_rate_dl(sched_pdsch->mcs, current_BWP->mcsTableIdx) != R) { + pdsch_pdu->mcsTable[0] = 0; + } + AssertFatal(harq->round < gNB_mac->dl_bler.harq_round_max,"%d", harq->round); + pdsch_pdu->rvIndex[0] = nr_get_rv(harq->round % 4); + pdsch_pdu->TBSize[0] = TBS; + pdsch_pdu->dataScramblingId = *scc->physCellId; + pdsch_pdu->nrOfLayers = nrOfLayers; + pdsch_pdu->transmissionScheme = 0; + pdsch_pdu->refPoint = 0; // Point A + // DMRS + pdsch_pdu->dlDmrsSymbPos = dmrs_parms->dl_dmrs_symb_pos; + pdsch_pdu->dmrsConfigType = dmrs_parms->dmrsConfigType; + pdsch_pdu->dlDmrsScramblingId = *scc->physCellId; + pdsch_pdu->SCID = 0; + pdsch_pdu->numDmrsCdmGrpsNoData = dmrs_parms->numDmrsCdmGrpsNoData; + pdsch_pdu->dmrsPorts = (1<resourceAlloc = 1; + pdsch_pdu->rbStart = sched_pdsch->rbStart; + pdsch_pdu->rbSize = sched_pdsch->rbSize; + pdsch_pdu->VRBtoPRBMapping = 1; // non-interleaved, check if this is ok for initialBWP + // Resource Allocation in time domain + pdsch_pdu->StartSymbolIndex = tda_info->startSymbolIndex; + pdsch_pdu->NrOfSymbols = tda_info->nrOfSymbols; + // Precoding + pdsch_pdu->precodingAndBeamforming.num_prgs = 0; + pdsch_pdu->precodingAndBeamforming.prg_size = pdsch_pdu->rbSize; + pdsch_pdu->precodingAndBeamforming.dig_bf_interfaces = 0; + pdsch_pdu->precodingAndBeamforming.prgs_list[0].pm_idx = sched_pdsch->pm_index; + pdsch_pdu->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = UE->UE_beam_index; + // TBS_LBRM according to section 5.4.2.1 of 38.212 + // TODO: verify the case where maxMIMO_Layers is NULL, in which case + // in principle maxMIMO_layers should be given by the maximum number of layers + // for PDSCH supported by the UE for the serving cell (5.4.2.1 of 38.212) + long maxMIMO_Layers = UE->sc_info.maxMIMO_Layers_PDSCH ? *UE->sc_info.maxMIMO_Layers_PDSCH : 1; + const int nl_tbslbrm = min(maxMIMO_Layers, 4); + // Maximum number of PRBs across all configured DL BWPs + pdsch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = + nr_compute_tbslbrm(current_BWP->mcsTableIdx, UE->sc_info.dl_bw_tbslbrm, nl_tbslbrm); + pdsch_pdu->maintenance_parms_v3.ldpcBaseGraph = get_BG(TBS<<3,R); + + NR_PDSCH_Config_t *pdsch_Config = current_BWP->pdsch_Config; + + /* Check and validate PTRS values */ + struct NR_SetupRelease_PTRS_DownlinkConfig *phaseTrackingRS = + pdsch_Config ? pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS : NULL; + + if (phaseTrackingRS) { + bool valid_ptrs_setup = set_dl_ptrs_values(phaseTrackingRS->choice.setup, + pdsch_pdu->rbSize, + pdsch_pdu->mcsIndex[0], + pdsch_pdu->mcsTable[0], + &pdsch_pdu->PTRSFreqDensity, + &pdsch_pdu->PTRSTimeDensity, + &pdsch_pdu->PTRSPortIndex, + &pdsch_pdu->nEpreRatioOfPDSCHToPTRS, + &pdsch_pdu->PTRSReOffset, + pdsch_pdu->NrOfSymbols); + + if (valid_ptrs_setup) + pdsch_pdu->pduBitmap |= 0x1; // Bit 0: pdschPtrs - Indicates PTRS included (FR2) + } + + LOG_D(NR_MAC,"Configuring DCI/PDCCH in %d.%d at CCE %d, rnti %x\n", frame,slot,sched_ctrl->cce_index,rnti); + /* Fill PDCCH DL DCI PDU */ + nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu->dci_pdu[pdcch_pdu->numDlDci]; + pdcch_pdu->numDlDci++; + dci_pdu->RNTI = rnti; + + if (sched_ctrl->coreset && + sched_ctrl->search_space && + sched_ctrl->coreset->pdcch_DMRS_ScramblingID && + sched_ctrl->search_space->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_ue_Specific) { + dci_pdu->ScramblingId = *sched_ctrl->coreset->pdcch_DMRS_ScramblingID; + dci_pdu->ScramblingRNTI = rnti; + } else { + dci_pdu->ScramblingId = *scc->physCellId; + dci_pdu->ScramblingRNTI = 0; + } + + dci_pdu->AggregationLevel = sched_ctrl->aggregation_level; + dci_pdu->CceIndex = sched_ctrl->cce_index; + dci_pdu->beta_PDCCH_1_0 = 0; + dci_pdu->powerControlOffsetSS = 1; + + dci_pdu->precodingAndBeamforming.num_prgs = 0; + dci_pdu->precodingAndBeamforming.prg_size = 0; + dci_pdu->precodingAndBeamforming.dig_bf_interfaces = 0; + dci_pdu->precodingAndBeamforming.prgs_list[0].pm_idx = 0; + dci_pdu->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = UE->UE_beam_index; + + /* DCI payload */ + dci_pdu_rel15_t dci_payload; + memset(&dci_payload, 0, sizeof(dci_pdu_rel15_t)); + // bwp indicator + // as per table 7.3.1.1.2-1 in 38.212 + dci_payload.bwp_indicator.val = UE->sc_info.n_dl_bwp < 4 ? bwp_id : bwp_id - 1; + + AssertFatal(pdsch_Config == NULL || pdsch_Config->resourceAllocation == NR_PDSCH_Config__resourceAllocation_resourceAllocationType1, + "Only frequency resource allocation type 1 is currently supported\n"); + + dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0(pdsch_pdu->rbSize, + pdsch_pdu->rbStart, + pdsch_pdu->BWPSize); + dci_payload.format_indicator = 1; + dci_payload.time_domain_assignment.val = sched_pdsch->time_domain_allocation; + dci_payload.mcs = sched_pdsch->mcs; + dci_payload.rv = pdsch_pdu->rvIndex[0]; + dci_payload.harq_pid.val = current_harq_pid; + dci_payload.ndi = harq->ndi; + dci_payload.dai[0].val = pucch ? (pucch->dai_c-1)&3 : 0; + dci_payload.tpc = sched_ctrl->tpc1; // TPC for PUCCH: table 7.2.1-1 in 38.213 + // Reset TPC to 0 dB to not request new gain multiple times before computing new value for SNR + sched_ctrl->tpc1 = 1; + dci_payload.pucch_resource_indicator = pucch ? pucch->resource_indicator : 0; + dci_payload.pdsch_to_harq_feedback_timing_indicator.val = pucch ? pucch->timing_indicator : 0; // PDSCH to HARQ TI + dci_payload.antenna_ports.val = dmrs_parms->dmrs_ports_id; + dci_payload.dmrs_sequence_initialization.val = pdsch_pdu->SCID; + LOG_D(NR_MAC, + "%4d.%2d DCI type 1 payload: freq_alloc %d (%d,%d,%d), " + "nrOfLayers %d, time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d tpc %d ti %d\n", + frame, + slot, + dci_payload.frequency_domain_assignment.val, + pdsch_pdu->rbStart, + pdsch_pdu->rbSize, + pdsch_pdu->BWPSize, + pdsch_pdu->nrOfLayers, + dci_payload.time_domain_assignment.val, + dci_payload.vrb_to_prb_mapping.val, + dci_payload.mcs, + dci_payload.tb_scaling, + dci_payload.ndi, + dci_payload.rv, + dci_payload.tpc, + pucch ? pucch->timing_indicator : 0); + + const int rnti_type = TYPE_C_RNTI_; + fill_dci_pdu_rel15(&UE->sc_info, + current_BWP, + &UE->current_UL_BWP, + dci_pdu, + &dci_payload, + current_BWP->dci_format, + rnti_type, + bwp_id, + sched_ctrl->search_space, + sched_ctrl->coreset, + UE->pdsch_HARQ_ACK_Codebook, + gNB_mac->cset0_bwp_size); + + LOG_D(NR_MAC, + "coreset params: FreqDomainResource %llx, start_symbol %d n_symb %d\n", + (unsigned long long)pdcch_pdu->FreqDomainResource, + pdcch_pdu->StartSymbolIndex, + pdcch_pdu->DurationSymbols); + + if (harq->round != 0) { /* retransmission */ + /* we do not have to do anything, since we do not require to get data + * from RLC or encode MAC CEs. The TX_req structure is filled below + * or copy data to FAPI structures */ + LOG_D(NR_MAC, + "%d.%2d DL retransmission RNTI %04x HARQ PID %d round %d NDI %d\n", + frame, + slot, + rnti, + current_harq_pid, + harq->round, + harq->ndi); + AssertFatal(harq->sched_pdsch.tb_size == TBS, + "UE %04x mismatch between scheduled TBS and buffered TB for HARQ PID %d\n", + UE->rnti, + current_harq_pid); + T(T_GNB_MAC_RETRANSMISSION_DL_PDU_WITH_DATA, T_INT(module_id), T_INT(CC_id), T_INT(rnti), + T_INT(frame), T_INT(slot), T_INT(current_harq_pid), T_INT(harq->round), T_BUFFER(harq->transportBlock.buf, TBS)); + UE->mac_stats.dl.total_rbs_retx += sched_pdsch->rbSize; + gNB_mac->mac_stats.used_prb_aggregate += sched_pdsch->rbSize; + } else { /* initial transmission */ + LOG_D(NR_MAC, "Initial HARQ transmission in %d.%d\n", frame, slot); + uint8_t *buf = allocate_transportBlock_buffer(&harq->transportBlock, TBS); + /* first, write all CEs that might be there */ + int written = nr_write_ce_dlsch_pdu(module_id, + sched_ctrl, + (unsigned char *)buf, + 255, // no drx + NULL); // contention res id + buf += written; + uint8_t *bufEnd = buf + TBS - written; + DevAssert(TBS > written); + int dlsch_total_bytes = 0; + /* next, get RLC data */ + start_meas(&gNB_mac->rlc_data_req); + int sdus = 0; + + if (sched_ctrl->num_total_bytes > 0) { + /* loop over all activated logical channels */ + for (int i = 0; i < seq_arr_size(&sched_ctrl->lc_config); ++i) { + const nr_lc_config_t *c = seq_arr_at(&sched_ctrl->lc_config, i); + const int lcid = c->lcid; + + if (sched_ctrl->rlc_status[lcid].bytes_in_buffer == 0) + continue; // no data for this LC tbs_size_t len = 0; + + int lcid_bytes=0; + while (bufEnd-buf > sizeof(NR_MAC_SUBHEADER_LONG) + 1 ) { + // we do not know how much data we will get from RLC, i.e., whether it + // will be longer than 256B or not. Therefore, reserve space for long header, then + // fetch data, then fill real length + NR_MAC_SUBHEADER_LONG *header = (NR_MAC_SUBHEADER_LONG *) buf; + /* limit requested number of bytes to what preprocessor specified, or + * such that TBS is full */ + const rlc_buffer_occupancy_t ndata = min(sched_ctrl->rlc_status[lcid].bytes_in_buffer, + bufEnd-buf-sizeof(NR_MAC_SUBHEADER_LONG)); + tbs_size_t len = nr_mac_rlc_data_req(module_id, + rnti, + true, + lcid, + ndata, + (char *)buf+sizeof(NR_MAC_SUBHEADER_LONG)); + LOG_D(NR_MAC, + "%4d.%2d RNTI %04x: %d bytes from %s %d (ndata %d, remaining size %ld)\n", + frame, + slot, + rnti, + len, + lcid < 4 ? "DCCH" : "DTCH", + lcid, + ndata, + bufEnd-buf-sizeof(NR_MAC_SUBHEADER_LONG)); + + if (len == 0) + break; + + header->R = 0; + header->F = 1; + header->LCID = lcid; + header->L = htons(len); + buf += len+sizeof(NR_MAC_SUBHEADER_LONG); + dlsch_total_bytes += len; + lcid_bytes += len; + sdus += 1; + } + + UE->mac_stats.dl.lc_bytes[lcid] += lcid_bytes; + } + } else if (get_softmodem_params()->phy_test || get_softmodem_params()->do_ra) { + /* we will need the large header, phy-test typically allocates all + * resources and fills to the last byte below */ + LOG_D(NR_MAC, "Configuring DL_TX in %d.%d: TBS %d of random data\n", frame, slot, TBS); + + if (bufEnd-buf > sizeof(NR_MAC_SUBHEADER_LONG) ) { + NR_MAC_SUBHEADER_LONG *header = (NR_MAC_SUBHEADER_LONG *) buf; + // fill dlsch_buffer with random data + header->R = 0; + header->F = 1; + header->LCID = DL_SCH_LCID_PADDING; + buf += sizeof(NR_MAC_SUBHEADER_LONG); + header->L = htons(bufEnd-buf); + + for (; ((intptr_t)buf) % 4; buf++) + *buf = lrand48() & 0xff; + for (; buf < bufEnd - 3; buf += 4) { + uint32_t *buf32 = (uint32_t *)buf; + *buf32 = lrand48(); + } + for (; buf < bufEnd; buf++) + *buf = lrand48() & 0xff; + sdus +=1; + } + } + + stop_meas(&gNB_mac->rlc_data_req); + + // Add padding header and zero rest out if there is space left + if (bufEnd-buf > 0) { + NR_MAC_SUBHEADER_FIXED *padding = (NR_MAC_SUBHEADER_FIXED *) buf; + padding->R = 0; + padding->LCID = DL_SCH_LCID_PADDING; + buf += 1; + memset(buf,0,bufEnd-buf); + buf=bufEnd; + } + + UE->mac_stats.dl.total_bytes += TBS; + UE->mac_stats.dl.current_bytes = TBS; + UE->mac_stats.dl.total_rbs += sched_pdsch->rbSize; + UE->mac_stats.dl.num_mac_sdu += sdus; + UE->mac_stats.dl.current_rbs = sched_pdsch->rbSize; + UE->mac_stats.dl.total_sdu_bytes += dlsch_total_bytes; + gNB_mac->mac_stats.used_prb_aggregate += sched_pdsch->rbSize; + + /* save retransmission information */ + harq->sched_pdsch = *sched_pdsch; + /* save which time allocation has been used, to be used on + * retransmissions */ + harq->sched_pdsch.time_domain_allocation = sched_pdsch->time_domain_allocation; + + // ta command is sent, values are reset + if (sched_ctrl->ta_apply) { + sched_ctrl->ta_apply = false; + sched_ctrl->ta_frame = frame; + LOG_D(NR_MAC, "%d.%2d UE %04x TA scheduled, resetting TA frame\n", frame, slot, UE->rnti); + } + + T(T_GNB_MAC_DL_PDU_WITH_DATA, T_INT(module_id), T_INT(CC_id), T_INT(rnti), + T_INT(frame), T_INT(slot), T_INT(current_harq_pid), T_BUFFER(harq->transportBlock.buf, TBS)); + } + + const int ntx_req = TX_req->Number_of_PDUs; + nfapi_nr_pdu_t *tx_req = &TX_req->pdu_list[ntx_req]; + tx_req->PDU_index = pduindex; + tx_req->num_TLV = 1; + tx_req->TLVs[0].length = TBS; + tx_req->PDU_length = compute_PDU_length(tx_req->num_TLV, tx_req->TLVs[0].length); + memcpy(tx_req->TLVs[0].value.direct, harq->transportBlock.buf, TBS); + TX_req->Number_of_PDUs++; + TX_req->SFN = frame; + TX_req->Slot = slot; + /* mark UE as scheduled */ + sched_pdsch->rbSize = 0; + } +} diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/main.c.patch b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/main.c.patch new file mode 100644 index 0000000..70a91ee --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/main.c.patch @@ -0,0 +1,22 @@ +diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c +index 4d732bb3eb..cb8d364110 100644 +--- a/openair2/LAYER2/NR_MAC_gNB/main.c ++++ b/openair2/LAYER2/NR_MAC_gNB/main.c +@@ -135,6 +135,7 @@ size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset + } + + bool in_sync = !sched_ctrl->ul_failure; ++ + output += snprintf(output, + end - output, + " %s PH %d dB PCMAX %d dBm, average RSRP %d (%d meas)\n", +@@ -174,6 +175,9 @@ size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset + UE->current_DL_BWP.mcsTableIdx, + sched_ctrl->dl_bler_stats.mcs); + if (reset_rsrp) { ++ // Save previous RSRP values before resetting so that querying them is synchronized with the gNB output ++ stats->prev_num_rsrp_meas = stats->num_rsrp_meas; ++ stats->prev_cumul_rsrp = stats->cumul_rsrp; + stats->num_rsrp_meas = 0; + stats->cumul_rsrp = 0; + } diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/main.previous.c b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/main.previous.c new file mode 100644 index 0000000..a8fe8de --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/main.previous.c @@ -0,0 +1,355 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file main.c + * \brief top init of Layer 2 + * \author Navid Nikaein and Raymond Knopp, WEI-TAI CHEN + * \date 2010 - 2014, 2018 + * \version 1.0 + * \company Eurecom, NTUST + * \email: navid.nikaein@eurecom.fr, kroempa@gmail.com + * @ingroup _mac + + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "NR_DRB-ToAddMod.h" +#include "NR_DRB-ToAddModList.h" +#include "NR_MAC_COMMON/nr_mac.h" +#include "NR_MAC_COMMON/nr_mac_common.h" +#include "NR_MAC_gNB/mac_proto.h" +#include "NR_MAC_gNB/mac_rrc_ul.h" +#include "NR_MAC_gNB/nr_mac_gNB.h" +#include "NR_PHY_INTERFACE/NR_IF_Module.h" +#include "NR_RLC-BearerConfig.h" +#include "NR_RadioBearerConfig.h" +#include "NR_ServingCellConfig.h" +#include "NR_ServingCellConfigCommon.h" +#include "NR_TAG.h" +#include "PHY/defs_common.h" +#include "RRC/NR/MESSAGES/asn1_msg.h" +#include "RRC/NR/nr_rrc_config.h" +#include "assertions.h" +#include "common/ngran_types.h" +#include "common/ran_context.h" +#include "common/utils/T/T.h" +#include "executables/softmodem-common.h" +#include "linear_alloc.h" +#include "nr_pdcp/nr_pdcp_entity.h" +#include "nr_pdcp/nr_pdcp_oai_api.h" +#include "nr_rlc/nr_rlc_oai_api.h" +#include "openair2/F1AP/f1ap_ids.h" +#include "rlc.h" +#include "seq_arr.h" +#include "system.h" +#include "time_meas.h" +#include "utils.h" + +#define MACSTATSSTRLEN 36256 + +void *nrmac_stats_thread(void *arg) { + + gNB_MAC_INST *gNB = (gNB_MAC_INST *)arg; + + char output[MACSTATSSTRLEN] = {0}; + const char *end = output + MACSTATSSTRLEN; + FILE *file = fopen("nrMAC_stats.log","w"); + AssertFatal(file!=NULL,"Cannot open nrMAC_stats.log, error %s\n",strerror(errno)); + + while (oai_exit == 0) { + char *p = output; + NR_SCHED_LOCK(&gNB->sched_lock); + p += dump_mac_stats(gNB, p, end - p, false); + NR_SCHED_UNLOCK(&gNB->sched_lock); + p += snprintf(p, end - p, "\n"); + p += print_meas_log(&gNB->eNB_scheduler, "DL & UL scheduling timing", NULL, NULL, p, end - p); + p += print_meas_log(&gNB->schedule_dlsch, "dlsch scheduler", NULL, NULL, p, end - p); + p += print_meas_log(&gNB->rlc_data_req, "rlc_data_req", NULL, NULL, p, end - p); + p += print_meas_log(&gNB->rlc_status_ind, "rlc_status_ind", NULL, NULL, p, end - p); + p += print_meas_log(&gNB->nr_srs_ri_computation_timer, "UL-RI computation time", NULL, NULL, p, end - p); + p += print_meas_log(&gNB->nr_srs_tpmi_computation_timer, "UL-TPMI computation time", NULL, NULL, p, end - p); + fwrite(output, p - output, 1, file); + fflush(file); + sleep(1); + fseek(file,0,SEEK_SET); + } + fclose(file); + return NULL; +} + +void clear_mac_stats(gNB_MAC_INST *gNB) { + UE_iterator(gNB->UE_info.list, UE) { + memset(&UE->mac_stats,0,sizeof(UE->mac_stats)); + } +} + +size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset_rsrp) +{ + const char *begin = output; + const char *end = output + strlen; + + /* this function is called from gNB_dlsch_ulsch_scheduler(), so assumes the + * scheduler to be locked*/ + NR_SCHED_ENSURE_LOCKED(&gNB->sched_lock); + + NR_SCHED_LOCK(&gNB->UE_info.mutex); + UE_iterator(gNB->UE_info.list, UE) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + NR_mac_stats_t *stats = &UE->mac_stats; + const int avg_rsrp = stats->num_rsrp_meas > 0 ? stats->cumul_rsrp / stats->num_rsrp_meas : 0; + + output += snprintf(output, end - output, "UE RNTI %04x CU-UE-ID ", UE->rnti); + if (du_exists_f1_ue_data(UE->rnti)) { + f1_ue_data_t ued = du_get_f1_ue_data(UE->rnti); + output += snprintf(output, end - output, "%d", ued.secondary_ue); + } else { + output += snprintf(output, end-output, "(none)"); + } + + bool in_sync = !sched_ctrl->ul_failure; + output += snprintf(output, + end - output, + " %s PH %d dB PCMAX %d dBm, average RSRP %d (%d meas)\n", + in_sync ? "in-sync" : "out-of-sync", + sched_ctrl->ph, + sched_ctrl->pcmax, + avg_rsrp, + stats->num_rsrp_meas); + + if(sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.print_report) + output += snprintf(output, + end - output, + "UE %04x: CQI %d, RI %d, PMI (%d,%d)\n", + UE->rnti, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.ri+1, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2); + + if (stats->srs_stats[0] != '\0') { + output += snprintf(output, end - output, "UE %04x: %s\n", UE->rnti, stats->srs_stats); + } + + output += snprintf(output, + end - output, + "UE %04x: dlsch_rounds ", UE->rnti); + output += snprintf(output, end - output, "%"PRIu64, stats->dl.rounds[0]); + for (int i = 1; i < gNB->dl_bler.harq_round_max; i++) + output += snprintf(output, end - output, "/%"PRIu64, stats->dl.rounds[i]); + + output += snprintf(output, + end - output, + ", dlsch_errors %"PRIu64", pucch0_DTX %d, BLER %.5f MCS (%d) %d\n", + stats->dl.errors, + stats->pucch0_DTX, + sched_ctrl->dl_bler_stats.bler, + UE->current_DL_BWP.mcsTableIdx, + sched_ctrl->dl_bler_stats.mcs); + if (reset_rsrp) { + stats->num_rsrp_meas = 0; + stats->cumul_rsrp = 0; + } + output += snprintf(output, + end - output, + "UE %04x: ulsch_rounds ", UE->rnti); + output += snprintf(output, end - output, "%"PRIu64, stats->ul.rounds[0]); + for (int i = 1; i < gNB->ul_bler.harq_round_max; i++) + output += snprintf(output, end - output, "/%"PRIu64, stats->ul.rounds[i]); + + output += snprintf(output, + end - output, + ", ulsch_errors %"PRIu64", ulsch_DTX %d, BLER %.5f MCS (%d) %d (Qm %d deltaMCS %d dB) NPRB %d SNR %d.%d dB\n", + stats->ul.errors, + stats->ulsch_DTX, + sched_ctrl->ul_bler_stats.bler, + UE->current_UL_BWP.mcs_table, + sched_ctrl->ul_bler_stats.mcs, + nr_get_Qm_ul(sched_ctrl->ul_bler_stats.mcs,UE->current_UL_BWP.mcs_table), + UE->mac_stats.deltaMCS, + UE->mac_stats.NPRB, + sched_ctrl->pusch_snrx10 / 10, + sched_ctrl->pusch_snrx10 % 10); + output += snprintf(output, + end - output, + "UE %04x: MAC: TX %14"PRIu64" RX %14"PRIu64" bytes\n", + UE->rnti, stats->dl.total_bytes, stats->ul.total_bytes); + + for (int i = 0; i < seq_arr_size(&sched_ctrl->lc_config); i++) { + const nr_lc_config_t *c = seq_arr_at(&sched_ctrl->lc_config, i); + output += snprintf(output, + end - output, + "UE %04x: LCID %d: TX %14"PRIu64" RX %14"PRIu64" bytes\n", + UE->rnti, + c->lcid, + stats->dl.lc_bytes[c->lcid], + stats->ul.lc_bytes[c->lcid]); + } + } + NR_SCHED_UNLOCK(&gNB->UE_info.mutex); + return output - begin; +} + +static void mac_rrc_init(gNB_MAC_INST *mac, ngran_node_t node_type) +{ + switch (node_type) { + case ngran_gNB_CU: + AssertFatal(1 == 0, "nothing to do for CU\n"); + break; + case ngran_gNB_DU: + mac_rrc_ul_f1ap_init(&mac->mac_rrc); + break; + case ngran_gNB: + mac_rrc_ul_direct_init(&mac->mac_rrc); + break; + default: + AssertFatal(0 == 1, "Unknown node type %d\n", node_type); + break; + } +} + +void mac_top_init_gNB(ngran_node_t node_type, + NR_ServingCellConfigCommon_t *scc, + NR_ServingCellConfig_t *scd, + const nr_mac_config_t *config) +{ + module_id_t i; + gNB_MAC_INST *nrmac; + + AssertFatal(RC.nb_nr_macrlc_inst == 1, "what is the point of calling %s() if you don't need exactly one MAC?\n", __func__); + + if (RC.nb_nr_macrlc_inst > 0) { + + RC.nrmac = (gNB_MAC_INST **) malloc16(RC.nb_nr_macrlc_inst *sizeof(gNB_MAC_INST *)); + + AssertFatal(RC.nrmac != NULL,"can't ALLOCATE %zu Bytes for %d gNB_MAC_INST with size %zu \n", + RC.nb_nr_macrlc_inst * sizeof(gNB_MAC_INST *), + RC.nb_nr_macrlc_inst, sizeof(gNB_MAC_INST)); + + for (i = 0; i < RC.nb_nr_macrlc_inst; i++) { + + RC.nrmac[i] = (gNB_MAC_INST *) malloc16(sizeof(gNB_MAC_INST)); + + AssertFatal(RC.nrmac != NULL,"can't ALLOCATE %zu Bytes for %d gNB_MAC_INST with size %zu \n", + RC.nb_nr_macrlc_inst * sizeof(gNB_MAC_INST *), + RC.nb_nr_macrlc_inst, sizeof(gNB_MAC_INST)); + + LOG_D(MAC,"[MAIN] ALLOCATE %zu Bytes for %d gNB_MAC_INST @ %p\n",sizeof(gNB_MAC_INST), RC.nb_nr_macrlc_inst, RC.mac); + + bzero(RC.nrmac[i], sizeof(gNB_MAC_INST)); + + RC.nrmac[i]->Mod_id = i; + + RC.nrmac[i]->tag = (NR_TAG_t*)malloc(sizeof(NR_TAG_t)); + memset((void*)RC.nrmac[i]->tag,0,sizeof(NR_TAG_t)); + + RC.nrmac[i]->ul_handle = 0; + + RC.nrmac[i]->common_channels[0].ServingCellConfigCommon = scc; + RC.nrmac[i]->radio_config = *config; + + RC.nrmac[i]->common_channels[0].pre_ServingCellConfig = scd; + + RC.nrmac[i]->first_MIB = true; + RC.nrmac[i]->common_channels[0].mib = get_new_MIB_NR(scc); + + RC.nrmac[i]->cset0_bwp_start = 0; + RC.nrmac[i]->cset0_bwp_size = 0; + + pthread_mutex_init(&RC.nrmac[i]->sched_lock, NULL); + + pthread_mutex_init(&RC.nrmac[i]->UE_info.mutex, NULL); + uid_linear_allocator_init(&RC.nrmac[i]->UE_info.uid_allocator); + + if (get_softmodem_params()->phy_test) { + RC.nrmac[i]->pre_processor_dl = nr_preprocessor_phytest; + RC.nrmac[i]->pre_processor_ul = nr_ul_preprocessor_phytest; + } else { + RC.nrmac[i]->pre_processor_dl = nr_init_dlsch_preprocessor(0); + RC.nrmac[i]->pre_processor_ul = nr_init_ulsch_preprocessor(0); + } + if (!IS_SOFTMODEM_NOSTATS) + threadCreate(&RC.nrmac[i]->stats_thread, + nrmac_stats_thread, + (void *)RC.nrmac[i], + "MAC_STATS", + -1, + sched_get_priority_min(SCHED_OAI) + 1); + mac_rrc_init(RC.nrmac[i], node_type); + }//END for (i = 0; i < RC.nb_nr_macrlc_inst; i++) + + AssertFatal(rlc_module_init(1) == 0,"Could not initialize RLC layer\n"); + + // These should be out of here later + if (get_softmodem_params()->usim_test == 0 ) nr_pdcp_layer_init(); + + if(IS_SOFTMODEM_NOS1 && get_softmodem_params()->phy_test) { + // get default noS1 configuration + NR_RadioBearerConfig_t *rbconfig = NULL; + NR_RLC_BearerConfig_t *rlc_rbconfig = NULL; + fill_nr_noS1_bearer_config(&rbconfig, &rlc_rbconfig); + + /* Note! previously, in nr_DRB_preconfiguration(), we passed ENB_FLAG_NO + * if ENB_NAS_USE_TUN was *not* set. It seems to me that we could not set + * this flag anywhere in the code, hence we would always configure PDCP + * with ENB_FLAG_NO in nr_DRB_preconfiguration(). This makes sense for + * noS1, because the result of passing ENB_FLAG_NO to PDCP is that PDCP + * will output the packets at a local interface, which is in line with + * the noS1 mode. Hence, below, we simply hardcode ENB_FLAG_NO */ + // setup PDCP, RLC + nr_pdcp_entity_security_keys_and_algos_t null_security_parameters = {0}; + nr_pdcp_add_drbs(ENB_FLAG_NO, 0x1234, rbconfig->drb_ToAddModList, &null_security_parameters); + nr_rlc_add_drb(0x1234, rbconfig->drb_ToAddModList->list.array[0]->drb_Identity, rlc_rbconfig); + + // free memory + free_nr_noS1_bearer_config(&rbconfig, &rlc_rbconfig); + } + + } else { + RC.nrmac = NULL; + } + + // Initialize Linked-List for Active UEs + for (i = 0; i < RC.nb_nr_macrlc_inst; i++) { + nrmac = RC.nrmac[i]; + nrmac->if_inst = NR_IF_Module_init(i); + memset(&nrmac->UE_info, 0, sizeof(nrmac->UE_info)); + } + + du_init_f1_ue_data(); + + srand48(0); +} + +void nr_mac_send_f1_setup_req(void) +{ + gNB_MAC_INST *mac = RC.nrmac[0]; + DevAssert(mac); + mac->mac_rrc.f1_setup_request(mac->f1_config.setup_req); +} diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h.patch b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h.patch new file mode 100644 index 0000000..75c3f4e --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h.patch @@ -0,0 +1,30 @@ +diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +index 83802182e0..ce01594afb 100644 +--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h ++++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +@@ -499,6 +499,8 @@ typedef struct NR_UE_harq { + + /// sched_pdsch keeps information on MCS etc used for the initial transmission + NR_sched_pdsch_t sched_pdsch; ++ // number of SDUs associated with this HARQ process ++ int num_sdus; + } NR_UE_harq_t; + + //! fixme : need to enhace for the multiple TB CQI report +@@ -709,6 +711,7 @@ typedef struct NR_mac_dir_stats { + uint32_t total_rbs_retx; + uint32_t num_mac_sdu; + uint32_t current_rbs; ++ uint32_t sdu_errors; + } NR_mac_dir_stats_t; + + typedef struct NR_mac_stats { +@@ -719,6 +722,8 @@ typedef struct NR_mac_stats { + uint32_t pucch0_DTX; + int cumul_rsrp; + uint8_t num_rsrp_meas; ++ int prev_cumul_rsrp; ++ uint8_t prev_num_rsrp_meas; + char srs_stats[50]; // Statistics may differ depending on SRS usage + int pusch_snrx10; + int deltaMCS; diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.previous.h b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.previous.h new file mode 100644 index 0000000..8b1bb3e --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.previous.h @@ -0,0 +1,949 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file mac.h +* \brief MAC data structures, constant, and function prototype +* \author Navid Nikaein and Raymond Knopp, WIE-TAI CHEN +* \date 2011, 2018 +* \version 0.5 +* \company Eurecom, NTUST +* \email navid.nikaein@eurecom.fr, kroempa@gmail.com + +*/ +/** @defgroup _oai2 openair2 Reference Implementation + * @ingroup _ref_implementation_ + * @{ + */ + +/*@}*/ + +#ifndef __LAYER2_NR_MAC_GNB_H__ +#define __LAYER2_NR_MAC_GNB_H__ + +#include +#include +#include +#include +#include "common/utils/ds/seq_arr.h" +#include "common/utils/nr/nr_common.h" +#include "common/utils/ds/byte_array.h" + +#define NR_SCHED_LOCK(lock) \ + do { \ + int rc = pthread_mutex_lock(lock); \ + AssertFatal(rc == 0, "error while locking scheduler mutex, pthread_mutex_lock() returned %d\n", rc); \ + } while (0) + +#define NR_SCHED_UNLOCK(lock) \ + do { \ + int rc = pthread_mutex_unlock(lock); \ + AssertFatal(rc == 0, "error while locking scheduler mutex, pthread_mutex_unlock() returned %d\n", rc); \ + } while (0) + +#define NR_SCHED_ENSURE_LOCKED(lock)\ + do {\ + int rc = pthread_mutex_trylock(lock); \ + AssertFatal(rc == EBUSY, "this function should be called with the scheduler mutex locked, pthread_mutex_trylock() returned %d\n", rc);\ + } while (0) + +/* Commmon */ +#include "radio/COMMON/common_lib.h" +#include "common/platform_constants.h" +#include "common/ran_context.h" +#include "collection/linear_alloc.h" + +/* RRC */ +#include "NR_BCCH-BCH-Message.h" +#include "NR_CellGroupConfig.h" +#include "NR_BCCH-DL-SCH-Message.h" +#include "openair2/RRC/NR/nr_rrc_config.h" + +/* PHY */ +#include "time_meas.h" + +/* Interface */ +#include "nfapi_nr_interface_scf.h" +#include "nfapi_nr_interface.h" +#include "NR_PHY_INTERFACE/NR_IF_Module.h" +#include "mac_rrc_ul.h" + +/* MAC */ +#include "LAYER2/NR_MAC_COMMON/nr_mac_common.h" +#include "NR_TAG.h" + +#include + + +/* Defs */ +#define MAX_NUM_BWP 5 +#define MAX_NUM_CORESET 12 +#define MAX_NUM_CCE 90 +/*!\brief Maximum number of random access process */ +#define NR_NB_RA_PROC_MAX 4 +#define MAX_NUM_OF_SSB 64 +#define MAX_NUM_NR_PRACH_PREAMBLES 64 +#define MIN_NUM_PRBS_TO_SCHEDULE 5 + +uint8_t nr_get_rv(int rel_round); + +/*! \brief NR_list_t is a "list" (of users, HARQ processes, slices, ...). + * Especially useful in the scheduler and to keep "classes" of users. */ +typedef struct { + int head; + int *next; + int tail; + int len; +} NR_list_t; + +typedef enum { + nrRA_gNB_IDLE, + nrRA_Msg2, + nrRA_WAIT_MsgA_PUSCH, + nrRA_WAIT_Msg3, + nrRA_Msg3_retransmission, + nrRA_Msg4, + nrRA_MsgB, + nrRA_WAIT_Msg4_MsgB_ACK, +} RA_gNB_state_t; + +static const char *const nrra_text[] = + {"IDLE", "Msg2", "WAIT_MsgA_PUSCH", "WAIT_Msg3", "Msg3_retransmission", "Msg4", "MsgB", "WAIT_Msg4_MsgB_ACK"}; + +typedef struct { + int idx; + bool new_beam; +} NR_beam_alloc_t; + +typedef struct nr_pdsch_AntennaPorts_t { + int N1; + int N2; + int XP; +} nr_pdsch_AntennaPorts_t; + +typedef struct nr_mac_timers { + int sr_ProhibitTimer; + int sr_TransMax; + int sr_ProhibitTimer_v1700; + int t300; + int t301; + int t310; + int n310; + int t311; + int n311; + int t319; +} nr_mac_timers_t; + +typedef struct nr_mac_config_t { + int sib1_tda; + nr_pdsch_AntennaPorts_t pdsch_AntennaPorts; + int pusch_AntennaPorts; + int minRXTXTIME; + int do_CSIRS; + int do_SRS; + bool force_256qam_off; + bool force_UL256qam_off; + bool use_deltaMCS; + int maxMIMO_layers; + bool disable_harq; + //int pusch_TargetSNRx10; + //int pucch_TargetSNRx10; + nr_mac_timers_t timer_config; + int num_dlharq; + int num_ulharq; + /// beamforming weight matrix size + int nb_bfw[2]; + int32_t *bw_list; + int num_agg_level_candidates[NUM_PDCCH_AGG_LEVELS]; +} nr_mac_config_t; + +typedef struct NR_preamble_ue { + uint8_t num_preambles; + uint8_t preamble_list[MAX_NUM_NR_PRACH_PREAMBLES]; +} NR_preamble_ue_t; + +typedef struct NR_sched_pdcch { + uint16_t BWPSize; + uint16_t BWPStart; + uint8_t CyclicPrefix; + uint8_t SubcarrierSpacing; + uint8_t StartSymbolIndex; + uint8_t CceRegMappingType; + uint8_t RegBundleSize; + uint8_t InterleaverSize; + uint16_t ShiftIndex; + uint8_t DurationSymbols; + int n_rb; +} NR_sched_pdcch_t; + +/*! \brief gNB template for the Random access information */ +typedef struct { + /// Flag to indicate this process is active + RA_gNB_state_t ra_state; + /// CORESET0 configured flag + int coreset0_configured; + /// Frame where preamble was received + int preamble_frame; + /// Slot where preamble was received + uint8_t preamble_slot; + /// Received preamble_index + uint8_t preamble_index; + /// Timing offset indicated by PHY + int16_t timing_offset; + /// Subframe where Msg2 is to be sent + uint8_t Msg2_slot; + /// Frame where Msg2 is to be sent + frame_t Msg2_frame; + /// Subframe where Msg3 is to be sent + slot_t Msg3_slot; + /// Frame where Msg3 is to be sent + frame_t Msg3_frame; + /// Msg3 time domain allocation index + int Msg3_tda_id; + /// Msg3 beam matrix index + NR_beam_alloc_t Msg3_beam; + /// harq_pid used for Msg4 transmission + uint8_t harq_pid; + /// UE RNTI allocated during RAR + rnti_t rnti; + /// RA RNTI allocated from received PRACH + uint16_t RA_rnti; + /// MsgB RNTI allocated from received MsgA + uint16_t MsgB_rnti; + /// Received UE Contention Resolution Identifier + uint8_t cont_res_id[6]; + /// Msg3 first RB + int msg3_first_rb; + /// Msg3 number of RB + int msg3_nb_rb; + /// Msg3 BWP start + int msg3_bwp_start; + /// Msg3 TPC command + uint8_t msg3_TPC; + /// Round of Msg3 HARQ + uint8_t msg3_round; + int msg3_startsymb; + int msg3_nbSymb; + /// MAC PDU length for Msg4 + int mac_pdu_length; + /// RA search space + NR_SearchSpace_t *ra_ss; + /// RA Coreset + NR_ControlResourceSet_t *coreset; + NR_sched_pdcch_t sched_pdcch; + // Beam index + uint8_t beam_id; + /// CellGroup for UE that is to come (NSA is non-null, null for SA) + NR_CellGroupConfig_t *CellGroup; + /// Preambles for contention-free access + NR_preamble_ue_t preambles; + int contention_resolution_timer; + nr_ra_type_t ra_type; + /// CFRA flag + bool cfra; + // BWP for RA + NR_UE_DL_BWP_t DL_BWP; + NR_UE_UL_BWP_t UL_BWP; + NR_UE_ServingCell_Info_t sc_info; +} NR_RA_t; + +/*! \brief gNB common channels */ +typedef struct { + frame_type_t frame_type; + NR_BCCH_BCH_Message_t *mib; + NR_BCCH_DL_SCH_Message_t *sib1; + NR_BCCH_DL_SCH_Message_t *sib19; + NR_ServingCellConfigCommon_t *ServingCellConfigCommon; + /// pre-configured ServingCellConfig that is default for every UE + NR_ServingCellConfig_t *pre_ServingCellConfig; + /// Outgoing MIB PDU for PHY + uint8_t MIB_pdu[3]; + /// Outgoing BCCH pdu for PHY + uint8_t sib1_bcch_pdu[NR_MAX_SIB_LENGTH / 8]; + int sib1_bcch_length; + /// used for sib19 data + uint8_t sib19_bcch_pdu[NR_MAX_SIB_LENGTH / 8]; + int sib19_bcch_length; + /// Template for RA computations + NR_RA_t ra[NR_NB_RA_PROC_MAX]; + /// VRB map for common channels + uint16_t vrb_map[MAX_NUM_BEAM_PERIODS][275]; + /// VRB map for common channels and PUSCH, dynamically allocated because + /// length depends on number of slots and RBs + uint16_t *vrb_map_UL[MAX_NUM_BEAM_PERIODS]; + ///Number of active SSBs + int num_active_ssb; + //Total available prach occasions per configuration period + int total_prach_occasions_per_config_period; + //Total available prach occasions + int total_prach_occasions; + //Max Association period + int max_association_period; + //SSB index + uint8_t ssb_index[MAX_NUM_OF_SSB]; + //CB preambles for each SSB + int cb_preambles_per_ssb; + /// Max prach length in slots + int prach_len; + nr_prach_info_t prach_info; +} NR_COMMON_channels_t; + +// SP ZP CSI-RS Resource Set Activation/Deactivation MAC CE +typedef struct sp_zp_csirs { + bool is_scheduled; //ZP CSI-RS ACT/Deact MAC CE is scheduled + bool act_deact; //Activation/Deactivation indication + uint8_t serv_cell_id; //Identity of Serving cell for which MAC CE applies + uint8_t bwpid; //Downlink BWP id + uint8_t rsc_id; //SP ZP CSI-RS resource set +} sp_zp_csirs_t; + +//SP CSI-RS / CSI-IM Resource Set Activation/Deactivation MAC CE +#define MAX_CSI_RESOURCE_SET 64 +typedef struct csi_rs_im { + bool is_scheduled; + bool act_deact; + uint8_t serv_cellid; + uint8_t bwp_id; + bool im; + uint8_t csi_im_rsc_id; + uint8_t nzp_csi_rsc_id; + uint8_t nb_tci_resource_set_id; + uint8_t tci_state_id [ MAX_CSI_RESOURCE_SET ]; +} csi_rs_im_t; + +typedef struct pdcchStateInd { + bool is_scheduled; + uint8_t servingCellId; + uint8_t coresetId; + uint8_t tciStateId; + bool tci_present_inDCI; +} pdcchStateInd_t; + +typedef struct pucchSpatialRelation { + bool is_scheduled; + uint8_t servingCellId; + uint8_t bwpId; + uint8_t pucchResourceId; + bool s0tos7_actDeact[8]; +} pucchSpatialRelation_t; + +typedef struct SPCSIReportingpucch { + bool is_scheduled; + uint8_t servingCellId; + uint8_t bwpId; + bool s0tos3_actDeact[4]; +} SPCSIReportingpucch_t; + +#define MAX_APERIODIC_TRIGGER_STATES 128 //38.331 +typedef struct aperiodicCSI_triggerStateSelection { + bool is_scheduled; + uint8_t servingCellId; + uint8_t bwpId; + uint8_t highestTriggerStateSelected; + bool triggerStateSelection[MAX_APERIODIC_TRIGGER_STATES]; +} aperiodicCSI_triggerStateSelection_t; + +#define MAX_TCI_STATES 128 //38.331 +typedef struct pdschTciStatesActDeact { + bool is_scheduled; + uint8_t servingCellId; + uint8_t bwpId; + uint8_t highestTciStateActivated; + bool tciStateActDeact[MAX_TCI_STATES]; + uint8_t codepoint[8]; +} pdschTciStatesActDeact_t; + +typedef struct UE_info { + sp_zp_csirs_t sp_zp_csi_rs; + csi_rs_im_t csi_im; + pdcchStateInd_t pdcch_state_ind; + pucchSpatialRelation_t pucch_spatial_relation; + SPCSIReportingpucch_t SP_CSI_reporting_pucch; + aperiodicCSI_triggerStateSelection_t aperi_CSI_trigger; + pdschTciStatesActDeact_t pdsch_TCI_States_ActDeact; +} NR_UE_mac_ce_ctrl_t; + +typedef struct NR_sched_pucch { + bool active; + int frame; + int ul_slot; + bool sr_flag; + int csi_bits; + bool simultaneous_harqcsi; + uint8_t dai_c; + uint8_t timing_indicator; + uint8_t resource_indicator; + int r_pucch; + int prb_start; + int second_hop_prb; + int nr_of_symb; + int start_symb; +} NR_sched_pucch_t; + +typedef struct NR_pusch_dmrs { + uint8_t N_PRB_DMRS; + uint8_t num_dmrs_symb; + uint16_t ul_dmrs_symb_pos; + uint8_t num_dmrs_cdm_grps_no_data; + nfapi_nr_dmrs_type_e dmrs_config_type; +} NR_pusch_dmrs_t; + +typedef struct NR_sched_pusch { + int frame; + int slot; + int mu; + + /// RB allocation within active uBWP + uint16_t rbSize; + uint16_t rbStart; + + /// MCS + uint8_t mcs; + + /// TBS-related info + uint16_t R; + uint8_t Qm; + uint32_t tb_size; + + /// UL HARQ PID to use for this UE, or -1 for "any new" + int8_t ul_harq_pid; + + uint8_t nrOfLayers; + int tpmi; + + // time_domain_allocation is the index of a list of tda + int time_domain_allocation; + NR_tda_info_t tda_info; + NR_pusch_dmrs_t dmrs_info; + int phr_txpower_calc; +} NR_sched_pusch_t; + +typedef struct NR_sched_srs { + int frame; + int slot; + bool srs_scheduled; +} NR_sched_srs_t; + +typedef struct NR_pdsch_dmrs { + uint8_t dmrs_ports_id; + uint8_t N_PRB_DMRS; + uint8_t N_DMRS_SLOT; + uint16_t dl_dmrs_symb_pos; + uint8_t numDmrsCdmGrpsNoData; + nfapi_nr_dmrs_type_e dmrsConfigType; +} NR_pdsch_dmrs_t; + +typedef struct NR_sched_pdsch { + /// RB allocation within active BWP + uint16_t rbSize; + uint16_t rbStart; + + /// MCS-related infos + uint8_t mcs; + + /// TBS-related info + uint16_t R; + uint8_t Qm; + uint32_t tb_size; + + /// DL HARQ PID to use for this UE, or -1 for "any new" + int8_t dl_harq_pid; + + // pucch format allocation + int16_t pucch_allocation; + + uint16_t pm_index; + uint8_t nrOfLayers; + + NR_pdsch_dmrs_t dmrs_parms; + // time_domain_allocation is the index of a list of tda + int time_domain_allocation; + NR_tda_info_t tda_info; +} NR_sched_pdsch_t; + +typedef struct NR_UE_harq { + bool is_waiting; + uint8_t ndi; + uint8_t round; + uint16_t feedback_frame; + uint16_t feedback_slot; + + /* Transport block to be sent using this HARQ process */ + byte_array_t transportBlock; + uint32_t tb_size; // size of currently stored TB + + /// sched_pdsch keeps information on MCS etc used for the initial transmission + NR_sched_pdsch_t sched_pdsch; +} NR_UE_harq_t; + +//! fixme : need to enhace for the multiple TB CQI report + +typedef struct NR_bler_stats { + frame_t last_frame; + float bler; + uint8_t mcs; + uint64_t rounds[8]; +} NR_bler_stats_t; + +// +/*! As per spec 38.214 section 5.2.1.4.2 + * - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'disabled', the UE shall report in + a single report nrofReportedRS (higher layer configured) different CRI or SSBRI for each report setting. + * - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'enabled', the UE shall report in a + single reporting instance two different CRI or SSBRI for each report setting, where CSI-RS and/or SSB + resources can be received simultaneously by the UE either with a single spatial domain receive filter, or with + multiple simultaneous spatial domain receive filter +*/ +#define MAX_NR_OF_REPORTED_RS 4 + +struct CRI_RI_LI_PMI_CQI { + uint8_t cri; + uint8_t ri; + uint8_t li; + uint8_t pmi_x1; + uint8_t pmi_x2; + uint8_t wb_cqi_1tb; + uint8_t wb_cqi_2tb; + uint8_t cqi_table; + uint8_t csi_report_id; + bool print_report; +}; + +typedef struct RSRP_report { + uint8_t nr_reports; + uint8_t resource_id[MAX_NR_OF_REPORTED_RS]; + int RSRP[MAX_NR_OF_REPORTED_RS]; +} RSRP_report_t; + +struct CSI_Report { + struct CRI_RI_LI_PMI_CQI cri_ri_li_pmi_cqi_report; + RSRP_report_t ssb_rsrp_report; + RSRP_report_t csirs_rsrp_report; +}; + +#define MAX_SR_BITLEN 8 + +/*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report + the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE + From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set + From spec 38.214 section 5.2.1.2 For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1 + */ +#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16 + +typedef enum { + INACTIVE = 0, + ACTIVE_NOT_SCHED, + ACTIVE_SCHED +} NR_UL_harq_states_t; + +typedef struct NR_UE_ul_harq { + bool is_waiting; + uint8_t ndi; + uint8_t round; + uint16_t feedback_slot; + + /// sched_pusch keeps information on MCS etc used for the initial transmission + NR_sched_pusch_t sched_pusch; +} NR_UE_ul_harq_t; + +typedef struct NR_QoS_config_s { + int fiveQI; + int priority; +} NR_QoS_config_t; + +typedef struct nr_lc_config { + uint8_t lcid; + /// priority as specified in 38.321 + int priority; + /// associated NSSAI for DRB + nssai_t nssai; + /// QoS config for DRB + NR_QoS_config_t qos_config[NR_MAX_NUM_QFI]; +} nr_lc_config_t; + +/*! \brief scheduling control information set through an API */ +#define MAX_CSI_REPORTS 48 +typedef struct { + /// CCE index and aggregation, should be coherent with cce_list + NR_SearchSpace_t *search_space; + NR_ControlResourceSet_t *coreset; + NR_sched_pdcch_t sched_pdcch; + + /// CCE index and Aggr. Level are shared for PUSCH/PDSCH allocation decisions + /// corresponding to the sched_pusch/sched_pdsch structures below + int cce_index; + uint8_t aggregation_level; + + /// Array of PUCCH scheduling information + /// Its size depends on TDD configuration and max feedback time + /// There will be a structure for each UL slot in the active period determined by the size + NR_sched_pucch_t *sched_pucch; + int sched_pucch_size; + + /// Sched PUSCH: scheduling decisions, copied into HARQ and cleared every TTI + NR_sched_pusch_t sched_pusch; + + /// Sched SRS: scheduling decisions + NR_sched_srs_t sched_srs; + + /// uplink bytes that are currently scheduled + int sched_ul_bytes; + /// estimation of the UL buffer size + int estimated_ul_buffer; + + /// PHR info: power headroom level (dB) + int ph; + /// PHR info: power headroom level (dB) for 1 PRB + int ph0; + + /// PHR info: nominal UE transmit power levels (dBm) + int pcmax; + + /// Sched PDSCH: scheduling decisions, copied into HARQ and cleared every TTI + NR_sched_pdsch_t sched_pdsch; + /// UE-estimated maximum MCS (from CSI-RS) + uint8_t dl_max_mcs; + + /// For UL synchronization: store last UL scheduling grant + frame_t last_ul_frame; + slot_t last_ul_slot; + + /// total amount of data awaiting for this UE + uint32_t num_total_bytes; + uint16_t dl_pdus_total; + /// per-LC status data + mac_rlc_status_resp_t rlc_status[NR_MAX_NUM_LCID]; + + /// Estimation of HARQ from BLER + NR_bler_stats_t dl_bler_stats; + NR_bler_stats_t ul_bler_stats; + + uint16_t ta_frame; + int16_t ta_update; + bool ta_apply; + uint8_t tpc0; + uint8_t tpc1; + int raw_rssi; + int pusch_snrx10; + int pucch_snrx10; + uint16_t ul_rssi; + uint8_t current_harq_pid; + int pusch_consecutive_dtx_cnt; + int pucch_consecutive_dtx_cnt; + bool ul_failure; + int ul_failure_timer; + int release_timer; + struct CSI_Report CSI_report; + bool SR; + /// information about every HARQ process + NR_UE_harq_t harq_processes[NR_MAX_HARQ_PROCESSES]; + /// HARQ processes that are free + NR_list_t available_dl_harq; + /// HARQ processes that await feedback + NR_list_t feedback_dl_harq; + /// HARQ processes that await retransmission + NR_list_t retrans_dl_harq; + /// information about every UL HARQ process + NR_UE_ul_harq_t ul_harq_processes[NR_MAX_HARQ_PROCESSES]; + /// UL HARQ processes that are free + NR_list_t available_ul_harq; + /// UL HARQ processes that await feedback + NR_list_t feedback_ul_harq; + /// UL HARQ processes that await retransmission + NR_list_t retrans_ul_harq; + NR_UE_mac_ce_ctrl_t UE_mac_ce_ctrl; // MAC CE related information + + /// Timer for RRC processing procedures and transmission activity + NR_timer_t transm_interrupt; + + /// sri, ul_ri and tpmi based on SRS + nr_srs_feedback_t srs_feedback; + + /// per-LC configuration + seq_arr_t lc_config; + + // pdcch closed loop adjust for PDCCH aggregation level, range <0, 1> + // 0 - good channel, 1 - bad channel + float pdcch_cl_adjust; +} NR_UE_sched_ctrl_t; + +typedef struct { + NR_SearchSpace_t *search_space; + NR_ControlResourceSet_t *coreset; + + NR_sched_pdcch_t sched_pdcch; + NR_sched_pdsch_t sched_pdsch; + + uint32_t num_total_bytes; + + int cce_index; + uint8_t aggregation_level; +} NR_UE_sched_osi_ctrl_t; + +typedef struct { + uicc_t *uicc; +} NRUEcontext_t; + +typedef struct NR_mac_dir_stats { + uint64_t lc_bytes[64]; + uint64_t rounds[8]; + uint64_t errors; + uint64_t total_bytes; + uint32_t current_bytes; + uint64_t total_sdu_bytes; + uint32_t total_rbs; + uint32_t total_rbs_retx; + uint32_t num_mac_sdu; + uint32_t current_rbs; +} NR_mac_dir_stats_t; + +typedef struct NR_mac_stats { + NR_mac_dir_stats_t dl; + NR_mac_dir_stats_t ul; + uint32_t ulsch_DTX; + uint64_t ulsch_total_bytes_scheduled; + uint32_t pucch0_DTX; + int cumul_rsrp; + uint8_t num_rsrp_meas; + char srs_stats[50]; // Statistics may differ depending on SRS usage + int pusch_snrx10; + int deltaMCS; + int NPRB; +} NR_mac_stats_t; + +typedef struct NR_bler_options { + double upper; + double lower; + uint8_t max_mcs; + uint8_t harq_round_max; +} NR_bler_options_t; + +typedef struct nr_mac_rrc_ul_if_s { + f1_reset_du_initiated_func_t f1_reset; + f1_reset_acknowledge_cu_initiated_func_t f1_reset_acknowledge; + f1_setup_request_func_t f1_setup_request; + gnb_du_configuration_update_t gnb_du_configuration_update; + ue_context_setup_response_func_t ue_context_setup_response; + ue_context_modification_response_func_t ue_context_modification_response; + ue_context_modification_required_func_t ue_context_modification_required; + ue_context_release_request_func_t ue_context_release_request; + ue_context_release_complete_func_t ue_context_release_complete; + initial_ul_rrc_message_transfer_func_t initial_ul_rrc_message_transfer; +} nr_mac_rrc_ul_if_t; + +typedef enum interrupt_followup_action { FOLLOW_INSYNC, FOLLOW_INSYNC_RECONFIG, FOLLOW_OUTOFSYNC } interrupt_followup_action_t; + +/*! \brief UE list used by gNB to order UEs/CC for scheduling*/ +typedef struct { + rnti_t rnti; + uid_t uid; // unique ID of this UE + /// scheduling control info + nr_csi_report_t csi_report_template[MAX_CSI_REPORTCONFIG]; + NR_UE_sched_ctrl_t UE_sched_ctrl; + NR_UE_DL_BWP_t current_DL_BWP; + NR_UE_UL_BWP_t current_UL_BWP; + NR_UE_ServingCell_Info_t sc_info; + NR_mac_stats_t mac_stats; + /// currently active CellGroupConfig + NR_CellGroupConfig_t *CellGroup; + /// CellGroupConfig that is to be activated after the next reconfiguration + bool expect_reconfiguration; + /// reestablishRLC has to be signaled in RRCreconfiguration + bool reestablish_rlc; + NR_CellGroupConfig_t *reconfigCellGroup; + interrupt_followup_action_t interrupt_action; + NR_UE_NR_Capability_t *capability; + // UE selected beam index + uint8_t UE_beam_index; + bool Msg4_MsgB_ACKed; + float ul_thr_ue; + float dl_thr_ue; + long pdsch_HARQ_ACK_Codebook; +} NR_UE_info_t; + +typedef struct { + /// scheduling control info + // last element always NULL + pthread_mutex_t mutex; + NR_UE_info_t *list[MAX_MOBILES_PER_GNB+1]; + // bitmap of CSI-RS already scheduled in current slot + int sched_csirs; + uid_allocator_t uid_allocator; +} NR_UEs_t; + +typedef struct { + /// list of allocated beams per period + int **beam_allocation; + int beam_duration; // in slots + int beams_per_period; + int beam_allocation_size; +} NR_beam_info_t; + +#define UE_iterator(BaSe, VaR) NR_UE_info_t ** VaR##pptr=BaSe, *VaR; while ((VaR=*(VaR##pptr++))) + +typedef void (*nr_pp_impl_dl)(module_id_t mod_id, frame_t frame, slot_t slot); +typedef bool (*nr_pp_impl_ul)(module_id_t mod_id, frame_t frame, slot_t slot); + +typedef struct f1_config_t { + f1ap_setup_req_t *setup_req; + f1ap_setup_resp_t *setup_resp; + uint32_t gnb_id; // associated gNB's ID, not used in DU itself +} f1_config_t; + +typedef struct { + char *nvipc_shm_prefix; + int8_t nvipc_poll_core; +} nvipc_params_t; + +typedef struct { + uint64_t total_prb_aggregate; + uint64_t used_prb_aggregate; +} mac_stats_t; + +/*! \brief top level eNB MAC structure */ +typedef struct gNB_MAC_INST_s { + /// Ethernet parameters for northbound midhaul interface + eth_params_t eth_params_n; + /// address for F1U to bind, ports in eth_params_n + char *f1u_addr; + /// Ethernet parameters for fronthaul interface + eth_params_t eth_params_s; + /// Nvipc parameters for FAPI interface with Aerial + nvipc_params_t nvipc_params_s; + /// Module + module_id_t Mod_id; + /// timing advance group + NR_TAG_t *tag; + /// Pointer to IF module instance for PHY + NR_IF_Module_t *if_inst; + pthread_t stats_thread; + /// Pusch target SNR + int pusch_target_snrx10; + /// RSSI threshold for power control. Limits power control commands when RSSI reaches threshold. + int pusch_rssi_threshold; + /// Pucch target SNR + int pucch_target_snrx10; + /// RSSI threshold for PUCCH power control. Limits power control commands when RSSI reaches threshold. + int pucch_rssi_threshold; + /// SNR threshold needed to put or not a PRB in the black list + int ul_prbblack_SNR_threshold; + /// PUCCH Failure threshold (compared to consecutive PUCCH DTX) + int pucch_failure_thres; + /// PUSCH Failure threshold (compared to consecutive PUSCH DTX) + int pusch_failure_thres; + /// Subcarrier Offset + int ssb_SubcarrierOffset; + int ssb_OffsetPointA; + + /// Common cell resources + NR_COMMON_channels_t common_channels[NFAPI_CC_MAX]; + /// current PDU index (BCH,DLSCH) + uint16_t pdu_index[NFAPI_CC_MAX]; + /// UL PRBs blacklist + uint16_t ulprbbl[MAX_BWP_SIZE]; + /// NFAPI Config Request Structure + nfapi_nr_config_request_scf_t config[NFAPI_CC_MAX]; + /// a PDCCH PDU groups DCIs per BWP and CORESET. The following structure + /// keeps pointers to PDCCH PDUs within DL_req so that we can easily track + /// PDCCH PDUs per CC/BWP/CORESET + nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_idx[NFAPI_CC_MAX][MAX_NUM_CORESET]; + /// NFAPI UL TTI Request Structure for future TTIs, dynamically allocated + /// because length depends on number of slots + nfapi_nr_ul_tti_request_t *UL_tti_req_ahead[NFAPI_CC_MAX]; + int UL_tti_req_ahead_size; + int vrb_map_UL_size; + + NR_UEs_t UE_info; + + /// UL handle + uint32_t ul_handle; + //UE_info_t UE_info; + + // MAC function execution peformance profiler + /// processing time of eNB scheduler + time_stats_t eNB_scheduler; + /// processing time of eNB scheduler for SI + time_stats_t schedule_si; + /// processing time of eNB scheduler for Random access + time_stats_t schedule_ra; + /// processing time of eNB ULSCH scheduler + time_stats_t schedule_ulsch; + /// processing time of eNB DCI generation + time_stats_t fill_DLSCH_dci; + /// processing time of eNB MAC preprocessor + time_stats_t schedule_dlsch_preprocessor; + /// processing time of eNB DLSCH scheduler + time_stats_t schedule_dlsch; // include rlc_data_req + MAC header + preprocessor + /// processing time of rlc_data_req + time_stats_t rlc_data_req; + /// processing time of rlc_status_ind + time_stats_t rlc_status_ind; + /// processing time of nr_srs_ri_computation + time_stats_t nr_srs_ri_computation_timer; + /// processing time of nr_srs_tpmi_estimation + time_stats_t nr_srs_tpmi_computation_timer; + /// processing time of eNB MCH scheduler + time_stats_t schedule_mch; + /// processing time of eNB ULSCH reception + time_stats_t rx_ulsch_sdu; // include rlc_data_ind + /// processing time of eNB PCH scheduler + time_stats_t schedule_pch; + + NR_beam_info_t beam_info; + + /// maximum number of slots before a UE will be scheduled ULSCH automatically + uint32_t ulsch_max_frame_inactivity; + /// instance of the frame structure configuration + frame_structure_t frame_structure; + + /// DL preprocessor for differentiated scheduling + nr_pp_impl_dl pre_processor_dl; + /// UL preprocessor for differentiated scheduling + nr_pp_impl_ul pre_processor_ul; + + nr_mac_config_t radio_config; + + NR_UE_sched_osi_ctrl_t *sched_osi; + NR_UE_sched_ctrl_t *sched_ctrlCommon; + + uint16_t cset0_bwp_start; + uint16_t cset0_bwp_size; + NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config[64]; + + bool first_MIB; + NR_bler_options_t dl_bler; + NR_bler_options_t ul_bler; + uint8_t min_grant_prb; + uint8_t min_grant_mcs; + bool identity_pm; + int precoding_matrix_size[NR_MAX_NB_LAYERS]; + int fapi_beam_index[MAX_NUM_OF_SSB]; + nr_mac_rrc_ul_if_t mac_rrc; + f1_config_t f1_config; + int16_t frame; + + pthread_mutex_t sched_lock; + + mac_stats_t mac_stats; + +} gNB_MAC_INST; + +#endif /*__LAYER2_NR_MAC_GNB_H__ */ +/** @}*/ diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/cmake_targets/tools/build_helper.patch b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/cmake_targets/tools/build_helper.patch new file mode 100644 index 0000000..b7ce1fb --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/cmake_targets/tools/build_helper.patch @@ -0,0 +1,31 @@ +diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper +index 3fc1db7b56..9f68588ea6 100755 +--- a/cmake_targets/tools/build_helper ++++ b/cmake_targets/tools/build_helper +@@ -37,6 +37,7 @@ case "$OS_DISTRO" in + centos) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake3" ;; # CentOS Stream + debian) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;; + ubuntu) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;; ++ linuxmint) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;; + esac + KERNEL_VERSION=$(uname -r | cut -d '.' -f1) + KERNEL_MAJOR=$(uname -r | cut -d '.' -f2) +@@ -93,6 +94,18 @@ echo_info() { cecho "$*" $blue ;} + # Examples: + # debian8.5 + get_distribution_release() { ++ if [[ $OS_DISTRO == "linuxmint" ]]; then ++ if [[ $OS_RELEASE == 22* ]]; then ++ OS_DISTRO="ubuntu" ++ OS_RELEASE="24.04" ++ elif [[ $OS_RELEASE == 21* ]]; then ++ OS_DISTRO="ubuntu" ++ OS_RELEASE="22.04" ++ elif [[ $OS_RELEASE == 20* ]]; then ++ OS_DISTRO="ubuntu" ++ OS_RELEASE="20.04" ++ fi ++ fi + if [[ ! -z "$OS_DISTRO$OS_RELEASE" ]]; then + echo "$OS_DISTRO$OS_RELEASE" + else diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/cmake_targets/tools/build_helper.previous b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/cmake_targets/tools/build_helper.previous new file mode 100644 index 0000000..3fc1db7 --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/cmake_targets/tools/build_helper.previous @@ -0,0 +1,843 @@ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +# file build_helper +# brief +# authors Laurent Thomas, Lionel GAUTHIER +# +####################################### +if [ ! -f /etc/os-release ]; then + echo "No /etc/os-release file found. You're likely on an unsupported distro." + exit -1 +fi +OS_DISTRO=$(grep "^ID=" /etc/os-release | sed "s/ID=//" | sed "s/\"//g") +OS_RELEASE=$(grep "^VERSION_ID=" /etc/os-release | sed "s/VERSION_ID=//" | sed "s/\"//g") +case "$OS_DISTRO" in + fedora) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;; + rhel) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake3" ;; + rocky) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;; + centos) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake3" ;; # CentOS Stream + debian) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;; + ubuntu) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;; +esac +KERNEL_VERSION=$(uname -r | cut -d '.' -f1) +KERNEL_MAJOR=$(uname -r | cut -d '.' -f2) + +#check if we run inside a container +IS_CONTAINER=`grep -E -c "docker|podman|kubepods|libpod|buildah" /proc/self/cgroup || true` +#sudo is not needed when we are root +if [ "$UID" = 0 ] +then + SUDO='' +else + SUDO='sudo -S -E' +fi + +############################### +## echo and family +############################### +# only emit color if connected to a terminal, and if it supports colors +if [ -t 1 ]; then + num_colors=$(tput colors) + if [ -n "$num_colors" ] && [ "$num_colors" -ge 8 ]; then + red='\E[31m' + green='\E[32m' + yellow='\E[33m' + blue='\E[1;34m' + reset_color='\E[00m' + fi +fi + +cecho() { + # Color-echo + # arg1 = message + # arg2 = color + local default_msg="No Message." + message=${1:-$default_msg} + color=${2:-$green} + echo -e "$color$message$reset_color" + return +} + +echo_error() { cecho "$*" $red ;} +echo_fatal() { cecho "$*" $red; exit -1 ;} +echo_warning() { cecho "$*" $yellow ;} +echo_success() { cecho "$*" $green ;} +echo_info() { cecho "$*" $blue ;} + +######################## +# distribution helpers # +######################## + +# This function return a string to identify the distribution we are running +# If we can't check the distribution, it returns "Unknown" +# This function return always true as exit code by design +# Examples: +# debian8.5 +get_distribution_release() { + if [[ ! -z "$OS_DISTRO$OS_RELEASE" ]]; then + echo "$OS_DISTRO$OS_RELEASE" + else + echo Unknown + fi +} + +check_supported_distribution() { + local distribution=$(get_distribution_release) + case "$distribution" in + "ubuntu24.04") return 0 ;; + "ubuntu22.04") return 0 ;; + "ubuntu20.04") return 0 ;; + "debian11") return 0 ;; + "fedora41") return 0 ;; + "fedora40") return 0 ;; + "rhel8.2") return 0 ;; + "rhel8.3") return 0 ;; + "rhel8.4") return 0 ;; + "rhel8.5") return 0 ;; + "rhel8.6") return 0 ;; + "rhel8.7") return 0 ;; + "rhel8.8") return 0 ;; + "rhel8.9") return 0 ;; + "rhel9.0") return 0 ;; + "rhel9.1") return 0 ;; + "rhel9.2") return 0 ;; + "rhel9.3") return 0 ;; + "rhel9.4") return 0 ;; + "rhel9.5") return 0 ;; + "centos9") return 0 ;; # CentOS stream + "rocky8.7") return 0 ;; + "rocky8.8") return 0 ;; + "rocky8.9") return 0 ;; + "rocky9.1") return 0 ;; + "rocky9.2") return 0 ;; + "rocky9.3") return 0 ;; + "rocky9.4") return 0 ;; + "rocky9.5") return 0 ;; + esac + return 1 +} + +################## +# Error handlers # +################## + +handler_EXIT() { + local exit_code=$? + [ "$exit_code" -eq 0 ] || echo_error "build have failed" + exit $exit_code +} + +trap handler_EXIT EXIT + +########################### +# Cleaners +########################### + +clean_kernel() { + $SUDO modprobe ip_tables + $SUDO modprobe x_tables + $SUDO iptables -P INPUT ACCEPT + $SUDO iptables -F INPUT + $SUDO iptables -P OUTPUT ACCEPT + $SUDO iptables -F OUTPUT + $SUDO iptables -P FORWARD ACCEPT + $SUDO iptables -F FORWARD + $SUDO iptables -t nat -F + $SUDO iptables -t mangle -F + $SUDO iptables -t filter -F + $SUDO iptables -t raw -F + echo_info "Flushed iptables" +} + +clean_all_files() { + set_openair_env + dir=$OPENAIR_DIR/cmake_targets + rm -rf $dir/ran_build $dir/ran_build_noLOG + rm -rf $dir/lte-simulators/build + rm -rf $dir/nas_sim_tools/build + rm -rf $dir/oaisim_build_oai/build $dir/oaisim_build_oai/CMakeLists.txt + rm -rf $dir/autotests/bin $dir/autotests/log $dir/autotests/*/build +} + +################################### +# Compilers +################################### + +#check_warnings: +# print error message if the compilation had warnings +#argument: +# $1: log file +check_warnings() { + #we look for 'warning:' in the compilation log file + #this is how gcc starts a warning + #this is not perfect, we may get false positive + warning_count=`grep "warning:" "$1" | grep -E -v "jobserver unavailable|disabling jobserver mode" | wc -l` + if [ $warning_count -gt 0 ]; then + echo_error "WARNING: $warning_count warnings. See $1" + fi +} + +#check_errors: +# print error message if the compilation had errors +#argument: +# $1: log file +check_errors() { + #we look for 'error:' in the compilation log file + error_count=`grep -c "error:" "$1"` + if [ $error_count -gt 0 ]; then + echo_error "ERROR: $error_count error. See $1" + fi +} + +compilations() { + [[ $# -eq 4 ]] || echo_fatal "compilations " + local dir=$1 + local logfile=$2 + local targets=$3 + local build_tool_opt=$4 + local verbose=$([ "$VERBOSE_COMPILE" == "1" ] && echo "-v" || echo "") + echo cd $OPENAIR_DIR/cmake_targets/$dir/build + cd $OPENAIR_DIR/cmake_targets/$dir/build + cmd="$CMAKE --build . ${verbose} --target ${targets} -- ${build_tool_opt}" + echo_info "Running \"${cmd}\"" $green + echo "Log file for compilation is being written to: $dlog/$logfile" + set +e + { + eval ${cmd} + ret=$? + } > $dlog/$logfile 2>&1 + # Print the errors and warnings for CI purposes + grep -E -A5 -B5 "warning:|error:| Error " $dlog/$logfile || true + check_warnings "$dlog/$logfile" + if [[ $ret -eq 0 ]]; then + echo_success "$targets compiled" + else + check_errors "$dlog/$logfile" + echo_error "compilation of $targets failed" + exit 1 + fi +} + +############################################ +# External packages installers +############################################ + +install_usrp_uhd_driver_from_source(){ + uhd_install_log=$OPENAIR_DIR/cmake_targets/log/uhd_install_log.txt + echo_info "\nInstalling UHD driver from sources. The log file for UHD driver installation is here: $uhd_install_log " + ( + pushd /tmp + echo "Cloning UHD driver repository" + rm -rf /tmp/uhd + git clone https://github.com/EttusResearch/uhd.git + cd uhd + # For our legacy TDD eNB running with a B2xx RF board + # the following patch has to be applied + if [[ -v UHD_VERSION ]]; then + git checkout tags/v${UHD_VERSION} + # We recommend to use not older than 3.15.0.0 + if [[ "$UHD_VERSION" == "3.15.0.0" ]]; then + # Tested that patch for the following versions: + # - 3.15.0.0 + git apply $OPENAIR_DIR/cmake_targets/tools/uhd-3.15-tdd-patch.diff + ret=$?;[[ $ret -ne 0 ]] && echo_fatal "Could not apply the TDD patch" + elif [[ "$UHD_VERSION" == "4.7.0.0" || "$UHD_VERSION" == "4.6.0.0" || "$UHD_VERSION" == "4.5.0.0" ]]; then + # Tested that patch for the following versions: + # - 4.7.0.0 + cp $OPENAIR_DIR/cmake_targets/tools/uhd-4.x-tdd-patch.diff $OPENAIR_DIR/cmake_targets/tools/uhd-4.5plus-tdd-patch.diff + sed -i '9,13 s/STATE_OFF/STATE_RX1_OFF/' $OPENAIR_DIR/cmake_targets/tools/uhd-4.5plus-tdd-patch.diff + sed -i '24,28 s/STATE_OFF/STATE_RX2_OFF/' $OPENAIR_DIR/cmake_targets/tools/uhd-4.5plus-tdd-patch.diff + git apply $OPENAIR_DIR/cmake_targets/tools/uhd-4.5plus-tdd-patch.diff + ret=$?;[[ $ret -ne 0 ]] && echo_fatal "Could not apply the TDD patch" + else + # Tested that patch for the following versions: + # - 4.0.0.0 + # - 4.1.0.0 + # - 4.1.0.5 + # - 4.2.0.0 + # - 4.2.0.1 + # - 4.3.0.0-rc1 + # - 4.4.0.0 + git apply $OPENAIR_DIR/cmake_targets/tools/uhd-4.x-tdd-patch.diff + ret=$?;[[ $ret -ne 0 ]] && echo_fatal "Could not apply the TDD patch" + fi + else + git checkout tags/v4.0.0.0 + git apply $OPENAIR_DIR/cmake_targets/tools/uhd-4.x-tdd-patch.diff + ret=$?;[[ $ret -ne 0 ]] && echo_fatal "Could not apply the TDD patch" + fi + # Printing out the results of the patch to make sure it was properly applied + git diff + mkdir -p host/build + cd host/build || true + $CMAKE ../ -GNinja -DENABLE_TESTS=OFF -DENABLE_EXAMPLES=OFF + echo "Compiling UHD" + ninja + $SUDO ninja install + $SUDO ldconfig -v + if [ $IS_CONTAINER -eq 0 ]; then + if [[ "$OS_DISTRO" == "ubuntu" ]]; then + $SUDO /usr/local/lib/uhd/utils/uhd_images_downloader.py + fi + if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then + $SUDO /usr/local/lib64/uhd/utils/uhd_images_downloader.py + fi + fi + popd + rm -rf /tmp/uhd + ) >& $uhd_install_log +} + +check_install_usrp_uhd_driver(){ + if [[ "$OS_BASEDISTRO" == "debian" ]]; then + boost_libs_ubuntu="libboost-chrono-dev libboost-date-time-dev libboost-filesystem-dev libboost-program-options-dev libboost-thread-dev libboost-test-dev libboost-regex-dev" + #first we remove old installation + $SUDO apt-get remove uhd -y || true + $SUDO apt-get remove uhd-host -y || true + $SUDO apt-get remove libuhd-dev -y || true + $SUDO apt-get remove libuhd003 -y || true + $SUDO apt-get remove libuhd3.13.1 -y || true + $SUDO apt-get remove libuhd3.14.0 -y || true + $SUDO apt-get remove libuhd3.14.1 -y || true + $SUDO apt-get remove libuhd3.15.0 -y || true + local distribution=$(get_distribution_release) + if [[ "$distribution" == "ubuntu20.04" || "$distribution" == "ubuntu22.04" ]]; then + $SUDO apt-get remove libuhd4.?.? -y || true + fi + v=$(lsb_release -cs) + $SUDO apt-add-repository --remove "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main" + if [[ -v BUILD_UHD_FROM_SOURCE ]] || [[ "$OS_DISTRO" == "debian" ]]; then + $SUDO apt-get install -y $boost_libs_ubuntu libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-setuptools ninja-build + install_usrp_uhd_driver_from_source + return + fi + # The new USRP repository + # Raphael Defosseux: Adding a loop on adding PPA because in CI the gpg key retrieve may + # timeout due to proxy / network latencies in Eurecom on VM + echo_info "\nAdding PPA repository ettusresearch/uhd\n" + x=0 + while [ $x -le 5 ] + do + if $SUDO add-apt-repository ppa:ettusresearch/uhd -y + then + echo_info "add-apt-repository successful\n" + break + else + echo_info "add-apt-repository failed, retrying...\n" + sleep 30 + fi + x=$((x + 1)) + done + $SUDO apt-get update + $SUDO apt-get -y install python-tk $boost_libs_ubuntu libusb-1.0-0-dev + case "$(get_distribution_release)" in + "ubuntu20.04" | "ubuntu22.04") + $SUDO apt-get -y install libuhd-dev libuhd4.5.0 uhd-host + ;; + esac + elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then + boost_libs_fedora="boost-chrono boost-date-time boost-filesystem boost-program-options boost-thread boost-test boost-regex boost-devel" + if [ $IS_CONTAINER -eq 0 ] + then + $SUDO $INSTALLER -y install python3 $boost_libs_fedora libusb-devel libusbx-devel python3-mako python3-docutils python3-pip $CMAKE + $SUDO pip3 install requests + else + $SUDO $INSTALLER -y install $boost_libs_fedora $CMAKE + $SUDO pip3 install mako requests + fi + if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then + if [ $IS_CONTAINER -eq 0 ] + then + # until EPEL repo hasn't bumped UHD driver to >=3.10 in EPEL, build driver from source + $SUDO $INSTALLER -y remove uhd uhd-devel uhd-firmware + fi + install_usrp_uhd_driver_from_source + else + $SUDO $INSTALLER -y install uhd uhd-devel uhd-firmware + fi + fi +} + +install_usrp_uhd_driver() { + if [[ "$OS_DISTRO" == "ubuntu" ]]; then + # We move uhd-host apart because it depends on linux kernel version + # On newer kernels, it fails to install + $SUDO apt-get -y install uhd-host + fi + # quick workaround for below distributions + local distribution=$(get_distribution_release) + if [ -z $1 ]; then + if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "rocky" ]] || [[ "$OS_DISTRO" == "centos" ]]; then + $SUDO /usr/local/bin/uhd_images_downloader + else + $SUDO uhd_images_downloader + fi + else + if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "rocky" ]] || [[ "$OS_DISTRO" == "centos" ]]; then + $SUDO /usr/local/bin/uhd_images_downloader -i $1 + else + $SUDO uhd_images_downloader -i $1 + fi + fi +} + +install_bladerf_driver_from_source(){ + bladerf_install_log=$OPENAIR_DIR/cmake_targets/log/bladerf_install_log.txt + echo_info "\nInstalling BladeRF driver from sources. The log file for BladeRF driver installation is here: $bladerf_install_log " + ( + cd /tmp + echo "Downloading BladeRF driver" + rm -rf /tmp/bladeRF + git clone https://github.com/Nuand/bladeRF.git + cd bladeRF + git checkout tags/2016.06 + mkdir -p build + cd build + $CMAKE ../ + echo "Compiling BladeRF driver" + make + $SUDO make install + $SUDO ldconfig + echo "Downloading FPGA and firmware images" + cd /tmp/bladeRF + #wget has been removed from default dependencies, so we must be sure that's installed + $SUDO $INSTALLER -y install wget + wget --tries=3 --retry-connrefused https://www.nuand.com/fx3/bladeRF_fw_latest.img + wget --tries=3 --retry-connrefused https://www.nuand.com/fpga/hostedx40-latest.rbf + sudo mkdir -p /usr/share/Nuand/bladeRF + sudo mv bladeRF_fw_latest.img /usr/share/Nuand/bladeRF/bladeRF_fw.img + sudo mv hostedx40-latest.rbf /usr/share/Nuand/bladeRF/hostedx40.rbf + ) >& $bladerf_install_log +} + +check_install_bladerf_driver(){ + if [[ "$OS_DISTRO" == "ubuntu" ]]; then + $SUDO apt-get install -y bladerf libbladerf-dev + $SUDO apt-get install -y bladerf-firmware-fx3 + $SUDO apt-get install -y bladerf-fpga-hostedx40 + elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then + install_bladerf_driver_from_source + else + echo_error "BladeRF Installer for OAI does not support automatic build. Install BladeRF compiling sources manually from BladeRF website" + fi +} + +flash_firmware_bladerf() { + $SUDO bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img +} + +check_install_lmssdr_driver(){ + if ( [ -d "/usr/local/include/lime" ] && + [ -f "/usr/local/include/lime/LimeSuite.h" ] ) + then + echo_success "Found lmssdr drivers and tools installed from source" + else + echo_error "lmssdr support implies installing lmssdr drivers and tools" \ + " from sources. check:" + echo_info "https://wiki.myriadrf.org/Lime_Suite" + echo_fatal "Cannot compile lmssdr device" + fi + + +} + +install_soapy_from_source(){ + soapy_install_log=$OPENAIR_DIR/cmake_targets/log/soapy_install_log.txt + echo_info "\nInstalling Soapy EcoSystem from source. The log file for Soapy installation is here: $soapy_install_log " + ( + cd /tmp + echo "Downloading SoapySDR" + rm -rf /tmp/SoapySDR + git clone -b soapy-sdr-0.7.0 --single-branch https://github.com/pothosware/SoapySDR.git + cd SoapySDR + #git checkout tags/release_003_010_001_001 + mkdir -p build + cd build + $CMAKE ../ + echo "Compiling SoapySDR" + make -j`nproc` + $SUDO make install + $SUDO ldconfig + cd /tmp + echo "Downloading SoapyRemote" + rm -rf /tmp/SoapyRemote + git clone -b soapy-remote-0.5.0 --single-branch https://github.com/pothosware/SoapyRemote.git + cd SoapyRemote + #git checkout tags/release_003_010_001_001 + mkdir -p build + cd build + $CMAKE ../ + echo "Compiling SoapyRemote" + make -j`nproc` + $SUDO make install + $SUDO ldconfig + ) >& $soapy_install_log +} + +install_soapy_iris_from_source(){ + iris_install_log=$OPENAIR_DIR/cmake_targets/log/iris_install_log.txt + echo_info "\nInstalling Iris driver from source. The log file for Iris driver installation is here: $iris_install_log " + ( + cd /tmp + echo "Downloading SoapyIris" + rm -rf /tmp/sklk-soapyiris + git clone -b soapy-iris-2018.08.0.1 --single-branch https://github.com/skylarkwireless/sklk-soapyiris.git + cd sklk-soapyiris + mkdir -p build + cd build + $CMAKE ../ + echo "Compiling SoapyIris" + make -j`nproc` + $SUDO make install + $SUDO ldconfig + ) >& $iris_install_log +} + +check_install_soapy () { + #if [[ "$OS_DISTRO" == "ubuntu" ]]; then + #first we remove old installation + $SUDO apt-get remove -y soapysdr soapysdr-server libsoapysdr-dev python-soapysdr python3-soapysdr soapysdr-module-remote || true + #$SUDO add-apt-repository -y ppa:myriadrf/drivers + #$SUDO apt-get update + #$SUDO apt-get install -y soapysdr soapysdr-server libsoapysdr-dev python-soapysdr python3-soapysdr soapysdr-module-remote + + #elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then + # $SUDO $INSTALLER -y install software-properties-common python3-software-properties python-software-properties subversion git python3 python-numpy python3-numpy cmake swig python-dev + install_soapy_from_source + #fi + install_soapy_iris_from_source +} + +check_install_additional_tools (){ + $SUDO $INSTALLER update -y + local optional_packages="" + if [[ "$OS_BASEDISTRO" == "debian" ]]; then + case "$(get_distribution_release)" in + "ubuntu20.04" | "ubuntu22.04" | "debian11" ) + optional_packages="python3 python3-pip python3-dev python3-scipy python3-matplotlib python3-pyroute2 universal-ctags" + ;; + esac + PACKAGE_LIST="\ + doxygen \ + libgnutls28-dev \ + libpthread-stubs0-dev \ + tshark \ + uml-utilities \ + iperf3 \ + libforms-bin \ + libforms-dev \ + libxft-dev \ + xmlstarlet" + elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]] || [[ "$OS_DISTRO" == "rocky" ]] || [[ "$OS_DISTRO" == "fedora" ]]; then + PACKAGE_LIST="\ + doxygen \ + ctags \ + iperf3 \ + gnutls-devel \ + libXft-devel \ + xforms \ + xforms-devel \ + xmlstarlet" + fi + $SUDO $INSTALLER install -y $PACKAGE_LIST $optional_packages +} + +check_install_oai_software() { + local specific_packages="" + if ! check_supported_distribution; then + echo_error "Your distribution $(get_distribution_release) is not supported by oai !" + exit 1 + fi + $SUDO $INSTALLER update -y + if [[ "$OS_BASEDISTRO" == "debian" ]]; then + $SUDO apt install -y software-properties-common + case "$(get_distribution_release)" in + "debian11") + specific_packages="libz-dev" + ;; + esac + $SUDO apt-get install -y \ + $specific_packages \ + automake \ + build-essential \ + $CMAKE \ + ninja-build \ + pkg-config \ + git \ + libblas-dev \ + liblapack-dev \ + liblapacke-dev \ + libreadline-dev \ + libconfig-dev \ + libsctp-dev \ + libssl-dev \ + libtool \ + patch \ + openssl \ + zlib1g-dev \ + xxd \ + libyaml-cpp-dev + + elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then + if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then + if rpm -q epel-release > /dev/null; then + echo "EPEL repos already present. Good." + else + echo "EPEL repos not present. Installing them." + $SUDO $INSTALLER install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm + fi + fi + + $SUDO $INSTALLER install -y \ + automake \ + $CMAKE \ + gcc \ + gcc-c++ \ + git \ + pkgconfig \ + libconfig-devel \ + lksctp-tools \ + lksctp-tools-devel \ + libtool \ + ninja-build \ + make \ + openssl-devel \ + patch \ + readline-devel \ + lapack \ + lapack-devel \ + blas \ + blas-devel \ + vim-common \ + zlib-devel \ + yaml-cpp-devel + fi + + install_asn1c_from_source $1 + install_simde_from_source $1 +} + +install_asn1c_from_source(){ + mkdir -p $OPENAIR_DIR/cmake_targets/log + asn1_install_log=$OPENAIR_DIR/cmake_targets/log/asn1c_install_log.txt + echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_log " + ( + $SUDO $INSTALLER -y install bison flex + $SUDO rm -rf /tmp/asn1c + # GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c + git clone https://github.com/mouse07410/asn1c /tmp/asn1c + cd /tmp/asn1c + #git checkout vlm_master + # hotfix: current vlm_master (5fa129cf3161da9ff2d67341e6277e818c0f5d6a) + # breaks F1, NG, so use the one before. + git checkout 940dd5fa9f3917913fd487b13dfddfacd0ded06e + # Showing which version is used + git log -n1 + autoreconf -iv + ./configure --prefix /opt/asn1c/ + make -j`nproc` + $SUDO make install + cd - + $SUDO ldconfig + if [[ -v CI_ENV ]]; then + $SUDO rm -rf /tmp/asn1c + fi + ) > $asn1_install_log 2>&1 +} + +install_simde_from_source(){ + echo_info "\nInstalling SIMDE from source without test cases (header files only)" + cd /tmp + $SUDO rm -rf /tmp/simde + git clone https://github.com/simd-everywhere/simde-no-tests.git /tmp/simde + cd /tmp/simde + # we can specify a given version of SIMDE (sha-one or tag) + if [[ -v SIMDE_VERSION ]]; then + git checkout -f $SIMDE_VERSION + else + # At time of writing, last working commit for OAI: c7f26b7 + git checkout c7f26b73ba8e874b95c2cec2b497826ad2188f68 + fi + # Showing which version is used + git log -n1 + # brute force copy into /usr/include + $SUDO \cp -rv ../simde /usr/include +} + +install_lttng() { + if [[ "$OS_DISTRO" != "ubuntu" ]]; then + echo_info "LTTng is supported only for ubuntu at the moment." + echo_info $distribution + return + fi + + set +e + $SUDO apt-add-repository ppa:lttng/stable-2.13 -y && apt-get update + $SUDO apt-get install -y lttng-tools lttng-modules-dkms liblttng-ust-dev + if [[ $? > 0 ]]; then + echo "Failed to install LTTng using apt. Installing from source" + install_lttng_deps + install_lttng_from_source + fi + set -e +} + +install_lttng_deps() { + echo "installing dependencies of LTTng" + $SUDO apt-get install uuid-dev libxml2-dev -y +} + +install_lttng_from_source() { + echo "installing LTTng from source" + install_popt_1_18_from_source + install_userspace_rcu + install_lttng_ust_2_13_from_source + install_lttng_tools_2_13_from_source +} + +install_popt_1_18_from_source() { + $SUDO $INSTALLER -y install wget + echo_info "\nInstalling popt_1_18." + cd $(mktemp -d) && + wget http://ftp.rpm.org/popt/releases/popt-1.x/popt-1.18.tar.gz + tar -xf popt-1.18.tar.gz && cd popt-1.18 + ./configure && make -j16 && $SUDO make install +} + +install_userspace_rcu() { + echo_info "\nInstalling U-RCU from source." + cd /tmp + $SUDO rm -rf /tmp/urcu + git clone https://github.com/urcu/userspace-rcu.git /tmp/urcu + cd /tmp/urcu + git checkout stable-0.12 + ./bootstrap && ./configure && make + $SUDO make install + $SUDO ldconfig +} + + +install_lttng_modules_2_13_from_source() { + $SUDO $INSTALLER -y install wget + echo_info "\nInstalling LTTng Modules." + cd $(mktemp -d) && + wget https://lttng.org/files/lttng-modules/lttng-modules-latest-2.13.tar.bz2 && + tar -xf lttng-modules-latest-2.13.tar.bz2 && + cd lttng-modules-2.13.* && + make && + $SUDO make modules_install && + $SUDO depmod -a +} + +install_lttng_ust_2_13_from_source() { + $SUDO $INSTALLER -y install wget + echo_info "\nInstalling LTTng UST." + cd $(mktemp -d) && + wget https://lttng.org/files/lttng-ust/lttng-ust-latest-2.13.tar.bz2 && + tar -xf lttng-ust-latest-2.13.tar.bz2 && + cd lttng-ust-2.13.* && + ./configure --disable-numa && + make && + $SUDO make install && + $SUDO ldconfig +} + +install_lttng_tools_2_13_from_source() { + $SUDO $INSTALLER -y install wget + echo_info "\nInstalling LTTng Tools." + cd $(mktemp -d) && + wget https://lttng.org/files/lttng-tools/lttng-tools-latest-2.13.tar.bz2 && + tar -xf lttng-tools-latest-2.13.tar.bz2 && + cd lttng-tools-2.13.* && + ./configure && + make && + $SUDO make install && + $SUDO ldconfig +} + +################################################# +# 2. compile +################################################ + +install_nas_tools() { + echo_success "generate .ue_emm.nvram .ue.nvram" + ./nvram --gen -c $1 -o $2 > "$3" + echo_success "generate .usim.nvram" + ./usim --gen -c $1 -o $2 >> "$3" +} + + +################################ +# set_openair_env +############################### +set_openair_env(){ + fullpath=`readlink -f $BASH_SOURCE` + [ -f "/.$fullpath" ] || fullpath=`readlink -f $PWD/$fullpath` + openair_path=${fullpath%/cmake_targets/*} + openair_path=${openair_path%/targets/*} + openair_path=${openair_path%/openair[123]/*} + export OPENAIR_DIR=$openair_path + export OPENAIR1_DIR=$openair_path/openair1 + export OPENAIR2_DIR=$openair_path/openair2 + export OPENAIR3_DIR=$openair_path/openair3 + export OPENAIR_TARGETS=$openair_path/targets +} + +################################ +# Function to killall the subprocesses when Ctrl-C Key is hit +############################### +function handle_ctrl_c(){ +CURPID=$$ +ppid=$$ +arraycounter=1 +echo_info "** Trapped CTRL-C. Killing all subprocesses now..." +echo_info "** Calling sync now..." +sync +while true +do + FORLOOP=FALSE + # Get all the child process id + for i in `ps -ef| awk '$3 == '$ppid' { print $2 }'` + do + if [ $i -ne $CURPID ] ; then + procid[$arraycounter]=$i + arraycounter=`expr $arraycounter + 1` + ppid=$i + FORLOOP=TRUE + fi + done + if [ "$FORLOOP" = "FALSE" ] ; then + arraycounter=`expr $arraycounter - 1` + ## We want to kill child process id first and then parent id's + while [ $arraycounter -ne 0 ] + do + echo "first we send ctrl-c to program" + $SUDO kill -INT "${procid[$arraycounter]}" + sleep 5 + echo "Now we force kill if that didn't work" + $SUDO kill -9 "${procid[$arraycounter]}" >/dev/null + arraycounter=`expr $arraycounter - 1` + done + exit + fi +done +} diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c.patch b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c.patch new file mode 100644 index 0000000..66013cb --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c.patch @@ -0,0 +1,12 @@ +diff --git a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c +index c9620e871f..7ebb8db55e 100644 +--- a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c ++++ b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c +@@ -437,6 +437,7 @@ static const char* kpm_meas_gnb[] = { + "DRB.UEThpUl", + "RRU.PrbTotDl", + "RRU.PrbTotUl", ++ "RSRP", + NULL, + }; + diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.previous.c b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.previous.c new file mode 100644 index 0000000..c9620e8 --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.previous.c @@ -0,0 +1,545 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "ran_func_kpm.h" +#include "ran_func_kpm_subs.h" +#include "ran_e2sm_ue_id.h" + +#include "common/utils/ds/byte_array.h" +#include "openair2/E1AP/e1ap_common.h" +#include "openair2/E2AP/flexric/src/util/time_now_us.h" +#include "openair2/F1AP/f1ap_ids.h" + +static pthread_once_t once_kpm_mutex = PTHREAD_ONCE_INIT; + +static void init_once_kpm(void) +{ + init_kpm_subs_data(); +} + +static ngran_node_t get_e2_node_type(void) +{ + ngran_node_t node_type = 0; + +#if defined(NGRAN_GNB_DU) && defined(NGRAN_GNB_CUUP) && defined(NGRAN_GNB_CUCP) + node_type = RC.nrrrc[0]->node_type; +#elif defined (NGRAN_GNB_CUUP) + node_type = ngran_gNB_CUUP; +#endif + + return node_type; +} + +typedef struct { + size_t sz; + ue_id_e2sm_t* ue_id; + + // Optional + // only used to retreive MAC/RLC stats + NR_UE_info_t** ue_info_list; +}arr_ue_id_t; + +static meas_data_lst_t fill_kpm_meas_data_item(const meas_info_format_1_lst_t* meas_info_lst, const size_t len, const uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_data_lst_t data_item = {0}; + + // Measurement Record + data_item.meas_record_len = len; // record data list length corresponds to info list length from action definition + + data_item.meas_record_lst = calloc(len, sizeof(meas_record_lst_t)); + assert(data_item.meas_record_lst != NULL && "Memory exhausted"); + + for (size_t i = 0; i < len; i++) { + // Measurement Type as requested in Action Definition + assert(meas_info_lst[i].meas_type.type == NAME_MEAS_TYPE && "Only NAME supported"); + + char* meas_info_name_str = cp_ba_to_str(meas_info_lst[i].meas_type.name); + + data_item.meas_record_lst[i] = get_kpm_meas_value(meas_info_name_str, gran_period_ms, ue_info, ue_idx); + + free(meas_info_name_str); + } + + return data_item; +} + +static kpm_ind_msg_format_1_t fill_kpm_ind_msg_frm_1(cudu_ue_info_pair_t ue_info, const size_t ue_idx, const kpm_act_def_format_1_t* act_def_fr_1) +{ + kpm_ind_msg_format_1_t msg_frm_1 = {0}; + + // Measurement Data contains a set of Meas Records, each collected at each granularity period + msg_frm_1.meas_data_lst_len = 1; /* this value is equal to (kpm_ric_event_trigger_format_1.report_period_ms/act_def_fr_1->gran_period_ms) + please, check their values in xApp */ + + msg_frm_1.meas_data_lst = calloc(msg_frm_1.meas_data_lst_len, sizeof(*msg_frm_1.meas_data_lst)); + assert(msg_frm_1.meas_data_lst != NULL && "Memory exhausted" ); + + msg_frm_1.meas_data_lst[0] = fill_kpm_meas_data_item(act_def_fr_1->meas_info_lst, + act_def_fr_1->meas_info_lst_len, + act_def_fr_1->gran_period_ms, + ue_info, + ue_idx); + + // Measurement Information - OPTIONAL + msg_frm_1.meas_info_lst_len = act_def_fr_1->meas_info_lst_len; + msg_frm_1.meas_info_lst = calloc(msg_frm_1.meas_info_lst_len, sizeof(meas_info_format_1_lst_t)); + assert(msg_frm_1.meas_info_lst != NULL && "Memory exhausted"); + for (size_t i = 0; i < msg_frm_1.meas_info_lst_len; i++) { + msg_frm_1.meas_info_lst[i] = cp_meas_info_format_1_lst(&act_def_fr_1->meas_info_lst[i]); + } + + return msg_frm_1; +} + +static cudu_ue_info_pair_t fill_ue_related_info(arr_ue_id_t* arr_ue_id, const size_t ue_idx) +{ + cudu_ue_info_pair_t ue_info = {0}; + + if (arr_ue_id->ue_id[ue_idx].type == GNB_UE_ID_E2SM) { + ue_info.rrc_ue_id = *arr_ue_id->ue_id[ue_idx].gnb.ran_ue_id; // rrc_ue_id + ue_info.ue = arr_ue_id->ue_info_list[ue_idx]; + } else if (arr_ue_id->ue_id[ue_idx].type == GNB_CU_UP_UE_ID_E2SM) { + /* in OAI implementation, CU-UP ue id = CU-CP ue id + => CU-UP ue id = rrc_ue_id, but it should not be the case by the spec */ + ue_info.rrc_ue_id = *arr_ue_id->ue_id[ue_idx].gnb_cu_up.ran_ue_id; // cucp_ue_id = rrc_ue_id + } else if (arr_ue_id->ue_id[ue_idx].type == GNB_DU_UE_ID_E2SM) { + ue_info.rrc_ue_id = *arr_ue_id->ue_id[ue_idx].gnb_du.ran_ue_id; // rrc_ue_id + ue_info.ue = arr_ue_id->ue_info_list[ue_idx]; + } + + return ue_info; +} + +static kpm_ind_msg_format_3_t fill_kpm_ind_msg_frm_3(arr_ue_id_t* arr_ue_id, const kpm_act_def_format_1_t* act_def_fr_1) +{ + assert(act_def_fr_1 != NULL); + + kpm_ind_msg_format_3_t msg_frm_3 = {0}; + + // Fill UE Measurement Reports + msg_frm_3.ue_meas_report_lst_len = arr_ue_id->sz; + msg_frm_3.meas_report_per_ue = calloc(msg_frm_3.ue_meas_report_lst_len, sizeof(meas_report_per_ue_t)); + assert(msg_frm_3.meas_report_per_ue != NULL && "Memory exhausted"); + + for (size_t i = 0; iue_id[i]); + + // Fill UE related info + cudu_ue_info_pair_t ue_info = fill_ue_related_info(arr_ue_id, i); + + // Fill UE measurements + msg_frm_3.meas_report_per_ue[i].ind_msg_format_1 = fill_kpm_ind_msg_frm_1(ue_info, i, act_def_fr_1); + } + + return msg_frm_3; +} + +static void capture_sst_sd(test_cond_value_t* test_cond_value, uint8_t *sst, uint32_t **sd) +{ + DevAssert(sst != NULL); + DevAssert(sd != NULL); + + // S-NSSAI is an OCTET_STRING, as defined by spec + switch (test_cond_value->type) { + case OCTET_STRING_TEST_COND_VALUE: { + if (test_cond_value->octet_string_value->len == 1) { + *sst = test_cond_value->octet_string_value->buf[0]; + *sd = NULL; + } else { + DevAssert(test_cond_value->octet_string_value->len == 4); + uint8_t *buf = test_cond_value->octet_string_value->buf; + *sst = buf[0]; + *sd = malloc(**sd); + **sd = buf[1] << 16 | buf[2] << 8 | buf[3]; + } + break; + } + default: + AssertFatal(false, "test condition value %d impossible\n", test_cond_value->type); + } +} + +static bool nssai_matches(nssai_t a_nssai, uint8_t b_sst, const uint32_t *b_sd) +{ + if (b_sd == NULL) { + return a_nssai.sst == b_sst && a_nssai.sd == 0xffffff; + } else { + AssertFatal(*b_sd <= 0xffffff, "illegal SD %d\n", *b_sd); + return a_nssai.sst == b_sst && a_nssai.sd == *b_sd; + } +} + +static arr_ue_id_t filter_ues_by_s_nssai_in_cu(const test_info_lst_t test_info) +{ + assert(test_info.S_NSSAI == TRUE_TEST_COND_TYPE && "Must be true"); + assert(test_info.test_cond != NULL && "Must be filled, even though it's optional by the specification"); + assert(*test_info.test_cond == EQUAL_TEST_COND && "Currently support EQUAL test condition"); + assert(test_info.test_cond_value != NULL && "Must be filled, even though it's optional by the specification"); + + uint8_t sst = 0; + uint32_t *sd = NULL; + capture_sst_sd(test_info.test_cond_value, &sst, &sd); + + arr_ue_id_t arr_ue_id = {.sz = 0}; + arr_ue_id.ue_id = calloc(MAX_MOBILES_PER_GNB, sizeof(ue_id_e2sm_t)); + assert(arr_ue_id.ue_id != NULL); + + struct rrc_gNB_ue_context_s* rrc_ue_context = NULL; + RB_FOREACH(rrc_ue_context, rrc_nr_ue_tree_s, &RC.nrrrc[0]->rrc_ue_head) { + gNB_RRC_UE_t *ue = &rrc_ue_context->ue_context; + for (int p = 0; p < ue->nb_of_pdusessions; ++p) { + pdusession_t *pdu = &ue->pduSession[p].param; + if (nssai_matches(pdu->nssai, sst, sd)) { + arr_ue_id.ue_id[arr_ue_id.sz] = fill_ue_id_data[ngran_gNB_CU](ue, 0, 0); + + arr_ue_id.sz++; + break; + } + } + AssertFatal(arr_ue_id.sz < MAX_MOBILES_PER_GNB, "cannot have more UEs than global UE number maximum\n"); + } + + free(sd); // if NULL, nothing happens + + return arr_ue_id; +} + +static arr_ue_id_t filter_ues_by_s_nssai_in_cuup(const test_info_lst_t test_info) +{ + assert(test_info.S_NSSAI == TRUE_TEST_COND_TYPE && "Must be true"); + assert(test_info.test_cond != NULL && "Must be filled, even though it's optional by the specification"); + assert(*test_info.test_cond == EQUAL_TEST_COND && "Currently support EQUAL test condition"); + assert(test_info.test_cond_value != NULL && "Must be filled, even though it's optional by the specification"); + + uint8_t sst = 0; + uint32_t *sd = NULL; + capture_sst_sd(test_info.test_cond_value, &sst, &sd); + + arr_ue_id_t arr_ue_id = {.sz = 0}; + arr_ue_id.ue_id = calloc(MAX_MOBILES_PER_GNB, sizeof(ue_id_e2sm_t)); + assert(arr_ue_id.ue_id != NULL); + + // Get NSSAI info from E1 context + const instance_t e1_inst = 0; + const e1ap_upcp_inst_t *e1inst = getCxtE1(e1_inst); + + // currently the CU-UP does not store the slices, so we can only do this "coarse filtering" + for(int s = 0; s < e1inst->cuup.setupReq.plmn[0].supported_slices; s++) { + if (nssai_matches(e1inst->cuup.setupReq.plmn[0].slice[s], sst, sd)) { + ue_id_t *pdcp_ue_id_list = calloc(MAX_MOBILES_PER_GNB, sizeof(ue_id_t)); + assert(pdcp_ue_id_list != NULL); + + arr_ue_id.sz = nr_pdcp_get_num_ues(pdcp_ue_id_list, MAX_MOBILES_PER_GNB); + for (size_t i = 0; i < arr_ue_id.sz; i++) { + arr_ue_id.ue_id[i] = fill_ue_id_data[ngran_gNB_CUUP](NULL, 0, pdcp_ue_id_list[i]); + } + free(pdcp_ue_id_list); + } + } + + free(sd); // if NULL, nothing happens + + return arr_ue_id; +} + +static arr_ue_id_t filter_ues_by_s_nssai_in_du_or_monolithic(const test_info_lst_t test_info) +{ + assert(test_info.S_NSSAI == TRUE_TEST_COND_TYPE && "Must be true"); + assert(test_info.test_cond != NULL && "Must be filled, even though it's optional by the specification"); + assert(*test_info.test_cond == EQUAL_TEST_COND && "Currently support EQUAL test condition"); + assert(test_info.test_cond_value != NULL && "Must be filled, even though it's optional by the specification"); + + uint8_t sst = 0; + uint32_t *sd = NULL; + capture_sst_sd(test_info.test_cond_value, &sst, &sd); + + arr_ue_id_t arr_ue_id = {.sz = 0}; + arr_ue_id.ue_id = calloc(MAX_MOBILES_PER_GNB, sizeof(ue_id_e2sm_t)); + assert(arr_ue_id.ue_id != NULL); + + arr_ue_id.ue_info_list = calloc(MAX_MOBILES_PER_GNB, sizeof(*arr_ue_id.ue_info_list)); + assert(arr_ue_id.ue_info_list != NULL); + + const ngran_node_t node_type = get_e2_node_type(); + + // Take MAC info + UE_iterator (RC.nrmac[0]->UE_info.list, ue) { + NR_UE_sched_ctrl_t *sched_ctrl = &ue->UE_sched_ctrl; + // UE matches if any of its DRBs matches + for (size_t l = 0; l < seq_arr_size(&sched_ctrl->lc_config); ++l) { + const nr_lc_config_t *c = seq_arr_at(&sched_ctrl->lc_config, l); + if (nssai_matches(c->nssai, sst, sd)) { + if (node_type == ngran_gNB_DU) { + f1_ue_data_t rrc_ue_id = du_get_f1_ue_data(ue->rnti); // gNB CU UE ID = rrc_ue_id + arr_ue_id.ue_id[arr_ue_id.sz] = fill_ue_id_data[ngran_gNB_DU](NULL, rrc_ue_id.secondary_ue, 0); + } else { + rrc_gNB_ue_context_t* rrc_ue_context = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], -1, ue->rnti); + arr_ue_id.ue_id[arr_ue_id.sz] = fill_ue_id_data[ngran_gNB](&rrc_ue_context->ue_context, 0, 0); + } + + // store NR_UE_info_t + arr_ue_id.ue_info_list[arr_ue_id.sz] = ue; + + arr_ue_id.sz++; + break; + } + } + AssertFatal(arr_ue_id.sz < MAX_MOBILES_PER_GNB, "cannot have more UEs than global UE number maximum\n"); + } + + free(sd); // if NULL, nothing happens + + return arr_ue_id; +} + +typedef arr_ue_id_t (*ue_type_matcher)(const test_info_lst_t test_info); + +static ue_type_matcher match_s_nssai_test_cond_type[END_NGRAN_NODE_TYPE] = +{ + NULL, + NULL, + filter_ues_by_s_nssai_in_du_or_monolithic, + NULL, + NULL, + filter_ues_by_s_nssai_in_cu, + NULL, + filter_ues_by_s_nssai_in_du_or_monolithic, + NULL, + NULL, // for CU-CP we don't use this + filter_ues_by_s_nssai_in_cuup, +}; + +typedef ue_type_matcher (*filter_ues)[END_NGRAN_NODE_TYPE]; + +static filter_ues match_cond_arr[END_TEST_COND_TYPE_KPM_V2_01] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + &match_s_nssai_test_cond_type, +}; + + +static kpm_ric_ind_hdr_format_1_t kpm_ind_hdr_frm_1(void) +{ + kpm_ric_ind_hdr_format_1_t hdr_frm_1 = {0}; + + int64_t const t = time_now_us(); +#if defined KPM_V2_03 + hdr_frm_1.collectStartTime = t/1000000; // seconds +#elif defined KPM_V3_00 + hdr_frm_1.collectStartTime = t; // microseconds +#else + static_assert(0!=0, "Undefined KPM SM Version"); +#endif + + hdr_frm_1.fileformat_version = NULL; + + // Check E2 Node NG-RAN Type + const ngran_node_t node_type = get_e2_node_type(); + const char* sender_name = get_ngran_name(node_type); + hdr_frm_1.sender_name = calloc(1, sizeof(byte_array_t)); + *hdr_frm_1.sender_name = cp_str_to_ba(sender_name); + + return hdr_frm_1; +} + +kpm_ind_hdr_t kpm_ind_hdr(void) +{ + kpm_ind_hdr_t hdr = {0}; + + hdr.type = FORMAT_1_INDICATION_HEADER; + hdr.kpm_ric_ind_hdr_format_1 = kpm_ind_hdr_frm_1(); + + return hdr; +} + +bool read_kpm_sm(void* data) +{ + assert(data != NULL); + // assert(data->type == KPM_STATS_V3_0); + + kpm_rd_ind_data_t* const kpm = (kpm_rd_ind_data_t*)data; + + assert(kpm->act_def != NULL && "Cannot be NULL"); + + // 7.8 Supported RIC Styles and E2SM IE Formats + // Action Definition Format 4 corresponds to Indication Message Format 3 + switch (kpm->act_def->type) { + case FORMAT_4_ACTION_DEFINITION: { + kpm->ind.hdr = kpm_ind_hdr(); + + kpm->ind.msg.type = FORMAT_3_INDICATION_MESSAGE; + // Filter the UE by the test condition criteria + kpm_act_def_format_4_t const* frm_4 = &kpm->act_def->frm_4; // 8.2.1.2.4 + for (size_t i = 0; i < frm_4->matching_cond_lst_len; i++) { + const test_info_lst_t test_info = frm_4->matching_cond_lst[i].test_info_lst; + const ngran_node_t node_type = get_e2_node_type(); + + /* Based on the node type (gNB-mono, CU, DU,...) and matching condition (S-NSSAI, DL RSRP, GBR,...) + get array of E2SM UE IDs with optionally their MAC info */ + ue_type_matcher fp_match_cond_type = (*match_cond_arr[test_info.test_cond_type])[node_type]; + arr_ue_id_t arr_ue_id = fp_match_cond_type(test_info); + + if (arr_ue_id.sz == 0) return false; + kpm->ind.msg.frm_3 = fill_kpm_ind_msg_frm_3(&arr_ue_id, &frm_4->action_def_format_1); + } + break; + } + + default: { + AssertFatal(kpm->act_def->type == FORMAT_4_ACTION_DEFINITION, "Action Definition Format %d not yet implemented", kpm->act_def->type); + } + } + + return true; +} + +static const char* kpm_meas_du[] = { + "DRB.RlcSduDelayDl", + "DRB.UEThpDl", + "DRB.UEThpUl", + "RRU.PrbTotDl", + "RRU.PrbTotUl", + NULL, +}; + +static const char* kpm_meas_gnb[] = { + "DRB.PdcpSduVolumeDL", + "DRB.PdcpSduVolumeUL", + "DRB.RlcSduDelayDl", + "DRB.UEThpDl", + "DRB.UEThpUl", + "RRU.PrbTotDl", + "RRU.PrbTotUl", + NULL, +}; + +static const char* kpm_meas_cuup[] = { + "DRB.PdcpSduVolumeDL", + "DRB.PdcpSduVolumeUL", + NULL, +}; + +typedef const char** meas_list; + +static const meas_list ran_def_kpm[END_NGRAN_NODE_TYPE] = { + NULL, + NULL, + kpm_meas_gnb, + NULL, + NULL, + kpm_meas_cuup, // at the moment, for CU, we use the same function as for CU-UP + NULL, + kpm_meas_du, + NULL, + NULL, // at the moment, no measurement is implemented in CU-CP + kpm_meas_cuup, +}; + +void read_kpm_setup_sm(void* e2ap) +{ + assert(e2ap != NULL); +// assert(e2ap->type == KPM_V3_0_AGENT_IF_E2_SETUP_ANS_V0); + + kpm_e2_setup_t* kpm = (kpm_e2_setup_t*)(e2ap); + + /* Fill the RAN Function Definition with currently supported measurements */ + + // RAN Function Name is already filled in fill_ran_function_name() in kpm_sm_agent.c + + // Fill supported measurements depending on the E2 node + // [1, 65535] + // 3GPP TS 28.552 + const ngran_node_t node_type = get_e2_node_type(); + const char** kpm_meas = ran_def_kpm[node_type]; + if (kpm_meas == NULL) return; // e.g. CU-CP node, doesn't support any measurements + size_t sz = 0; + while (kpm_meas[sz] != NULL) { + sz++; + } + + // Sequence of Report styles + const size_t sz_report = 1; + kpm->ran_func_def.sz_ric_report_style_list = sz_report; + kpm->ran_func_def.ric_report_style_list = calloc(sz_report, sizeof(ric_report_style_item_t)); + assert(kpm->ran_func_def.ric_report_style_list != NULL && "Memory exhausted"); + + ric_report_style_item_t* report_item = &kpm->ran_func_def.ric_report_style_list[0]; + + report_item->report_style_type = STYLE_4_RIC_SERVICE_REPORT; + const char report_style_name[] = "Common Condition-based, UE-level Measurement"; + report_item->report_style_name = cp_str_to_ba(report_style_name); + report_item->act_def_format_type = FORMAT_4_ACTION_DEFINITION; + + report_item->meas_info_for_action_lst_len = sz; + report_item->meas_info_for_action_lst = calloc(sz, sizeof(meas_info_for_action_lst_t)); + assert(report_item->meas_info_for_action_lst != NULL && "Memory exhausted"); + + for(size_t i = 0; i < sz; i++) { + meas_info_for_action_lst_t* meas_item = &report_item->meas_info_for_action_lst[i]; + // 8.3.9 + meas_item->name = cp_str_to_ba(kpm_meas[i]); + + // 8.3.10 - OPTIONAL + meas_item->id = NULL; + + // 8.3.26 - OPTIONAL + meas_item->bin_range_def = NULL; + } + + // Sequence of Event Trigger styles + const size_t sz_ev_tr = 1; + kpm->ran_func_def.sz_ric_event_trigger_style_list = sz_ev_tr; + kpm->ran_func_def.ric_event_trigger_style_list = calloc(sz_ev_tr, sizeof(ric_event_trigger_style_item_t)); + assert(kpm->ran_func_def.ric_event_trigger_style_list != NULL && "Memory exhausted"); + + ric_event_trigger_style_item_t* ev_tr_item = &kpm->ran_func_def.ric_event_trigger_style_list[0]; + + ev_tr_item->style_type = STYLE_1_RIC_EVENT_TRIGGER; + const char ev_style_name[] = "Periodic Report"; + ev_tr_item->style_name = cp_str_to_ba(ev_style_name); + ev_tr_item->format_type = FORMAT_1_RIC_EVENT_TRIGGER; + + // Supported RIC Indication Formats + report_item->ind_hdr_format_type = FORMAT_1_INDICATION_HEADER; // 8.3.5 + report_item->ind_msg_format_type = FORMAT_3_INDICATION_MESSAGE; // 8.3.5 + + // E2 Setup Request is sent periodically until the connection is established + // RC subscritpion data should be initialized only once + const int ret = pthread_once(&once_kpm_mutex, init_once_kpm); + DevAssert(ret == 0); +} + +sm_ag_if_ans_t write_ctrl_kpm_sm(void const* src) +{ + printf("write_ctrl callback for KPM SM: operation not supported\n"); + (void)src; + sm_ag_if_ans_t ans = {0}; + return ans; +} diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c.patch b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c.patch new file mode 100644 index 0000000..408b10a --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c.patch @@ -0,0 +1,31 @@ +diff --git a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c +index 80579e1754..93718e7e7b 100644 +--- a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c ++++ b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c +@@ -82,6 +82,18 @@ static meas_record_lst_t fill_DRB_PdcpSduVolumeUL(__attribute__((unused))uint32_ + return meas_record; + } + ++// Added metric for research purposes only ++static meas_record_lst_t fill_RSRP(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) ++{ ++ meas_record_lst_t meas_record = {0}; ++ ++ meas_record.value = REAL_MEAS_VALUE; ++ ++ // Calculate the average value of RSRP ++ meas_record.real_val = ue_info.ue->mac_stats.prev_num_rsrp_meas > 0 ? (double)ue_info.ue->mac_stats.prev_cumul_rsrp / ue_info.ue->mac_stats.prev_num_rsrp_meas : 0.0; // [dBm] ++ return meas_record; ++} ++ + #if defined (NGRAN_GNB_DU) + static uldlcounter_t last_rlc_pdu_total_bytes[MAX_MOBILES_PER_GNB] = {0}; + static uldlcounter_t last_total_prbs[MAX_MOBILES_PER_GNB] = {0}; +@@ -194,6 +206,7 @@ static meas_record_lst_t fill_RRU_PrbTotUl(__attribute__((unused))uint32_t gran_ + static kv_measure_t lst_measure[] = { + {.key = "DRB.PdcpSduVolumeDL", .value = fill_DRB_PdcpSduVolumeDL }, + {.key = "DRB.PdcpSduVolumeUL", .value = fill_DRB_PdcpSduVolumeUL }, ++ {.key = "RSRP", .value = fill_RSRP }, + #if defined (NGRAN_GNB_DU) + {.key = "DRB.RlcSduDelayDl", .value = fill_DRB_RlcSduDelayDl }, + {.key = "DRB.UEThpDl", .value = fill_DRB_UEThpDl }, diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.previous.c b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.previous.c new file mode 100644 index 0000000..80579e1 --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.previous.c @@ -0,0 +1,232 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "ran_func_kpm_subs.h" + +#include + +/* measurements that need to store values from previous reporting period have a limitation + when it comes to multiple subscriptions to the same UEs; ric_req_id is unique per subscription */ +typedef struct uldlcounter { + uint32_t dl; + uint32_t ul; +} uldlcounter_t; + +static uldlcounter_t last_pdcp_sdu_total_bytes[MAX_MOBILES_PER_GNB] = {0}; + +static nr_pdcp_statistics_t get_pdcp_stats_per_drb(const uint32_t rrc_ue_id, const int rb_id) +{ + nr_pdcp_statistics_t pdcp = {0}; + const int srb_flag = 0; + + // Get PDCP stats for specific DRB + const bool rc = nr_pdcp_get_statistics(rrc_ue_id, srb_flag, rb_id, &pdcp); + assert(rc == true && "Cannot get PDCP stats\n"); + + return pdcp; +} + +/* 3GPP TS 28.522 - section 5.1.2.1.1.1 + note: this measurement is calculated as per spec */ +static meas_record_lst_t fill_DRB_PdcpSduVolumeDL(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + // Get PDCP stats per DRB + const int rb_id = 1; // at the moment, only 1 DRB is supported + nr_pdcp_statistics_t pdcp = get_pdcp_stats_per_drb(ue_info.rrc_ue_id, rb_id); + + meas_record.value = INTEGER_MEAS_VALUE; + + // Get DL data volume delivered to PDCP layer + meas_record.int_val = (pdcp.rxsdu_bytes - last_pdcp_sdu_total_bytes[ue_idx].dl)*8/1000; // [kb] + last_pdcp_sdu_total_bytes[ue_idx].dl = pdcp.rxsdu_bytes; + + return meas_record; +} + +/* 3GPP TS 28.522 - section 5.1.2.1.2.1 + note: this measurement is calculated as per spec */ +static meas_record_lst_t fill_DRB_PdcpSduVolumeUL(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + // Get PDCP stats per DRB + const int rb_id = 1; // at the moment, only 1 DRB is supported + nr_pdcp_statistics_t pdcp = get_pdcp_stats_per_drb(ue_info.rrc_ue_id, rb_id); + + meas_record.value = INTEGER_MEAS_VALUE; + + // Get UL data volume delivered from PDCP layer + meas_record.int_val = (pdcp.txsdu_bytes - last_pdcp_sdu_total_bytes[ue_idx].ul)*8/1000; // [kb] + last_pdcp_sdu_total_bytes[ue_idx].ul = pdcp.txsdu_bytes; + + return meas_record; +} + +#if defined (NGRAN_GNB_DU) +static uldlcounter_t last_rlc_pdu_total_bytes[MAX_MOBILES_PER_GNB] = {0}; +static uldlcounter_t last_total_prbs[MAX_MOBILES_PER_GNB] = {0}; + +static nr_rlc_statistics_t get_rlc_stats_per_drb(const rnti_t rnti, const int rb_id) +{ + nr_rlc_statistics_t rlc = {0}; + const int srb_flag = 0; + + // Get RLC stats for specific DRB + const bool rc = nr_rlc_get_statistics(rnti, srb_flag, rb_id, &rlc); + assert(rc == true && "Cannot get RLC stats\n"); + + // Activate average sojourn time at the RLC buffer for specific DRB + nr_rlc_activate_avg_time_to_tx(rnti, rb_id+3, 1); + + return rlc; +} + +/* 3GPP TS 28.522 - section 5.1.3.3.3 + note: by default this measurement is calculated for previous 100ms (openair2/LAYER2/nr_rlc/nr_rlc_entity.c:118, 173, 213); please, update according to your needs */ +static meas_record_lst_t fill_DRB_RlcSduDelayDl(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, __attribute__((unused))const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + // Get RLC stats per DRB + const int rb_id = 1; // at the moment, only 1 DRB is supported + nr_rlc_statistics_t rlc = get_rlc_stats_per_drb(ue_info.ue->rnti, rb_id); + + meas_record.value = REAL_MEAS_VALUE; + + // Get the value of sojourn time at the RLC buffer + meas_record.real_val = rlc.txsdu_avg_time_to_tx; // [μs] + + return meas_record; +} + +/* 3GPP TS 28.522 - section 5.1.1.3.1 + note: per spec, average UE throughput in DL (taken into consideration values from all UEs, and averaged) + here calculated as: UE specific throughput in DL */ +static meas_record_lst_t fill_DRB_UEThpDl(uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + // Get RLC stats per DRB + const int rb_id = 1; // at the moment, only 1 DRB is supported + nr_rlc_statistics_t rlc = get_rlc_stats_per_drb(ue_info.ue->rnti, rb_id); + meas_record.value = REAL_MEAS_VALUE; + + // Calculate DL Thp + meas_record.real_val = (double)(rlc.txpdu_bytes - last_rlc_pdu_total_bytes[ue_idx].dl)*8/gran_period_ms; // [kbps] + last_rlc_pdu_total_bytes[ue_idx].dl = rlc.txpdu_bytes; + + return meas_record; +} + +/* 3GPP TS 28.522 - section 5.1.1.3.3 + note: per spec, average UE throughput in UL (taken into consideration values from all UEs, and averaged) + here calculated as: UE specific throughput in UL */ +static meas_record_lst_t fill_DRB_UEThpUl(uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + // Get RLC stats per DRB + const int rb_id = 1; // at the moment, only 1 DRB is supported + nr_rlc_statistics_t rlc = get_rlc_stats_per_drb(ue_info.ue->rnti, rb_id); + + meas_record.value = REAL_MEAS_VALUE; + + // Calculate UL Thp + meas_record.real_val = (double)(rlc.rxpdu_bytes - last_rlc_pdu_total_bytes[ue_idx].ul)*8/gran_period_ms; // [kbps] + last_rlc_pdu_total_bytes[ue_idx].ul = rlc.rxpdu_bytes; + + return meas_record; +} + +/* 3GPP TS 28.522 - section 5.1.1.2.1 + note: per spec, DL PRB usage [%] = (total used PRBs for DL traffic / total available PRBs for DL traffic) * 100 + here calculated as: aggregated DL PRBs (t) - aggregated DL PRBs (t-gran_period) */ +static meas_record_lst_t fill_RRU_PrbTotDl(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + meas_record.value = INTEGER_MEAS_VALUE; + + // Get the number of DL PRBs + meas_record.int_val = ue_info.ue->mac_stats.dl.total_rbs - last_total_prbs[ue_idx].dl; // [PRBs] + last_total_prbs[ue_idx].dl = ue_info.ue->mac_stats.dl.total_rbs; + + return meas_record; +} + +/* 3GPP TS 28.522 - section 5.1.1.2.2 + note: per spec, UL PRB usage [%] = (total used PRBs for UL traffic / total available PRBs for UL traffic) * 100 + here calculated as: aggregated UL PRBs (t) - aggregated UL PRBs (t-gran_period) */ +static meas_record_lst_t fill_RRU_PrbTotUl(__attribute__((unused))uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + meas_record_lst_t meas_record = {0}; + + meas_record.value = INTEGER_MEAS_VALUE; + + // Get the number of UL PRBs + meas_record.int_val = ue_info.ue->mac_stats.ul.total_rbs - last_total_prbs[ue_idx].ul; // [PRBs] + last_total_prbs[ue_idx].ul = ue_info.ue->mac_stats.ul.total_rbs; + + return meas_record; +} +#endif + +static kv_measure_t lst_measure[] = { + {.key = "DRB.PdcpSduVolumeDL", .value = fill_DRB_PdcpSduVolumeDL }, + {.key = "DRB.PdcpSduVolumeUL", .value = fill_DRB_PdcpSduVolumeUL }, +#if defined (NGRAN_GNB_DU) + {.key = "DRB.RlcSduDelayDl", .value = fill_DRB_RlcSduDelayDl }, + {.key = "DRB.UEThpDl", .value = fill_DRB_UEThpDl }, + {.key = "DRB.UEThpUl", .value = fill_DRB_UEThpUl }, + {.key = "RRU.PrbTotDl", .value = fill_RRU_PrbTotDl }, + {.key = "RRU.PrbTotUl", .value = fill_RRU_PrbTotUl }, +#endif +}; + +void init_kpm_subs_data(void) +{ + const size_t ht_len = sizeof(lst_measure) / sizeof(lst_measure[0]); + hcreate(ht_len); + + ENTRY kv_pair; + + for (size_t i = 0; i < ht_len; i++) { + kv_pair.key = lst_measure[i].key; + kv_pair.data = &lst_measure[i]; + hsearch(kv_pair, ENTER); + } +} + +meas_record_lst_t get_kpm_meas_value(char* kpm_meas_name, uint32_t gran_period_ms, cudu_ue_info_pair_t ue_info, const size_t ue_idx) +{ + assert(kpm_meas_name != NULL); + + ENTRY search_entry = {.key = kpm_meas_name}; + ENTRY *found_entry = hsearch(search_entry, FIND); + assert(found_entry != NULL && "Unsupported KPM measurement name"); + + kv_measure_t *kv_found = (kv_measure_t *)found_entry->data; + meas_record_lst_t meas_record = kv_found->value(gran_period_ms, ue_info, ue_idx); + + return meas_record; +} diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/LAYER2/NR_MAC_gNB/main.c.patch b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/LAYER2/NR_MAC_gNB/main.c.patch new file mode 100644 index 0000000..a9f1c41 --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/LAYER2/NR_MAC_gNB/main.c.patch @@ -0,0 +1,16 @@ +diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c +index a8fe8de79c..1f31f543e2 100644 +--- a/openair2/LAYER2/NR_MAC_gNB/main.c ++++ b/openair2/LAYER2/NR_MAC_gNB/main.c +@@ -134,6 +134,11 @@ size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset + } + + bool in_sync = !sched_ctrl->ul_failure; ++ ++ // Save the previous RSRP values so that querying them is synchronized with the gNB output: ++ stats->prev_num_rsrp_meas = stats->num_rsrp_meas; ++ stats->prev_cumul_rsrp = stats->cumul_rsrp; ++ + output += snprintf(output, + end - output, + " %s PH %d dB PCMAX %d dBm, average RSRP %d (%d meas)\n", diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/LAYER2/NR_MAC_gNB/main.previous.c b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/LAYER2/NR_MAC_gNB/main.previous.c new file mode 100644 index 0000000..a8fe8de --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/LAYER2/NR_MAC_gNB/main.previous.c @@ -0,0 +1,355 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file main.c + * \brief top init of Layer 2 + * \author Navid Nikaein and Raymond Knopp, WEI-TAI CHEN + * \date 2010 - 2014, 2018 + * \version 1.0 + * \company Eurecom, NTUST + * \email: navid.nikaein@eurecom.fr, kroempa@gmail.com + * @ingroup _mac + + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "NR_DRB-ToAddMod.h" +#include "NR_DRB-ToAddModList.h" +#include "NR_MAC_COMMON/nr_mac.h" +#include "NR_MAC_COMMON/nr_mac_common.h" +#include "NR_MAC_gNB/mac_proto.h" +#include "NR_MAC_gNB/mac_rrc_ul.h" +#include "NR_MAC_gNB/nr_mac_gNB.h" +#include "NR_PHY_INTERFACE/NR_IF_Module.h" +#include "NR_RLC-BearerConfig.h" +#include "NR_RadioBearerConfig.h" +#include "NR_ServingCellConfig.h" +#include "NR_ServingCellConfigCommon.h" +#include "NR_TAG.h" +#include "PHY/defs_common.h" +#include "RRC/NR/MESSAGES/asn1_msg.h" +#include "RRC/NR/nr_rrc_config.h" +#include "assertions.h" +#include "common/ngran_types.h" +#include "common/ran_context.h" +#include "common/utils/T/T.h" +#include "executables/softmodem-common.h" +#include "linear_alloc.h" +#include "nr_pdcp/nr_pdcp_entity.h" +#include "nr_pdcp/nr_pdcp_oai_api.h" +#include "nr_rlc/nr_rlc_oai_api.h" +#include "openair2/F1AP/f1ap_ids.h" +#include "rlc.h" +#include "seq_arr.h" +#include "system.h" +#include "time_meas.h" +#include "utils.h" + +#define MACSTATSSTRLEN 36256 + +void *nrmac_stats_thread(void *arg) { + + gNB_MAC_INST *gNB = (gNB_MAC_INST *)arg; + + char output[MACSTATSSTRLEN] = {0}; + const char *end = output + MACSTATSSTRLEN; + FILE *file = fopen("nrMAC_stats.log","w"); + AssertFatal(file!=NULL,"Cannot open nrMAC_stats.log, error %s\n",strerror(errno)); + + while (oai_exit == 0) { + char *p = output; + NR_SCHED_LOCK(&gNB->sched_lock); + p += dump_mac_stats(gNB, p, end - p, false); + NR_SCHED_UNLOCK(&gNB->sched_lock); + p += snprintf(p, end - p, "\n"); + p += print_meas_log(&gNB->eNB_scheduler, "DL & UL scheduling timing", NULL, NULL, p, end - p); + p += print_meas_log(&gNB->schedule_dlsch, "dlsch scheduler", NULL, NULL, p, end - p); + p += print_meas_log(&gNB->rlc_data_req, "rlc_data_req", NULL, NULL, p, end - p); + p += print_meas_log(&gNB->rlc_status_ind, "rlc_status_ind", NULL, NULL, p, end - p); + p += print_meas_log(&gNB->nr_srs_ri_computation_timer, "UL-RI computation time", NULL, NULL, p, end - p); + p += print_meas_log(&gNB->nr_srs_tpmi_computation_timer, "UL-TPMI computation time", NULL, NULL, p, end - p); + fwrite(output, p - output, 1, file); + fflush(file); + sleep(1); + fseek(file,0,SEEK_SET); + } + fclose(file); + return NULL; +} + +void clear_mac_stats(gNB_MAC_INST *gNB) { + UE_iterator(gNB->UE_info.list, UE) { + memset(&UE->mac_stats,0,sizeof(UE->mac_stats)); + } +} + +size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset_rsrp) +{ + const char *begin = output; + const char *end = output + strlen; + + /* this function is called from gNB_dlsch_ulsch_scheduler(), so assumes the + * scheduler to be locked*/ + NR_SCHED_ENSURE_LOCKED(&gNB->sched_lock); + + NR_SCHED_LOCK(&gNB->UE_info.mutex); + UE_iterator(gNB->UE_info.list, UE) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + NR_mac_stats_t *stats = &UE->mac_stats; + const int avg_rsrp = stats->num_rsrp_meas > 0 ? stats->cumul_rsrp / stats->num_rsrp_meas : 0; + + output += snprintf(output, end - output, "UE RNTI %04x CU-UE-ID ", UE->rnti); + if (du_exists_f1_ue_data(UE->rnti)) { + f1_ue_data_t ued = du_get_f1_ue_data(UE->rnti); + output += snprintf(output, end - output, "%d", ued.secondary_ue); + } else { + output += snprintf(output, end-output, "(none)"); + } + + bool in_sync = !sched_ctrl->ul_failure; + output += snprintf(output, + end - output, + " %s PH %d dB PCMAX %d dBm, average RSRP %d (%d meas)\n", + in_sync ? "in-sync" : "out-of-sync", + sched_ctrl->ph, + sched_ctrl->pcmax, + avg_rsrp, + stats->num_rsrp_meas); + + if(sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.print_report) + output += snprintf(output, + end - output, + "UE %04x: CQI %d, RI %d, PMI (%d,%d)\n", + UE->rnti, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.ri+1, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2); + + if (stats->srs_stats[0] != '\0') { + output += snprintf(output, end - output, "UE %04x: %s\n", UE->rnti, stats->srs_stats); + } + + output += snprintf(output, + end - output, + "UE %04x: dlsch_rounds ", UE->rnti); + output += snprintf(output, end - output, "%"PRIu64, stats->dl.rounds[0]); + for (int i = 1; i < gNB->dl_bler.harq_round_max; i++) + output += snprintf(output, end - output, "/%"PRIu64, stats->dl.rounds[i]); + + output += snprintf(output, + end - output, + ", dlsch_errors %"PRIu64", pucch0_DTX %d, BLER %.5f MCS (%d) %d\n", + stats->dl.errors, + stats->pucch0_DTX, + sched_ctrl->dl_bler_stats.bler, + UE->current_DL_BWP.mcsTableIdx, + sched_ctrl->dl_bler_stats.mcs); + if (reset_rsrp) { + stats->num_rsrp_meas = 0; + stats->cumul_rsrp = 0; + } + output += snprintf(output, + end - output, + "UE %04x: ulsch_rounds ", UE->rnti); + output += snprintf(output, end - output, "%"PRIu64, stats->ul.rounds[0]); + for (int i = 1; i < gNB->ul_bler.harq_round_max; i++) + output += snprintf(output, end - output, "/%"PRIu64, stats->ul.rounds[i]); + + output += snprintf(output, + end - output, + ", ulsch_errors %"PRIu64", ulsch_DTX %d, BLER %.5f MCS (%d) %d (Qm %d deltaMCS %d dB) NPRB %d SNR %d.%d dB\n", + stats->ul.errors, + stats->ulsch_DTX, + sched_ctrl->ul_bler_stats.bler, + UE->current_UL_BWP.mcs_table, + sched_ctrl->ul_bler_stats.mcs, + nr_get_Qm_ul(sched_ctrl->ul_bler_stats.mcs,UE->current_UL_BWP.mcs_table), + UE->mac_stats.deltaMCS, + UE->mac_stats.NPRB, + sched_ctrl->pusch_snrx10 / 10, + sched_ctrl->pusch_snrx10 % 10); + output += snprintf(output, + end - output, + "UE %04x: MAC: TX %14"PRIu64" RX %14"PRIu64" bytes\n", + UE->rnti, stats->dl.total_bytes, stats->ul.total_bytes); + + for (int i = 0; i < seq_arr_size(&sched_ctrl->lc_config); i++) { + const nr_lc_config_t *c = seq_arr_at(&sched_ctrl->lc_config, i); + output += snprintf(output, + end - output, + "UE %04x: LCID %d: TX %14"PRIu64" RX %14"PRIu64" bytes\n", + UE->rnti, + c->lcid, + stats->dl.lc_bytes[c->lcid], + stats->ul.lc_bytes[c->lcid]); + } + } + NR_SCHED_UNLOCK(&gNB->UE_info.mutex); + return output - begin; +} + +static void mac_rrc_init(gNB_MAC_INST *mac, ngran_node_t node_type) +{ + switch (node_type) { + case ngran_gNB_CU: + AssertFatal(1 == 0, "nothing to do for CU\n"); + break; + case ngran_gNB_DU: + mac_rrc_ul_f1ap_init(&mac->mac_rrc); + break; + case ngran_gNB: + mac_rrc_ul_direct_init(&mac->mac_rrc); + break; + default: + AssertFatal(0 == 1, "Unknown node type %d\n", node_type); + break; + } +} + +void mac_top_init_gNB(ngran_node_t node_type, + NR_ServingCellConfigCommon_t *scc, + NR_ServingCellConfig_t *scd, + const nr_mac_config_t *config) +{ + module_id_t i; + gNB_MAC_INST *nrmac; + + AssertFatal(RC.nb_nr_macrlc_inst == 1, "what is the point of calling %s() if you don't need exactly one MAC?\n", __func__); + + if (RC.nb_nr_macrlc_inst > 0) { + + RC.nrmac = (gNB_MAC_INST **) malloc16(RC.nb_nr_macrlc_inst *sizeof(gNB_MAC_INST *)); + + AssertFatal(RC.nrmac != NULL,"can't ALLOCATE %zu Bytes for %d gNB_MAC_INST with size %zu \n", + RC.nb_nr_macrlc_inst * sizeof(gNB_MAC_INST *), + RC.nb_nr_macrlc_inst, sizeof(gNB_MAC_INST)); + + for (i = 0; i < RC.nb_nr_macrlc_inst; i++) { + + RC.nrmac[i] = (gNB_MAC_INST *) malloc16(sizeof(gNB_MAC_INST)); + + AssertFatal(RC.nrmac != NULL,"can't ALLOCATE %zu Bytes for %d gNB_MAC_INST with size %zu \n", + RC.nb_nr_macrlc_inst * sizeof(gNB_MAC_INST *), + RC.nb_nr_macrlc_inst, sizeof(gNB_MAC_INST)); + + LOG_D(MAC,"[MAIN] ALLOCATE %zu Bytes for %d gNB_MAC_INST @ %p\n",sizeof(gNB_MAC_INST), RC.nb_nr_macrlc_inst, RC.mac); + + bzero(RC.nrmac[i], sizeof(gNB_MAC_INST)); + + RC.nrmac[i]->Mod_id = i; + + RC.nrmac[i]->tag = (NR_TAG_t*)malloc(sizeof(NR_TAG_t)); + memset((void*)RC.nrmac[i]->tag,0,sizeof(NR_TAG_t)); + + RC.nrmac[i]->ul_handle = 0; + + RC.nrmac[i]->common_channels[0].ServingCellConfigCommon = scc; + RC.nrmac[i]->radio_config = *config; + + RC.nrmac[i]->common_channels[0].pre_ServingCellConfig = scd; + + RC.nrmac[i]->first_MIB = true; + RC.nrmac[i]->common_channels[0].mib = get_new_MIB_NR(scc); + + RC.nrmac[i]->cset0_bwp_start = 0; + RC.nrmac[i]->cset0_bwp_size = 0; + + pthread_mutex_init(&RC.nrmac[i]->sched_lock, NULL); + + pthread_mutex_init(&RC.nrmac[i]->UE_info.mutex, NULL); + uid_linear_allocator_init(&RC.nrmac[i]->UE_info.uid_allocator); + + if (get_softmodem_params()->phy_test) { + RC.nrmac[i]->pre_processor_dl = nr_preprocessor_phytest; + RC.nrmac[i]->pre_processor_ul = nr_ul_preprocessor_phytest; + } else { + RC.nrmac[i]->pre_processor_dl = nr_init_dlsch_preprocessor(0); + RC.nrmac[i]->pre_processor_ul = nr_init_ulsch_preprocessor(0); + } + if (!IS_SOFTMODEM_NOSTATS) + threadCreate(&RC.nrmac[i]->stats_thread, + nrmac_stats_thread, + (void *)RC.nrmac[i], + "MAC_STATS", + -1, + sched_get_priority_min(SCHED_OAI) + 1); + mac_rrc_init(RC.nrmac[i], node_type); + }//END for (i = 0; i < RC.nb_nr_macrlc_inst; i++) + + AssertFatal(rlc_module_init(1) == 0,"Could not initialize RLC layer\n"); + + // These should be out of here later + if (get_softmodem_params()->usim_test == 0 ) nr_pdcp_layer_init(); + + if(IS_SOFTMODEM_NOS1 && get_softmodem_params()->phy_test) { + // get default noS1 configuration + NR_RadioBearerConfig_t *rbconfig = NULL; + NR_RLC_BearerConfig_t *rlc_rbconfig = NULL; + fill_nr_noS1_bearer_config(&rbconfig, &rlc_rbconfig); + + /* Note! previously, in nr_DRB_preconfiguration(), we passed ENB_FLAG_NO + * if ENB_NAS_USE_TUN was *not* set. It seems to me that we could not set + * this flag anywhere in the code, hence we would always configure PDCP + * with ENB_FLAG_NO in nr_DRB_preconfiguration(). This makes sense for + * noS1, because the result of passing ENB_FLAG_NO to PDCP is that PDCP + * will output the packets at a local interface, which is in line with + * the noS1 mode. Hence, below, we simply hardcode ENB_FLAG_NO */ + // setup PDCP, RLC + nr_pdcp_entity_security_keys_and_algos_t null_security_parameters = {0}; + nr_pdcp_add_drbs(ENB_FLAG_NO, 0x1234, rbconfig->drb_ToAddModList, &null_security_parameters); + nr_rlc_add_drb(0x1234, rbconfig->drb_ToAddModList->list.array[0]->drb_Identity, rlc_rbconfig); + + // free memory + free_nr_noS1_bearer_config(&rbconfig, &rlc_rbconfig); + } + + } else { + RC.nrmac = NULL; + } + + // Initialize Linked-List for Active UEs + for (i = 0; i < RC.nb_nr_macrlc_inst; i++) { + nrmac = RC.nrmac[i]; + nrmac->if_inst = NR_IF_Module_init(i); + memset(&nrmac->UE_info, 0, sizeof(nrmac->UE_info)); + } + + du_init_f1_ue_data(); + + srand48(0); +} + +void nr_mac_send_f1_setup_req(void) +{ + gNB_MAC_INST *mac = RC.nrmac[0]; + DevAssert(mac); + mac->mac_rrc.f1_setup_request(mac->f1_config.setup_req); +} diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h.patch b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h.patch new file mode 100644 index 0000000..30a226c --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h.patch @@ -0,0 +1,13 @@ +diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +index 65812ae0f5..a2a2227dad 100644 +--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h ++++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +@@ -729,6 +729,8 @@ typedef struct NR_mac_stats { + uint32_t pucch0_DTX; + int cumul_rsrp; + uint8_t num_rsrp_meas; ++ int prev_cumul_rsrp; ++ uint8_t prev_num_rsrp_meas; + char srs_stats[50]; // Statistics may differ depending on SRS usage + int pusch_snrx10; + int deltaMCS; diff --git a/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.previous.h b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.previous.h new file mode 100644 index 0000000..8b1bb3e --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_patch_files_only_rsrp/openairinterface/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.previous.h @@ -0,0 +1,949 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file mac.h +* \brief MAC data structures, constant, and function prototype +* \author Navid Nikaein and Raymond Knopp, WIE-TAI CHEN +* \date 2011, 2018 +* \version 0.5 +* \company Eurecom, NTUST +* \email navid.nikaein@eurecom.fr, kroempa@gmail.com + +*/ +/** @defgroup _oai2 openair2 Reference Implementation + * @ingroup _ref_implementation_ + * @{ + */ + +/*@}*/ + +#ifndef __LAYER2_NR_MAC_GNB_H__ +#define __LAYER2_NR_MAC_GNB_H__ + +#include +#include +#include +#include +#include "common/utils/ds/seq_arr.h" +#include "common/utils/nr/nr_common.h" +#include "common/utils/ds/byte_array.h" + +#define NR_SCHED_LOCK(lock) \ + do { \ + int rc = pthread_mutex_lock(lock); \ + AssertFatal(rc == 0, "error while locking scheduler mutex, pthread_mutex_lock() returned %d\n", rc); \ + } while (0) + +#define NR_SCHED_UNLOCK(lock) \ + do { \ + int rc = pthread_mutex_unlock(lock); \ + AssertFatal(rc == 0, "error while locking scheduler mutex, pthread_mutex_unlock() returned %d\n", rc); \ + } while (0) + +#define NR_SCHED_ENSURE_LOCKED(lock)\ + do {\ + int rc = pthread_mutex_trylock(lock); \ + AssertFatal(rc == EBUSY, "this function should be called with the scheduler mutex locked, pthread_mutex_trylock() returned %d\n", rc);\ + } while (0) + +/* Commmon */ +#include "radio/COMMON/common_lib.h" +#include "common/platform_constants.h" +#include "common/ran_context.h" +#include "collection/linear_alloc.h" + +/* RRC */ +#include "NR_BCCH-BCH-Message.h" +#include "NR_CellGroupConfig.h" +#include "NR_BCCH-DL-SCH-Message.h" +#include "openair2/RRC/NR/nr_rrc_config.h" + +/* PHY */ +#include "time_meas.h" + +/* Interface */ +#include "nfapi_nr_interface_scf.h" +#include "nfapi_nr_interface.h" +#include "NR_PHY_INTERFACE/NR_IF_Module.h" +#include "mac_rrc_ul.h" + +/* MAC */ +#include "LAYER2/NR_MAC_COMMON/nr_mac_common.h" +#include "NR_TAG.h" + +#include + + +/* Defs */ +#define MAX_NUM_BWP 5 +#define MAX_NUM_CORESET 12 +#define MAX_NUM_CCE 90 +/*!\brief Maximum number of random access process */ +#define NR_NB_RA_PROC_MAX 4 +#define MAX_NUM_OF_SSB 64 +#define MAX_NUM_NR_PRACH_PREAMBLES 64 +#define MIN_NUM_PRBS_TO_SCHEDULE 5 + +uint8_t nr_get_rv(int rel_round); + +/*! \brief NR_list_t is a "list" (of users, HARQ processes, slices, ...). + * Especially useful in the scheduler and to keep "classes" of users. */ +typedef struct { + int head; + int *next; + int tail; + int len; +} NR_list_t; + +typedef enum { + nrRA_gNB_IDLE, + nrRA_Msg2, + nrRA_WAIT_MsgA_PUSCH, + nrRA_WAIT_Msg3, + nrRA_Msg3_retransmission, + nrRA_Msg4, + nrRA_MsgB, + nrRA_WAIT_Msg4_MsgB_ACK, +} RA_gNB_state_t; + +static const char *const nrra_text[] = + {"IDLE", "Msg2", "WAIT_MsgA_PUSCH", "WAIT_Msg3", "Msg3_retransmission", "Msg4", "MsgB", "WAIT_Msg4_MsgB_ACK"}; + +typedef struct { + int idx; + bool new_beam; +} NR_beam_alloc_t; + +typedef struct nr_pdsch_AntennaPorts_t { + int N1; + int N2; + int XP; +} nr_pdsch_AntennaPorts_t; + +typedef struct nr_mac_timers { + int sr_ProhibitTimer; + int sr_TransMax; + int sr_ProhibitTimer_v1700; + int t300; + int t301; + int t310; + int n310; + int t311; + int n311; + int t319; +} nr_mac_timers_t; + +typedef struct nr_mac_config_t { + int sib1_tda; + nr_pdsch_AntennaPorts_t pdsch_AntennaPorts; + int pusch_AntennaPorts; + int minRXTXTIME; + int do_CSIRS; + int do_SRS; + bool force_256qam_off; + bool force_UL256qam_off; + bool use_deltaMCS; + int maxMIMO_layers; + bool disable_harq; + //int pusch_TargetSNRx10; + //int pucch_TargetSNRx10; + nr_mac_timers_t timer_config; + int num_dlharq; + int num_ulharq; + /// beamforming weight matrix size + int nb_bfw[2]; + int32_t *bw_list; + int num_agg_level_candidates[NUM_PDCCH_AGG_LEVELS]; +} nr_mac_config_t; + +typedef struct NR_preamble_ue { + uint8_t num_preambles; + uint8_t preamble_list[MAX_NUM_NR_PRACH_PREAMBLES]; +} NR_preamble_ue_t; + +typedef struct NR_sched_pdcch { + uint16_t BWPSize; + uint16_t BWPStart; + uint8_t CyclicPrefix; + uint8_t SubcarrierSpacing; + uint8_t StartSymbolIndex; + uint8_t CceRegMappingType; + uint8_t RegBundleSize; + uint8_t InterleaverSize; + uint16_t ShiftIndex; + uint8_t DurationSymbols; + int n_rb; +} NR_sched_pdcch_t; + +/*! \brief gNB template for the Random access information */ +typedef struct { + /// Flag to indicate this process is active + RA_gNB_state_t ra_state; + /// CORESET0 configured flag + int coreset0_configured; + /// Frame where preamble was received + int preamble_frame; + /// Slot where preamble was received + uint8_t preamble_slot; + /// Received preamble_index + uint8_t preamble_index; + /// Timing offset indicated by PHY + int16_t timing_offset; + /// Subframe where Msg2 is to be sent + uint8_t Msg2_slot; + /// Frame where Msg2 is to be sent + frame_t Msg2_frame; + /// Subframe where Msg3 is to be sent + slot_t Msg3_slot; + /// Frame where Msg3 is to be sent + frame_t Msg3_frame; + /// Msg3 time domain allocation index + int Msg3_tda_id; + /// Msg3 beam matrix index + NR_beam_alloc_t Msg3_beam; + /// harq_pid used for Msg4 transmission + uint8_t harq_pid; + /// UE RNTI allocated during RAR + rnti_t rnti; + /// RA RNTI allocated from received PRACH + uint16_t RA_rnti; + /// MsgB RNTI allocated from received MsgA + uint16_t MsgB_rnti; + /// Received UE Contention Resolution Identifier + uint8_t cont_res_id[6]; + /// Msg3 first RB + int msg3_first_rb; + /// Msg3 number of RB + int msg3_nb_rb; + /// Msg3 BWP start + int msg3_bwp_start; + /// Msg3 TPC command + uint8_t msg3_TPC; + /// Round of Msg3 HARQ + uint8_t msg3_round; + int msg3_startsymb; + int msg3_nbSymb; + /// MAC PDU length for Msg4 + int mac_pdu_length; + /// RA search space + NR_SearchSpace_t *ra_ss; + /// RA Coreset + NR_ControlResourceSet_t *coreset; + NR_sched_pdcch_t sched_pdcch; + // Beam index + uint8_t beam_id; + /// CellGroup for UE that is to come (NSA is non-null, null for SA) + NR_CellGroupConfig_t *CellGroup; + /// Preambles for contention-free access + NR_preamble_ue_t preambles; + int contention_resolution_timer; + nr_ra_type_t ra_type; + /// CFRA flag + bool cfra; + // BWP for RA + NR_UE_DL_BWP_t DL_BWP; + NR_UE_UL_BWP_t UL_BWP; + NR_UE_ServingCell_Info_t sc_info; +} NR_RA_t; + +/*! \brief gNB common channels */ +typedef struct { + frame_type_t frame_type; + NR_BCCH_BCH_Message_t *mib; + NR_BCCH_DL_SCH_Message_t *sib1; + NR_BCCH_DL_SCH_Message_t *sib19; + NR_ServingCellConfigCommon_t *ServingCellConfigCommon; + /// pre-configured ServingCellConfig that is default for every UE + NR_ServingCellConfig_t *pre_ServingCellConfig; + /// Outgoing MIB PDU for PHY + uint8_t MIB_pdu[3]; + /// Outgoing BCCH pdu for PHY + uint8_t sib1_bcch_pdu[NR_MAX_SIB_LENGTH / 8]; + int sib1_bcch_length; + /// used for sib19 data + uint8_t sib19_bcch_pdu[NR_MAX_SIB_LENGTH / 8]; + int sib19_bcch_length; + /// Template for RA computations + NR_RA_t ra[NR_NB_RA_PROC_MAX]; + /// VRB map for common channels + uint16_t vrb_map[MAX_NUM_BEAM_PERIODS][275]; + /// VRB map for common channels and PUSCH, dynamically allocated because + /// length depends on number of slots and RBs + uint16_t *vrb_map_UL[MAX_NUM_BEAM_PERIODS]; + ///Number of active SSBs + int num_active_ssb; + //Total available prach occasions per configuration period + int total_prach_occasions_per_config_period; + //Total available prach occasions + int total_prach_occasions; + //Max Association period + int max_association_period; + //SSB index + uint8_t ssb_index[MAX_NUM_OF_SSB]; + //CB preambles for each SSB + int cb_preambles_per_ssb; + /// Max prach length in slots + int prach_len; + nr_prach_info_t prach_info; +} NR_COMMON_channels_t; + +// SP ZP CSI-RS Resource Set Activation/Deactivation MAC CE +typedef struct sp_zp_csirs { + bool is_scheduled; //ZP CSI-RS ACT/Deact MAC CE is scheduled + bool act_deact; //Activation/Deactivation indication + uint8_t serv_cell_id; //Identity of Serving cell for which MAC CE applies + uint8_t bwpid; //Downlink BWP id + uint8_t rsc_id; //SP ZP CSI-RS resource set +} sp_zp_csirs_t; + +//SP CSI-RS / CSI-IM Resource Set Activation/Deactivation MAC CE +#define MAX_CSI_RESOURCE_SET 64 +typedef struct csi_rs_im { + bool is_scheduled; + bool act_deact; + uint8_t serv_cellid; + uint8_t bwp_id; + bool im; + uint8_t csi_im_rsc_id; + uint8_t nzp_csi_rsc_id; + uint8_t nb_tci_resource_set_id; + uint8_t tci_state_id [ MAX_CSI_RESOURCE_SET ]; +} csi_rs_im_t; + +typedef struct pdcchStateInd { + bool is_scheduled; + uint8_t servingCellId; + uint8_t coresetId; + uint8_t tciStateId; + bool tci_present_inDCI; +} pdcchStateInd_t; + +typedef struct pucchSpatialRelation { + bool is_scheduled; + uint8_t servingCellId; + uint8_t bwpId; + uint8_t pucchResourceId; + bool s0tos7_actDeact[8]; +} pucchSpatialRelation_t; + +typedef struct SPCSIReportingpucch { + bool is_scheduled; + uint8_t servingCellId; + uint8_t bwpId; + bool s0tos3_actDeact[4]; +} SPCSIReportingpucch_t; + +#define MAX_APERIODIC_TRIGGER_STATES 128 //38.331 +typedef struct aperiodicCSI_triggerStateSelection { + bool is_scheduled; + uint8_t servingCellId; + uint8_t bwpId; + uint8_t highestTriggerStateSelected; + bool triggerStateSelection[MAX_APERIODIC_TRIGGER_STATES]; +} aperiodicCSI_triggerStateSelection_t; + +#define MAX_TCI_STATES 128 //38.331 +typedef struct pdschTciStatesActDeact { + bool is_scheduled; + uint8_t servingCellId; + uint8_t bwpId; + uint8_t highestTciStateActivated; + bool tciStateActDeact[MAX_TCI_STATES]; + uint8_t codepoint[8]; +} pdschTciStatesActDeact_t; + +typedef struct UE_info { + sp_zp_csirs_t sp_zp_csi_rs; + csi_rs_im_t csi_im; + pdcchStateInd_t pdcch_state_ind; + pucchSpatialRelation_t pucch_spatial_relation; + SPCSIReportingpucch_t SP_CSI_reporting_pucch; + aperiodicCSI_triggerStateSelection_t aperi_CSI_trigger; + pdschTciStatesActDeact_t pdsch_TCI_States_ActDeact; +} NR_UE_mac_ce_ctrl_t; + +typedef struct NR_sched_pucch { + bool active; + int frame; + int ul_slot; + bool sr_flag; + int csi_bits; + bool simultaneous_harqcsi; + uint8_t dai_c; + uint8_t timing_indicator; + uint8_t resource_indicator; + int r_pucch; + int prb_start; + int second_hop_prb; + int nr_of_symb; + int start_symb; +} NR_sched_pucch_t; + +typedef struct NR_pusch_dmrs { + uint8_t N_PRB_DMRS; + uint8_t num_dmrs_symb; + uint16_t ul_dmrs_symb_pos; + uint8_t num_dmrs_cdm_grps_no_data; + nfapi_nr_dmrs_type_e dmrs_config_type; +} NR_pusch_dmrs_t; + +typedef struct NR_sched_pusch { + int frame; + int slot; + int mu; + + /// RB allocation within active uBWP + uint16_t rbSize; + uint16_t rbStart; + + /// MCS + uint8_t mcs; + + /// TBS-related info + uint16_t R; + uint8_t Qm; + uint32_t tb_size; + + /// UL HARQ PID to use for this UE, or -1 for "any new" + int8_t ul_harq_pid; + + uint8_t nrOfLayers; + int tpmi; + + // time_domain_allocation is the index of a list of tda + int time_domain_allocation; + NR_tda_info_t tda_info; + NR_pusch_dmrs_t dmrs_info; + int phr_txpower_calc; +} NR_sched_pusch_t; + +typedef struct NR_sched_srs { + int frame; + int slot; + bool srs_scheduled; +} NR_sched_srs_t; + +typedef struct NR_pdsch_dmrs { + uint8_t dmrs_ports_id; + uint8_t N_PRB_DMRS; + uint8_t N_DMRS_SLOT; + uint16_t dl_dmrs_symb_pos; + uint8_t numDmrsCdmGrpsNoData; + nfapi_nr_dmrs_type_e dmrsConfigType; +} NR_pdsch_dmrs_t; + +typedef struct NR_sched_pdsch { + /// RB allocation within active BWP + uint16_t rbSize; + uint16_t rbStart; + + /// MCS-related infos + uint8_t mcs; + + /// TBS-related info + uint16_t R; + uint8_t Qm; + uint32_t tb_size; + + /// DL HARQ PID to use for this UE, or -1 for "any new" + int8_t dl_harq_pid; + + // pucch format allocation + int16_t pucch_allocation; + + uint16_t pm_index; + uint8_t nrOfLayers; + + NR_pdsch_dmrs_t dmrs_parms; + // time_domain_allocation is the index of a list of tda + int time_domain_allocation; + NR_tda_info_t tda_info; +} NR_sched_pdsch_t; + +typedef struct NR_UE_harq { + bool is_waiting; + uint8_t ndi; + uint8_t round; + uint16_t feedback_frame; + uint16_t feedback_slot; + + /* Transport block to be sent using this HARQ process */ + byte_array_t transportBlock; + uint32_t tb_size; // size of currently stored TB + + /// sched_pdsch keeps information on MCS etc used for the initial transmission + NR_sched_pdsch_t sched_pdsch; +} NR_UE_harq_t; + +//! fixme : need to enhace for the multiple TB CQI report + +typedef struct NR_bler_stats { + frame_t last_frame; + float bler; + uint8_t mcs; + uint64_t rounds[8]; +} NR_bler_stats_t; + +// +/*! As per spec 38.214 section 5.2.1.4.2 + * - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'disabled', the UE shall report in + a single report nrofReportedRS (higher layer configured) different CRI or SSBRI for each report setting. + * - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'enabled', the UE shall report in a + single reporting instance two different CRI or SSBRI for each report setting, where CSI-RS and/or SSB + resources can be received simultaneously by the UE either with a single spatial domain receive filter, or with + multiple simultaneous spatial domain receive filter +*/ +#define MAX_NR_OF_REPORTED_RS 4 + +struct CRI_RI_LI_PMI_CQI { + uint8_t cri; + uint8_t ri; + uint8_t li; + uint8_t pmi_x1; + uint8_t pmi_x2; + uint8_t wb_cqi_1tb; + uint8_t wb_cqi_2tb; + uint8_t cqi_table; + uint8_t csi_report_id; + bool print_report; +}; + +typedef struct RSRP_report { + uint8_t nr_reports; + uint8_t resource_id[MAX_NR_OF_REPORTED_RS]; + int RSRP[MAX_NR_OF_REPORTED_RS]; +} RSRP_report_t; + +struct CSI_Report { + struct CRI_RI_LI_PMI_CQI cri_ri_li_pmi_cqi_report; + RSRP_report_t ssb_rsrp_report; + RSRP_report_t csirs_rsrp_report; +}; + +#define MAX_SR_BITLEN 8 + +/*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report + the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE + From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set + From spec 38.214 section 5.2.1.2 For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1 + */ +#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16 + +typedef enum { + INACTIVE = 0, + ACTIVE_NOT_SCHED, + ACTIVE_SCHED +} NR_UL_harq_states_t; + +typedef struct NR_UE_ul_harq { + bool is_waiting; + uint8_t ndi; + uint8_t round; + uint16_t feedback_slot; + + /// sched_pusch keeps information on MCS etc used for the initial transmission + NR_sched_pusch_t sched_pusch; +} NR_UE_ul_harq_t; + +typedef struct NR_QoS_config_s { + int fiveQI; + int priority; +} NR_QoS_config_t; + +typedef struct nr_lc_config { + uint8_t lcid; + /// priority as specified in 38.321 + int priority; + /// associated NSSAI for DRB + nssai_t nssai; + /// QoS config for DRB + NR_QoS_config_t qos_config[NR_MAX_NUM_QFI]; +} nr_lc_config_t; + +/*! \brief scheduling control information set through an API */ +#define MAX_CSI_REPORTS 48 +typedef struct { + /// CCE index and aggregation, should be coherent with cce_list + NR_SearchSpace_t *search_space; + NR_ControlResourceSet_t *coreset; + NR_sched_pdcch_t sched_pdcch; + + /// CCE index and Aggr. Level are shared for PUSCH/PDSCH allocation decisions + /// corresponding to the sched_pusch/sched_pdsch structures below + int cce_index; + uint8_t aggregation_level; + + /// Array of PUCCH scheduling information + /// Its size depends on TDD configuration and max feedback time + /// There will be a structure for each UL slot in the active period determined by the size + NR_sched_pucch_t *sched_pucch; + int sched_pucch_size; + + /// Sched PUSCH: scheduling decisions, copied into HARQ and cleared every TTI + NR_sched_pusch_t sched_pusch; + + /// Sched SRS: scheduling decisions + NR_sched_srs_t sched_srs; + + /// uplink bytes that are currently scheduled + int sched_ul_bytes; + /// estimation of the UL buffer size + int estimated_ul_buffer; + + /// PHR info: power headroom level (dB) + int ph; + /// PHR info: power headroom level (dB) for 1 PRB + int ph0; + + /// PHR info: nominal UE transmit power levels (dBm) + int pcmax; + + /// Sched PDSCH: scheduling decisions, copied into HARQ and cleared every TTI + NR_sched_pdsch_t sched_pdsch; + /// UE-estimated maximum MCS (from CSI-RS) + uint8_t dl_max_mcs; + + /// For UL synchronization: store last UL scheduling grant + frame_t last_ul_frame; + slot_t last_ul_slot; + + /// total amount of data awaiting for this UE + uint32_t num_total_bytes; + uint16_t dl_pdus_total; + /// per-LC status data + mac_rlc_status_resp_t rlc_status[NR_MAX_NUM_LCID]; + + /// Estimation of HARQ from BLER + NR_bler_stats_t dl_bler_stats; + NR_bler_stats_t ul_bler_stats; + + uint16_t ta_frame; + int16_t ta_update; + bool ta_apply; + uint8_t tpc0; + uint8_t tpc1; + int raw_rssi; + int pusch_snrx10; + int pucch_snrx10; + uint16_t ul_rssi; + uint8_t current_harq_pid; + int pusch_consecutive_dtx_cnt; + int pucch_consecutive_dtx_cnt; + bool ul_failure; + int ul_failure_timer; + int release_timer; + struct CSI_Report CSI_report; + bool SR; + /// information about every HARQ process + NR_UE_harq_t harq_processes[NR_MAX_HARQ_PROCESSES]; + /// HARQ processes that are free + NR_list_t available_dl_harq; + /// HARQ processes that await feedback + NR_list_t feedback_dl_harq; + /// HARQ processes that await retransmission + NR_list_t retrans_dl_harq; + /// information about every UL HARQ process + NR_UE_ul_harq_t ul_harq_processes[NR_MAX_HARQ_PROCESSES]; + /// UL HARQ processes that are free + NR_list_t available_ul_harq; + /// UL HARQ processes that await feedback + NR_list_t feedback_ul_harq; + /// UL HARQ processes that await retransmission + NR_list_t retrans_ul_harq; + NR_UE_mac_ce_ctrl_t UE_mac_ce_ctrl; // MAC CE related information + + /// Timer for RRC processing procedures and transmission activity + NR_timer_t transm_interrupt; + + /// sri, ul_ri and tpmi based on SRS + nr_srs_feedback_t srs_feedback; + + /// per-LC configuration + seq_arr_t lc_config; + + // pdcch closed loop adjust for PDCCH aggregation level, range <0, 1> + // 0 - good channel, 1 - bad channel + float pdcch_cl_adjust; +} NR_UE_sched_ctrl_t; + +typedef struct { + NR_SearchSpace_t *search_space; + NR_ControlResourceSet_t *coreset; + + NR_sched_pdcch_t sched_pdcch; + NR_sched_pdsch_t sched_pdsch; + + uint32_t num_total_bytes; + + int cce_index; + uint8_t aggregation_level; +} NR_UE_sched_osi_ctrl_t; + +typedef struct { + uicc_t *uicc; +} NRUEcontext_t; + +typedef struct NR_mac_dir_stats { + uint64_t lc_bytes[64]; + uint64_t rounds[8]; + uint64_t errors; + uint64_t total_bytes; + uint32_t current_bytes; + uint64_t total_sdu_bytes; + uint32_t total_rbs; + uint32_t total_rbs_retx; + uint32_t num_mac_sdu; + uint32_t current_rbs; +} NR_mac_dir_stats_t; + +typedef struct NR_mac_stats { + NR_mac_dir_stats_t dl; + NR_mac_dir_stats_t ul; + uint32_t ulsch_DTX; + uint64_t ulsch_total_bytes_scheduled; + uint32_t pucch0_DTX; + int cumul_rsrp; + uint8_t num_rsrp_meas; + char srs_stats[50]; // Statistics may differ depending on SRS usage + int pusch_snrx10; + int deltaMCS; + int NPRB; +} NR_mac_stats_t; + +typedef struct NR_bler_options { + double upper; + double lower; + uint8_t max_mcs; + uint8_t harq_round_max; +} NR_bler_options_t; + +typedef struct nr_mac_rrc_ul_if_s { + f1_reset_du_initiated_func_t f1_reset; + f1_reset_acknowledge_cu_initiated_func_t f1_reset_acknowledge; + f1_setup_request_func_t f1_setup_request; + gnb_du_configuration_update_t gnb_du_configuration_update; + ue_context_setup_response_func_t ue_context_setup_response; + ue_context_modification_response_func_t ue_context_modification_response; + ue_context_modification_required_func_t ue_context_modification_required; + ue_context_release_request_func_t ue_context_release_request; + ue_context_release_complete_func_t ue_context_release_complete; + initial_ul_rrc_message_transfer_func_t initial_ul_rrc_message_transfer; +} nr_mac_rrc_ul_if_t; + +typedef enum interrupt_followup_action { FOLLOW_INSYNC, FOLLOW_INSYNC_RECONFIG, FOLLOW_OUTOFSYNC } interrupt_followup_action_t; + +/*! \brief UE list used by gNB to order UEs/CC for scheduling*/ +typedef struct { + rnti_t rnti; + uid_t uid; // unique ID of this UE + /// scheduling control info + nr_csi_report_t csi_report_template[MAX_CSI_REPORTCONFIG]; + NR_UE_sched_ctrl_t UE_sched_ctrl; + NR_UE_DL_BWP_t current_DL_BWP; + NR_UE_UL_BWP_t current_UL_BWP; + NR_UE_ServingCell_Info_t sc_info; + NR_mac_stats_t mac_stats; + /// currently active CellGroupConfig + NR_CellGroupConfig_t *CellGroup; + /// CellGroupConfig that is to be activated after the next reconfiguration + bool expect_reconfiguration; + /// reestablishRLC has to be signaled in RRCreconfiguration + bool reestablish_rlc; + NR_CellGroupConfig_t *reconfigCellGroup; + interrupt_followup_action_t interrupt_action; + NR_UE_NR_Capability_t *capability; + // UE selected beam index + uint8_t UE_beam_index; + bool Msg4_MsgB_ACKed; + float ul_thr_ue; + float dl_thr_ue; + long pdsch_HARQ_ACK_Codebook; +} NR_UE_info_t; + +typedef struct { + /// scheduling control info + // last element always NULL + pthread_mutex_t mutex; + NR_UE_info_t *list[MAX_MOBILES_PER_GNB+1]; + // bitmap of CSI-RS already scheduled in current slot + int sched_csirs; + uid_allocator_t uid_allocator; +} NR_UEs_t; + +typedef struct { + /// list of allocated beams per period + int **beam_allocation; + int beam_duration; // in slots + int beams_per_period; + int beam_allocation_size; +} NR_beam_info_t; + +#define UE_iterator(BaSe, VaR) NR_UE_info_t ** VaR##pptr=BaSe, *VaR; while ((VaR=*(VaR##pptr++))) + +typedef void (*nr_pp_impl_dl)(module_id_t mod_id, frame_t frame, slot_t slot); +typedef bool (*nr_pp_impl_ul)(module_id_t mod_id, frame_t frame, slot_t slot); + +typedef struct f1_config_t { + f1ap_setup_req_t *setup_req; + f1ap_setup_resp_t *setup_resp; + uint32_t gnb_id; // associated gNB's ID, not used in DU itself +} f1_config_t; + +typedef struct { + char *nvipc_shm_prefix; + int8_t nvipc_poll_core; +} nvipc_params_t; + +typedef struct { + uint64_t total_prb_aggregate; + uint64_t used_prb_aggregate; +} mac_stats_t; + +/*! \brief top level eNB MAC structure */ +typedef struct gNB_MAC_INST_s { + /// Ethernet parameters for northbound midhaul interface + eth_params_t eth_params_n; + /// address for F1U to bind, ports in eth_params_n + char *f1u_addr; + /// Ethernet parameters for fronthaul interface + eth_params_t eth_params_s; + /// Nvipc parameters for FAPI interface with Aerial + nvipc_params_t nvipc_params_s; + /// Module + module_id_t Mod_id; + /// timing advance group + NR_TAG_t *tag; + /// Pointer to IF module instance for PHY + NR_IF_Module_t *if_inst; + pthread_t stats_thread; + /// Pusch target SNR + int pusch_target_snrx10; + /// RSSI threshold for power control. Limits power control commands when RSSI reaches threshold. + int pusch_rssi_threshold; + /// Pucch target SNR + int pucch_target_snrx10; + /// RSSI threshold for PUCCH power control. Limits power control commands when RSSI reaches threshold. + int pucch_rssi_threshold; + /// SNR threshold needed to put or not a PRB in the black list + int ul_prbblack_SNR_threshold; + /// PUCCH Failure threshold (compared to consecutive PUCCH DTX) + int pucch_failure_thres; + /// PUSCH Failure threshold (compared to consecutive PUSCH DTX) + int pusch_failure_thres; + /// Subcarrier Offset + int ssb_SubcarrierOffset; + int ssb_OffsetPointA; + + /// Common cell resources + NR_COMMON_channels_t common_channels[NFAPI_CC_MAX]; + /// current PDU index (BCH,DLSCH) + uint16_t pdu_index[NFAPI_CC_MAX]; + /// UL PRBs blacklist + uint16_t ulprbbl[MAX_BWP_SIZE]; + /// NFAPI Config Request Structure + nfapi_nr_config_request_scf_t config[NFAPI_CC_MAX]; + /// a PDCCH PDU groups DCIs per BWP and CORESET. The following structure + /// keeps pointers to PDCCH PDUs within DL_req so that we can easily track + /// PDCCH PDUs per CC/BWP/CORESET + nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_idx[NFAPI_CC_MAX][MAX_NUM_CORESET]; + /// NFAPI UL TTI Request Structure for future TTIs, dynamically allocated + /// because length depends on number of slots + nfapi_nr_ul_tti_request_t *UL_tti_req_ahead[NFAPI_CC_MAX]; + int UL_tti_req_ahead_size; + int vrb_map_UL_size; + + NR_UEs_t UE_info; + + /// UL handle + uint32_t ul_handle; + //UE_info_t UE_info; + + // MAC function execution peformance profiler + /// processing time of eNB scheduler + time_stats_t eNB_scheduler; + /// processing time of eNB scheduler for SI + time_stats_t schedule_si; + /// processing time of eNB scheduler for Random access + time_stats_t schedule_ra; + /// processing time of eNB ULSCH scheduler + time_stats_t schedule_ulsch; + /// processing time of eNB DCI generation + time_stats_t fill_DLSCH_dci; + /// processing time of eNB MAC preprocessor + time_stats_t schedule_dlsch_preprocessor; + /// processing time of eNB DLSCH scheduler + time_stats_t schedule_dlsch; // include rlc_data_req + MAC header + preprocessor + /// processing time of rlc_data_req + time_stats_t rlc_data_req; + /// processing time of rlc_status_ind + time_stats_t rlc_status_ind; + /// processing time of nr_srs_ri_computation + time_stats_t nr_srs_ri_computation_timer; + /// processing time of nr_srs_tpmi_estimation + time_stats_t nr_srs_tpmi_computation_timer; + /// processing time of eNB MCH scheduler + time_stats_t schedule_mch; + /// processing time of eNB ULSCH reception + time_stats_t rx_ulsch_sdu; // include rlc_data_ind + /// processing time of eNB PCH scheduler + time_stats_t schedule_pch; + + NR_beam_info_t beam_info; + + /// maximum number of slots before a UE will be scheduled ULSCH automatically + uint32_t ulsch_max_frame_inactivity; + /// instance of the frame structure configuration + frame_structure_t frame_structure; + + /// DL preprocessor for differentiated scheduling + nr_pp_impl_dl pre_processor_dl; + /// UL preprocessor for differentiated scheduling + nr_pp_impl_ul pre_processor_ul; + + nr_mac_config_t radio_config; + + NR_UE_sched_osi_ctrl_t *sched_osi; + NR_UE_sched_ctrl_t *sched_ctrlCommon; + + uint16_t cset0_bwp_start; + uint16_t cset0_bwp_size; + NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config[64]; + + bool first_MIB; + NR_bler_options_t dl_bler; + NR_bler_options_t ul_bler; + uint8_t min_grant_prb; + uint8_t min_grant_mcs; + bool identity_pm; + int precoding_matrix_size[NR_MAX_NB_LAYERS]; + int fapi_beam_index[MAX_NUM_OF_SSB]; + nr_mac_rrc_ul_if_t mac_rrc; + f1_config_t f1_config; + int16_t frame; + + pthread_mutex_t sched_lock; + + mac_stats_t mac_stats; + +} gNB_MAC_INST; + +#endif /*__LAYER2_NR_MAC_GNB_H__ */ +/** @}*/ diff --git a/OpenAirInterface_Testbed/User_Equipment/install_scripts/apply_patches.sh b/OpenAirInterface_Testbed/User_Equipment/install_scripts/apply_patches.sh new file mode 100755 index 0000000..3ca63a6 --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_scripts/apply_patches.sh @@ -0,0 +1,116 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Exit immediately if a command fails +set -e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +# Modify CMakeLists.txt to set E2AP_VERSION to E2AP_V3 and KPM_VERSION to KPM_V3_00 (must match FlexRIC) +if [ -f "openairinterface5g/CMakeLists.txt" ]; then + echo "Modifying CMakeLists.txt to set E2AP_VERSION to E2AP_V3..." + sed -i 's/set(E2AP_VERSION "[^"]*"/set(E2AP_VERSION "E2AP_V3"/' openairinterface5g/CMakeLists.txt +fi +if [ -f "openairinterface5g/CMakeLists.txt" ]; then + echo "Modifying CMakeLists.txt to set KPM_VERSION to KPM_V3_00..." + sed -i 's/set(KPM_VERSION "[^"]*"/set(KPM_VERSION "KPM_V3_00"/' openairinterface5g/CMakeLists.txt +fi + +# Apply patches to OpenAirInterface to add support for additional metrics in the KPI report +if [ ! -f "openairinterface5g/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c.previous" ]; then + cp openairinterface5g/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c openairinterface5g/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c.previous +fi +echo +echo "Patching ran_func_kpm.c..." +cd openairinterface5g +git restore openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c +git apply --verbose --ignore-whitespace "$PARENT_DIR/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c.patch" +cd .. + +if [ ! -f "openairinterface5g/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c.previous" ]; then + cp openairinterface5g/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c openairinterface5g/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c.previous +fi +echo +echo "Patching ran_func_kpm_subs.c..." +cd openairinterface5g +git restore openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c +git apply --verbose --ignore-whitespace "$PARENT_DIR/install_patch_files/openairinterface/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm_subs.c.patch" +cd .. + +if [ ! -f "openairinterface5g/openair2/LAYER2/NR_MAC_gNB/main.c.previous" ]; then + cp openairinterface5g/openair2/LAYER2/NR_MAC_gNB/main.c openairinterface5g/openair2/LAYER2/NR_MAC_gNB/main.c.previous +fi +echo +echo "Patching main.c..." +cd openairinterface5g +git restore openair2/LAYER2/NR_MAC_gNB/main.c +git apply --verbose --ignore-whitespace "$PARENT_DIR/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/main.c.patch" +cd .. + +if [ ! -f "openairinterface5g/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h.previous" ]; then + cp openairinterface5g/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h openairinterface5g/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h.previous +fi +echo +echo "Patching nr_mac_gNB.h..." +cd openairinterface5g +git restore openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +git apply --verbose --ignore-whitespace "$PARENT_DIR/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h.patch" +cd .. + +if [ ! -f "openairinterface5g/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c.previous" ]; then + cp openairinterface5g/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c openairinterface5g/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c.previous +fi +echo +echo "Patching gNB_scheduler_dlsch.c..." +cd openairinterface5g +git restore openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +git apply --verbose --ignore-whitespace "$PARENT_DIR/install_patch_files/openairinterface/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c.patch" +cd .. + +# If using Linux Mint, add support for Linux Mint 20, 21, and 22 to OpenAirInterface +if grep -q "Linux Mint" /etc/os-release; then + echo + echo "Linux Mint detected, attempting to patching OpenAirInterface to support Linux Mint 20, 21, and 22..." + cd openairinterface5g + git restore cmake_targets/tools/build_helper + git apply --verbose --ignore-whitespace "$PARENT_DIR/install_patch_files/openairinterface/cmake_targets/tools/build_helper.patch" + cd .. + echo "Patching completed." + echo +fi + +echo "Successfully patched OpenAirInterface." diff --git a/OpenAirInterface_Testbed/User_Equipment/install_scripts/revert_ue_namespace.sh b/OpenAirInterface_Testbed/User_Equipment/install_scripts/revert_ue_namespace.sh new file mode 100755 index 0000000..74d8a27 --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_scripts/revert_ue_namespace.sh @@ -0,0 +1,70 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +echo "# Script: $(realpath $0)..." + +# Do not exit immediately if a command fails +set +e + +UE_NUMBER=$1 + +if [[ -z "$UE_NUMBER" ]]; then + echo "Error: No UE number provided." + echo "Usage: $0 " + exit 1 +fi +if ! [[ $UE_NUMBER =~ ^[0-9]+$ ]]; then + echo "Error: UE number must be a number." + exit 1 +fi + +UE_NAMESPACE="ue$UE_NUMBER" + +NETWORK_INTEFACE=$(ip route | grep default | awk '{print $5}') +UE_SUBNET_FIRST_3_OCTETS=10.201.$UE_NUMBER + +echo "Removing IP routes and addresses inside the namespace..." +sudo ip netns exec $UE_NAMESPACE ip route del default via $UE_SUBNET_FIRST_3_OCTETS.1 +sudo ip netns exec $UE_NAMESPACE ip addr del $UE_SUBNET_FIRST_3_OCTETS.2/24 dev v-$UE_NAMESPACE +sudo ip netns exec $UE_NAMESPACE ip link set v-$UE_NAMESPACE down + +echo "Removing iptables rules..." +sudo iptables -D FORWARD -o $NETWORK_INTEFACE -i v-eth$UE_NUMBER -j ACCEPT +sudo iptables -D FORWARD -i $NETWORK_INTEFACE -o v-eth$UE_NUMBER -j ACCEPT +sudo iptables -t nat -D POSTROUTING -s $UE_SUBNET_FIRST_3_OCTETS.0/24 -o $NETWORK_INTEFACE -j MASQUERADE + +echo "Deleting the network devices..." +sudo ip link set v-eth$UE_NUMBER down +sudo ip link del v-eth$UE_NUMBER + +echo "Deleting the network namespace..." +sudo ip netns del $UE_NAMESPACE + +echo "Successfully reverted the UE $UE_NUMBER namespace." diff --git a/OpenAirInterface_Testbed/User_Equipment/install_scripts/setup_ue_namespace.sh b/OpenAirInterface_Testbed/User_Equipment/install_scripts/setup_ue_namespace.sh new file mode 100755 index 0000000..3a503b0 --- /dev/null +++ b/OpenAirInterface_Testbed/User_Equipment/install_scripts/setup_ue_namespace.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +echo "# Script: $(realpath $0)..." + +# Exit immediately if a command fails +set -e + +UE_NUMBER=$1 + +if [[ -z "$UE_NUMBER" ]]; then + echo "Error: No UE number provided." + echo "Usage: $0 " + exit 1 +fi +if ! [[ $UE_NUMBER =~ ^[0-9]+$ ]]; then + echo "Error: UE number must be a number." + exit 1 +fi + +UE_NAMESPACE="ue$UE_NUMBER" + +# Give the UE its own network namespace and configure it to access the host network +NETWORK_INTEFACE=$(ip route | grep default | awk '{print $5}') +UE_SUBNET_FIRST_3_OCTETS=10.201.$UE_NUMBER + +# Code from (https://open-cells.com/index.php/2021/02/08/rf-simulator-1-enb-2-ues-all-in-one): +sudo ip netns delete $UE_NAMESPACE || true +sudo ip link delete v-eth$UE_NUMBER || true +sudo ip netns add $UE_NAMESPACE +sudo ip link add v-eth$UE_NUMBER type veth peer name v-$UE_NAMESPACE +sudo ip link set v-$UE_NAMESPACE netns $UE_NAMESPACE +sudo ip addr add $UE_SUBNET_FIRST_3_OCTETS.1/24 dev v-eth$UE_NUMBER +sudo ip link set v-eth$UE_NUMBER up +sudo iptables -t nat -A POSTROUTING -s $UE_SUBNET_FIRST_3_OCTETS.0/24 -o $NETWORK_INTEFACE -j MASQUERADE +sudo iptables -A FORWARD -i $NETWORK_INTEFACE -o v-eth$UE_NUMBER -j ACCEPT +sudo iptables -A FORWARD -o $NETWORK_INTEFACE -i v-eth$UE_NUMBER -j ACCEPT +sudo ip netns exec $UE_NAMESPACE ip link set dev lo up +sudo ip netns exec $UE_NAMESPACE ip addr add $UE_SUBNET_FIRST_3_OCTETS.2/24 dev v-$UE_NAMESPACE +sudo ip netns exec $UE_NAMESPACE ip link set v-$UE_NAMESPACE up +sudo ip netns exec $UE_NAMESPACE ip route add default via $UE_SUBNET_FIRST_3_OCTETS.1 diff --git a/OpenAirInterface_Testbed/User_Equipment/is_running.sh b/OpenAirInterface_Testbed/User_Equipment/is_running.sh index 6a3d287..5cd0060 100755 --- a/OpenAirInterface_Testbed/User_Equipment/is_running.sh +++ b/OpenAirInterface_Testbed/User_Equipment/is_running.sh @@ -36,8 +36,26 @@ fi SCRIPT_DIR=$(dirname "$(realpath "$0")") cd "$SCRIPT_DIR" -if pgrep -x "nr-uesoftmodem" >/dev/null; then - echo "User Equipment: RUNNING" +RUNNING_UE_NUMBERS=() + +# Attempt to extract the UE number from the configuration file path +while read -r LINE; do + UE_NUMBER=$(echo "$LINE" | grep -oP "configs/ue\K\d+\.conf" | sed 's/.conf//') + if [[ -n $UE_NUMBER ]]; then + # Add to array only if not already present + if [[ ! " ${RUNNING_UE_NUMBERS[@]} " =~ " ue$UE_NUMBER " ]]; then + RUNNING_UE_NUMBERS+=("ue$UE_NUMBER") + fi + fi +done < <(pgrep -af "nr-uesoftmodem -O " | grep "configs/ue") + +# Check if the UE is running +if [ ${#RUNNING_UE_NUMBERS[@]} -gt 0 ]; then + echo "User Equipment: RUNNING (${RUNNING_UE_NUMBERS[*]})" else - echo "User Equipment: NOT_RUNNING" + if pgrep -x "srsue" >/dev/null; then + echo "User Equipment: RUNNING" + else + echo "User Equipment: NOT_RUNNING" + fi fi diff --git a/OpenAirInterface_Testbed/User_Equipment/run.sh b/OpenAirInterface_Testbed/User_Equipment/run.sh index eea84cf..efcde75 100755 --- a/OpenAirInterface_Testbed/User_Equipment/run.sh +++ b/OpenAirInterface_Testbed/User_Equipment/run.sh @@ -40,23 +40,136 @@ UE_NUMBER=1 if [ "$#" -eq 1 ]; then UE_NUMBER=$1 fi - if ! [[ $UE_NUMBER =~ ^[0-9]+$ ]]; then echo "Error: UE number must be a number." exit 1 fi - if [ $UE_NUMBER -lt 1 ]; then echo "Error: UE number must be greater than or equal to 1." exit 1 fi -if [ ! -f "configs/ue$UE_NUMBER.conf" ]; then - echo "Configuration was not found for srsUE. Please run ./generate_configurations.sh first." +if [ ! -f "configs/ue1.conf" ]; then + echo "Configuration was not found for nr-uesoftmodem. Please run ./generate_configurations.sh first." exit 1 fi -cd "$SCRIPT_DIR/openairinterface5g/cmake_targets/ran_build/build" +# Function to handle graceful shutdown +graceful_shutdown() { + echo "Shutting down UE $UE_NUMBER gracefully..." + ./stop.sh + exit +} +trap graceful_shutdown SIGINT + +# Function to update or add configuration properties in .conf files, considering sections and uncommenting if needed +update_conf() { + echo "update_conf($1, $2, $3)" + local FILE_PATH="$1" + local PROPERTY="$2" + local VALUE="$3" + + # Check if the property exists in the file, and update or append it accordingly + if grep -q "^\s*$PROPERTY\s*=" "$FILE_PATH"; then + # Update existing property's value + sed -i "s|^\(\s*$PROPERTY\s*=\).*|\1 $VALUE;|" "$FILE_PATH" + else + # Append new property-value pair if it does not exist + echo "$PROPERTY = $VALUE;" >>"$FILE_PATH" + fi +} + +# Function to comment out a line in a file +comment_out() { + local FILE_PATH="$1" + local STRING="$2" + sed -i "s|^\(\s*\)$STRING|#\1$STRING|" "$FILE_PATH" +} + +UE_CONF_PATH="configs/ue$UE_NUMBER.conf" + +if [ ! -f "$UE_CONF_PATH" ]; then + echo "Configuration file for UE $UE_NUMBER not found, creating..." + cp openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.conf "$UE_CONF_PATH" + + UE_OPC="63BFA50EE6523365FF14C1F45F88737D" + UE_APN="srsapn" + UE_TX_PORT=2001 + UE_RX_PORT=2000 + if [ $UE_NUMBER -eq 1 ]; then # Following the blueprint for UE 1: https://doi.org/10.6028/NIST.TN.2311 + UE_IMEI="353490069873319" + UE_IMSI="001010123456780" + UE_KEY="00112233445566778899AABBCCDDEEFF" + # UE_TX_PORT=2101 + # UE_RX_PORT=2100 + UE_NAMESPACE="ue1" + + elif [ $UE_NUMBER -eq 2 ]; then # Following the blueprint for UE 2: https://doi.org/10.6028/NIST.TN.2311 + UE_IMEI="353490069873318" + UE_IMSI="001010123456790" + UE_KEY="00112233445566778899AABBCCDDEF00" + # UE_TX_PORT=2201 + # UE_RX_PORT=2200 + UE_NAMESPACE="ue2" + + elif [ $UE_NUMBER -eq 3 ]; then # Following the blueprint for UE 3: https://doi.org/10.6028/NIST.TN.2311 + UE_IMEI="353490069873312" + UE_IMSI="001010123456791" + UE_KEY="00112233445566778899AABBCCDDEF01" + # UE_TX_PORT=2301 + # UE_RX_PORT=2300 + UE_NAMESPACE="ue3" + + elif [ $UE_NUMBER -gt 3 ]; then # Dynamic configurations for UE 4 and beyond + UE_OFFSET=$((UE_NUMBER - 3)) + UE_IMEI=$(printf '%d' $((353490069873319 + UE_OFFSET))) + UE_IMSI=$(printf '%015d' $((1010123456781 + UE_OFFSET))) + UE_KEY="00112233445566778$(printf '%X' $((16#899AABBCCDDEF01 + UE_OFFSET)))" + # UE_TX_PORT="$((23 + $UE_OFFSET))01" + # UE_RX_PORT="$((23 + $UE_OFFSET))00" + UE_NAMESPACE="ue$UE_NUMBER" + fi -# Code from (https://github.com/OPENAIRINTERFACE/openairinterface5g/blob/develop/radio/rfsimulator/README.md#5g-case): -sudo ./nr-uesoftmodem -O "$SCRIPT_DIR/configs/ue$UE_NUMBER.conf" --rfsim --rfsimulator.serveraddr 127.0.0.1 -r 106 --numerology 1 --band 78 -C 3619200000 + # Ensure that the beginning of the IMSI is the correct PLMN + if [ ! -z "$PLMN" ]; then + PLMN_LENGTH=${#PLMN} + UE_IMSI="${PLMN}${UE_IMSI:$PLMN_LENGTH}" + fi + + update_conf "configs/ue$UE_NUMBER.conf" "imsi" "\"$UE_IMSI\"" + update_conf "configs/ue$UE_NUMBER.conf" "key" "\"$UE_KEY\"" + update_conf "configs/ue$UE_NUMBER.conf" "opc" "\"$UE_OPC\"" + update_conf "configs/ue$UE_NUMBER.conf" "dnn" "\"$UE_APN\"" + update_conf "configs/ue$UE_NUMBER.conf" "nssai_sst" "1" + update_conf "configs/ue$UE_NUMBER.conf" "nssai_sd" "0xFFFFFF" + comment_out "configs/ue$UE_NUMBER.conf" "nssai_sd" +fi + +if [ $UE_NUMBER -gt 3 ]; then + echo "UE is greater than registered subscribers, registering UE $UE_NUMBER..." + REGISTRATION_DIR=$(dirname "$SCRIPT_DIR")/5G_Core_Network/install_scripts + "$REGISTRATION_DIR/./register_subscriber.sh" --imsi "$UE_IMSI" --key "$UE_KEY" --opc "$UE_OPC" --apn "$UE_APN" +fi + +HOSTNAME_IP=$(hostname -I | awk '{print $1}') + +if ./is_running.sh | grep -q "ue$UE_NUMBER"; then + echo "Already running ue$UE_NUMBER." +else + if [ ! -f "$UE_CONF_PATH" ]; then + echo "Configuration was not found for nr-uesoftmodem. Please run ./generate_configurations.sh first." + exit 1 + fi + mkdir -p logs + >logs/ue${UE_NUMBER}_stdout.txt + echo "Starting nr-uesoftmodem (ue$UE_NUMBER)..." + + # Ensure the following command runs with sudo privileges + sudo ls >/dev/null + + # Give the UE its own network namespace and configure it to access the host network + sudo ./install_scripts/setup_ue_namespace.sh "$UE_NUMBER" + + cd "$SCRIPT_DIR/openairinterface5g/cmake_targets/ran_build/build" + sudo ./nr-uesoftmodem -O "../../../../configs/ue$UE_NUMBER.conf" --rfsim --rfsimulator.serveraddr $HOSTNAME_IP -r 106 --numerology 1 --band 78 -C 3619200000 +fi diff --git a/OpenAirInterface_Testbed/User_Equipment/run_background.sh b/OpenAirInterface_Testbed/User_Equipment/run_background.sh index 009b182..c6a06b0 100755 --- a/OpenAirInterface_Testbed/User_Equipment/run_background.sh +++ b/OpenAirInterface_Testbed/User_Equipment/run_background.sh @@ -40,30 +40,28 @@ UE_NUMBER=1 if [ "$#" -eq 1 ]; then UE_NUMBER=$1 fi - if ! [[ $UE_NUMBER =~ ^[0-9]+$ ]]; then echo "Error: UE number must be a number." exit 1 fi - if [ $UE_NUMBER -lt 1 ]; then echo "Error: UE number must be greater than or equal to 1." exit 1 fi -if [ ! -f "configs/ue$UE_NUMBER.conf" ]; then +if [ ! -f "configs/ue1.conf" ]; then echo "Configuration was not found for srsUE. Please run ./generate_configurations.sh first." exit 1 fi echo "Starting User Equipment in background..." mkdir -p logs -sudo chown -R $USER:$USER logs >logs/ue${UE_NUMBER}_stdout.txt -cd "$SCRIPT_DIR/openairinterface5g/cmake_targets/ran_build/build" -sudo setsid bash -c "stdbuf -oL -eL ./nr-uesoftmodem -O "$SCRIPT_DIR/configs/ue$UE_NUMBER.conf" --rfsim --rfsimulator.serveraddr 127.0.0.1 -r 106 --numerology 1 --band 78 -C 3619200000 > \"$SCRIPT_DIR/logs/ue${UE_NUMBER}_stdout.txt\" 2>&1" /dev/null + +sudo setsid bash -c "stdbuf -oL -eL \"$SCRIPT_DIR/run.sh\" $UE_NUMBER > logs/ue${UE_NUMBER}_stdout.txt 2>&1" /dev/null; then echo "Package \"coreutils\" not found, installing..." sudo apt-get install -y coreutils @@ -36,34 +39,75 @@ fi SCRIPT_DIR=$(dirname "$(realpath "$0")") cd "$SCRIPT_DIR" +UE_NUMBER="" +if [ "$#" -eq 1 ]; then + UE_NUMBER=$1 + if ! [[ $UE_NUMBER =~ ^[0-9]+$ ]]; then + echo "Error: UE number must be a number." + exit 1 + fi + if [ $UE_NUMBER -lt 1 ]; then + echo "Error: UE number must be greater than or equal to 1." + exit 1 + fi +fi + # Check if the UE is already stopped if $(./is_running.sh | grep -q "User Equipment: NOT_RUNNING"); then ./is_running.sh exit 0 fi +# Prevent the subsequent commands from requiring credential input +sudo ls >/dev/null 2>&1 + # Send a graceful shutdown signal to the UE process -sudo pkill -f "nr-uesoftmodem" >/dev/null 2>&1 & +if [ -z "$UE_NUMBER" ]; then + sudo pkill -f "nr-uesoftmodem" >/dev/null 2>&1 & + # Revert all running UE namespaces if no UE number is provided + RUNNING_UE=$(./is_running.sh | grep -oP '(?<=User Equipment: RUNNING \().*(?=\))') + for UE in $RUNNING_UE; do + UE_NUM=$(echo "$UE" | grep -oP '(?<=ue)\d+') + sudo ./install_scripts/revert_ue_namespace.sh "$UE_NUM" &>/dev/null + done + stty sane +else + sudo pkill -f "nr-uesoftmodem -O ../../../../configs/ue$UE_NUMBER.conf" >/dev/null 2>&1 & + sudo ./install_scripts/revert_ue_namespace.sh $UE_NUMBER +fi # Wait for the process to terminate gracefully COUNT=0 -MAX_COUNT=10 +MAX_COUNT=5 sleep 1 while [ $COUNT -lt $MAX_COUNT ]; do IS_RUNNING=$(./is_running.sh) echo "$IS_RUNNING ($COUNT / $MAX_COUNT)" - if echo "$IS_RUNNING" | grep -q "User Equipment: NOT_RUNNING"; then - echo "The User Equipment has stopped gracefully." - ./is_running.sh - exit 0 + if [ -z "$UE_NUMBER" ]; then + if echo "$IS_RUNNING" | grep -q "User Equipment: NOT_RUNNING"; then + echo "The User Equipment has stopped gracefully." + ./is_running.sh + exit 0 + fi + else + if ! echo "$IS_RUNNING" | grep -q "ue$UE_NUMBER"; then + echo "The User Equipment $UE_NUMBER has stopped gracefully." + ./is_running.sh + exit 0 + fi fi COUNT=$((COUNT + 1)) sleep 2 done # If the process is still running after 20 seconds, send a forceful kill signal -echo "The User Equipment did not stop in time, sending forceful kill signal..." -sudo pkill -9 -f "nr-uesoftmodem" >/dev/null 2>&1 & +if [ -z "$UE_NUMBER" ]; then + echo "The User Equipment did not stop in time, sending forceful kill signal..." + sudo pkill -9 -f "nr-uesoftmodem" >/dev/null 2>&1 & +else + echo "The User Equipment $UE_NUMBER did not stop in time, sending forceful kill signal..." + sudo pkill -9 -f "nr-uesoftmodem -O ../../../../configs/ue$UE_NUMBER.conf" >/dev/null 2>&1 & +fi sleep 2 ./is_running.sh diff --git a/OpenAirInterface_Testbed/commit_hashes.json b/OpenAirInterface_Testbed/commit_hashes.json old mode 100755 new mode 100644 index 080ed8d..beb55ca --- a/OpenAirInterface_Testbed/commit_hashes.json +++ b/OpenAirInterface_Testbed/commit_hashes.json @@ -1,5 +1,5 @@ { - "https://gitlab.eurecom.fr/oai/openairinterface5g.git": ["develop", "0515cf98b3a176d59a37f071977150abd2c6b37a"], - "https://github.com/swig/swig.git": ["master", "138507624bd1e0de72adff1b12a788e74133f94e"], - "https://gitlab.eurecom.fr/mosaic5g/flexric.git": ["dev", "beabdd072ca9e381d4d27c9fbc6bb19382817489"] + "https://gitlab.eurecom.fr/oai/openairinterface5g.git": ["develop", "acb982d0bd96b01dee84aea730f01dfff73875d0"], + "https://github.com/swig/swig.git": ["master", "01bf5808dd44516a7937afd4fb5438c026d937ac"], + "https://gitlab.eurecom.fr/mosaic5g/flexric.git": ["dev", "596a1ae67309618a74e09e56dff9a723ea7d99c5"] } diff --git a/OpenAirInterface_Testbed/full_install.sh b/OpenAirInterface_Testbed/full_install.sh index 36b6450..6bd7e1f 100755 --- a/OpenAirInterface_Testbed/full_install.sh +++ b/OpenAirInterface_Testbed/full_install.sh @@ -101,17 +101,17 @@ if [[ "$OPEN5GS_INSTALLED" = true || "$GNODEB_INSTALLED" = true || "$UE_INSTALLE sudo rm -rf Next_Generation_Node_B/logs sudo rm -rf Next_Generation_Node_B/configs sudo rm -rf Next_Generation_Node_B/install_time.txt - sudo rm -rf RAN_Intelligent_Controllers/Near-Real-Time-RIC/flexric - sudo rm -rf RAN_Intelligent_Controllers/Near-Real-Time-RIC/swig - sudo rm -rf RAN_Intelligent_Controllers/Near-Real-Time-RIC/logs - sudo rm -rf RAN_Intelligent_Controllers/Near-Real-Time-RIC/configs - sudo rm -rf RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_time.txt + sudo rm -rf RAN_Intelligent_Controllers/Flexible-RIC/flexric + sudo rm -rf RAN_Intelligent_Controllers/Flexible-RIC/swig + sudo rm -rf RAN_Intelligent_Controllers/Flexible-RIC/logs + sudo rm -rf RAN_Intelligent_Controllers/Flexible-RIC/configs + sudo rm -rf RAN_Intelligent_Controllers/Flexible-RIC/install_time.txt echo "Successfully removed previous installations." fi fi # Ensure backward compatibility with previous installations -# sudo ./Additional_Scripts/migrate_to_new_version.sh +sudo ./../Additional_Scripts/migrate_to_new_version.sh echo echo @@ -154,12 +154,12 @@ cd .. echo echo echo "################################################################################" -echo "# Installing Near Real-Time RAN Intelligent Controller... #" +echo "# Installing Near-Real-Time RAN Intelligent Controller... #" echo "################################################################################" echo echo -cd RAN_Intelligent_Controllers/Near-Real-Time-RIC +cd RAN_Intelligent_Controllers/Flexible-RIC ./full_install.sh cd ../.. @@ -178,7 +178,7 @@ cd ../User_Equipment ./generate_configurations.sh cd ../Next_Generation_Node_B ./generate_configurations.sh -cd ../RAN_Intelligent_Controllers/Near-Real-Time-RIC +cd ../RAN_Intelligent_Controllers/Flexible-RIC ./generate_configurations.sh cd ../.. diff --git a/OpenAirInterface_Testbed/full_uninstall.sh b/OpenAirInterface_Testbed/full_uninstall.sh new file mode 100755 index 0000000..98967ec --- /dev/null +++ b/OpenAirInterface_Testbed/full_uninstall.sh @@ -0,0 +1,93 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Exit immediately if a command fails +set -e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +cd "$SCRIPT_DIR" + +echo "Stopping 5G Core Network, OpenAirInterface components, and FlexRIC..." +./stop.sh + +echo +echo +echo "################################################################################" +echo "# Uninstalling 5G Core... #" +echo "################################################################################" +echo +echo + +cd 5G_Core_Network +./full_uninstall.sh + +cd .. + +echo +echo +echo "################################################################################" +echo "# Uninstalling User Equipment... #" +echo "################################################################################" +echo +echo + +cd User_Equipment +./full_uninstall.sh + +cd .. + +echo +echo +echo "################################################################################" +echo "# Uninstalling Next Generation Node B... #" +echo "################################################################################" +echo +echo + +cd Next_Generation_Node_B +./full_uninstall.sh + +cd .. + +echo +echo +echo "################################################################################" +echo "# Uninstalling Near-Real-Time RAN Intelligent Controller... #" +echo "################################################################################" +echo +echo + +cd RAN_Intelligent_Controllers/Flexible-RIC +./full_uninstall.sh diff --git a/OpenAirInterface_Testbed/generate_configurations.sh b/OpenAirInterface_Testbed/generate_configurations.sh index d44bd59..e1984a7 100755 --- a/OpenAirInterface_Testbed/generate_configurations.sh +++ b/OpenAirInterface_Testbed/generate_configurations.sh @@ -58,6 +58,6 @@ cd .. echo echo "Generating Configuration for FlexRIC..." -cd RAN_Intelligent_Controllers/Near-Real-Time-RIC +cd RAN_Intelligent_Controllers/Flexible-RIC ./generate_configurations.sh cd ../.. diff --git a/OpenAirInterface_Testbed/is_running.sh b/OpenAirInterface_Testbed/is_running.sh index ed0f879..883204c 100755 --- a/OpenAirInterface_Testbed/is_running.sh +++ b/OpenAirInterface_Testbed/is_running.sh @@ -49,7 +49,7 @@ cd .. echo echo "Checking status of FlexRIC..." -cd RAN_Intelligent_Controllers/Near-Real-Time-RIC +cd RAN_Intelligent_Controllers/Flexible-RIC ./is_running.sh cd ../.. diff --git a/OpenAirInterface_Testbed/run.sh b/OpenAirInterface_Testbed/run.sh index ad675c1..10f3a20 100755 --- a/OpenAirInterface_Testbed/run.sh +++ b/OpenAirInterface_Testbed/run.sh @@ -37,7 +37,7 @@ SCRIPT_DIR=$(dirname "$(realpath "$0")") cd "$SCRIPT_DIR" # Upon exit, gracefully stop all components and fix console in case it breaks -trap './stop.sh; stty sane; exit' SIGINT SIGTERM +trap 'trap - EXIT SIGINT SIGTERM; echo "################################# STOPPING... #################################"; "$SCRIPT_DIR/./stop.sh"; stty sane; exit' EXIT SIGINT SIGTERM echo "Running 5G Core components..." cd 5G_Core_Network @@ -46,14 +46,19 @@ cd .. echo echo "Running FlexRIC..." -cd RAN_Intelligent_Controllers/Near-Real-Time-RIC +cd RAN_Intelligent_Controllers/Flexible-RIC ./run_background.sh + +if $(./is_running.sh | grep -q "NOT_RUNNING"); then + echo "Error starting FlexRIC." + exit 1 +fi cd ../.. echo echo -n "Waiting for AMF to be ready" attempt=0 -while [ ! -f 5G_Core_Network/logs/amf.txt ] || ! grep -q "NF registered" 5G_Core_Network/logs/amf.txt; do +while [ ! -f 5G_Core_Network/logs/amf.log ] || ! grep -q "NF registered" 5G_Core_Network/logs/amf.log; do echo -n "." sleep 0.5 attempt=$((attempt + 1)) @@ -68,10 +73,54 @@ echo echo "Running gNodeB..." cd Next_Generation_Node_B ./run_background.sh + +echo -en "\nWaiting for gNodeB to be ready" +ATTEMPT=0 +while [ ! -f logs/gnb_stdout.txt ] || ! grep -q "TYPE TO TERMINATE" logs/gnb_stdout.txt; do + echo -n "." + sleep 0.5 + ATTEMPT=$((ATTEMPT + 1)) + if [ $ATTEMPT -ge 120 ]; then + echo "gNodeB did not start after 60 seconds, exiting..." + exit 1 + fi + if grep -q "TYPE TO TERMINATE" logs/gnb_stdout.txt; then + break + elif $(./is_running.sh | grep -q "NOT_RUNNING"); then + echo "Error starting gNodeB. Check logs/gnb_stdout.txt for more information." + exit 1 + fi +done +echo -e "\ngNodeB is ready." cd .. echo echo "Running User Equipment..." cd User_Equipment ./run_background.sh + +echo -en "\nWaiting for UE to be ready" +ATTEMPT=0 +while [ ! -f logs/ue1_stdout.txt ] || ! grep -q "TYPE TO TERMINATE" logs/ue1_stdout.txt; do + echo -n "." + sleep 0.5 + ATTEMPT=$((ATTEMPT + 1)) + if [ $ATTEMPT -ge 120 ]; then + echo "UE did not start after 60 seconds, exiting..." + exit 1 + fi + if grep -q "TYPE TO TERMINATE" logs/ue1_stdout.txt; then + break + elif $(./is_running.sh | grep -q "NOT_RUNNING"); then + echo "Error starting UE. Check logs/ue1_stdout.txt for more information." + exit 1 + fi +done +echo -e "\nUE is ready." cd .. + +echo +echo "Running FlexRIC..." +cd RAN_Intelligent_Controllers/Flexible-RIC +./run_xapp_kpm_moni.sh +cd ../.. diff --git a/OpenAirInterface_Testbed/run_with_grafana_dashboard.sh b/OpenAirInterface_Testbed/run_with_grafana_dashboard.sh new file mode 100755 index 0000000..9a0e9cf --- /dev/null +++ b/OpenAirInterface_Testbed/run_with_grafana_dashboard.sh @@ -0,0 +1,131 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +cd "$SCRIPT_DIR" + +# Upon exit, gracefully stop all components and fix console in case it breaks +trap 'trap - EXIT SIGINT SIGTERM; echo "################################# STOPPING... #################################"; "$SCRIPT_DIR/RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts/./stop_grafana.sh"; "$SCRIPT_DIR/./stop.sh"; stty sane; exit' EXIT SIGINT SIGTERM + +echo "Running 5G Core components..." +cd 5G_Core_Network +./run.sh +cd .. + +echo +echo "Running FlexRIC..." +cd RAN_Intelligent_Controllers/Flexible-RIC +./run_background.sh +if $(./is_running.sh | grep -q "NOT_RUNNING"); then + echo "Error starting FlexRIC." + exit 1 +fi +cd ../.. + +echo +echo -n "Waiting for AMF to be ready" +attempt=0 +while [ ! -f 5G_Core_Network/logs/amf.log ] || ! grep -q "NF registered" 5G_Core_Network/logs/amf.log; do + echo -n "." + sleep 0.5 + attempt=$((attempt + 1)) + if [ $attempt -ge 120 ]; then + echo "5G Core components did not start after 60 seconds, exiting..." + exit 1 + fi +done +echo -e "\nAMF is ready." + +echo +echo "Running gNodeB..." +cd Next_Generation_Node_B +./run_background.sh + +echo -en "\nWaiting for gNodeB to be ready" +ATTEMPT=0 +while [ ! -f logs/gnb_stdout.txt ] || ! grep -q "TYPE TO TERMINATE" logs/gnb_stdout.txt; do + echo -n "." + sleep 0.5 + ATTEMPT=$((ATTEMPT + 1)) + if [ $ATTEMPT -ge 120 ]; then + echo "gNodeB did not start after 60 seconds, exiting..." + exit 1 + fi + if grep -q "TYPE TO TERMINATE" logs/gnb_stdout.txt; then + break + elif $(./is_running.sh | grep -q "NOT_RUNNING"); then + echo "Error starting gNodeB. Check logs/gnb_stdout.txt for more information." + exit 1 + fi +done +echo -e "\ngNodeB is ready." +cd .. + +echo +echo "Running User Equipment..." +cd User_Equipment +./run_background.sh + +echo -en "\nWaiting for UE to be ready" +ATTEMPT=0 +while [ ! -f logs/ue1_stdout.txt ] || ! grep -q "TYPE TO TERMINATE" logs/ue1_stdout.txt; do + echo -n "." + sleep 0.5 + ATTEMPT=$((ATTEMPT + 1)) + if [ $ATTEMPT -ge 120 ]; then + echo "UE did not start after 60 seconds, exiting..." + exit 1 + fi + if grep -q "TYPE TO TERMINATE" logs/ue1_stdout.txt; then + break + elif $(./is_running.sh | grep -q "NOT_RUNNING"); then + echo "Error starting UE. Check logs/ue1_stdout.txt for more information." + exit 1 + fi +done +echo -e "\nUE is ready." +cd .. + +echo +echo "Running FlexRIC..." +cd RAN_Intelligent_Controllers/Flexible-RIC/additional_scripts + +# Send metrics to CSV (Grafana dashboard provided) +./start_grafana_with_csv_xapp_kpm_moni.sh + +# Send metrics to InfluxDB (Grafana dashboard not provided) +#./start_grafana_with_influxdb_xapp_kpm_moni.sh + +cd ../.. diff --git a/OpenAirInterface_Testbed/stop.sh b/OpenAirInterface_Testbed/stop.sh index 0bf4644..bdc314f 100755 --- a/OpenAirInterface_Testbed/stop.sh +++ b/OpenAirInterface_Testbed/stop.sh @@ -49,8 +49,9 @@ cd .. echo echo "Stopping FlexRIC components..." -cd RAN_Intelligent_Controllers/Near-Real-Time-RIC +cd RAN_Intelligent_Controllers/Flexible-RIC sudo ./stop.sh +sudo ./additional_scripts/stop_grafana.sh &>/dev/null cd ../.. echo diff --git a/RAN_Intelligent_Controllers/Flexible-RIC b/RAN_Intelligent_Controllers/Flexible-RIC new file mode 120000 index 0000000..5da5491 --- /dev/null +++ b/RAN_Intelligent_Controllers/Flexible-RIC @@ -0,0 +1 @@ +../OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC \ No newline at end of file diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/.gitignore b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/.gitignore old mode 100755 new mode 100644 index 3405a1a..f58e42e --- a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/.gitignore +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/.gitignore @@ -10,3 +10,4 @@ /xApps/ influxdb_auth_token.json install_time.txt +!install_patch_files/ diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/README.md b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/README.md old mode 100755 new mode 100644 index a9517b0..47a0ae2 --- a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/README.md +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/README.md @@ -16,8 +16,49 @@ This automation tool is based on the K-Release of the Near-RT RIC. More informat - **Start the Near-RT RIC**: While the Kubernetes pods start automatically on system boot, the entire process of ensuring that the components are running, connected, and that the xApp is deployed can be re-executed with `./run.sh`. - **Status**: Check on a pod's status with `kubectl get pods -A`, or by running the interactive pod manager (K9s) with `k9s -A` or `./start_k9s.sh`. - **Logs**: From within K9s, use the `Arrow Keys` to highlight a pod, `Enter` to view the logs for the pod, `w` to wrap text, `Esc` to go back, `Ctrl+k` to restart a pod that isn't responding, and `s` to open a command line shell in the pod. +- **Uninstall**: Remove the Near-RT RIC with `./full_uninstall.sh`. + +
+ View the list of Kubernetes pods running after the Near-RT RIC is installed. +
+ +```console +$ kubectl get pods -A +NAMESPACE NAME READY STATUS +kube-flannel kube-flannel-ds-rfsxv 1/1 Running +kube-system coredns-668d6bf9bc-hzjjt 1/1 Running +kube-system coredns-668d6bf9bc-pql2s 1/1 Running +kube-system etcd-vmware-022 1/1 Running +kube-system kube-apiserver-vmware-022 1/1 Running +kube-system kube-controller-manager-vmware-022 1/1 Running +kube-system kube-proxy-7c6hq 1/1 Running +kube-system kube-scheduler-vmware-022 1/1 Running +ricinfra deployment-tiller-ricxapp-84b87b8c64-tjvkx 1/1 Running +ricplt deployment-ricplt-a1mediator-78f79cbb6b-rchrz 1/1 Running +ricplt deployment-ricplt-alarmmanager-5b49476676-sfdfn 1/1 Running +ricplt deployment-ricplt-appmgr-5564b65869-zq5qt 1/1 Running +ricplt deployment-ricplt-e2mgr-9b6b8f99f-g98jt 1/1 Running +ricplt deployment-ricplt-e2term-alpha-f8f7d7855-zwdkp 1/1 Running +ricplt deployment-ricplt-o1mediator-bf4fb5758-5dp78 1/1 Running +ricplt deployment-ricplt-rtmgr-657457c4bb-5kk4j 1/1 Running +ricplt deployment-ricplt-submgr-858956fbdc-zbbp8 1/1 Running +ricplt deployment-ricplt-vespamgr-848f7bb874-l4kzc 1/1 Running +ricplt r4-infrastructure-kong-79d7985749-tfsb2 2/2 Running +ricplt r4-infrastructure-prometheus-alertmanager-b9cc56766-gqmt2 2/2 Running +ricplt r4-infrastructure-prometheus-server-6476958975-mtkz9 1/1 Running +ricplt statefulset-ricplt-dbaas-server-0 1/1 Running +ricxapp ricxapp-hw-go-c84579888-rtjn9 1/1 Running +``` + + + _Note: Upon installing an xApp requiring InfluxDB, the pod "r4-influxdb-influxdb2-0" will also be installed._ + +
+ +--- ## Installing an xApp + By default, the Hello World Go xApp (hw-go) is installed automatically. Additional xApps can be installed to extend the functionality of the Near-RT RIC. For convenience, installation scripts for the following xApps are included: - **KPI Monitoring xApp (kpimon)**: @@ -25,18 +66,21 @@ By default, the Hello World Go xApp (hw-go) is installed automatically. Addition - Patched to connect to the InfluxDB pod and write metrics to its database. - Upon initialization, the xApp will only connect to pre-existing E2 nodes, therefore, you can restart the xApp by running the install script again which will establish connections to any new E2 nodes. - Metrics will be stored in the InfluxDB pod under `bucket=kpimon, org=influxdata`. Access this data by opening the InfluxDB Client with `./additional_scripts/open_influxdb_client_shell.sh`. + - Information about the xApp's debugging and usage can be found at [[6]][abdul-kpimon-go]. - More information can be found in the documentation [[4]][kpimon-go-docs] and code [[5]][kpimon-go-code]. - - For information about using the KPI monitor, please refer to [[6]][abdul-kpimon-go]. - **5G Cell Anomaly Detection xApp (ad-cell)**: - Install with `./additional_scripts/install_xapp_5g_cell_anomaly_detection.sh`. + - As a prerequisite, the database must contain a sufficient amount of measurements. - More information can be found in the documentation [[7]][ad-cell-docs] and code [[8]][ad-cell-code]. - **Anomaly Detection xApp (ad)**: - Install with `./additional_scripts/install_xapp_anomaly_detection.sh`. - - Patched to support InfluxDB version 2.X instead of InfluxDB 1.X. + - Patched to support InfluxDB version 2._X_ instead of InfluxDB 1._X_. + - As a prerequisite, the database must contain a sufficient amount of measurements. - More information can be found in the documentation [[9]][ad-docs] and code [[10]][ad-code]. - **Quality of Experience Predictor xApp (qp)**: - Install with `./additional_scripts/install_xapp_qoe_predictor.sh`. - - Patched to support InfluxDB version 2.X instead of InfluxDB 1.X. + - Patched to support InfluxDB version 2._X_ instead of InfluxDB 1._X_. + - As a prerequisite, the database must contain a sufficient amount of measurements. - More information can be found in the documentation [[11]][qp-docs] and code [[12]][qp-code]. - **RIC Control xApp (rc)**: - Install with `./additional_scripts/install_xapp_ric_control.sh`. @@ -52,9 +96,47 @@ By default, the Hello World Go xApp (hw-go) is installed automatically. Addition - More information can be found in the code [[18]][hw-rust-code]. ## Uninstalling an xApp + To uninstall an xApp, run `./additional_scripts/uninstall_an_xapp.sh` which will prompt the user to select an xApp to uninstall. Alternatively, xApps can be uninstalled manually by fetching the list of xApps with `dms_cli get_charts_list` and uninstalling an xApp with `dms_cli uninstall "NAME_OF_XAPP" ricxapp`. +## Migration to Cilium + +The cluster is installed with Flannel as the default network plugin. There are several benefits of migrating to a security-enhanced network plugin like Cilium [[19]][cilium-io], for example, to monitor and regulate the network flows going in to and out of each pod using Cilium Hubble [[20]][cilium-hubble]. By default, pods can communicate with addresses outside the namespace (including the internet). Restricting this allows for better security and monitoring of the network flows. The following steps can be used to migrate the cluster to Cilium and apply policies that restrict such communications. + +- **Install Cilium and Migrate Cluster Nodes**: Run `./additional_scripts/install_cilium_and_migrate_nodes.sh` to install Cilium and migrate each of the pods from the current network plugin to Cilium, then apply policies that restrict the pods from communicating with addresses outside the namespace. + - For debugging purposes, the following files are generated in `$HOME/.kube/`: + - `cilium-values-migration.yaml`: Contains the Cilium configuration values during migration. + - `cilium-values-initial.yaml`: Contains the initial Cilium configuration values. + - `cilium-values-final.yaml`: Contains the final Cilium configuration values. +- **Check Cilium Status**: Run `./additional_scripts/cilium_status.sh` to verify the status of Cilium. All indicators should display green. +- **List Cilium Policies**: Run `./additional_scripts/cilium_list_policies.sh` to list currently-active Cilium policies. + - By default, the two policies are applied: `isolate-ric-communication` and `isolate-ricxapp-communication`. Both are defined in the YAML file: `$HOME/.kube/cilium-policy.yaml`. +- **Disable Policies**: Run `./additional_scripts/cilium_disable_policies.sh` to disable the currently-active policies. After running the script, pods will have restored internet access. +- **Enable Policies**: Run `./additional_scripts/cilium_enable_policies.sh` to re-enable the policies defined in `$HOME/.kube/cilium-policy.yaml`. +- **Check Policy Enforcement**: Run `./additional_scripts/cilium_check_enforcement.sh` to check which pod labels are enforced by the policies. +- **Visualize and Capture Network Flows**: Hubble can be used to monitor the network flows of the pods. + - Run `./additional_scripts/hubble_capture.sh` to capture the network flows. The output will be saved to `logs/hubble_captured_flows.csv` with the following columns: + - Timestamp (readable) + - UNIX Epoch (seconds) + - Summary + - Is Reply + - Source IP + - Destination IP + - Source Port + - Destination Port + - Source Pod + - Destination Pod + - Source Namespace + - Destination Namespace + - Protocol + - Layer 4 + - Run `./additional_scripts/hubble_visualize.sh` to visualize the network flows using the Hubble UI. + +

+ Hubble UI showing network flows +

+ ## References 1. Working Group 3: Near-Real-time RAN Intelligent Controller and E2 Interface Workgroup. O-RAN Alliance. [https://public.o-ran.org/display/WG3/Introduction][oran-wg3] @@ -75,6 +157,9 @@ Alternatively, xApps can be uninstalled manually by fetching the list of xApps w 16. Traffic Steering xApp project page. O-RAN Software Community. [https://github.com/o-ran-sc/ric-app-ts][trafficxapp-code] 17. HW Python xApp project page. O-RAN Software Community. [https://github.com/o-ran-sc/ric-app-hw-python][hw-python-code] 18. HW Rust xApp project page. O-RAN Software Community. [https://github.com/o-ran-sc/ric-app-hw-rust][hw-rust-code] +19. eBPF-based Networking, Observability, Security. Cilium. [https://cilium.io][cilium-io] +20. Hubble - Network, Service & Security Observability for Kubernetes using eBPF. Hubble. [https://cilium.io/hubble][cilium-hubble] + [oran-wg3]: https://public.o-ran.org/display/WG3/Introduction @@ -95,3 +180,5 @@ Alternatively, xApps can be uninstalled manually by fetching the list of xApps w [trafficxapp-docs]: https://docs.o-ran-sc.org/projects/o-ran-sc-ric-app-ts/en/latest/user-guide.html [hw-python-code]: https://github.com/o-ran-sc/ric-app-hw-python [hw-rust-code]: https://github.com/o-ran-sc/ric-app-hw-rust +[cilium-io]: https://cilium.io +[cilium-hubble]: https://cilium.io/hubble diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_check_enforcement.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_check_enforcement.sh new file mode 100755 index 0000000..04a52ad --- /dev/null +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_check_enforcement.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +set -e +set -x + +echo "# Script: $(realpath $0)..." + +kubectl exec -n kube-system -it $(kubectl get pods -n kube-system -l k8s-app=cilium -o jsonpath='{.items[0].metadata.name}') -- cilium endpoint list diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_disable_policies.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_disable_policies.sh new file mode 100755 index 0000000..28f9f50 --- /dev/null +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_disable_policies.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +echo "# Script: $(realpath $0)..." + +# Read policy names and namespaces into arrays +read -a POLICY_NAMES <<<$(kubectl get cnp --all-namespaces -o jsonpath='{.items[*].metadata.name}') +read -a POLICY_NAMESPACES <<<$(kubectl get cnp --all-namespaces -o jsonpath='{.items[*].metadata.namespace}') + +# Loop through the arrays using indices +for i in "${!POLICY_NAMES[@]}"; do + POLICY="${POLICY_NAMES[$i]}" + NAMESPACE="${POLICY_NAMESPACES[$i]}" + echo "Deleting policy $POLICY in namespace $NAMESPACE..." + kubectl delete cnp "$POLICY" -n "$NAMESPACE" +done + +echo +echo "Cilium policies have been deleted. Run ./cilium_enable_policies.sh to re-enable them." diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_enable_policies.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_enable_policies.sh new file mode 100755 index 0000000..6d493c8 --- /dev/null +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_enable_policies.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +set -e + +echo "# Script: $(realpath $0)..." + +CILIUM_POLICY_FILE="$HOME/.kube/cilium-policy.yaml" + +echo +echo "The Cilium policy is located at: $CILIUM_POLICY_FILE" + +if ! kubectl apply -f $CILIUM_POLICY_FILE; then + echo "Error: Failed to apply Cilium NetworkPolicy. Please check the Cilium logs for errors." + exit 1 +fi + +echo +echo "Cilium policies have been re-enabled." diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_list_policies.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_list_policies.sh new file mode 100755 index 0000000..75bdd5f --- /dev/null +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_list_policies.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +set -e + +echo "# Script: $(realpath $0)..." + +kubectl get cnp --all-namespaces diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_status.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_status.sh new file mode 100755 index 0000000..fb319f0 --- /dev/null +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/cilium_status.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +set -e + +echo "# Script: $(realpath $0)..." + +kubectl exec -n kube-system -it $(kubectl get pods -n kube-system -l k8s-app=cilium -o jsonpath='{.items[0].metadata.name}') -- cilium status diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/hubble_capture.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/hubble_capture.sh new file mode 100755 index 0000000..6984b62 --- /dev/null +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/hubble_capture.sh @@ -0,0 +1,110 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +set -e + +echo "# Script: $(realpath $0)..." + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") + +# If command hubble doesn't exist +if ! command -v hubble &>/dev/null; then + echo "Hubble command not found. Installing hubble..." + HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt) + HUBBLE_ARCH=amd64 + if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi + curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum} + sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum + sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin + rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum} + + echo "Waiting for Cilium to be ready..." + until cilium status --wait; do + echo "Continuing to wait for Cilium to be ready..." + sleep 5 + done +fi + +LOG_PATH="$PARENT_DIR/logs/hubble_captured_flows.csv" +mkdir -p "$PARENT_DIR/logs" + +if ! pgrep -f "cilium hubble port-forward" >/dev/null; then + echo "Starting Hubble port-forward..." + cilium hubble port-forward & +fi + +if [ ! -f "$LOG_PATH" ]; then + HEADER="" + HEADER+="Timestamp (readable)," + HEADER+="UNIX Epoch (seconds)," + HEADER+="Summary," + HEADER+="Is Reply," + HEADER+="Source IP," + HEADER+="Destination IP," + HEADER+="Source Port," + HEADER+="Destination Port," + HEADER+="Source Pod," + HEADER+="Destination Pod," + HEADER+="Source Namespace," + HEADER+="Destination Namespace," + HEADER+="Protocol," + HEADER+="Layer 4," + echo "$HEADER" >"$LOG_PATH" +fi + +echo +echo "Starting to Observe Flows (Output File: logs/hubble_captured_flows.csv)..." +#hubble observe --follow -o json | while read -r JSON; do +hubble observe --namespace ricxapp --follow -o json | while read -r JSON; do + TIMESTAMP=$(echo "$JSON" | jq -r '.flow.time') + SECONDS=$(date -d "${TIMESTAMP}" +"%s") + FRACTION=$(echo "${TIMESTAMP}" | awk -F'[.Z]' '{print $2}') + PROTOCOL=$(echo "$JSON" | jq -r '.flow.l4 | keys_unsorted[0]') + LAYER4=$(echo "$JSON" | jq -cr ".flow.l4[\"$PROTOCOL\"]") + + LINE="\"$TIMESTAMP\"," # Timestamp + LINE+="$SECONDS.$FRACTION," # UNIX Epoch (seconds) + LINE+="\"$(echo "$JSON" | jq -cr '.flow.Summary' | sed 's/"/'"'"'/g')\"," # Summary + LINE+="$(echo "$JSON" | jq -r '.flow.is_reply')," # Is Reply + LINE+="$(echo "$JSON" | jq -r '.flow.IP.source')," # Source IP + LINE+="$(echo "$JSON" | jq -r '.flow.IP.destination')," # Destination IP + LINE+="$(echo "$LAYER4" | jq -r '.source_port' | sed 's/null//g')," # Source Port + LINE+="$(echo "$LAYER4" | jq -r '.destination_port' | sed 's/null//g')," # Destination Port + LINE+="$(echo "$JSON" | jq -r '.flow.source.pod_name' | sed 's/null//g')," # Source Pod + LINE+="$(echo "$JSON" | jq -r '.flow.destination.pod_name' | sed 's/null//g')," # Destination Pod + LINE+="$(echo "$JSON" | jq -r '.flow.source.namespace' | sed 's/null//g')," # Source Namespace + LINE+="$(echo "$JSON" | jq -r '.flow.destination.namespace' | sed 's/null//g')," # Destination Namespace + LINE+="\"$PROTOCOL\"," # Protocol + LINE+="\"$(echo "$LAYER4" | sed 's/"/'"'"'/g')\"" + + echo "$LINE" >>"$LOG_PATH" + echo -n "." +done diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/hubble_visualize.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/hubble_visualize.sh new file mode 100755 index 0000000..8b42f99 --- /dev/null +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/hubble_visualize.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +set -e + +echo "# Script: $(realpath $0)..." + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") + +# If command hubble doesn't exist +if ! command -v hubble &>/dev/null; then + echo "Hubble command not found. Installing hubble..." + HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt) + HUBBLE_ARCH=amd64 + if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi + curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum} + sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum + sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin + rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum} +fi + +echo "Waiting for Cilium to be ready..." +until cilium status --wait; do + echo "Continuing to wait for Cilium to be ready..." + sleep 5 +done + +if ! cilium status | grep -q hubble-ui; then + echo "Enabling hubble ui..." + cilium hubble enable --ui + cilium status --wait +fi + +cilium hubble ui diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_cilium_and_migrate_nodes.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_cilium_and_migrate_nodes.sh new file mode 100755 index 0000000..8815669 --- /dev/null +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_cilium_and_migrate_nodes.sh @@ -0,0 +1,424 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +echo "# Script: $(realpath $0)..." + +ENABLE_HUBBLE_LOGGING="true" + +DRAIN_NODES="false" + +echo "Hubble enabled: $ENABLE_HUBBLE_LOGGING" +echo "Drain nodes: $DRAIN_NODES" +echo +echo "This script will install Cilium and migrate all nodes to Cilium for network policy enforcement (replacing the existing network plugin, e.g., Flannel)." +echo "Since this is a disruptive operation, it is recommended to back up your Kubernetes cluster before proceeding." +read -p "Would you like to proceed? (y/n): " -r REPLY + +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Exiting script." + exit 1 +fi + +sudo ls &>/dev/null + +if cilium status &>/dev/null; then + echo "Cilium is already installed. Uninstalling Cilium first..." + cilium uninstall +fi + +CILIUM_CLI_VERSION="latest" # "v0.16.19" +if [ "$CILIUM_CLI_VERSION" = "latest" ]; then + CILIUM_CLI_VERSION=$(curl -s https://api.github.com/repos/cilium/cilium-cli/releases/latest | grep tag_name | cut -d '"' -f 4) +fi +CILIUM_MIGRATION_VALUES_FILE="$HOME/.kube/cilium-values-migration.yaml" +CILIUM_INITIAL_VALUES_FILE="$HOME/.kube/cilium-values-initial.yaml" +CILIUM_FINAL_VALUES_FILE="$HOME/.kube/cilium-values-final.yaml" +if ! command -v cilium &>/dev/null; then + echo "Installing Cilium CLI version ${CILIUM_CLI_VERSION}..." + CLI_ARCH="amd64" + if [ "$(uname -m)" = "aarch64" ]; then + CLI_ARCH="arm64" + fi + DOWNLOAD_URL="https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz" + echo "Cilium CLI Download URL: ${DOWNLOAD_URL}" + curl -L --fail --remote-name "${DOWNLOAD_URL}" + curl -L --fail --remote-name "${DOWNLOAD_URL}.sha256sum" + sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum + sudo tar xzvf cilium-linux-${CLI_ARCH}.tar.gz -C /usr/local/bin + rm cilium-linux-${CLI_ARCH}.tar.gz cilium-linux-${CLI_ARCH}.tar.gz.sha256sum +fi + +cat <$CILIUM_INITIAL_VALUES_FILE + +if ! helm repo list | grep -q "cilium"; then + echo "Adding Cilium Helm repository..." + helm repo add cilium https://helm.cilium.io + helm repo update +fi + +if ! cilium status &>/dev/null; then + CILIUM_HELM_VERSION=$(helm search repo cilium --versions | grep "^cilium/cilium\\s" | head -1 | awk '{print $2}') + echo "Using Cilium Helm version ${CILIUM_HELM_VERSION} for installation..." + + cilium install --version ${CILIUM_HELM_VERSION} --namespace kube-system --values $CILIUM_INITIAL_VALUES_FILE +fi + +until cilium status --wait; do + echo "Continuing to wait for Cilium to be ready..." + sleep 5 +done + +echo +echo "Creating a per-node config to instruct Cilium to take over CNI networking on the node..." +cat <$CILIUM_FINAL_VALUES_FILE + +echo +echo "Diffing initial and final Cilium Helm values..." +diff $CILIUM_INITIAL_VALUES_FILE $CILIUM_FINAL_VALUES_FILE || true + +echo +echo "Upgrading Cilium with final Helm values..." +cilium upgrade --namespace kube-system cilium cilium/cilium --values $CILIUM_FINAL_VALUES_FILE + +kubectl -n kube-system rollout restart daemonset cilium +until cilium status --wait; do + echo "Continuing to wait for Cilium to be ready..." + sleep 5 +done + +if [ "$ENABLE_HUBBLE_LOGGING" = "true" ]; then + # If command hubble doesn't exist, install hubble + if ! command -v hubble &>/dev/null; then + echo "Hubble command not found. Installing hubble..." + HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt) + HUBBLE_ARCH=amd64 + if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi + curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum} + sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum + sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin + rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum} + fi + echo "Enabling hubble..." + cilium hubble enable +fi + +echo +echo "Deleting the per-node configuration..." +kubectl delete -n kube-system ciliumnodeconfig cilium-default + +echo +echo "Migration complete. Removing previous network plugin..." + +# Check for and remove conflicting VXLAN configurations +if ip link show type vxlan | grep -q "flannel.1"; then + echo "Removing conflicting VXLAN configuration..." + kubectl delete daemonset kube-flannel-ds -n kube-flannel + sudo ip link delete flannel.1 + if [ -f /etc/cni/net.d/10-flannel.conflist ]; then + sudo rm -f /etc/cni/net.d/10-flannel.conflist + fi + if [ -f /etc/cni/net.d/10-flannel.conf ]; then + sudo rm -f /etc/cni/net.d/10-flannel.conf + fi + if [ -f /etc/cni/net.d/10-flannel.conflist.cilium_bak ]; then + sudo rm -f /etc/cni/net.d/10-flannel.conflist.cilium_bak + fi + if kubectl get ds -n kube-system cilium &>/dev/null; then + echo "Restarting Cilium DaemonSet..." + kubectl rollout restart daemonset cilium -n kube-system + fi + kubectl rollout restart deployment coredns -n kube-system +fi +echo +echo "Successfully installed Cilium and migrated node to Cilium." + +echo "Ensuring permissions for $USER in ~/.kube directory..." +sudo chown --recursive $USER:$USER ~/.kube + +echo +echo "Deleting all existing CiliumNetworkPolicies..." +kubectl delete cnp --all-namespaces --all || true + +# ----------------------------------------------------------------------------- +# Applying Cilium Policy for RIC Pods +# ----------------------------------------------------------------------------- + +echo +echo "Writing Cilium NetworkPolicy to $CILIUM_POLICY_FILE..." +CILIUM_POLICY_FILE="$HOME/.kube/cilium-policy.yaml" +cat </dev/null 2>&1; then + # Create the Role if it doesn't exist + if [ ! -f "$XAPP_READ_RESTRICTION_FILE" ]; then + echo + echo "Creating xApp read restriction Role file..." + cat </dev/null; then + echo "The InfluxDB pod is not running, installing it..." + ./install_scripts/install_influxdb_pod.sh +fi + if [ "$CHART_REPO_URL" != "http://0.0.0.0:8090" ]; then echo "Registering the Chart Museum URL..." ./install_scripts/register_chart_museum_url.sh diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_anomaly_detection.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_anomaly_detection.sh index 3dc566c..fee3c32 100755 --- a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_anomaly_detection.sh +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_anomaly_detection.sh @@ -43,6 +43,11 @@ cd "$PARENT_DIR" # Run a sudo command every minute to ensure script execution without user interaction ./install_scripts/start_sudo_refresh.sh +if ! kubectl get pods -n ricplt | grep r4-influxdb-influxdb2 &>/dev/null; then + echo "The InfluxDB pod is not running, installing it..." + ./install_scripts/install_influxdb_pod.sh +fi + if [ "$CHART_REPO_URL" != "http://0.0.0.0:8090" ]; then echo "Registering the Chart Museum URL..." ./install_scripts/register_chart_museum_url.sh @@ -150,7 +155,7 @@ if echo "$OUTPUT" | grep -q '"status": "Created"'; then echo "Onboarding successful: status is 'Created'." else echo "Onboarding failed or 'Created' status not found." - #exit 1 + exit 1 fi echo "Checking if namespace 'ricxapp' exists..." diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_kpi_monitor.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_kpi_monitor.sh index 79fce03..e0dfe55 100755 --- a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_kpi_monitor.sh +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_kpi_monitor.sh @@ -43,6 +43,11 @@ cd "$PARENT_DIR" # Run a sudo command every minute to ensure script execution without user interaction ./install_scripts/start_sudo_refresh.sh +if ! kubectl get pods -n ricplt | grep r4-influxdb-influxdb2 &>/dev/null; then + echo "The InfluxDB pod is not running, installing it..." + ./install_scripts/install_influxdb_pod.sh +fi + if [ "$CHART_REPO_URL" != "http://0.0.0.0:8090" ]; then echo "Registering the Chart Museum URL..." ./install_scripts/register_chart_museum_url.sh diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_qoe_predictor.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_qoe_predictor.sh index 5ef0340..38b7ed8 100755 --- a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_qoe_predictor.sh +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_qoe_predictor.sh @@ -43,6 +43,11 @@ cd "$PARENT_DIR" # Run a sudo command every minute to ensure script execution without user interaction ./install_scripts/start_sudo_refresh.sh +if ! kubectl get pods -n ricplt | grep r4-influxdb-influxdb2 &>/dev/null; then + echo "The InfluxDB pod is not running, installing it..." + ./install_scripts/install_influxdb_pod.sh +fi + if [ "$CHART_REPO_URL" != "http://0.0.0.0:8090" ]; then echo "Registering the Chart Museum URL..." ./install_scripts/register_chart_museum_url.sh diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_ric_control.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_ric_control.sh index 186876c..0f56967 100755 --- a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_ric_control.sh +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_ric_control.sh @@ -43,6 +43,11 @@ cd "$PARENT_DIR" # Run a sudo command every minute to ensure script execution without user interaction ./install_scripts/start_sudo_refresh.sh +if ! kubectl get pods -n ricplt | grep r4-influxdb-influxdb2 &>/dev/null; then + echo "The InfluxDB pod is not running, installing it..." + ./install_scripts/install_influxdb_pod.sh +fi + if [ "$CHART_REPO_URL" != "http://0.0.0.0:8090" ]; then echo "Registering the Chart Museum URL..." ./install_scripts/register_chart_museum_url.sh diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_traffic_steering.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_traffic_steering.sh index 596f491..f0aab9d 100755 --- a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_traffic_steering.sh +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/install_xapp_traffic_steering.sh @@ -43,6 +43,11 @@ cd "$PARENT_DIR" # Run a sudo command every minute to ensure script execution without user interaction ./install_scripts/start_sudo_refresh.sh +if ! kubectl get pods -n ricplt | grep r4-influxdb-influxdb2 &>/dev/null; then + echo "The InfluxDB pod is not running, installing it..." + ./install_scripts/install_influxdb_pod.sh +fi + if [ "$CHART_REPO_URL" != "http://0.0.0.0:8090" ]; then echo "Registering the Chart Museum URL..." ./install_scripts/register_chart_museum_url.sh diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/wireshark_packet_capture_pod.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/wireshark_packet_capture_pod.sh index 0c36a32..8c1ad5f 100755 --- a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/wireshark_packet_capture_pod.sh +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/wireshark_packet_capture_pod.sh @@ -39,7 +39,8 @@ sudo ./install_and_configure_wireshark.sh # Check if krew is installed if ! kubectl krew >/dev/null 2>&1; then echo "Krew is not installed. Installing Krew..." - ( # Code from (https://krew.sigs.k8s.io/docs/user-guide/setup/install/#bash): + # Code from (https://krew.sigs.k8s.io/docs/user-guide/setup/install/#bash): + ( set -x cd "$(mktemp -d)" && OS="$(uname | tr '[:upper:]' '[:lower:]')" && diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/full_install.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/full_install.sh index 38a4306..c951d55 100755 --- a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/full_install.sh +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/full_install.sh @@ -39,7 +39,7 @@ fi SCRIPT_DIR=$(dirname "$(realpath "$0")") cd "$SCRIPT_DIR" -echo "Installing Near Real-Time RAN Intelligent Controller..." +echo "Installing Near-Real-Time RAN Intelligent Controller..." export DEBIAN_FRONTEND=noninteractive # Modifies the needrestart configuration to suppress interactive prompts if [ -f "/etc/needrestart/needrestart.conf" ]; then @@ -74,13 +74,17 @@ fi # Ensure time synchronization is enabled using chrony if ! dpkg -s chrony &>/dev/null; then - sudo apt-get install -y chrony + echo "Chrony is not installed, installing..." + sudo apt-get update + sudo apt-get install -y chrony || true fi if ! systemctl is-enabled --quiet chrony; then - sudo systemctl enable chrony && echo "Chrony service enabled." + echo "Enabling Chrony service..." + sudo systemctl enable chrony || true fi if ! systemctl is-active --quiet chrony; then - sudo systemctl start chrony && echo "Chrony service started." + echo "Starting Chrony service..." + sudo systemctl start chrony || true fi echo @@ -203,8 +207,8 @@ else sudo ./install_scripts/delete_namespace.sh ricinfra ricplt || true echo "Revising RIC Installation YAML File..." - RIC_YAML_FILE_NAME="example_recipe_oran_j_release.yaml" - RIC_YAML_FILE_NAME_UPDATED="example_recipe_oran_j_release_updated.yaml" + RIC_YAML_FILE_NAME="example_recipe_latest_stable.yaml" + RIC_YAML_FILE_NAME_UPDATED="example_recipe_latest_stable_updated.yaml" sudo chown $USER:$USER "ric-dep/RECIPE_EXAMPLE/$RIC_YAML_FILE_NAME" sudo cp "ric-dep/RECIPE_EXAMPLE/$RIC_YAML_FILE_NAME" "ric-dep/RECIPE_EXAMPLE/$RIC_YAML_FILE_NAME_UPDATED" @@ -215,9 +219,6 @@ else echo "Waiting for the Kubernetes API server to become ready before installing Near-RT RIC..." sudo ./install_scripts/wait_for_kubectl.sh - echo "Revising InfluxDB NFS Storage Class configuration..." - ./install_scripts/revise_influxdb_values_yaml.sh - # Run the installation command mkdir -p "$SCRIPT_DIR/logs" @@ -230,7 +231,7 @@ else echo echo "Installing Near-RT RIC..." cd ric-dep/bin/ - sudo ./install -f "../RECIPE_EXAMPLE/$RIC_YAML_FILE_NAME_UPDATED" -c "influxdb" 2>&1 | tee -a "$RIC_INSTALLATION_STDOUT" + sudo ./install -f "../RECIPE_EXAMPLE/$RIC_YAML_FILE_NAME_UPDATED" 2>&1 | tee -a "$RIC_INSTALLATION_STDOUT" cd "$SCRIPT_DIR" echo "Parsing output to check for successful Near-RT RIC installation..." ./install_scripts/parse_ric_installation_output.sh @@ -337,7 +338,6 @@ sudo ./install_scripts/run_e2sim_and_connect_to_ric.sh echo "Restoring ownership of directories and files created while in root..." sudo chown $USER:$USER logs/e2sim_output.txt sudo chown -R $USER:$USER charts || true -sudo chown -R $USER:$USER logs || true echo echo "Installing the xApp Onboarder (dms_cli)..." diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/full_uninstall.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/full_uninstall.sh similarity index 75% rename from RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/full_uninstall.sh rename to RAN_Intelligent_Controllers/Near-Real-Time-RIC/full_uninstall.sh index f22a4fb..6d86eac 100755 --- a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/additional_scripts/full_uninstall.sh +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/full_uninstall.sh @@ -28,8 +28,8 @@ # damage to property. The software developed by NIST employees is not subject to # copyright protection within the United States. -# Exit immediately if a command fails -set -e +# Do not exit immediately if a command fails +set +e if ! command -v realpath &>/dev/null; then echo "Package \"coreutils\" not found, installing..." @@ -37,22 +37,23 @@ if ! command -v realpath &>/dev/null; then fi SCRIPT_DIR=$(dirname "$(realpath "$0")") -PARENT_DIR=$(dirname "$SCRIPT_DIR") -cd "$PARENT_DIR" +cd "$SCRIPT_DIR" -clear -echo "This script will remove Docker and Kubernetes from the system." -echo "This is a destructive operation and may result in data loss." -echo "Please ensure you have backed up any necessary data before proceeding." -echo -echo "Do you want to proceed? (yes/no)" -read -r PROCEED -if [ "$PROCEED" != "yes" ]; then - echo "Exiting script." - exit 0 +if [ "$1" != "bypass_confirmation" ]; then + clear + echo "This script will remove Docker and Kubernetes from the system." + echo "This is a destructive operation and may result in data loss." + echo "Please ensure you have backed up any necessary data before proceeding." + echo + echo "Do you want to proceed? (yes/no)" + read -r PROCEED + if [ "$PROCEED" != "yes" ]; then + echo "Exiting script." + exit 0 + fi fi -echo "Uninstalling Near Real-Time RAN Intelligent Controller..." +echo "Uninstalling Near-Real-Time RAN Intelligent Controller..." export DEBIAN_FRONTEND=noninteractive # Modifies the needrestart configuration to suppress interactive prompts if [ -f "/etc/needrestart/needrestart.conf" ]; then @@ -82,19 +83,21 @@ fi # Ensure time synchronization is enabled using chrony if ! dpkg -s chrony &>/dev/null; then - sudo apt-get install -y chrony + echo "Chrony is not installed, installing..." + sudo apt-get update + sudo apt-get install -y chrony || true fi if ! systemctl is-enabled --quiet chrony; then - sudo systemctl enable chrony && echo "Chrony service enabled." + echo "Enabling Chrony service..." + sudo systemctl enable chrony || true fi if ! systemctl is-active --quiet chrony; then - sudo systemctl start chrony && echo "Chrony service started." + echo "Starting Chrony service..." + sudo systemctl start chrony || true fi ./install_scripts/stop_e2sim.sh -sudo rm -rf logs/ - echo echo echo "Stopping and removing existing Docker installations, then installing Docker $DOCKERVERSION..." @@ -112,7 +115,7 @@ if sudo systemctl is-enabled --quiet docker.service; then fi # Uninstall Docker packages and clean up -sudo apt-get purge -y --allow-change-held-packages docker docker-engine docker-ce docker.io containerd runc || true +sudo apt-get remove --purge -y --allow-change-held-packages docker docker-engine docker-ce docker.io containerd runc || true sudo rm -rf /var/lib/docker /etc/docker sudo apt-get autoremove -y @@ -190,6 +193,32 @@ for PORT in "${PORTS[@]}"; do fi done +# Uninstall Kubernetes packages +if command -v kubernetes-cni &>/dev/null; then + echo "Uninstalling kubernetes-cni..." + sudo apt-mark unhold kubernetes-cni + sudo apt-get remove --purge -y kubernetes-cni + sudo rm -f $(which kubernetes-cni) +fi +if command -v kubeadm &>/dev/null; then + echo "Uninstalling kubeadm..." + sudo apt-mark unhold kubeadm + sudo apt-get remove --purge -y kubeadm + sudo rm -f $(which kubeadm) +fi +if command -v kubelet &>/dev/null; then + echo "Uninstalling kubelet..." + sudo apt-mark unhold kubelet + sudo apt-get remove --purge -y kubelet + sudo rm -f $(which kubelet) +fi +if command -v kubectl &>/dev/null; then + echo "Uninstalling kubectl..." + sudo apt-mark unhold kubectl + sudo apt-get remove --purge -y kubectl + sudo rm -f $(which kubectl) +fi + # Clean up Kubernetes directories sudo find /var/lib/kubelet -type d -exec umount {} \; 2>/dev/null || true sudo ipvsadm --clear || true @@ -224,13 +253,34 @@ else echo "crictl not found; skipping containerd cleanup." fi -# Reset iptables +if command -v k9s &>/dev/null; then + echo "Uninstalling k9s..." + sudo rm -f /usr/local/bin/k9s + echo "Successfully uninstalled k9s." +else + echo "k9s is not installed, nothing to uninstall." +fi +if [ -d "$HOME/k9s-installation" ]; then + echo "Removing k9s temporary installation directory..." + rm -rf "$HOME/k9s-installation" +fi +rm -rf ~/.config/k9s + +# Reset iptables: Flush all default chains sudo iptables -F sudo iptables -t nat -F sudo iptables -t mangle -F -sudo iptables -X -sudo iptables -t nat -X -sudo iptables -t mangle -X +# Reset iptables: Delete known custom chains safely +for chain in FLANNEL-FWD FLANNEL-INGRESS FLANNEL-EGRESS; do + sudo iptables -D FORWARD -j $chain 2>/dev/null || true + sudo iptables -F $chain 2>/dev/null || true + sudo iptables -X $chain 2>/dev/null || true +done +# Reset iptables: Delete all remaining user-defined chains +sudo iptables -X || true +sudo iptables -t nat -X || true +sudo iptables -t mangle -X || true +# Reset iptables: Delete CNI interfaces echo "Removing CNI network interfaces..." sudo ip link delete cni0 2>/dev/null || true sudo ip link delete flannel.1 2>/dev/null || true @@ -240,11 +290,19 @@ sudo rm -rf ~/.kube echo echo "Kubernetes is cleaned up." -cd "$PARENT_DIR" -sudo rm -rf influxdb -sudo rm -rf e2-interface -sudo rm -rf charts +echo "Performing general system cleanup..." +sudo apt-get autoremove -y +sudo apt-get autoclean + +cd "$SCRIPT_DIR" +sudo rm -rf additional_scripts/pod_pcaps sudo rm -rf appmgr +sudo rm -rf charts +sudo rm -rf e2-interface +sudo rm -rf influxdb +sudo rm -rf influxdb_auth_token.json +sudo rm -rf install_time.txt +sudo rm -rf logs/ sudo rm -rf ric-dep sudo rm -rf xApps diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/e2sm_examples/kpm_e2sm/reports.json b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/e2sm_examples/kpm_e2sm/reports.json old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/e2sm_examples/kpm_e2sm/reports.previous.json b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/e2sm_examples/kpm_e2sm/reports.previous.json old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/e2sm_examples/kpm_e2sm/src/kpm/encode_kpm.cpp b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/e2sm_examples/kpm_e2sm/src/kpm/encode_kpm.cpp old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/e2sm_examples/kpm_e2sm/src/kpm/encode_kpm.previous.cpp b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/e2sm_examples/kpm_e2sm/src/kpm/encode_kpm.previous.cpp old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/e2sm_examples/kpm_e2sm/src/kpm/kpm_callbacks.cpp b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/e2sm_examples/kpm_e2sm/src/kpm/kpm_callbacks.cpp old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/e2sm_examples/kpm_e2sm/src/kpm/kpm_callbacks.previous.cpp b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/e2sm_examples/kpm_e2sm/src/kpm/kpm_callbacks.previous.cpp old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/src/messagerouting/e2ap_message_handler.cpp b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/src/messagerouting/e2ap_message_handler.cpp old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/src/messagerouting/e2ap_message_handler.previous.cpp b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/e2-interface/e2sim/src/messagerouting/e2ap_message_handler.previous.cpp old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/ric-dep/bin/install_k8s_and_helm.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/ric-dep/bin/install_k8s_and_helm.sh index 07c040e..a794154 100755 --- a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/ric-dep/bin/install_k8s_and_helm.sh +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/ric-dep/bin/install_k8s_and_helm.sh @@ -128,9 +128,9 @@ sudo apt-get install -y libsctp1 lksctp-tools # DOCKERV="20.10" #.21" # The version will be dynamically completed rather than hardcoding in the version -KUBEV="1.31" -KUBECNIV="1.3" -HELMV="3.16" +KUBEV="1.32" +KUBECNIV="1.5" +HELMV="3.17" # Fetch the Ubuntu release version regardless of the derivative distro if [ -f /etc/upstream-release/lsb-release ]; then @@ -148,7 +148,7 @@ if [ "$USE_DOCKER_CE" -eq 0 ]; then # Use docker.io fi else # Use docker.ce - DOCKERV="27.5" + DOCKERV="28.0" UBUNTU_CODENAME=$(grep -oP '^UBUNTU_CODENAME=\K.*' /etc/os-release 2>/dev/null) # If not found, try to extract VERSION_CODENAME as a fallback if [[ -z "$UBUNTU_CODENAME" ]]; then @@ -472,7 +472,7 @@ if sudo systemctl is-enabled --quiet docker.service; then fi # Uninstall Docker packages and clean up -sudo apt-get purge -y --allow-change-held-packages docker docker-engine docker-ce docker.io containerd runc || true +sudo apt-get remove --purge -y --allow-change-held-packages docker docker-engine docker-ce docker.io containerd runc || true sudo rm -rf /var/lib/docker /etc/docker sudo apt-get autoremove -y @@ -655,17 +655,26 @@ else echo "crictl not found; skipping containerd cleanup." fi -# Reset iptables +# Reset iptables: Flush all default chains sudo iptables -F sudo iptables -t nat -F sudo iptables -t mangle -F -sudo iptables -X -sudo iptables -t nat -X -sudo iptables -t mangle -X +# Reset iptables: Delete known custom chains safely +for chain in FLANNEL-FWD FLANNEL-INGRESS FLANNEL-EGRESS; do + sudo iptables -D FORWARD -j $chain 2>/dev/null || true + sudo iptables -F $chain 2>/dev/null || true + sudo iptables -X $chain 2>/dev/null || true +done +# Reset iptables: Delete all remaining user-defined chains +sudo iptables -X || true +sudo iptables -t nat -X || true +sudo iptables -t mangle -X || true +# Reset iptables: Delete CNI interfaces echo "Removing CNI network interfaces..." sudo ip link delete cni0 2>/dev/null || true sudo ip link delete flannel.1 2>/dev/null || true sudo ip link delete weave 2>/dev/null || true + echo "Kubernetes is cleaned up." # ----------------------------------------------------------------------------- diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/setup.previous.py b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/setup.previous.py old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/setup.py b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/setup.py old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/src/ad_config.ini b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/src/ad_config.ini old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/src/ad_config.previous.ini b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/src/ad_config.previous.ini old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/src/database.previous.py b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/src/database.previous.py old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/src/database.py b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/src/database.py old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/src/insert.previous.py b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/src/insert.previous.py old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/src/insert.py b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/ad/src/insert.py old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/kpimon-go/e2sm/wrapper.c b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/kpimon-go/e2sm/wrapper.c old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/kpimon-go/e2sm/wrapper.previous.c b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/kpimon-go/e2sm/wrapper.previous.c old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/insert.previous.py b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/insert.previous.py old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/insert.py b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/insert.py old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/setup.previous.py b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/setup.previous.py old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/setup.py b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/setup.py old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/src/database.previous.py b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/src/database.previous.py old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/src/database.py b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/src/database.py old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/src/qp_config.backup.ini b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/src/qp_config.backup.ini old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/src/qp_config.ini b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_patch_files/xApps/qp/src/qp_config.ini old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/install_influxdb_pod.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/install_influxdb_pod.sh new file mode 100755 index 0000000..cf46111 --- /dev/null +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/install_influxdb_pod.sh @@ -0,0 +1,93 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +echo "# Script: $(realpath $0)..." + +# Exit immediately if a command fails +set -e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +# Check if the influxDB pod already exists: kubectl get pods -n ricplt | grep r4-influxdb-influxdb2 +if kubectl get pods -n ricplt | grep r4-influxdb-influxdb2 &>/dev/null; then + echo "The InfluxDB pod is already installed and running, skipping." + exit 0 +fi + +# Wait for kube-apiserver to be ready before installing Near-RT RIC +echo "Waiting for the Kubernetes API server to become ready before installing Near-RT RIC..." +sudo ./install_scripts/wait_for_kubectl.sh + +echo "Revising InfluxDB NFS Storage Class configuration..." +./install_scripts/revise_influxdb_values_yaml.sh + +echo +echo +echo "Installing InfluxDB..." +cd ric-dep/bin/ + +RIC_YAML_FILE_NAME_UPDATED="example_recipe_latest_stable_updated.yaml" +if [ ! -f "../RECIPE_EXAMPLE/$RIC_YAML_FILE_NAME_UPDATED" ]; then + RIC_YAML_FILE_NAME_UPDATED="example_recipe_latest_stable.yaml" +fi +RIC_INSTALLATION_STDOUT="$SCRIPT_DIR/logs/ric_influxdb_installation_stdout.txt" + +echo +echo +echo "Please ignore \"Error: INSTALLATION FAILED: cannot re-use a name that is still in use\" as these pods are already installed." +sudo ./install -f "../RECIPE_EXAMPLE/$RIC_YAML_FILE_NAME_UPDATED" -c "influxdb" 2>&1 | tee -a "$RIC_INSTALLATION_STDOUT" || true +cd "$PARENT_DIR" + +sudo ./install_scripts/wait_for_kubectl.sh + +kubectl get pods -A || true +echo +echo "Attempting to remove any remaining taints from control-plane/master..." +# Remaining taints prevent the RIC components from initializing +# Check for remaining taints with: kubectl describe nodes | grep Taints +if kubectl taint nodes --all node-role.kubernetes.io/control-plane- &>/dev/null; then + echo "Successfully removed taint from control-plane." +fi +if kubectl taint nodes --all node-role.kubernetes.io/master- &>/dev/null; then + echo "Successfully removed taint removed from master." +fi + +echo "Waiting for all pods to be in the Running state before installation is complete..." +./install_scripts/wait_for_ricplt_pods.sh + +echo +echo "Successfully installed InfluxDB into Near-RT RIC." diff --git a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/revise_influxdb_values_yaml.sh b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/revise_influxdb_values_yaml.sh index 6b43e98..585bfba 100755 --- a/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/revise_influxdb_values_yaml.sh +++ b/RAN_Intelligent_Controllers/Near-Real-Time-RIC/install_scripts/revise_influxdb_values_yaml.sh @@ -51,6 +51,16 @@ mkdir -p "$INFLUXDB_PATH" sudo chown -R nobody:nogroup "$INFLUXDB_PATH" sudo chmod 775 "$INFLUXDB_PATH" +# List all the kubectl nodes, and prepare the values string for nodeAffinity +NODE_NAMES=($(kubectl get nodes --no-headers | awk '{print $1}')) +NODE_VALUES="" +if [ ${#NODE_NAMES[@]} -gt 0 ]; then + NODE_VALUES=" - \"${NODE_NAMES[0]}\"" + for NODE_NAME in "${NODE_NAMES[@]:1}"; do + NODE_VALUES="$NODE_VALUES"$'\n'" - \"$NODE_NAME\"" + done +fi + # Create and apply PersistentVolume for InfluxDB cat <"$HOME/.kube/influxdb-pv.yaml" apiVersion: v1 @@ -74,7 +84,7 @@ spec: - key: kubernetes.io/hostname operator: In values: - - "$(hostname)" +$NODE_VALUES EOF kubectl apply -f "$HOME/.kube/influxdb-pv.yaml" diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/.gitignore b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/.gitignore old mode 100755 new mode 100644 index 8140c1e..45aca71 --- a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/.gitignore +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/.gitignore @@ -10,14 +10,13 @@ requirements.txt /rappmanager/ /rApps/ install_time.txt +!install_patch_files/ # Ignore additional Python files __pycache__/ *.py[cod] *$py.class - *.so - .Python build/ develop-eggs/ @@ -36,13 +35,10 @@ share/python-wheels/ .installed.cfg *.egg MANIFEST - *.manifest *.spec - pip-log.txt pip-delete-this-directory.txt - htmlcov/ .tox/ .nox/ @@ -56,40 +52,28 @@ coverage.xml .hypothesis/ .pytest_cache/ cover/ - *.mo *.pot - *.log local_settings.py db.sqlite3 db.sqlite3-journal - instance/ .webassets-cache - .scrapy - docs/_build/ - .pybuilder/ target/ - .ipynb_checkpoints - profile_default/ ipython_config.py - .pdm.toml .pdm-python .pdm-build/ __pypackages__/ - celerybeat-schedule celerybeat.pid - *.sage.py - .env .venv env/ @@ -97,21 +81,13 @@ venv/ ENV/ env.bak/ venv.bak/ - .spyderproject .spyproject - .ropeproject - /site - .mypy_cache/ .dmypy.json dmypy.json - .pyre/ - .pytype/ - cython_debug/ - diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/README.md b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/README.md old mode 100755 new mode 100644 index effad15..cc3e7fc --- a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/README.md +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/README.md @@ -17,6 +17,59 @@ This automation tool is based on the K-Release of the Non-RT RIC. More informati - **Start the Non-RT RIC**: The Kubernetes pods start automatically on system boot, however, to ensure that all the components are running and properly configured, use `./run.sh`. - **Status**: Check on the pod statuses of the Non-RT RIC components with `kubectl get pods -A`, or by running the interactive pod manager (K9s) with `k9s -A` or `./start_k9s.sh`. - **Logs**: From within K9s, use the `Arrow Keys` to highlight a pod, `Enter` to view the logs for the pod, `w` to wrap text, `Esc` to go back, `Ctrl+k` to restart a pod that isn't responding, and `s` to open a command line shell in the pod. The control panel output is displayed in the terminal and in `logs/controlpanel_stdout.txt`. +- **Uninstall**: Remove the Non-RT RIC with `./full_uninstall.sh`. + + +
+ View the list of Kubernetes pods running after the Non-RT RIC is installed. +
+ +```console +$ kubectl get pods -A +NAMESPACE NAME READY STATUS +istio-system istio-ingressgateway-75bddb84ff-fczl2 1/1 Running +istio-system istiod-f59bfc4b4-25dfc 1/1 Running +kube-flannel kube-flannel-ds-fx6cm 1/1 Running +kube-system coredns-668d6bf9bc-kzs28 1/1 Running +kube-system coredns-668d6bf9bc-mpb9x 1/1 Running +kube-system etcd-vmware-022 1/1 Running +kube-system kube-apiserver-vmware-022 1/1 Running +kube-system kube-controller-manager-vmware-022 1/1 Running +kube-system kube-proxy-l6ncs 1/1 Running +kube-system kube-scheduler-vmware-022 1/1 Running +nonrtric a1-sim-osc-0 1/1 Running +nonrtric a1-sim-osc-1 1/1 Running +nonrtric a1-sim-std-0 1/1 Running +nonrtric a1-sim-std-1 1/1 Running +nonrtric a1-sim-std2-0 1/1 Running +nonrtric a1-sim-std2-1 1/1 Running +nonrtric a1controller-59675f9b55-fnjqp 1/1 Running +nonrtric capifcore-58b5887dc9-56n74 1/1 Running +nonrtric controlpanel-9d574cb44-dkrq6 1/1 Running +nonrtric db-85c8fdc968-bftwp 1/1 Running +nonrtric dmaapadapterservice-0 1/1 Running +nonrtric dmaapmediatorservice-0 1/1 Running +nonrtric helmmanager-0 1/1 Running +nonrtric informationservice-0 1/1 Running +nonrtric nonrtricgateway-55476db4c5-g5ppr 1/1 Running +nonrtric oran-nonrtric-kong-86c9cb9f99-wvbhv 2/2 Running +nonrtric oran-nonrtric-postgresql-0 1/1 Running +nonrtric orufhrecovery-55697f9666-h6lwn 1/1 Running +nonrtric policymanagementservice-0 1/1 Running +nonrtric ransliceassurance-7bfc6676fd-fk9qj 1/1 Running +nonrtric rappcatalogueenhancedservice-7795848b6c-v45fb 1/1 Running +nonrtric rappcatalogueservice-5cdb59b486-2hzb5 1/1 Running +nonrtric rappmanager-0 1/1 Running +nonrtric servicemanager-795d499bd-msl8n 1/1 Running +``` + +
+ +## Migration to Cilium + +For instructions on migrating the cluster to Cilium, since the scripts behave the same, please see the Near-RT RIC [README.md](../Near-Real-Time-RIC/README.md#migration-to-cilium) document. + +--- ## References diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_check_enforcement.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_check_enforcement.sh new file mode 120000 index 0000000..bda05f7 --- /dev/null +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_check_enforcement.sh @@ -0,0 +1 @@ +../../Near-Real-Time-RIC/additional_scripts/cilium_check_enforcement.sh \ No newline at end of file diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_disable_policies.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_disable_policies.sh new file mode 120000 index 0000000..f4e95d3 --- /dev/null +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_disable_policies.sh @@ -0,0 +1 @@ +../../Near-Real-Time-RIC/additional_scripts/cilium_disable_policies.sh \ No newline at end of file diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_enable_policies.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_enable_policies.sh new file mode 120000 index 0000000..b7f98fc --- /dev/null +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_enable_policies.sh @@ -0,0 +1 @@ +../../Near-Real-Time-RIC/additional_scripts/cilium_enable_policies.sh \ No newline at end of file diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_list_policies.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_list_policies.sh new file mode 120000 index 0000000..9adb626 --- /dev/null +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_list_policies.sh @@ -0,0 +1 @@ +../../Near-Real-Time-RIC/additional_scripts/cilium_list_policies.sh \ No newline at end of file diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_status.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_status.sh new file mode 120000 index 0000000..3dad968 --- /dev/null +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/cilium_status.sh @@ -0,0 +1 @@ +../../Near-Real-Time-RIC/additional_scripts/cilium_status.sh \ No newline at end of file diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/hubble_capture.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/hubble_capture.sh new file mode 120000 index 0000000..ca36077 --- /dev/null +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/hubble_capture.sh @@ -0,0 +1 @@ +../../Near-Real-Time-RIC/additional_scripts/hubble_capture.sh \ No newline at end of file diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/hubble_visualize.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/hubble_visualize.sh new file mode 120000 index 0000000..20f2517 --- /dev/null +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/hubble_visualize.sh @@ -0,0 +1 @@ +../../Near-Real-Time-RIC/additional_scripts/hubble_visualize.sh \ No newline at end of file diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/install_and_configure_wireshark.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/install_and_configure_wireshark.sh new file mode 120000 index 0000000..494846d --- /dev/null +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/install_and_configure_wireshark.sh @@ -0,0 +1 @@ +../../Near-Real-Time-RIC/additional_scripts/install_and_configure_wireshark.sh \ No newline at end of file diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/install_cilium_and_migrate_nodes.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/install_cilium_and_migrate_nodes.sh new file mode 100755 index 0000000..03a7092 --- /dev/null +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/install_cilium_and_migrate_nodes.sh @@ -0,0 +1,424 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +echo "# Script: $(realpath $0)..." + +ENABLE_HUBBLE_LOGGING="true" + +DRAIN_NODES="false" + +echo "Hubble enabled: $ENABLE_HUBBLE_LOGGING" +echo "Drain nodes: $DRAIN_NODES" +echo +echo "This script will install Cilium and migrate all nodes to Cilium for network policy enforcement (replacing the existing network plugin, e.g., Flannel)." +echo "Since this is a disruptive operation, it is recommended to back up your Kubernetes cluster before proceeding." +read -p "Would you like to proceed? (y/n): " -r REPLY + +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Exiting script." + exit 1 +fi + +sudo ls &>/dev/null + +if cilium status &>/dev/null; then + echo "Cilium is already installed. Uninstalling Cilium first..." + cilium uninstall +fi + +CILIUM_CLI_VERSION="latest" # "v0.16.19" +if [ "$CILIUM_CLI_VERSION" = "latest" ]; then + CILIUM_CLI_VERSION=$(curl -s https://api.github.com/repos/cilium/cilium-cli/releases/latest | grep tag_name | cut -d '"' -f 4) +fi +CILIUM_MIGRATION_VALUES_FILE="$HOME/.kube/cilium-values-migration.yaml" +CILIUM_INITIAL_VALUES_FILE="$HOME/.kube/cilium-values-initial.yaml" +CILIUM_FINAL_VALUES_FILE="$HOME/.kube/cilium-values-final.yaml" +if ! command -v cilium &>/dev/null; then + echo "Installing Cilium CLI version ${CILIUM_CLI_VERSION}..." + CLI_ARCH="amd64" + if [ "$(uname -m)" = "aarch64" ]; then + CLI_ARCH="arm64" + fi + DOWNLOAD_URL="https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz" + echo "Cilium CLI Download URL: ${DOWNLOAD_URL}" + curl -L --fail --remote-name "${DOWNLOAD_URL}" + curl -L --fail --remote-name "${DOWNLOAD_URL}.sha256sum" + sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum + sudo tar xzvf cilium-linux-${CLI_ARCH}.tar.gz -C /usr/local/bin + rm cilium-linux-${CLI_ARCH}.tar.gz cilium-linux-${CLI_ARCH}.tar.gz.sha256sum +fi + +cat <$CILIUM_INITIAL_VALUES_FILE + +if ! helm repo list | grep -q "cilium"; then + echo "Adding Cilium Helm repository..." + helm repo add cilium https://helm.cilium.io + helm repo update +fi + +if ! cilium status &>/dev/null; then + CILIUM_HELM_VERSION=$(helm search repo cilium --versions | grep "^cilium/cilium\\s" | head -1 | awk '{print $2}') + echo "Using Cilium Helm version ${CILIUM_HELM_VERSION} for installation..." + + cilium install --version ${CILIUM_HELM_VERSION} --namespace kube-system --values $CILIUM_INITIAL_VALUES_FILE +fi + +until cilium status --wait; do + echo "Continuing to wait for Cilium to be ready..." + sleep 5 +done + +echo +echo "Creating a per-node config to instruct Cilium to take over CNI networking on the node..." +cat <$CILIUM_FINAL_VALUES_FILE + +echo +echo "Diffing initial and final Cilium Helm values..." +diff $CILIUM_INITIAL_VALUES_FILE $CILIUM_FINAL_VALUES_FILE || true + +echo +echo "Upgrading Cilium with final Helm values..." +cilium upgrade --namespace kube-system cilium cilium/cilium --values $CILIUM_FINAL_VALUES_FILE + +kubectl -n kube-system rollout restart daemonset cilium +until cilium status --wait; do + echo "Continuing to wait for Cilium to be ready..." + sleep 5 +done + +if [ "$ENABLE_HUBBLE_LOGGING" = "true" ]; then + # If command hubble doesn't exist, install hubble + if ! command -v hubble &>/dev/null; then + echo "Hubble command not found. Installing hubble..." + HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt) + HUBBLE_ARCH=amd64 + if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi + curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum} + sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum + sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin + rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum} + fi + echo "Enabling hubble..." + cilium hubble enable +fi + +echo +echo "Deleting the per-node configuration..." +kubectl delete -n kube-system ciliumnodeconfig cilium-default + +echo +echo "Migration complete. Removing previous network plugin..." + +# Check for and remove conflicting VXLAN configurations +if ip link show type vxlan | grep -q "flannel.1"; then + echo "Removing conflicting VXLAN configuration..." + kubectl delete daemonset kube-flannel-ds -n kube-flannel + sudo ip link delete flannel.1 + if [ -f /etc/cni/net.d/10-flannel.conflist ]; then + sudo rm -f /etc/cni/net.d/10-flannel.conflist + fi + if [ -f /etc/cni/net.d/10-flannel.conf ]; then + sudo rm -f /etc/cni/net.d/10-flannel.conf + fi + if [ -f /etc/cni/net.d/10-flannel.conflist.cilium_bak ]; then + sudo rm -f /etc/cni/net.d/10-flannel.conflist.cilium_bak + fi + if kubectl get ds -n kube-system cilium &>/dev/null; then + echo "Restarting Cilium DaemonSet..." + kubectl rollout restart daemonset cilium -n kube-system + fi + kubectl rollout restart deployment coredns -n kube-system +fi +echo +echo "Successfully installed Cilium and migrated node to Cilium." + +echo "Ensuring permissions for $USER in ~/.kube directory..." +sudo chown --recursive $USER:$USER ~/.kube + +echo +echo "Deleting all existing CiliumNetworkPolicies..." +kubectl delete cnp --all-namespaces --all || true + +# ----------------------------------------------------------------------------- +# Applying Cilium Policy for RIC Pods +# ----------------------------------------------------------------------------- + +echo +echo "Writing Cilium NetworkPolicy to $CILIUM_POLICY_FILE..." +CILIUM_POLICY_FILE="$HOME/.kube/cilium-policy.yaml" +cat </dev/null 2>&1; then + # Create the Role if it doesn't exist + if [ ! -f "$NONRTRIC_READ_RESTRICTION_FILE" ]; then + echo + echo "Creating Non-RT RIC read restriction Role file..." + cat </dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" + +echo "Installing A1 Simulators..." +export DEBIAN_FRONTEND=noninteractive +# Modifies the needrestart configuration to suppress interactive prompts +if [ -f "/etc/needrestart/needrestart.conf" ]; then + if ! grep -q "^\$nrconf{restart} = 'a';$" "/etc/needrestart/needrestart.conf"; then + sudo sed -i "/\$nrconf{restart} = /c\$nrconf{restart} = 'a';" "/etc/needrestart/needrestart.conf" + echo "Modified needrestart configuration to auto-restart services." + fi +fi +export NEEDRESTART_SUSPEND=1 + +# Run a sudo command every minute to ensure script execution without user interaction +./install_scripts/start_sudo_refresh.sh + +# Prevent the unattended-upgrades service from creating dpkg locks that would error the script +if systemctl is-active --quiet unattended-upgrades; then + sudo systemctl stop unattended-upgrades &>/dev/null && echo "Successfully stopped unattended-upgrades service." + sudo systemctl disable unattended-upgrades &>/dev/null && echo "Successfully disabled unattended-upgrades service." +fi +if systemctl is-active --quiet apt-daily.timer; then + sudo systemctl stop apt-daily.timer &>/dev/null && echo "Successfully stopped apt-daily.timer service." + sudo systemctl disable apt-daily.timer &>/dev/null && echo "Successfully disabled apt-daily.timer service." +fi +if systemctl is-active --quiet apt-daily-upgrade.timer; then + sudo systemctl stop apt-daily-upgrade.timer &>/dev/null && echo "Successfully stopped apt-daily-upgrade.timer service." + sudo systemctl disable apt-daily-upgrade.timer &>/dev/null && echo "Successfully disabled apt-daily-upgrade.timer service." +fi + +# Ensure time synchronization is enabled using chrony +if ! dpkg -s chrony &>/dev/null; then + echo "Chrony is not installed, installing..." + sudo apt-get update + sudo apt-get install -y chrony || true +fi +if ! systemctl is-enabled --quiet chrony; then + echo "Enabling Chrony service..." + sudo systemctl enable chrony || true +fi +if ! systemctl is-active --quiet chrony; then + echo "Starting Chrony service..." + sudo systemctl start chrony || true +fi + +# Instructions are from: https://lf-o-ran-sc.atlassian.net/wiki/spaces/RICNR/pages/86802787/Release+K+-+Run+in+Kubernetes +if [ ! -d dep ]; then + echo + echo "Cloning A1 dependencies..." + ./install_scripts/git_clone.sh https://gerrit.o-ran-sc.org/r/it/dep.git + cd dep # Ensure that the components are cloned + git restore --source=HEAD :/ + cd .. +fi + +cd "$PARENT_DIR/dep/" + +echo +echo "Installing Docker, Kubernetes, and Helm..." +# Determine if Kubernetes should be reset +SHOULD_RESET_KUBE=false +if ! helm version &>/dev/null; then + SHOULD_RESET_KUBE=true +fi +echo "Checking if any of the kube-system pods are not running..." +if [ "$SHOULD_RESET_KUBE" = false ]; then + POD_NAMES=("coredns" "etcd" "kube-apiserver" "kube-controller" "kube-proxy" "kube-scheduler") + ALL_PODS=$(kubectl get pods -n kube-system --no-headers 2>/dev/null) || true + for POD_NAME in "${POD_NAMES[@]}"; do + # Check for at least one pod with the part of the name matching and in 'RUNNING' or 'COMPLETED' status + if ! echo "$ALL_PODS" | grep -e "$POD_NAME" | awk '{print $3}' | grep -q -e "Running" -e "Completed"; then + SHOULD_RESET_KUBE=true + echo " $POD_NAME is not running." + else + echo " $POD_NAME is running." + fi + done +fi + +cd "$PARENT_DIR/dep/" +if [ "$SHOULD_RESET_KUBE" = false ]; then + echo "All kube-system pods are already running, skipping." + echo +else + echo "At least one kube-system pod is not running, resetting Kubernetes..." + + # Download ric-dep from gerrit + if [ ! -d "ric-dep" ]; then + ./../install_scripts/git_clone.sh https://gerrit.o-ran-sc.org/r/ric-plt/ric-dep.git ric-dep + fi + # Patch the install script and save a backup of the original + if [ ! -f "ric-dep/bin/install_k8s_and_helm.previous.sh" ]; then + cp ric-dep/bin/install_k8s_and_helm.sh ric-dep/bin/install_k8s_and_helm.previous.sh + fi + cp "$PARENT_DIR/install_patch_files/dep/ric-dep/bin/install_k8s_and_helm.sh" ric-dep/bin/install_k8s_and_helm.sh + + cd "$PARENT_DIR/dep/ric-dep/bin/" + + # Remove any expired keys from apt-get update + sudo "$PARENT_DIR/install_scripts/./remove_expired_apt_keys.sh" + + # Increase the file descriptor limits of the system + sudo "$PARENT_DIR/install_scripts/./set_file_descriptor_limits.sh" + + if ! ./install_k8s_and_helm.sh; then + echo "An error occured when running $(pwd)/install_k8s_and_helm.sh." + exit 1 + fi + + echo + echo + echo "Installing Helm Chart and Museum..." + cd "$PARENT_DIR/dep/ric-dep/bin/" + sudo ./install_common_templates_to_helm.sh +fi + +cd "$PARENT_DIR" + +echo +echo "Installing k9s..." +if ! sudo ./install_scripts/install_k9s.sh; then + echo "Could not install k9s at the moment, skipping." +fi + +cd "$PARENT_DIR" + +# Ensure docker is configured properly +sudo ./install_scripts/enable_docker_build_kit.sh +if ! command -v docker-compose &>/dev/null; then + ./install_scripts/install_docker_compose.sh +fi + +if ! command -v jq >/dev/null 2>&1; then + echo "Installing jq to process JSON files..." + sudo apt-get install -y jq +fi + +echo +echo "Installing A1 Simulators ..." +# Determine if RAN Intelligent Controller pods should be reset by checking if any of the nonrtric pods are not running +echo "Checking if any of the nonrtric pods are not running..." +SHOULD_RESET_NONRTRIC=false +if [ "$SHOULD_RESET_NONRTRIC" = false ]; then + POD_NAMES=("a1-sim-osc" "a1-sim-std" "a1-sim-std2" "a1controller") + ALL_PODS=$(kubectl get pods -n nonrtric --no-headers 2>/dev/null) || true + + for POD_NAME in "${POD_NAMES[@]}"; do + # Check for at least one pod with the part of the name matching and in 'RUNNING' or 'COMPLETED' status + if ! echo "$ALL_PODS" | grep -e "^$POD_NAME" | awk '{print $3}' | grep -q -e "Running" -e "Completed"; then + SHOULD_RESET_NONRTRIC=true + echo " $POD_NAME is not running." + else + echo " $POD_NAME is running." + fi + done +fi + +if [ "$SHOULD_RESET_NONRTRIC" = false ]; then + echo "All nonrtric pods are already running, skipping." + echo +else + echo "At least one nonrtric pod is not running, resetting A1 pods..." + cd "$PARENT_DIR" + + echo "Revising the YAML file for the A1 pods..." + RIC_YAML_FILE_PATH="dep/RECIPE_EXAMPLE/NONRTRIC/example_recipe.yaml" + RIC_YAML_FILE_PATH_UPDATED="dep/RECIPE_EXAMPLE/NONRTRIC/example_recipe_updated.yaml" + sudo chown $USER:$USER $RIC_YAML_FILE_PATH + sudo cp $RIC_YAML_FILE_PATH $RIC_YAML_FILE_PATH_UPDATED + sudo chown $USER:$USER $RIC_YAML_FILE_PATH_UPDATED + + # Function to update YAML configuration files + update_yaml() { + local FILE_PATH=$1 + local PROPERTY=$2 + local VALUE=$3 + echo "Updating $FILE_PATH: setting $PROPERTY to $VALUE" + if [[ "$VALUE" == "true" || "$VALUE" == "false" ]]; then + yq e "$PROPERTY = $VALUE" -i $FILE_PATH + else + yq e "$PROPERTY = \"$VALUE\"" -i $FILE_PATH + fi + } + + # First, replace all true to false using sed + sed -i 's/true/false/g' "$RIC_YAML_FILE_PATH_UPDATED" + + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installPms' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installA1controller' 'true' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installA1simulator' 'true' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installControlpanel' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installInformationservice' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installRappcatalogueservice' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installRappcatalogueenhancedservice' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installNonrtricgateway' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installKong' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installDmaapadapterservice' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installDmaapmediatorservice' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installHelmmanager' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installOrufhrecovery' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installRansliceassurance' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installCapifcore' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installServicemanager' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installRanpm' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installrAppmanager' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.installDmeParticipant' 'false' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.volume1.size' '2Gi' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.volume1.storageClassName' 'pms-storage' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.volume1.hostPath' '/var/nonrtric/pms-storage' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.volume2.size' '2Gi' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.volume2.storageClassName' 'ics-storage' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.volume2.hostPath' '/var/nonrtric/ics-storage' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.volume3.size' '1Gi' + update_yaml $RIC_YAML_FILE_PATH_UPDATED '.nonrtric.volume3.storageClassName' 'helmmanager-storage' + + cd "$PARENT_DIR/dep/" + + echo "Deploying A1 pods..." + sudo ./bin/deploy-nonrtric -f ./RECIPE_EXAMPLE/NONRTRIC/example_recipe_updated.yaml + + echo "Successfully installed A1 pods." +fi + +cd "$PARENT_DIR" +sudo ./install_scripts/wait_for_kubectl.sh +kubectl get pods -A || true +echo +echo "Attempting to remove any remaining taints from control-plane/master..." +# Remaining taints prevent the RIC components from initializing +# Check for remaining taints with: kubectl describe nodes | grep Taints +if kubectl taint nodes --all node-role.kubernetes.io/control-plane- &>/dev/null; then + echo "Successfully removed taint from control-plane." +fi +if kubectl taint nodes --all node-role.kubernetes.io/master- &>/dev/null; then + echo "Successfully removed taint removed from master." +fi + +echo +echo "Waiting for A1 pods..." +sudo ./install_scripts/wait_for_nonrtric_pods.sh + +cd "$PARENT_DIR" + +# Stop the sudo timeout refresher, it is no longer necessary to run +./install_scripts/stop_sudo_refresh.sh + +echo +echo +echo "################################################################################" +echo "# Successfully installed the A1 Simulators #" +echo "################################################################################" diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/purge_unready_pods.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/purge_unready_pods.sh new file mode 120000 index 0000000..bc38003 --- /dev/null +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/purge_unready_pods.sh @@ -0,0 +1 @@ +../../Near-Real-Time-RIC/additional_scripts/purge_unready_pods.sh \ No newline at end of file diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/refresh_pod_certificates.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/refresh_pod_certificates.sh new file mode 120000 index 0000000..8614de6 --- /dev/null +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/refresh_pod_certificates.sh @@ -0,0 +1 @@ +../../Near-Real-Time-RIC/additional_scripts/refresh_pod_certificates.sh \ No newline at end of file diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/wireshark_packet_capture_pod.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/wireshark_packet_capture_pod.sh new file mode 120000 index 0000000..1b3d5f5 --- /dev/null +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/additional_scripts/wireshark_packet_capture_pod.sh @@ -0,0 +1 @@ +../../Near-Real-Time-RIC/additional_scripts/wireshark_packet_capture_pod.sh \ No newline at end of file diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/commit_hashes.json b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/commit_hashes.json old mode 100755 new mode 100644 index 3085a52..d7b877f --- a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/commit_hashes.json +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/commit_hashes.json @@ -1,10 +1,10 @@ { - "https://gerrit.o-ran-sc.org/r/ric-plt/ric-dep.git": ["", "33b5940a15ea852d47f73521295eef53d295b7fd"], + "https://gerrit.o-ran-sc.org/r/ric-plt/ric-dep.git": ["master", "33b5940a15ea852d47f73521295eef53d295b7fd"], "https://gerrit.o-ran-sc.org/r/ric-plt/appmgr.git": ["", "4c05932dce72e98db23eaff2b72b58816e1f2d55"], - "https://gerrit.o-ran-sc.org/r/it/dep.git": ["", "cdb4ba3d9d5a86cda7b68d70c2ea0cb891d38471"], - "https://gerrit.o-ran-sc.org/r/nonrtric/plt/ranpm.git": ["", "cfb34a99dc39c0ef22d5b1aab884483338ffed95"], + "https://gerrit.o-ran-sc.org/r/it/dep.git": ["master", "dfcfdbc9b540b3e6d401b8c09379e5a8b6267848"], + "https://gerrit.o-ran-sc.org/r/nonrtric/plt/ranpm.git": ["master", "b5f4f8698217ce70d3c2e6a454146fbcd2111d35"], "https://github.com/onap/multicloud-k8s.git": ["", "8bea0a13c223aff43f98f0cb6426379bb23e8894"], - "https://gerrit.onap.org/r/oom.git": ["", "60c14232c92f4e04c53d1a75a76c3f17bb32d0e2"], + "https://gerrit.onap.org/r/oom.git": ["", "1ca9e322036072b2d1ef69046c297ca13f1618b7"], "https://gerrit.o-ran-sc.org/r/portal/nonrtric-controlpanel.git": ["master", "15bdaf8f25dca54e3a52ad30d69fa2eb1d59ce48"], - "https://gerrit.o-ran-sc.org/r/nonrtric/plt/rappmanager.git": ["", "688ab2c9ac9b1af06c30ddc28db9bcc5ecaaa096"] + "https://gerrit.o-ran-sc.org/r/nonrtric/plt/rappmanager.git": ["k-release", "688ab2c9ac9b1af06c30ddc28db9bcc5ecaaa096"] } diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/full_install.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/full_install.sh index a1fa8a3..1bed5cf 100755 --- a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/full_install.sh +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/full_install.sh @@ -39,7 +39,7 @@ fi SCRIPT_DIR=$(dirname "$(realpath "$0")") cd "$SCRIPT_DIR" -echo "Installing Non Real-Time RAN Intelligent Controller..." +echo "Installing Non-Real-Time RAN Intelligent Controller..." export DEBIAN_FRONTEND=noninteractive # Modifies the needrestart configuration to suppress interactive prompts if [ -f "/etc/needrestart/needrestart.conf" ]; then @@ -74,22 +74,27 @@ fi # Ensure time synchronization is enabled using chrony if ! dpkg -s chrony &>/dev/null; then - sudo apt-get install -y chrony + echo "Chrony is not installed, installing..." + sudo apt-get update + sudo apt-get install -y chrony || true fi if ! systemctl is-enabled --quiet chrony; then - sudo systemctl enable chrony && echo "Chrony service enabled." + echo "Enabling Chrony service..." + sudo systemctl enable chrony || true fi if ! systemctl is-active --quiet chrony; then - sudo systemctl start chrony && echo "Chrony service started." + echo "Starting Chrony service..." + sudo systemctl start chrony || true fi -# Instructions are from: https://lf-o-ran-sc.atlassian.net/wiki/spaces/RICNR/pages/15075609/Release+J+-+Run+in+Kubernetes +# Instructions are from: https://lf-o-ran-sc.atlassian.net/wiki/spaces/RICNR/pages/86802787/Release+K+-+Run+in+Kubernetes if [ ! -d dep ]; then echo echo "Cloning Non-RT RIC dependencies..." ./install_scripts/git_clone.sh https://gerrit.o-ran-sc.org/r/it/dep.git cd dep # Ensure that the components are cloned git restore --source=HEAD :/ + cd .. fi if [ ! -d "rappmanager" ]; then @@ -216,7 +221,8 @@ if ! command -v istioctl &>/dev/null; then exit 1 fi if [ -f bin/istioctl ]; then - sudo ln -s "$(pwd)/bin/istioctl" /usr/local/bin/istioctl + sudo rm -f /usr/local/bin/istioctl + sudo ln -sf "$(pwd)/bin/istioctl" /usr/local/bin/istioctl echo "Successfully installed Istio." else echo "Binary for istioctl not found." @@ -311,8 +317,9 @@ else cd "$SCRIPT_DIR/dep/" - echo "Deploying Non-RT RIC..." + echo "Deploying Non-RT RIC pods..." sudo ./bin/deploy-nonrtric -f ./RECIPE_EXAMPLE/NONRTRIC/example_recipe_updated.yaml + echo "Successfully installed Non-RT RIC pods." fi diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/full_uninstall.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/full_uninstall.sh new file mode 100755 index 0000000..a062f75 --- /dev/null +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/full_uninstall.sh @@ -0,0 +1,343 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Do not exit immediately if a command fails +set +e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +cd "$SCRIPT_DIR" + +if [ "$1" != "bypass_confirmation" ]; then + clear + echo "This script will remove Docker and Kubernetes from the system." + echo "This is a destructive operation and may result in data loss." + echo "Please ensure you have backed up any necessary data before proceeding." + echo + echo "Do you want to proceed? (yes/no)" + read -r PROCEED + if [ "$PROCEED" != "yes" ]; then + echo "Exiting script." + exit 0 + fi +fi + +echo "Uninstalling Non-Real-Time RAN Intelligent Controller..." +export DEBIAN_FRONTEND=noninteractive +# Modifies the needrestart configuration to suppress interactive prompts +if [ -f "/etc/needrestart/needrestart.conf" ]; then + if ! grep -q "^\$nrconf{restart} = 'a';$" "/etc/needrestart/needrestart.conf"; then + sudo sed -i "/\$nrconf{restart} = /c\$nrconf{restart} = 'a';" "/etc/needrestart/needrestart.conf" + echo "Modified needrestart configuration to auto-restart services." + fi +fi +export NEEDRESTART_SUSPEND=1 + +# Run a sudo command every minute to ensure script execution without user interaction +./install_scripts/start_sudo_refresh.sh + +# Prevent the unattended-upgrades service from creating dpkg locks that would error the script +if systemctl is-active --quiet unattended-upgrades; then + sudo systemctl stop unattended-upgrades &>/dev/null && echo "Successfully stopped unattended-upgrades service." + sudo systemctl disable unattended-upgrades &>/dev/null && echo "Successfully disabled unattended-upgrades service." +fi +if systemctl is-active --quiet apt-daily.timer; then + sudo systemctl stop apt-daily.timer &>/dev/null && echo "Successfully stopped apt-daily.timer service." + sudo systemctl disable apt-daily.timer &>/dev/null && echo "Successfully disabled apt-daily.timer service." +fi +if systemctl is-active --quiet apt-daily-upgrade.timer; then + sudo systemctl stop apt-daily-upgrade.timer &>/dev/null && echo "Successfully stopped apt-daily-upgrade.timer service." + sudo systemctl disable apt-daily-upgrade.timer &>/dev/null && echo "Successfully disabled apt-daily-upgrade.timer service." +fi + +# Ensure time synchronization is enabled using chrony +if ! dpkg -s chrony &>/dev/null; then + sudo apt-get update + echo "Chrony is not installed, installing..." + sudo apt-get install -y chrony || true +fi +if ! systemctl is-enabled --quiet chrony; then + echo "Enabling Chrony service..." + sudo systemctl enable chrony || true +fi +if ! systemctl is-active --quiet chrony; then + echo "Starting Chrony service..." + sudo systemctl start chrony || true +fi + +./stop_control_panel.sh + +cd "$SCRIPT_DIR" +if [ -f dep/bin/undeploy-nonrtric ]; then + echo + echo "Running undeploy-nonrtric script to gracefully remove the Non-RT RIC pods..." + sudo ./dep/bin/undeploy-nonrtric || true +fi + +echo "Uninstalling Node.js used by the Control Panel..." +sudo apt-get remove --purge -y nodejs +sudo rm -f /etc/apt/keyrings/nodesource.gpg +sudo rm -f /etc/apt/sources.list.d/nodesource.list + +if docker-compose -v &>/dev/null; then + echo "Uninstalling docker-compose..." + sudo rm -f /usr/local/bin/docker-compose + sudo rm -f /usr/bin/docker-compose + sudo rm -rf ~/.docker/compose +fi + +echo +echo +echo "Stopping and removing existing Docker installations, then installing Docker $DOCKERVERSION..." +if sudo systemctl is-active --quiet docker.socket; then + sudo systemctl stop docker.socket +fi +if sudo systemctl is-active --quiet docker.service; then + sudo systemctl stop docker.service +fi +if sudo systemctl is-enabled --quiet docker.socket; then + sudo systemctl disable docker.socket +fi +if sudo systemctl is-enabled --quiet docker.service; then + sudo systemctl disable docker.service +fi + +# Uninstall Docker packages and clean up +sudo apt-get remove --purge -y --allow-change-held-packages docker docker-engine docker-ce docker.io containerd runc || true +sudo rm -rf /var/lib/docker /etc/docker +sudo apt-get autoremove -y + +echo +echo +echo "Stopping and removing existing Kubernetes installations..." + +# Stop and remove all Docker containers if Docker is installed +if command -v docker &>/dev/null; then + echo "Stopping and removing existing Docker containers..." + if [ "$(sudo docker ps -aq)" ]; then + sudo docker stop $(sudo docker ps -aq) 2>/dev/null || true + sudo docker rm $(sudo docker ps -aq) 2>/dev/null || true + else + echo "No Docker containers to stop or remove." + fi +fi + +if sudo systemctl is-active --quiet containerd; then + echo "Stopping containerd..." + sudo systemctl stop containerd +fi + +# Stop, disable, and mask kubelet service if it's running +if sudo systemctl is-active --quiet kubelet; then + echo "Stopping, disabling, and masking kubelet service..." + sudo systemctl stop kubelet + sudo systemctl disable kubelet + sudo systemctl mask kubelet + echo "kubelet service stopped, disabled, and masked." +fi + +# Reset Kubernetes using kubeadm if kubeadm is installed +if command -v kubeadm &>/dev/null; then + echo "Unmounting /var/lib/kubelet mounts..." + mount | grep '/var/lib/kubelet' | awk '{print $3}' | xargs -r sudo umount -f + echo "Resetting Kubernetes..." + echo "y" | sudo kubeadm reset -f -v5 + echo "Kubernetes reset successfully." +fi + +# Stop Kubernetes services using systemd +SERVICES=("kube-apiserver" "kube-controller-manager" "kube-scheduler" "etcd") +for SERVICE in "${SERVICES[@]}"; do + if systemctl is-active --quiet $SERVICE; then + echo "Stopping $SERVICE..." + sudo systemctl stop $SERVICE || true + else + echo "$SERVICE is not active." + fi +done + +# Stop and remove Docker containers if Docker is used +if [ ! -z "$(sudo docker ps -a -q)" ]; then + sudo docker stop $(sudo docker ps -a -q) || true + sudo docker rm $(sudo docker ps -a -q) || true +fi + +# Kill stubborn Kubernetes processes more carefully +PROCESSES=("kubelet" "kube-control" "kube-schedul" "kube-apiserver" "etcd") +for PROCESS in "${PROCESSES[@]}"; do + while pgrep "$PROCESS" >/dev/null; do + echo "Terminating $PROCESS..." + sudo pkill -9 "$PROCESS" || true + sleep 1 + done +done + +# Check and free ports, check which process is using a port with: ss -tulpn | grep :PORTNUMBER +PORTS=(6443 10250 10257 10259 2379 2380) +for PORT in "${PORTS[@]}"; do + if sudo ss -tulpn | grep ":$PORT" >/dev/null; then + echo "Freeing port $PORT..." + sudo fuser -k $PORT/tcp || true + fi +done + +# Uninstall Kubernetes packages +if command -v kubernetes-cni &>/dev/null; then + echo "Uninstalling kubernetes-cni..." + sudo apt-mark unhold kubernetes-cni + sudo apt-get remove --purge -y kubernetes-cni + sudo rm -f $(which kubernetes-cni) +fi +if command -v kubeadm &>/dev/null; then + echo "Uninstalling kubeadm..." + sudo apt-mark unhold kubeadm + sudo apt-get remove --purge -y kubeadm + sudo rm -f $(which kubeadm) +fi +if command -v kubelet &>/dev/null; then + echo "Uninstalling kubelet..." + sudo apt-mark unhold kubelet + sudo apt-get remove --purge -y kubelet + sudo rm -f $(which kubelet) +fi +if command -v kubectl &>/dev/null; then + echo "Uninstalling kubectl..." + sudo apt-mark unhold kubectl + sudo apt-get remove --purge -y kubectl + sudo rm -f $(which kubectl) +fi + +# Clean up Kubernetes directories +sudo find /var/lib/kubelet -type d -exec umount {} \; 2>/dev/null || true +sudo ipvsadm --clear || true +sudo rm -rf /etc/cni/net.d || true +sudo rm -rf /etc/kubernetes/ || true +sudo rm -rf /var/lib/etcd || true +sudo rm -rf /var/lib/kubelet || true +sudo rm -rf /var/lib/dockershim || true +sudo rm -rf /var/run/kubernetes || true +sudo rm -rf /var/lib/cni/ || true +sudo rm -rf /root/.kube/ || true +sudo rm -rf $HOME/.kube/ || true + +# Remove all Kubernetes-related Docker or containerd images +if command -v docker &>/dev/null; then + echo "Removing all Docker images..." + if [ "$(sudo docker images -q)" ]; then + sudo docker rmi $(sudo docker images -q) 2>/dev/null || true + else + echo "No Docker images to remove." + fi +fi + +# Remove containerd containers and images if crictl is installed +if command -v crictl &>/dev/null; then + echo "Removing all containerd containers and images..." + sudo crictl stop $(sudo crictl pods -q 2>/dev/null || true) || true + sudo crictl rmp $(sudo crictl pods -q 2>/dev/null || true) || true + sudo crictl rm $(sudo crictl ps -a -q 2>/dev/null || true) || true + sudo crictl rmi $(sudo crictl images -q 2>/dev/null || true) || true +else + echo "crictl not found; skipping containerd cleanup." +fi + +if command -v k9s &>/dev/null; then + echo "Uninstalling k9s..." + sudo rm -f /usr/local/bin/k9s + echo "Successfully uninstalled k9s." +else + echo "k9s is not installed, nothing to uninstall." +fi +if [ -d "$HOME/k9s-installation" ]; then + echo "Removing k9s temporary installation directory..." + rm -rf "$HOME/k9s-installation" +fi +rm -rf ~/.config/k9s + +echo "Uninstalling istioctl..." +if command -v istioctl &>/dev/null; then + ISTIOCTL_PATH=$(command -v istioctl) + echo "Removing istioctl from $ISTIOCTL_PATH" + sudo rm -f "$ISTIOCTL_PATH" + hash -d istioctl 2>/dev/null || true +else + echo "istioctl not found, nothing to uninstall." +fi + +# Reset iptables: Flush all default chains +sudo iptables -F +sudo iptables -t nat -F +sudo iptables -t mangle -F +# Reset iptables: Delete known custom chains safely +for chain in FLANNEL-FWD FLANNEL-INGRESS FLANNEL-EGRESS; do + sudo iptables -D FORWARD -j $chain 2>/dev/null || true + sudo iptables -F $chain 2>/dev/null || true + sudo iptables -X $chain 2>/dev/null || true +done +# Reset iptables: Delete all remaining user-defined chains +sudo iptables -X || true +sudo iptables -t nat -X || true +sudo iptables -t mangle -X || true +# Reset iptables: Delete CNI interfaces +echo "Removing CNI network interfaces..." +sudo ip link delete cni0 2>/dev/null || true +sudo ip link delete flannel.1 2>/dev/null || true +sudo ip link delete weave 2>/dev/null || true + +sudo rm -rf ~/.kube +echo +echo "Kubernetes is cleaned up." + +echo "Performing general system cleanup..." +sudo apt-get autoremove -y +sudo apt-get autoclean + +cd "$SCRIPT_DIR" +sudo rm -rf dep +sudo rm -rf istio +sudo rm -rf nonrtric-controlpanel +sudo rm -rf rappmanager +sudo rm -rf rApps +sudo rm -rf install_time.txt +sudo rm -rf logs/ +sudo rm -rf tests/__pycache__ +sudo rm -rf tests/venv +sudo rm -rf tests/requirements.txt +sudo rm -rf tests/.requirements_hash + +echo +echo +echo "################################################################################" +echo "# Successfully uninstalled the Non-Real Time RAN Intelligent Controller #" +echo "################################################################################" diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_patch_files/dep/ric-dep/bin/install_k8s_and_helm.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_patch_files/dep/ric-dep/bin/install_k8s_and_helm.sh index d5eb6ee..f512541 100755 --- a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_patch_files/dep/ric-dep/bin/install_k8s_and_helm.sh +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_patch_files/dep/ric-dep/bin/install_k8s_and_helm.sh @@ -128,9 +128,9 @@ sudo apt-get install -y libsctp1 lksctp-tools # DOCKERV="20.10" #.21" # The version will be dynamically completed rather than hardcoding in the version -KUBEV="1.31" -KUBECNIV="1.3" -HELMV="3.16" +KUBEV="1.32" +KUBECNIV="1.5" +HELMV="3.17" # Fetch the Ubuntu release version regardless of the derivative distro if [ -f /etc/upstream-release/lsb-release ]; then @@ -148,7 +148,7 @@ if [ "$USE_DOCKER_CE" -eq 0 ]; then # Use docker.io fi else # Use docker.ce - DOCKERV="27.5" + DOCKERV="28.0" UBUNTU_CODENAME=$(grep -oP '^UBUNTU_CODENAME=\K.*' /etc/os-release 2>/dev/null) # If not found, try to extract VERSION_CODENAME as a fallback if [[ -z "$UBUNTU_CODENAME" ]]; then @@ -472,7 +472,7 @@ if sudo systemctl is-enabled --quiet docker.service; then fi # Uninstall Docker packages and clean up -sudo apt-get purge -y --allow-change-held-packages docker docker-engine docker-ce docker.io containerd runc || true +sudo apt-get remove --purge -y --allow-change-held-packages docker docker-engine docker-ce docker.io containerd runc || true sudo rm -rf /var/lib/docker /etc/docker sudo apt-get autoremove -y @@ -655,13 +655,21 @@ else echo "crictl not found; skipping containerd cleanup." fi -# Reset iptables +# Reset iptables: Flush all default chains sudo iptables -F sudo iptables -t nat -F sudo iptables -t mangle -F -sudo iptables -X -sudo iptables -t nat -X -sudo iptables -t mangle -X +# Reset iptables: Delete known custom chains safely +for chain in FLANNEL-FWD FLANNEL-INGRESS FLANNEL-EGRESS; do + sudo iptables -D FORWARD -j $chain 2>/dev/null || true + sudo iptables -F $chain 2>/dev/null || true + sudo iptables -X $chain 2>/dev/null || true +done +# Reset iptables: Delete all remaining user-defined chains +sudo iptables -X || true +sudo iptables -t nat -X || true +sudo iptables -t mangle -X || true +# Reset iptables: Delete CNI interfaces echo "Removing CNI network interfaces..." sudo ip link delete cni0 2>/dev/null || true sudo ip link delete flannel.1 2>/dev/null || true @@ -922,22 +930,6 @@ if ! kubectl apply -f "$HOME/.kube/kube-proxy-rbac.yaml"; then echo "Failed to apply Kube-Proxy ClusterRoleBinding, skipping." fi -# Create local-storage storage class -cat <"$HOME/.kube/local-storage-class.yaml" -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: local-storage -provisioner: kubernetes.io/no-provisioner -volumeBindingMode: WaitForFirstConsumer -EOF -echo "Local storage class configuration file created." - -# Apply the local-storage storage class -if ! kubectl apply -f "$HOME/.kube/local-storage-class.yaml"; then - echo "Failed to apply local storage class, skipping." -fi - # Check for node readiness for conditional taint removal echo "Waiting for essential system pods to be ready..." if [[ $KUBE_MAJOR -eq 1 && $KUBE_MINOR -ge 28 ]]; then diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_scripts/ensure_kong_storage_class_set_yaml.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_scripts/ensure_kong_storage_class_set_yaml.sh index f55c555..c99bfd5 100755 --- a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_scripts/ensure_kong_storage_class_set_yaml.sh +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_scripts/ensure_kong_storage_class_set_yaml.sh @@ -31,7 +31,8 @@ echo "# Script: $(realpath $0)..." SCRIPT_DIR=$(dirname "$(realpath "$0")") -cd "$(dirname "$SCRIPT_DIR")" +PARENT_DIR=$(dirname "$SCRIPT_DIR") +cd "$PARENT_DIR" # Get the file path from the command line argument KONG_CONFIG_PATH=$1 @@ -59,11 +60,13 @@ if ! command -v yq &>/dev/null; then sudo ./install_scripts/install_yq.sh fi -CURRENT_STORAGE_CLASS=$(yq eval '.postgresql.primary.persistence.storageClass' "$KONG_CONFIG_PATH") +# The following snippet is from https://lf-o-ran-sc.atlassian.net/wiki/spaces/RICNR/pages/86802787/Release+K+-+Run+in+Kubernetes: +# sed -i '/persistence:/,/existingClaim:/s/existingClaim: .*/enabled: false/' ./dep/nonrtric/helm/kongstorage/kongvalues.yaml && rm -rf ./dep/nonrtric/helm/kongstorage/templates +# Below are the equivalent yq commands: +echo "Removing existingClaim and setting persistence.enabled=false for Postgres..." +yq eval 'del(.postgresql.primary.persistence.existingClaim)' -i "$KONG_CONFIG_PATH" +yq eval '.postgresql.primary.persistence.enabled = false' -i "$KONG_CONFIG_PATH" +sudo rm -rf "$PARENT_DIR/dep/nonrtric/helm/kongstorage/templates" -if [ -z "$CURRENT_STORAGE_CLASS" ] || [ "$CURRENT_STORAGE_CLASS" == "null" ]; then - echo "Default storage class for Kong was not set, setting..." - yq eval '.postgresql.primary.persistence.storageClass = "standard"' -i "$KONG_CONFIG_PATH" -else - echo "Storage class is already set to $CURRENT_STORAGE_CLASS. No changes made." -fi +# Disable volumePermissions for PostgreSQL since it is causing error "container's runAsUser breaks non-root policy": +yq eval '.postgresql.volumePermissions.enabled = false' -i "$KONG_CONFIG_PATH" diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_scripts/install_docker_compose.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_scripts/install_docker_compose.sh index db21837..8add970 100755 --- a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_scripts/install_docker_compose.sh +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_scripts/install_docker_compose.sh @@ -28,16 +28,46 @@ # damage to property. The software developed by NIST employees is not subject to # copyright protection within the United States. -# if docker-compose -v &>/dev/null; then -# echo -# echo "Uninstalling docker-compose..." -# sudo rm -f /usr/local/bin/docker-compose -# sudo rm -f /usr/bin/docker-compose -# fi +echo "# Script: $(realpath $0)..." if ! command -v docker-compose &>/dev/null; then echo "Installing docker-compose..." - curl -SL https://github.com/docker/compose/releases/download/v2.30.1/docker-compose-linux-x86_64 -o docker-compose + + ARCH=$(uname -m) + case $ARCH in + x86_64) + ARCH="linux-x86_64" + ;; + aarch64) + ARCH="linux-aarch64" + ;; + armv6l) + ARCH="linux-armv6" + ;; + armv7l) + ARCH="linux-armv7" + ;; + ppc64le) + ARCH="linux-ppc64le" + ;; + riscv64) + ARCH="linux-riscv64" + ;; + s390x) + ARCH="linux-s390x" + ;; + *) + echo "Unsupported architecture: $ARCH" + exit 1 + ;; + esac + URL="https://github.com/docker/compose/releases/latest/download/docker-compose-$ARCH" + curl -SL $URL -o docker-compose + if [ $? -ne 0 ]; then + echo "Failed to download docker-compose. Please check your internet connection or the URL." + echo "URL: $URL" + exit 1 + fi sudo mv docker-compose /usr/local/bin/docker-compose || true sudo chmod +x /usr/local/bin/docker-compose sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose || true diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_scripts/wait_for_nonrtric_pods.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_scripts/wait_for_nonrtric_pods.sh index bdf72b5..40b6e8d 100755 --- a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_scripts/wait_for_nonrtric_pods.sh +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/install_scripts/wait_for_nonrtric_pods.sh @@ -157,4 +157,14 @@ if [ ! -z "$POD_INFO" ]; then fi fi +# Remove the unnecessary tiller-secret-generator pod if it has completed +CMD="kubectl get pods -n nonrtric --no-headers | grep 'oran-nonrtric-kong-init-migrations' | awk '{print \$1, \$3}'" +POD_INFO=$(eval $CMD) +POD_NAME=$(echo $POD_INFO | awk '{print $1}') +POD_STATUS=$(echo $POD_INFO | awk '{print $2}') +if [ "$POD_STATUS" == "Completed" ]; then + echo "Cleaning up pod $POD_NAME..." + kubectl delete pod $POD_NAME -n nonrtric +fi + echo "All required pods are now running." diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/run_control_panel.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/run_control_panel.sh index 5710953..151940c 100755 --- a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/run_control_panel.sh +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/run_control_panel.sh @@ -30,6 +30,7 @@ # Exit immediately if a command fails set -e +set -x if [ "$1" = "mock" ]; then MOCK_MODE=true @@ -45,6 +46,15 @@ fi SCRIPT_DIR=$(dirname "$(realpath "$0")") cd "$SCRIPT_DIR" +if ! command -v docker &>/dev/null; then + echo "Docker not found, installing..." + sudo apt-get update + sudo apt-get install -y docker.io + sudo systemctl start docker + sudo systemctl enable docker + sudo usermod -aG docker "$USER" +fi + if ! command -v docker-compose &>/dev/null; then ./install_scripts/install_docker_compose.sh fi @@ -59,13 +69,13 @@ if ! command -v yq &>/dev/null; then fi # Fetch the addresses of the policy management service and information service -SERVICE_INFO_PMS=$(kubectl get service -n nonrtric | grep policymanagementservice) +SERVICE_INFO_PMS=$(kubectl get service -n nonrtric | grep policymanagementservice || echo "") if [ ! -z "$SERVICE_INFO_PMS" ]; then IP_PMS=$(echo "$SERVICE_INFO_PMS" | awk '{print $3}') PORT_PMS=$(echo "$SERVICE_INFO_PMS" | awk '{split($5, a, /[:/]/); print a[1]}') fi -SERVICE_INFO_ICS=$(kubectl get service -n nonrtric | grep informationservice) +SERVICE_INFO_ICS=$(kubectl get service -n nonrtric | grep informationservice || echo "") if [ ! -z "$SERVICE_INFO_ICS" ]; then IP_ICS=$(echo "$SERVICE_INFO_ICS" | awk '{print $3}') PORT_ICS=$(echo "$SERVICE_INFO_ICS" | awk '{split($5, a, /[:/]/); print a[1]}') diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/run_tests.sh b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/run_tests.sh index 9130f04..d2689cc 100755 --- a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/run_tests.sh +++ b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/run_tests.sh @@ -74,6 +74,11 @@ if [[ "$VIRTUAL_ENV" == "" ]]; then exit 1 fi +if ! command -v pytest &>/dev/null; then + sudo rm -rf requirements.txt + sudo rm -rf .requirements_hash +fi + # Create the requirements.txt file if it doesn't exist already if [ ! -f requirements.txt ]; then cat </dev/null @@ -112,7 +117,10 @@ fi cd "$SCRIPT_DIR" -pytest tests/ -s +if ! pytest tests/ -s; then + echo + echo "Non-RT RIC was successfully installed but the tests failed. You can re-run the tests with ./run_tests.sh." +fi # Stop the sudo timeout refresher, it is no longer necessary to run ./install_scripts/stop_sudo_refresh.sh diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/tests/test_a1_policy.py b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/tests/test_a1_policy.py old mode 100755 new mode 100644 diff --git a/RAN_Intelligent_Controllers/Non-Real-Time-RIC/tests/test_hello_world.py b/RAN_Intelligent_Controllers/Non-Real-Time-RIC/tests/test_hello_world.py old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 index 20e4c9a..f48fca5 --- a/README.md +++ b/README.md @@ -2,20 +2,71 @@ Based on the blueprints described in NIST TN 2311 [[1]][nist-tn], this automation tool facilitates the deployment and configuration of 5G Open Radio Access Network (O-RAN) testbeds. Designed to operate in both bare metal and virtualized environments, it simplifies setting up the components required for a 5G O-RAN testbed, including the 5G Core; Next Generation Node B (gNodeB) composed of Radio Unit (RU), Distributed Unit (DU), and Centralized Unit (CU); User Equipment (UE); RAN Intelligent Controller (RIC); and a series of xApps that can be installed in the RIC. This reduces the complexity and time required to operationalize the testbeds described in the report above, and enables more efficient testing and validation to facilitate research and development in 5G technologies. -## Setting Up the Testbed +## Setting Up a Testbed -The automation tool can be used in virtual machines and physical machines with the minimum system requirements listed below. More details on the build options, including the configuration of physical hardware and individual software components are described in the report [[1]][nist-tn]. +The automation tool can be used in virtual machines and physical machines with the list of open-source components and minimum system requirements specified below. For additional details on the configuration of physical hardware and individual software components, refer to [[1]][nist-tn]. + +### Supported Testbed Open-Source Components + +

+ + + + Diagram of Testbed Open-Source Components + +

+ +This tool supports the deployment of 5G O-RAN testbeds using open-source components in two main scenarios: srsRAN with O-RAN SC's Near-RT RIC, and OpenAirInterface with Mosaic5G's FlexRIC. Below is the list of the supported testbed open-source components. + +```text +CU/DU +├── srsRAN_Project gNB: v24.10.1 +├── OpenAirInterface gNB: v2025.w17 +└── O-RAN SC E2 Simulator: k-release +RICs +├── O-RAN SC Near-RT RIC: k-release +│ └── xApps +│ ├── Hello World xApps (Go, Python, and Rust) +│ ├── KPI Monitor xApp +│ ├── 5G Cell Anomaly Detection xApp +│ ├── Anomaly Detection xApp +│ ├── Quality of Experience Predictor xApp +│ ├── RIC Control xApp +│ └── Traffic Steering xApp +├── FlexRIC: v2.0.0 +│ └── xApps +│ ├── KPI Monitor xApp +│ ├── MAC + RLC + PDCP + GTP Monitor xApp +│ ├── RIC Control xApp +│ └── RIC Control Monitor xApp +└── O-RAN SC Non-RT RIC: k-release + └── Minimal prototype with no rApp support. +5G Core +└── Open5GS: v2.7.5 +UEs +├── srsRAN_4G: v23.11 +└── OpenAirInterface 5G UE: v2025.w14 +``` + +The components that have been verified to support or not support connectivity are included below. +

+ + + + Diagram of Supported and Unsupported Connections + +

### Minimum System Requirements -Before beginning the installation and setup of the testbed, verify that your system meets the following minimum specifications to prevent issues like pods remaining in pending or crash loop states, often due to insufficient resources. +Before beginning the installation and setup of the testbed, verify that the system meets the following minimum specifications to prevent issues like pods remaining in pending or crash loop states if using an O-RAN SC RIC. - **Operating System**: Linux distributions based on Ubuntu 20.04 LTS, Ubuntu 22.04 LTS, and Ubuntu 24.04 LTS are supported. - - _Recommendation: Linux Mint 21.1 based on Ubuntu 22.04 LTS._ + - _Recommendation: Ubuntu 22.04._ - **Hard Drive Storage**: Must be `≥ 35` GB. - **Base Memory/RAM**: Must be `≥ 6144` MB. - **Number of Processors**: Must be `≥ 2` processors. - - _Recommendation: Between `6-8` processors for improved performance._ + - _Recommendation: `≥ 6` processors._ - **Internet Connectivity**: A stable internet connection must be maintained during the installation otherwise the process may fail and require restarting. ### Virtual Machine Preferences @@ -23,10 +74,10 @@ Before beginning the installation and setup of the testbed, verify that your sys For users using a virtual machine, e.g., VirtualBox, the following configuration parameters may be considered. - **System** - - **Extended Features**: Ensure that `Enable I/O APIC` is checked to improve interrupt handling. + - **Extended Features**: Check `Enable I/O APIC` to improve interrupt handling. - **Extended Features**: Check `Enable PAE/NX` and if possible, also check `Enable Nested VT-x/AMD-V`. - - **Paravirtualization Interface**: If the host machine is a Mac choose `Default`, if Windows choose `Hyper-V`, and if Linux choose `KVM`. - - **Hardware Virtualization**: Ensure that `Enabled Nested Paging` is checked. + - **Paravirtualization Interface**: Select `Default`. + - **Hardware Virtualization**: Check `Enabled Nested Paging`. - **Display** - **Video Memory**: Set the slider to the maximum if using a Desktop environment. - **Storage** @@ -67,13 +118,16 @@ Alternatively, you may clone the repository using SSH: `git clone git@github.com --- -Begin the installation process, recommended to be run as your current user rather than as root: +> [!TIP] +> The deployment scenario based on OpenAirInterface with FlexRIC can be installed from the `OpenAirInterface_Testbed` directory, while the deployment scenario based on srsRAN and O-RAN SC's Near-RT RIC can be installed from the base directory. + +Begin the installation process, recommended to be run as the current user rather than as root: ```console ./full_install.sh ``` -> [!TIP] +> [!NOTE] > Due to `set -e`, the scripts will halt upon encountering an error so that it can be corrected before trying again. Since the scripts are idempotent, only the incomplete steps of the installation process will be executed unless specified otherwise. Please be patient until an error occurs or the testbed installation completes successfully. ```text @@ -82,7 +136,11 @@ Begin the installation process, recommended to be run as your current user rathe ################################################################################ ``` -After successful installation, verify that the configs/ files are generated for the 5G Core, gNodeB, and UE using `./generate_configurations.sh`. Run the testbed with `./run.sh` to start the 5G Core and gNodeB as background processes, and the UE in the foreground. Use `./is_running.sh` to check if the components are running, and `./stop.sh` to stop the components. +
+ O-RAN SC Near-RT RIC and srsRAN Output +
+ +Run the testbed with `./run.sh` to start the 5G Core and gNodeB as background processes, and the UE in the foreground. Use `./is_running.sh` to check if the components are running, and `./stop.sh` to stop the components. The RIC starts automatically on boot and can be accessed with `k9s -A`. ```console Attaching UE... @@ -93,46 +151,108 @@ PDU Session Establishment successful. IP: 10.45.0.2 RRC NR reconfiguration successful. ``` -The RIC starts automatically on boot and can be accessed with `k9s -A`. For more information about a specific component, refer to the README.md files in the respective subdirectories. +Supplementary Network Monitoring, Visualization, and Control

+ Hubble UI showing network flows +

+ +See this section for the set up guide. +
+ +--- + +
+ OpenAirInterface and FlexRIC Output +
+ +Run the testbed with `./run.sh` to start the 5G Core, FlexRIC, gNodeB, and UE as background processes, and the KPI monitoring xApp in the foreground. Use `./is_running.sh` to check if the components are running, and `./stop.sh` to stop the components. + +```console +8 KPM ind_msg latency = 600 [μs] +UE ID type = gNB, amf_ue_ngap_id = 1 +ran_ue_id = 1 +DRB.PdcpSduVolumeDL = 0 [kb] +DRB.PdcpSduVolumeUL = 0 [kb] +DRB.RlcSduDelayDl = 0.00 [μs] +DRB.UEThpDl = 0.00 [kbps] +DRB.UEThpUl = 0.00 [kbps] +RRU.PrbTotDl = 15 [PRBs] +RRU.PrbTotUl = 140 [PRBs] +RSRP = -44.00 [dBm] +... +``` + +Supplementary Dashboard for KPI Visualization

+ Grafana dashboard of xApp KPI metrics +

+ +See this section for the set up guide. +
+ +--- ## Software Versioning -For stability of software dependencies, all `git clone` calls are first routed through `commit_hashes.json` to get the branch/commit hash to use for each repository git clone. This file can be updated manually, or by running `./Additional_Scripts/update_commit_hashes.sh` to fetch the latest commit hashes. For information about the automation tool versions, please see the releases page [[2]][gh-ota]. +For stability of software dependencies, all `git clone` calls are routed through `commit_hashes.json` which specifies a branch and/or commit hash for each repository. This file can be updated manually, or with `./Additional_Scripts/update_commit_hashes.sh` to fetch the latest commit hashes. For information about the automation tool versions, please see the releases page [[2]][gh-ota]. -## Alternative Testbeds +## Documentation -As an alternative, the testbed by OpenAirInterface can be installed from the `OpenAirInterface_Testbed` directory. This installs the 5G Core Network by Open5GS, gNodeB by OpenAirInterface, 5G UE by OpenAirInterface, and FlexRIC by Mosaic5G. For more information, please visit the README.md documents within the respective directories. +For more information about a specific component, refer to the README.md files in the respective subdirectories: +- README.md [[3]][gh-readme] +- 5G_Core_Network/README.md [[4]][gh-5gcore] +- Next_Generation_Node_B/README.md [[5]][gh-gnodeb] +- User_Equipment/README.md [[6]][gh-ue] +- RAN_Intelligent_Controllers/Near-Real-Time-RIC/README.md [[7]][gh-nearrtric] +- RAN_Intelligent_Controllers/Non-Real-Time-RIC/README.md [[8]][gh-nonrtric] +- OpenAirInterface_Testbed/README.md [[9]][gh-oai] +- OpenAirInterface_Testbed/Next_Generation_Node_B/README.md [[10]][gh-oaignb] +- OpenAirInterface_Testbed/User_Equipment/README.md [[11]][gh-oaiue] +- OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/README.md [[12]][gh-flexric] ## Contact Information -USNISTGOV/O-RAN-Testbed-Automation is developed and maintained by the NIST Wireless Networks Division [[3]][nist-wnd], as part of their Open RAN Research Program [[4]][nist-oran]. Contacts for this software: +USNISTGOV/O-RAN-Testbed-Automation is developed and maintained by the NIST Wireless Networks Division [[13]][nist-wnd], as part of their Open RAN Research Program [[14]][nist-oran]. Contacts for this software: - Simeon J. Wuthier, @Simewu - Peng Liu, @pengnist - Kyehwan Lee, @kyehwanlee - Fernando J. Cintrón, @fjcintron +- Doug Montgomery, @dougm-nist ## NIST Disclaimers -- **NIST Software Disclaimer** [[5]][gh-nsd] -- **NIST Commercial Software Disclaimer** [[6]][gh-cpd] -- **Fair Use and Licensing Statements of NIST Data/Works** [[7]][gh-license] +- **NIST Software Disclaimer** [[15]][gh-nsd] +- **NIST Commercial Software Disclaimer** [[16]][gh-cpd] +- **Fair Use and Licensing Statements of NIST Data/Works** [[17]][gh-license] ## References 1. Liu, Peng, Lee, Kyehwan, Cintrón, Fernando J., Wuthier, Simeon, Savaliya, Bhadresh, Montgomery, Douglas, Rouil, Richard (2024). Blueprint for Deploying 5G O-RAN Testbeds: A Guide to Using Diverse O-RAN Software Stacks. National Institute of Standards and Technology. [https://doi.org/10.6028/NIST.TN.2311][nist-tn]. 2. Releases, Automation Tool for Deploying 5G O-RAN Testbeds. GitHub. [https://github.com/USNISTGOV/O-RAN-Testbed-Automation/releases][gh-ota]. -3. Wireless Networks Division. National Institute of Standards and Technology. [https://www.nist.gov/ctl/Wireless-Networks-Division][nist-wnd]. -4. Open RAN Research at NIST. National Institute of Standards and Technology. [https://www.nist.gov/programs-projects/Open-RAN-Research-NIST][nist-oran]. -5. NIST Software Disclaimer. [NIST Software Disclaimer.md][gh-nsd]. -6. NIST Commercial Software Disclaimer. [NIST Commercial Product Disclaimer.md][gh-cpd]. -7. Fair Use and Licensing Statements of NIST Data/Works: [LICENSE][gh-license]. +3. Documentation of Base Directory. [https://github.com/usnistgov/O-RAN-Testbed-Automation/blob/main/README.md][gh-readme] +4. Documentation of 5G Core Network (Open5GS). [https://github.com/usnistgov/O-RAN-Testbed-Automation/blob/main/5G_Core_Network/README.md][gh-5gcore]. +5. Documentation of Next Generation Node B (srsRAN_Project). [https://github.com/usnistgov/O-RAN-Testbed-Automation/blob/main/Next_Generation_Node_B/README.md][gh-gnodeb]. +6. Documentation of User Equipment (srsRAN_4G). [https://github.com/usnistgov/O-RAN-Testbed-Automation/blob/main/User_Equipment/README.md][gh-ue]. +7. Documentation of Near-Real Time RAN Intelligent Controller (O-RAN SC). [https://github.com/usnistgov/O-RAN-Testbed-Automation/blob/main/RAN_Intelligent_Controllers/Near-Real-Time-RIC/README.md][gh-nearrtric]. +8. Documentation of Non-Real Time RAN Intelligent Controller (O-RAN SC). [https://github.com/usnistgov/O-RAN-Testbed-Automation/blob/main/RAN_Intelligent_Controllers/Non-Real-Time-RIC/README.md][gh-nonrtric]. +9. Documentation of OpenAirInterface Testbed. [https://github.com/usnistgov/O-RAN-Testbed-Automation/blob/main/OpenAirInterface_Testbed/README.md][gh-oai]. +10. Documentation of Next Generation Node B (OpenAirInterface). [https://github.com/usnistgov/O-RAN-Testbed-Automation/blob/main/OpenAirInterface_Testbed/Next_Generation_Node_B/README.md][gh-oaignb]. +11. Documentation of User Equipment (OpenAirInterface). [https://github.com/usnistgov/O-RAN-Testbed-Automation/blob/main/OpenAirInterface_Testbed/User_Equipment/README.md][gh-oaiue]. +12. Documentation of Near-Real Time RAN Intelligent Controller (FlexRIC). [https://github.com/usnistgov/O-RAN-Testbed-Automation/blob/main/OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/README.md][gh-flexric]. +13. Wireless Networks Division. National Institute of Standards and Technology. [https://www.nist.gov/ctl/Wireless-Networks-Division][nist-wnd]. +14. Open RAN Research at NIST. National Institute of Standards and Technology. [https://www.nist.gov/programs-projects/Open-RAN-Research-NIST][nist-oran]. +15. NIST Software Disclaimer. [https://github.com/usnistgov/O-RAN-Testbed-Automation/blob/main/NIST Software Disclaimer.md][gh-nsd]. +16. NIST Commercial Software Disclaimer. [https://github.com/usnistgov/O-RAN-Testbed-Automation/blob/main/NIST Commercial Product Disclaimer.md][gh-cpd]. +17. Fair Use and Licensing Statements of NIST Data/Works: [https://github.com/usnistgov/O-RAN-Testbed-Automation/blob/main/LICENSE][gh-license]. ##

- National Institute of Standards and Technology + + + + National Institute of Standards and Technology +

@@ -140,6 +260,16 @@ USNISTGOV/O-RAN-Testbed-Automation is developed and maintained by the NIST Wirel [nist-tn]: https://doi.org/10.6028/NIST.TN.2311 [gh-ota]: https://github.com/USNISTGOV/O-RAN-Testbed-Automation/releases +[gh-readme]: README.md +[gh-5gcore]: 5G_Core_Network/README.md +[gh-gnodeb]: Next_Generation_Node_B/README.md +[gh-ue]: User_Equipment/README.md +[gh-nearrtric]: RAN_Intelligent_Controllers/Near-Real-Time-RIC/README.md +[gh-nonrtric]: RAN_Intelligent_Controllers/Non-Real-Time-RIC/README.md +[gh-oai]: OpenAirInterface_Testbed/README.md +[gh-oaignb]: OpenAirInterface_Testbed/Next_Generation_Node_B/README.md +[gh-oaiue]: OpenAirInterface_Testbed/User_Equipment/README.md +[gh-flexric]: OpenAirInterface_Testbed/RAN_Intelligent_Controllers/Flexible-RIC/README.md [nist-wnd]: https://www.nist.gov/ctl/Wireless-Networks-Division [nist-oran]: https://www.nist.gov/programs-projects/Open-RAN-Research-NIST [gh-nsd]: ./NIST%20Software%20Disclaimer.md diff --git a/User_Equipment/.gitignore b/User_Equipment/.gitignore old mode 100755 new mode 100644 index a489653..305bef3 --- a/User_Equipment/.gitignore +++ b/User_Equipment/.gitignore @@ -7,3 +7,4 @@ czmq install_time.txt libzmq +!install_patch_files/ diff --git a/User_Equipment/OpenAirInterface_UE b/User_Equipment/OpenAirInterface_UE new file mode 120000 index 0000000..6d8df68 --- /dev/null +++ b/User_Equipment/OpenAirInterface_UE @@ -0,0 +1 @@ +../OpenAirInterface_Testbed/User_Equipment/ \ No newline at end of file diff --git a/User_Equipment/README.md b/User_Equipment/README.md old mode 100755 new mode 100644 index 12b949d..8208dd9 --- a/User_Equipment/README.md +++ b/User_Equipment/README.md @@ -4,7 +4,7 @@ The User Equipment (UE) is a simulated device utilizing the srsRAN_4G software p ## Usage -- **Compile**: Use `./full_install.sh` to build the UE software. +- **Compile**: Use `./full_install.sh` to build and install the UE software. - **Generate Configurations**: Use `./generate_configurations.sh` to create configuration files. - Configuration files can be accessed and modified in the `configs` directory. - **Start the UE**: Use `./run.sh` to start the UE, or `./run_background.sh` to run it as a background process where the output is redirected to `logs/ue1_stdout.txt`. @@ -13,6 +13,7 @@ The User Equipment (UE) is a simulated device utilizing the srsRAN_4G software p - To stop an individual UE, use `./stop.sh `. - **Status**: Check running UEs with `./is_running.sh`. The output will display which UEs are running. - **Logs**: Access logs by navigating to the `logs` directory. +- **Uninstall**: Use `./uninstall.sh` to remove the UE software. ## Multiple UEs @@ -23,7 +24,7 @@ The `run.sh`, `run_background.sh` and `stop.sh` scripts can be given an optional - Key - Network namespace -For UE 1, UE 2, and UE 3, the SIM subscriber information is pre-registered with the 5G Core Network. For `` values greater than 3, the unique values are generated dynamically and automatically registered with the 5G Core Network, and stored in the `configs` directory as their own `ue.conf` file. For more information about the parameter values, refer to the `run.sh` script source code. +For UE 1, UE 2, and UE 3, the SIM subscriber information is pre-registered with the 5G Core Network. For `` values greater than 3, the unique values are generated dynamically, registered with the 5G Core, and stored in the `configs` directory as their own `ue.conf` file before starting the UE software. For more information about the parameter values, refer to the `run.sh` script source code. ## References diff --git a/User_Equipment/full_install.sh b/User_Equipment/full_install.sh index 0b725d7..c4feecf 100755 --- a/User_Equipment/full_install.sh +++ b/User_Equipment/full_install.sh @@ -89,7 +89,7 @@ fi export NEEDRESTART_SUSPEND=1 # Code from (https://docs.srsran.com/projects/4g/en/latest/general/source/1_installation.html#installation-from-source): -sudo apt-get install -y build-essential cmake libfftw3-dev libmbedtls-dev libboost-program-options-dev libconfig++-dev libsctp-dev +sudo apt-get install -y build-essential cmake cmake-data libfftw3-dev libmbedtls-dev libboost-program-options-dev libconfig++-dev libsctp-dev sudo apt-get install -y libboost-all-dev sudo apt-get install -y libuhd-dev @@ -113,6 +113,17 @@ else echo "SCTP module loaded successfully." fi +# Check if GCC 13 is installed, if not, install it and set it as the default +GCC_VERSION=$(gcc -v 2>&1 | grep "gcc version" | awk '{print $3}') +if [[ -z "$GCC_VERSION" || ! "$GCC_VERSION" == 13.* ]]; then + echo "Installing GCC 13..." + sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + sudo apt-get update + sudo apt-get install -y gcc-13 g++-13 + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100 +fi + cd "$SCRIPT_DIR" echo @@ -194,7 +205,7 @@ INSTALL_END_TIME=$(date +%s) if [ -n "$INSTALL_START_TIME" ]; then DURATION=$((INSTALL_END_TIME - INSTALL_START_TIME)) DURATION_MINUTES=$(echo "scale=5; $DURATION/ 60" | bc) - echo "The srsUE installation process took $DURATION_MINUTES minutes to complete." + echo "The User Equipment installation process took $DURATION_MINUTES minutes to complete." mkdir -p logs echo "$DURATION_MINUTES minutes" >>install_time.txt fi diff --git a/User_Equipment/full_uninstall.sh b/User_Equipment/full_uninstall.sh new file mode 100755 index 0000000..b41f4f1 --- /dev/null +++ b/User_Equipment/full_uninstall.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Do not exit immediately if a command fails +set +e + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +cd "$SCRIPT_DIR" + +echo "Stopping User Equipment..." +./stop.sh + +echo "Uninstalling ZeroMQ libzmq..." +if [ -d libzmq ]; then + cd libzmq + sudo make uninstall + cd .. +fi +sudo rm -rf libzmq + +echo "Uninstalling ZeroMQ czmq..." +if [ -d czmq ]; then + cd czmq + sudo make uninstall + cd .. +fi +sudo rm -rf czmq + +echo "Uninstalling srsRAN_4G..." +if [ -d srsRAN_4G/build ]; then + cd srsRAN_4G/build + sudo make uninstall + cd ../.. +fi +sudo rm -rf srsRAN_4G + +sudo rm -rf logs/ +sudo rm -rf configs/ +sudo rm -rf install_time.txt + +echo +echo +echo "################################################################################" +echo "# Successfully uninstalled User Equipment #" +echo "################################################################################" diff --git a/User_Equipment/generate_configurations.sh b/User_Equipment/generate_configurations.sh index 2a741d9..31ff274 100755 --- a/User_Equipment/generate_configurations.sh +++ b/User_Equipment/generate_configurations.sh @@ -45,9 +45,15 @@ if ! command -v yq &>/dev/null; then fi echo "Downloading configuration file example..." -rm -rf "$SCRIPT_DIR/configs" -mkdir "$SCRIPT_DIR/configs" -rm -rf "$SCRIPT_DIR/logs" +rm -rf configs +mkdir configs + +# Only remove the logs if is not running +RUNNING_STATUS=$(./is_running.sh) +if [[ $RUNNING_STATUS != *": RUNNING"* ]]; then + rm -rf logs + mkdir logs +fi wget https://raw.githubusercontent.com/srsran/srsRAN/master/srsue/ue.conf.example -O configs/ue1.conf # Function to update or add configuration properties in .conf files, considering sections and uncommenting if needed @@ -68,6 +74,22 @@ update_conf() { sed -i "/^\[$SECTION\]/a $PROPERTY = $VALUE" "$FILE_PATH" } +PLMN_LENGTH=${#PLMN} + +IMSI="001010123456780" + +# Read the PLMN value from the 5G Core, and apply it to the beginning of the UE's IMSI +YAML_PATH="../5G_Core_Network/options.yaml" +if [ ! -f "$YAML_PATH" ]; then + echo "Configuration not found in $YAML_PATH, please generate the configuration for 5G_Core_Network first." + exit 1 +fi +PLMN=$(sed -n 's/^plmn: \([0-9]*\)/\1/p' "$YAML_PATH" | tr -d '[:space:]') +if [ ! -z "$PLMN" ]; then + PLMN_LENGTH=${#PLMN} + IMSI="${PLMN}${IMSI:$PLMN_LENGTH}" +fi + UE1_TX_PORT=2001 # 2101 UE1_RX_PORT=2000 # 2100 @@ -102,7 +124,7 @@ update_conf "configs/ue1.conf" "pcap" "nas_filename" "$SCRIPT_DIR/logs/ue1_nas.p update_conf "configs/ue1.conf" "log" "all_level" "info" #warning update_conf "configs/ue1.conf" "log" "phy_lib_level" "none" update_conf "configs/ue1.conf" "log" "all_hex_limit" "32" -update_conf "configs/ue1.conf" "log" "filename" "$SCRIPT_DIR/logs/ue1.txt" +update_conf "configs/ue1.conf" "log" "filename" "$SCRIPT_DIR/logs/ue1.log" update_conf "configs/ue1.conf" "log" "file_max_size" "-1" # Update configuration values for Metrics @@ -112,7 +134,7 @@ update_conf "configs/ue1.conf" "general" "metrics_csv_filename" "$SCRIPT_DIR/log update_conf "configs/ue1.conf" "general" "metrics_json_enable" "false" update_conf "configs/ue1.conf" "general" "metrics_json_filename" "$SCRIPT_DIR/logs/ue_metrics.json" update_conf "configs/ue1.conf" "general" "tracing_enable" "true" -update_conf "configs/ue1.conf" "general" "tracing_filename" "$SCRIPT_DIR/logs/ue1_tracing.txt" +update_conf "configs/ue1.conf" "general" "tracing_filename" "$SCRIPT_DIR/logs/ue1_tracing.log" update_conf "configs/ue1.conf" "general" "tracing_buffcapacity" "1000000" # Update configuration values for USIM @@ -120,7 +142,7 @@ update_conf "configs/ue1.conf" "usim" "mode" "soft" update_conf "configs/ue1.conf" "usim" "algo" "milenage" update_conf "configs/ue1.conf" "usim" "opc" "63BFA50EE6523365FF14C1F45F88737D" update_conf "configs/ue1.conf" "usim" "k" "00112233445566778899aabbccddeeff" -update_conf "configs/ue1.conf" "usim" "imsi" "001010123456780" +update_conf "configs/ue1.conf" "usim" "imsi" "$IMSI" update_conf "configs/ue1.conf" "usim" "imei" "353490069873319" # Update configuration values for RRC @@ -139,7 +161,4 @@ update_conf "configs/ue1.conf" "gw" "ip_netmask" "255.255.255.0" # Update configuration values for GUI update_conf "configs/ue1.conf" "gui" "enable" "false" -mkdir -p logs -sudo chown $USER:$USER -R logs - echo "Successfully configured the UE. The configuration file is located in the configs/ directory." diff --git a/User_Equipment/run.sh b/User_Equipment/run.sh index 97ab1d1..8aadea6 100755 --- a/User_Equipment/run.sh +++ b/User_Equipment/run.sh @@ -28,6 +28,9 @@ # damage to property. The software developed by NIST employees is not subject to # copyright protection within the United States. +# Exit immediately if a command fails +set -e + if ! command -v realpath &>/dev/null; then echo "Package \"coreutils\" not found, installing..." sudo apt-get install -y coreutils @@ -40,12 +43,10 @@ UE_NUMBER=1 if [ "$#" -eq 1 ]; then UE_NUMBER=$1 fi - if ! [[ $UE_NUMBER =~ ^[0-9]+$ ]]; then echo "Error: UE number must be a number." exit 1 fi - if [ $UE_NUMBER -lt 1 ]; then echo "Error: UE number must be greater than or equal to 1." exit 1 @@ -102,6 +103,18 @@ elif [ $UE_NUMBER -gt 3 ]; then # Dynamic configurations for UE 4 and beyond UE_NAMESPACE="ue$UE_NUMBER" fi +# Read the PLMN value from the 5G Core, and apply it to the beginning of the UE's IMSI +YAML_PATH="../5G_Core_Network/options.yaml" +if [ ! -f "$YAML_PATH" ]; then + echo "Configuration not found in $YAML_PATH, please generate the configuration for 5G_Core_Network first." + exit 1 +fi +PLMN=$(sed -n 's/^plmn: \([0-9]*\)/\1/p' "$YAML_PATH" | tr -d '[:space:]') +if [ ! -z "$PLMN" ]; then + PLMN_LENGTH=${#PLMN} + UE_IMSI="${PLMN}${UE_IMSI:$PLMN_LENGTH}" +fi + # echo "UE IMEI: $UE_IMEI" # echo "UE IMSI: $UE_IMSI" # echo "UE KEY: $UE_KEY" @@ -145,9 +158,9 @@ else update_conf "$UE_CONF_PATH" "pcap" "mac_filename" "logs/ue${UE_NUMBER}_mac.pcap" update_conf "$UE_CONF_PATH" "pcap" "mac_nr_filename" "logs/ue${UE_NUMBER}_mac_nr.pcap" update_conf "$UE_CONF_PATH" "pcap" "nas_filename" "logs/ue${UE_NUMBER}_nas.pcap" - update_conf "$UE_CONF_PATH" "log" "filename" "logs/ue${UE_NUMBER}.txt" + update_conf "$UE_CONF_PATH" "log" "filename" "logs/ue${UE_NUMBER}.log" update_conf "$UE_CONF_PATH" "general" "metrics_csv_filename" "logs/ue${UE_NUMBER}_metrics.csv" - update_conf "$UE_CONF_PATH" "general" "tracing_filename" "logs/ue${UE_NUMBER}_tracing.txt" + update_conf "$UE_CONF_PATH" "general" "tracing_filename" "logs/ue${UE_NUMBER}_tracing.log" echo "Successfully created configuration file \"$UE_CONF_PATH\"." fi fi @@ -171,7 +184,6 @@ else exit 1 fi mkdir -p logs - sudo chown -R $USER:$USER logs >logs/ue${UE_NUMBER}_stdout.txt echo "Starting srsue (ue$UE_NUMBER)..." sudo ./srsRAN_4G/build/srsue/src/srsue --config_file "$UE_CONF_PATH" diff --git a/User_Equipment/run_background.sh b/User_Equipment/run_background.sh index 59ca322..2b25cc8 100755 --- a/User_Equipment/run_background.sh +++ b/User_Equipment/run_background.sh @@ -28,6 +28,9 @@ # damage to property. The software developed by NIST employees is not subject to # copyright protection within the United States. +# Exit immediately if a command fails +set -e + if ! command -v realpath &>/dev/null; then echo "Package \"coreutils\" not found, installing..." sudo apt-get install -y coreutils @@ -40,12 +43,10 @@ UE_NUMBER=1 if [ "$#" -eq 1 ]; then UE_NUMBER=$1 fi - if ! [[ $UE_NUMBER =~ ^[0-9]+$ ]]; then echo "Error: UE number must be a number." exit 1 fi - if [ $UE_NUMBER -lt 1 ]; then echo "Error: UE number must be greater than or equal to 1." exit 1 @@ -57,14 +58,12 @@ if [ ! -f "configs/ue1.conf" ]; then fi echo "Starting User Equipment in background..." mkdir -p logs -sudo chown -R $USER:$USER logs >logs/ue${UE_NUMBER}_stdout.txt sudo setsid bash -c "stdbuf -oL -eL \"$SCRIPT_DIR/run.sh\" $UE_NUMBER > logs/ue${UE_NUMBER}_stdout.txt 2>&1" /dev/null 2>&1 + # Send a graceful shutdown signal to the UE process if [ -z "$UE_NUMBER" ]; then sudo pkill -f "srsue" >/dev/null 2>&1 & @@ -76,7 +79,7 @@ while [ $COUNT -lt $MAX_COUNT ]; do exit 0 fi else - if echo "$IS_RUNNING" | grep -q "ue$UE_NUMBER"; then + if ! echo "$IS_RUNNING" | grep -q "ue$UE_NUMBER"; then echo "The User Equipment $UE_NUMBER has stopped gracefully." ./is_running.sh exit 0 diff --git a/commit_hashes.json b/commit_hashes.json old mode 100755 new mode 100644 index 7e326a6..de57eef --- a/commit_hashes.json +++ b/commit_hashes.json @@ -1,9 +1,9 @@ { - "https://github.com/open5gs/open5gs.git": ["", "e3dd98cd291fba233a46adb2881213fc6e38b924"], + "https://github.com/open5gs/open5gs.git": ["", "7b40d5a3f1080f088c653abfdc01f3adfac5d3cd"], "https://github.com/srsran/srsRAN_4G.git": ["", "ec29b0c1ff79cebcbe66caa6d6b90778261c42b8"], "https://github.com/zeromq/libzmq.git": ["", "34f7fa22022bed9e0e390ed3580a1c83ac4a2834"], "https://github.com/zeromq/czmq.git": ["", "5b5c640248dfb6e9a9a612cfad16d8c019e5702c"], - "https://github.com/srsran/srsRAN_Project.git": ["", "cc2869f967adfd8d33f9d1440839bf5f1b282998"], + "https://github.com/srsran/srsRAN_Project.git": ["", "644263b5a7c7b98b892bc1120940ae8d801eaee0"], "https://gerrit.o-ran-sc.org/r/ric-plt/ric-dep.git": ["master", "33b5940a15ea852d47f73521295eef53d295b7fd"], "https://gerrit.o-ran-sc.org/r/sim/e2-interface.git": ["k-release", "da6f82f286cdbb38af1178f82f85877b12c2f85b"], "https://gerrit.o-ran-sc.org/r/ric-plt/appmgr.git": ["", "4c05932dce72e98db23eaff2b72b58816e1f2d55"], @@ -16,10 +16,13 @@ "https://gerrit.o-ran-sc.org/r/ric-app/rc.git": ["k-release", "a2282eedc9e32f60298bf530456ad367bef0824b"], "https://gerrit.o-ran-sc.org/r/ric-app/ts.git": ["master", "19e169b2e81a0dbaf3d9dc526de0415cc995ee8b"], "https://gerrit.o-ran-sc.org/r/ric-app/qp.git": ["k-release", "47a35cafc3f90aed8b6fa711c37b131f06061ca6"], - "https://gerrit.o-ran-sc.org/r/it/dep.git": ["master", "cdb4ba3d9d5a86cda7b68d70c2ea0cb891d38471"], - "https://gerrit.o-ran-sc.org/r/nonrtric/plt/ranpm.git": ["master", "cfb34a99dc39c0ef22d5b1aab884483338ffed95"], + "https://gerrit.o-ran-sc.org/r/it/dep.git": ["master", "dfcfdbc9b540b3e6d401b8c09379e5a8b6267848"], + "https://gerrit.o-ran-sc.org/r/nonrtric/plt/ranpm.git": ["master", "b5f4f8698217ce70d3c2e6a454146fbcd2111d35"], "https://github.com/onap/multicloud-k8s.git": ["", "8bea0a13c223aff43f98f0cb6426379bb23e8894"], - "https://gerrit.onap.org/r/oom.git": ["", "60c14232c92f4e04c53d1a75a76c3f17bb32d0e2"], + "https://gerrit.onap.org/r/oom.git": ["", "1ca9e322036072b2d1ef69046c297ca13f1618b7"], "https://gerrit.o-ran-sc.org/r/portal/nonrtric-controlpanel.git": ["master", "15bdaf8f25dca54e3a52ad30d69fa2eb1d59ce48"], - "https://gerrit.o-ran-sc.org/r/nonrtric/plt/rappmanager.git": ["k-release", "688ab2c9ac9b1af06c30ddc28db9bcc5ecaaa096"] + "https://gerrit.o-ran-sc.org/r/nonrtric/plt/rappmanager.git": ["k-release", "688ab2c9ac9b1af06c30ddc28db9bcc5ecaaa096"], + "https://gitlab.eurecom.fr/oai/openairinterface5g.git": ["develop", "acb982d0bd96b01dee84aea730f01dfff73875d0"], + "https://github.com/swig/swig.git": ["master", "01bf5808dd44516a7937afd4fb5438c026d937ac"], + "https://gitlab.eurecom.fr/mosaic5g/flexric.git": ["dev", "596a1ae67309618a74e09e56dff9a723ea7d99c5"] } diff --git a/commit_hashes_j_release.json b/commit_hashes_j_release.json old mode 100755 new mode 100644 index fdffc30..24dd008 --- a/commit_hashes_j_release.json +++ b/commit_hashes_j_release.json @@ -16,11 +16,13 @@ "https://gerrit.o-ran-sc.org/r/ric-app/rc.git": ["master", "a2282eedc9e32f60298bf530456ad367bef0824b"], "https://gerrit.o-ran-sc.org/r/ric-app/ts.git": ["master", "19e169b2e81a0dbaf3d9dc526de0415cc995ee8b"], "https://gerrit.o-ran-sc.org/r/ric-app/qp.git": ["master", "47a35cafc3f90aed8b6fa711c37b131f06061ca6"], - "https://gerrit.o-ran-sc.org/r/ric-app/ml.git": ["master", "2a2860f7ab79121d75647e73697e4c51168db350"], "https://gerrit.o-ran-sc.org/r/it/dep.git": ["master", "60372089116269f82038c0fe38a02acbc51fb269"], "https://gerrit.o-ran-sc.org/r/nonrtric/plt/ranpm.git": ["master", "dbb29d3eb620b0ed223510590030a9a4a3c73d50"], "https://github.com/onap/multicloud-k8s.git": ["", "8bea0a13c223aff43f98f0cb6426379bb23e8894"], "https://gerrit.onap.org/r/oom.git": ["", "c6ddebbd61e755f078d97483a4efec6189e4d756"], "https://gerrit.o-ran-sc.org/r/portal/nonrtric-controlpanel.git": ["master", "15bdaf8f25dca54e3a52ad30d69fa2eb1d59ce48"], - "https://gerrit.o-ran-sc.org/r/nonrtric/plt/rappmanager.git": ["j-release", "ffd5b45b53572ae42fbc22510bcbe3ad8883b86f"] + "https://gerrit.o-ran-sc.org/r/nonrtric/plt/rappmanager.git": ["j-release", "ffd5b45b53572ae42fbc22510bcbe3ad8883b86f"], + "https://gitlab.eurecom.fr/oai/openairinterface5g.git": ["develop", "acb982d0bd96b01dee84aea730f01dfff73875d0"], + "https://github.com/swig/swig.git": ["master", "01bf5808dd44516a7937afd4fb5438c026d937ac"], + "https://gitlab.eurecom.fr/mosaic5g/flexric.git": ["dev", "596a1ae67309618a74e09e56dff9a723ea7d99c5"] } diff --git a/full_install.sh b/full_install.sh index b8c324f..22b6c7b 100755 --- a/full_install.sh +++ b/full_install.sh @@ -164,7 +164,7 @@ cd .. echo echo echo "################################################################################" -echo "# Installing Near Real-Time RAN Intelligent Controller... #" +echo "# Installing Near-Real-Time RAN Intelligent Controller... #" echo "################################################################################" echo echo diff --git a/full_uninstall.sh b/full_uninstall.sh new file mode 100755 index 0000000..ba5550a --- /dev/null +++ b/full_uninstall.sh @@ -0,0 +1,108 @@ +#!/bin/bash +# +# NIST-developed software is provided by NIST as a public service. You may use, +# copy, and distribute copies of the software in any medium, provided that you +# keep intact this entire notice. You may improve, modify, and create derivative +# works of the software or any portion of the software, and you may copy and +# distribute such modifications or works. Modified works should carry a notice +# stating that you changed the software and should note the date and nature of +# any such change. Please explicitly acknowledge the National Institute of +# Standards and Technology as the source of the software. +# +# NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY +# OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, +# INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST +# NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +# UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +# NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR +# THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +# RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +# +# You are solely responsible for determining the appropriateness of using and +# distributing the software and you assume all risks associated with its use, +# including but not limited to the risks and costs of program errors, compliance +# with applicable laws, damage to or loss of data, programs or equipment, and +# the unavailability or interruption of operation. This software is not intended +# to be used in any situation where a failure could cause risk of injury or +# damage to property. The software developed by NIST employees is not subject to +# copyright protection within the United States. + +# Do not exit immediately if a command fails +set +e + +clear +echo "This script will remove Open5GS, srsRAN_Project, srsRAN_4G, and the Near-RT RIC by removing Docker and Kubernetes." +echo "This is a destructive operation and may result in data loss." +echo "Please ensure you have backed up any necessary data before proceeding." +echo +echo "Do you want to proceed? (yes/no)" +read -r PROCEED +if [ "$PROCEED" != "yes" ]; then + echo "Exiting script." + exit 0 +fi + +if ! command -v realpath &>/dev/null; then + echo "Package \"coreutils\" not found, installing..." + sudo apt-get install -y coreutils +fi + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +cd "$SCRIPT_DIR" + +echo "Stopping 5G Core Network, srsRAN_Project, and srsRAN_4G..." +./stop.sh + +echo +echo +echo "################################################################################" +echo "# Uninstalling 5G Core... #" +echo "################################################################################" +echo +echo + +cd 5G_Core_Network +./full_uninstall.sh + +cd .. + +echo +echo +echo "################################################################################" +echo "# Uninstalling User Equipment... #" +echo "################################################################################" +echo +echo + +cd User_Equipment +./full_uninstall.sh + +cd .. + +echo +echo +echo "################################################################################" +echo "# Uninstalling Next Generation Node B... #" +echo "################################################################################" +echo +echo + +cd Next_Generation_Node_B +./full_uninstall.sh + +cd .. + +echo +echo +echo "################################################################################" +echo "# Uninstalling Near-Real-Time RAN Intelligent Controller... #" +echo "################################################################################" +echo +echo + +cd RAN_Intelligent_Controllers/Near-Real-Time-RIC +./full_uninstall.sh bypass_confirmation + +echo +echo "To ensure components within the OpenAirInterface testbed are also uninstalled, run \"./OpenAirInterface_Testbed/full_uninstall.sh\"." diff --git a/run.sh b/run.sh index 1fa4510..33c90d3 100755 --- a/run.sh +++ b/run.sh @@ -28,6 +28,9 @@ # damage to property. The software developed by NIST employees is not subject to # copyright protection within the United States. +# Exit immediately if a command fails +set -e + if ! command -v realpath &>/dev/null; then echo "Package \"coreutils\" not found, installing..." sudo apt-get install -y coreutils @@ -37,7 +40,7 @@ SCRIPT_DIR=$(dirname "$(realpath "$0")") cd "$SCRIPT_DIR" # Upon exit, gracefully stop all components and fix console in case it breaks -trap './stop.sh; stty sane; exit' EXIT SIGINT SIGTERM +trap "echo \"################################# STOPPING... #################################\"; \"$SCRIPT_DIR/./stop.sh\"; stty sane; exit" EXIT SIGINT SIGTERM echo "Running 5G Core components..." cd 5G_Core_Network @@ -46,7 +49,7 @@ cd .. echo -n "Waiting for AMF to be ready" ATTEMPT=0 -while [ ! -f 5G_Core_Network/logs/amf.txt ] || ! grep -q "NF registered" 5G_Core_Network/logs/amf.txt; do +while [ ! -f 5G_Core_Network/logs/amf.log ] || ! grep -q "NF registered" 5G_Core_Network/logs/amf.log; do echo -n "." sleep 0.5 ATTEMPT=$((ATTEMPT + 1)) @@ -63,22 +66,6 @@ cd Next_Generation_Node_B ./run_background.sh cd .. -ATTEMPT=0 -while [ ! -f Next_Generation_Node_B/logs/gnb_stdout.txt ] || ! grep -q "gNB started" Next_Generation_Node_B/logs/gnb_stdout.txt; do - sleep 0.5 - ATTEMPT=$((ATTEMPT + 1)) - if [ $ATTEMPT -ge 120 ]; then - echo "gNodeB did not start after 60 seconds, exiting..." - exit 1 - fi - if grep -q " gNB started " logs/gnb_stdout.txt; then - break - elif [ grep -q "Error" logs/gnb_stdout.txt ] || [ grep -q "srsRAN ERROR:" logs/gnb_stdout.txt ]; then - echo "Error starting gNodeB. Check logs/gnb_stdout.txt for more information." - exit 1 - fi -done - echo echo "Running User Equipment..." cd User_Equipment