{
  "version": 10,
  "plumr_config": {
    "pipeline": {
      "delay_constant-1": {
        "delay_constant": {
          "flows": [
            {
              "input": "[delay_constant-1-flows-0|in:0]-[loss_constant-1-flows-0|out:0]",
              "output": "[peer_writer-3|in:0]-[delay_constant-1-flows-0|out:0]"
            },
            {
              "input": "[delay_constant-1-flows-1|in:1]-[loss_constant-1-flows-1|out:1]",
              "output": "[peer_writer-2|in:0]-[delay_constant-1-flows-1|out:1]"
            },
            {
              "input": "[delay_constant-1-flows-2|in:2]-[session_reader-1|out:0]",
              "output": "[loss_constant-1-flows-2|in:2]-[delay_constant-1-flows-2|out:2]"
            }
          ],
          "delay": 0,
          "jitter": 0
        }
      },
      "delay_constant-4": {
        "delay_constant": {
          "flows": [
            {
              "input": "[delay_constant-4-flows-0|in:0]-[loss_constant-3-flows-0|out:0]",
              "output": "[peer_writer-1|in:0]-[delay_constant-4-flows-0|out:0]"
            },
            {
              "input": "[delay_constant-4-flows-1|in:0]-[session_reader-2|out:0]",
              "output": "[loss_constant-3-flows-1|in:0]-[delay_constant-4-flows-1|out:1]"
            }
          ],
          "delay": 0,
          "jitter": 0
        }
      },
      "peer_writer-1": {
        "peer_writer": {
          "input": "[peer_writer-1|in:0]-[delay_constant-4-flows-0|out:0]",
          "output": "[session_writer-2|in:0]-[peer_writer-1|out:0]",
          "remote_address": "0.0.0.0:1235"
        }
      },
      "udp_local-2": {
        "udp_local": {
          "output": "[raft-2-streams-0|in:0]-[udp_local-2|out:0]",
          "address": "127.0.0.1:5000"
        }
      },
      "udp_remote-2": {
        "udp_remote": {
          "input": "[udp_remote-2|in:0]-[session_writer-1|out:0]",
          "output": "[session_reader-1|in:0]-[udp_remote-2|out:0]",
          "interface": "wwan0"
        }
      },
      "session_reader-2": {
        "session_reader": {
          "input": "[session_reader-2|in:0]-[udp_remote-1|out:0]",
          "output": "[delay_constant-4-flows-1|in:0]-[session_reader-2|out:0]"
        }
      },
      "delay_constant-2": {
        "delay_constant": {
          "flows": [
            {
              "input": "delay_constant-2_flows_0_input",
              "output": "delay_constant-2_flows_0_output"
            },
            {
              "input": "delay_constant-2_flows_1_input",
              "output": "delay_constant-2_flows_1_output"
            },
            {
              "input": "delay_constant-2_flows_2_input",
              "output": "delay_constant-2_flows_2_output"
            }
          ],
          "delay": 0,
          "jitter": 0
        }
      },
      "delay_constant-3": {
        "delay_constant": {
          "flows": [
            {
              "input": "delay_constant-3_flows_0_input",
              "output": "delay_constant-3_flows_0_output"
            },
            {
              "input": "delay_constant-3_flows_1_input",
              "output": "delay_constant-3_flows_1_output"
            },
            {
              "input": "delay_constant-3_flows_2_input",
              "output": "delay_constant-3_flows_2_output"
            }
          ],
          "delay": 0,
          "jitter": 0
        }
      },
      "loss_constant-1": {
        "loss_constant": {
          "flows": [
            {
              "input": "[loss_constant-1-flows-0|in:0]-[udp_local-1|out:0]",
              "output": "[delay_constant-1-flows-0|in:0]-[loss_constant-1-flows-0|out:0]"
            },
            {
              "input": "[loss_constant-1-flows-1|in:1]-[raft-2-carriers-0|out:0]",
              "output": "[delay_constant-1-flows-1|in:1]-[loss_constant-1-flows-1|out:1]"
            },
            {
              "input": "[loss_constant-1-flows-2|in:2]-[delay_constant-1-flows-2|out:2]",
              "output": "[raft-2-carriers-0|in:0]-[loss_constant-1-flows-2|out:2]"
            }
          ],
          "loss_probability": 2
        }
      },
      "loss_constant-2": {
        "loss_constant": {
          "flows": [
            {
              "input": "loss_constant-2_flows_0_input",
              "output": "loss_constant-2_flows_0_output"
            },
            {
              "input": "loss_constant-2_flows_1_input",
              "output": "loss_constant-2_flows_1_output"
            },
            {
              "input": "loss_constant-2_flows_2_input",
              "output": "loss_constant-2_flows_2_output"
            }
          ],
          "loss_probability": 2
        }
      },
      "peer_writer-2": {
        "peer_writer": {
          "input": "[peer_writer-2|in:0]-[delay_constant-1-flows-1|out:1]",
          "output": "[session_writer-1|in:0]-[peer_writer-2|out:0]",
          "remote_address": "0.0.0.0:1234"
        }
      },
      "session_writer-2": {
        "session_writer": {
          "input": "[session_writer-2|in:0]-[peer_writer-1|out:0]",
          "output": "[udp_remote-1|in:0]-[session_writer-2|out:0]"
        }
      },
      "udp_remote-1": {
        "udp_remote": {
          "input": "[udp_remote-1|in:0]-[session_writer-2|out:0]",
          "output": "[session_reader-2|in:0]-[udp_remote-1|out:0]",
          "interface": "wwan1"
        }
      },
      "peer_writer-3": {
        "peer_writer": {
          "input": "[peer_writer-3|in:0]-[delay_constant-1-flows-0|out:0]",
          "output": "[udp_remote-3|in:0]-[peer_writer-3|out:0]",
          "remote_address": "0.0.0.0:1232"
        }
      },
      "session_writer-1": {
        "session_writer": {
          "input": "[session_writer-1|in:0]-[peer_writer-2|out:0]",
          "output": "[udp_remote-2|in:0]-[session_writer-1|out:0]"
        }
      },
      "loss_constant-3": {
        "loss_constant": {
          "flows": [
            {
              "input": "[loss_constant-3-flows-0|in:0]-[raft-2-carriers-1|out:1]",
              "output": "[delay_constant-4-flows-0|in:0]-[loss_constant-3-flows-0|out:0]"
            },
            {
              "input": "[loss_constant-3-flows-1|in:0]-[delay_constant-4-flows-1|out:1]",
              "output": "[raft-2-carriers-1|in:0]-[loss_constant-3-flows-1|out:1]"
            }
          ],
          "loss_probability": 2
        }
      },
      "raft-2": {
        "raft": {
          "streams": [
            {
              "input": "[raft-2-streams-0|in:0]-[udp_local-2|out:0]",
              "stream_handle": 0,
              "realtime_stream": {
                "timeout": 300,
                "extension": {
                  "fixed_replication": {}
                }
              }
            }
          ],
          "carriers": [
            {
              "input": "[raft-2-carriers-0|in:0]-[loss_constant-1-flows-2|out:2]",
              "output": "[loss_constant-1-flows-1|in:1]-[raft-2-carriers-0|out:0]",
              "carrier_handle": 0
            },
            {
              "input": "[raft-2-carriers-1|in:0]-[loss_constant-3-flows-1|out:1]",
              "output": "[loss_constant-3-flows-0|in:0]-[raft-2-carriers-1|out:1]",
              "carrier_handle": 1
            }
          ]
        }
      },
      "session_reader-1": {
        "session_reader": {
          "input": "[session_reader-1|in:0]-[udp_remote-2|out:0]",
          "output": "[delay_constant-1-flows-2|in:2]-[session_reader-1|out:0]"
        }
      },
      "udp_local-1": {
        "udp_local": {
          "output": "[loss_constant-1-flows-0|in:0]-[udp_local-1|out:0]",
          "address": "127.0.0.1:5001"
        }
      },
      "udp_remote-3": {
        "udp_remote": {
          "input": "[udp_remote-3|in:0]-[peer_writer-3|out:0]"
        }
      }
    },
    "shm_config": null,
    "log_filters": [],
    "lifecycle_handler": {
      "env": null,
      "on_setup": [],
      "pre_start": [
        {
          "cmd": "gst-launch-1.0 v4l2src device=/dev/video0 ! rtph264pay config-interval=1 pt=96 mtu=1320 ! multiudpsink clients=127.0.0.1:5000,127.0.0.1:5001",
          "policy": "RUN_IN_BACKGROUND",
          "env": null
        }
      ],
      "post_start": [],
      "pre_stop": [],
      "post_stop": [
        {
          "cmd": "pkill -f gst-launch-1.0",
          "policy": "CONTINUE_ON_ERROR",
          "env": null
        }
      ]
    }
  },
  "meta": {
    "component_display_coordinates": {
      "peer_writer-2": {
        "x": 1560,
        "y": 440
      },
      "peer_writer-3": {
        "x": 1240,
        "y": 160
      },
      "udp_remote-2": {
        "x": 2160,
        "y": 520
      },
      "loss_constant-1": {
        "x": 720,
        "y": 400
      },
      "loss_constant-2": {
        "x": 720,
        "y": 400
      },
      "raft-2": {
        "x": 360,
        "y": 360
      },
      "session_writer-1": {
        "x": 1880,
        "y": 480
      },
      "session_writer-2": {
        "x": 1880,
        "y": 880
      },
      "udp_remote-1": {
        "x": 2160,
        "y": 920
      },
      "udp_remote-3": {
        "x": 2080,
        "y": 360
      },
      "delay_constant-2": {
        "x": 960,
        "y": 360
      },
      "delay_constant-3": {
        "x": 960,
        "y": 360
      },
      "delay_constant-4": {
        "x": 960,
        "y": 760
      },
      "peer_writer-1": {
        "x": 1560,
        "y": 840
      },
      "session_reader-1": {
        "x": 1840,
        "y": 640
      },
      "session_reader-2": {
        "x": 1840,
        "y": 1040
      },
      "udp_local-1": {
        "x": 400,
        "y": 160
      },
      "udp_local-2": {
        "x": -160,
        "y": 480
      },
      "delay_constant-1": {
        "x": 960,
        "y": 360
      },
      "loss_constant-3": {
        "x": 720,
        "y": 800
      }
    },
    "component_display_order": {
      "delay_constant-2": 7,
      "udp_local-1": 3,
      "udp_remote-1": 19,
      "delay_constant-1": 6,
      "delay_constant-3": 10,
      "loss_constant-1": 5,
      "raft-2": 0,
      "session_reader-1": 12,
      "session_writer-2": 14,
      "udp_remote-2": 13,
      "udp_remote-3": 2,
      "delay_constant-4": 16,
      "loss_constant-3": 17,
      "peer_writer-1": 15,
      "peer_writer-2": 9,
      "peer_writer-3": 4,
      "loss_constant-2": 11,
      "session_reader-2": 18,
      "session_writer-1": 8,
      "udp_local-2": 1
    }
  },
  "kpis": {
    "variables": {
      "source_carrier1_bw_in": "/pipeline/raft-2/raft_node/raft_carrier:1/bandwidth_in",
      "source_carrier1_bw_out": "/pipeline/raft-2/raft_node/raft_carrier:1/bandwidth_out",
      "source_flow1_overall_repair_mode": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/raft_realtime_flow:1/overall_repair_mode",
      "source_flow1_overall_viability": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/raft_realtime_flow:1/overall_viability",
      "source_stream_bw_out": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/bandwidth_out",
      "source_viability_control": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/viability_control",
      "sink_loss_stream": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/raft_loss_tracker/stable_loss_rate",
      "source_carrier0_bw_in": "/pipeline/raft-2/raft_node/raft_carrier:0/bandwidth_in",
      "source_carrier1_stable_loss": "/pipeline/raft-2/raft_node/raft_carrier:1/raft_loss_tracker/stable_loss_rate",
      "source_carrier0_bw_out": "/pipeline/raft-2/raft_node/raft_carrier:0/bandwidth_out",
      "source_carrier0_stable_loss": "/pipeline/raft-2/raft_node/raft_carrier:0/raft_loss_tracker/stable_loss_rate",
      "source_flow0_overall_repair_mode": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/raft_realtime_flow:0/overall_repair_mode",
      "source_flow0_overall_viability": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/raft_realtime_flow:0/overall_viability",
      "source_stream_control": "/pipeline/raft-2/raft_node/stream_control",
      "source_carrier0_latency": "/pipeline/raft-2/raft_node/raft_carrier:0/raft_latency_estimator/link_trip_time",
      "source_carrier1_latency": "/pipeline/raft-2/raft_node/raft_carrier:1/raft_latency_estimator/link_trip_time",
      "source_stream_bw_in": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/bandwidth_in"
    },
    "metrics": [
      {
        "label": "Source",
        "description": "",
        "id": "1"
      },
      {
        "label": "Data Rate Rx",
        "data_rate": {
          "goodput_expression": "source_stream_bw_out",
          "overhead_expression": "(source_carrier0_bw_in + source_carrier1_bw_in) - source_stream_bw_out",
          "type": "RATE"
        },
        "description": "Represents the reception data rate, including goodput and overhead.",
        "id": "2"
      },
      {
        "label": "Data Rate Tx",
        "data_rate": {
          "goodput_expression": "source_stream_bw_in",
          "overhead_expression": "(source_carrier0_bw_out + source_carrier1_bw_out) - source_stream_bw_in",
          "type": "RATE"
        },
        "description": "Represents the reception data rate, including goodput and overhead.",
        "id": "3"
      },
      {
        "label": "Data Overhead Rx",
        "gauge": {
          "expression": "(1.0 - (source_stream_bw_out / (source_carrier0_bw_in + source_carrier1_bw_in))) * 100"
        },
        "description": "Represents the reception overhead percentage, calculated as the proportion of non-goodput data in the total received data.",
        "id": "4"
      },
      {
        "label": "Data Overhead Tx",
        "gauge": {
          "expression": "(1.0 - (source_stream_bw_in / (source_carrier0_bw_out + source_carrier1_bw_out))) * 100"
        },
        "description": "Represents the reception overhead percentage, calculated as the proportion of non-goodput data in the total received data.",
        "id": "5"
      },
      {
        "label": "Loss carrier0 (source)",
        "gauge": {
          "expression": "source_carrier0_stable_loss"
        },
        "description": "",
        "id": "8"
      },
      {
        "label": "Loss carrier1 (source)",
        "gauge": {
          "expression": "source_carrier1_stable_loss"
        },
        "description": "",
        "id": "9"
      },
      {
        "label": "Latency carrier0",
        "value_over_time": {
          "expression": "source_carrier0_latency",
          "unit": "ms"
        },
        "description": "",
        "id": "10"
      },
      {
        "label": "Latency carrier1",
        "value_over_time": {
          "expression": "source_carrier1_latency",
          "unit": "ms"
        },
        "description": "",
        "id": "11"
      },
      {
        "label": "Source -> Stream Control",
        "value_to_text_conditions": {
          "conditions": [
            {
              "expression": "source_stream_control == 0",
              "text": "local",
              "color": "orange"
            },
            {
              "expression": "source_stream_control == 1",
              "text": "remote",
              "color": "yellow"
            }
          ]
        },
        "description": "",
        "id": "m36efib3"
      },
      {
        "label": "Source -> Viability Control",
        "value_to_text_conditions": {
          "conditions": [
            {
              "expression": "source_viability_control == 0",
              "text": "undetermined",
              "color": "red"
            },
            {
              "expression": "source_viability_control == 1",
              "text": "local",
              "color": "orange"
            },
            {
              "expression": "source_viability_control == 2",
              "text": "remote",
              "color": "yellow"
            }
          ]
        },
        "description": "",
        "id": "m36eodgc"
      },
      {
        "label": "Source -> Carrier0",
        "value_to_text_conditions": {
          "conditions": [
            {
              "expression": "source_flow0_overall_viability == 0",
              "text": "disabled",
              "color": "red"
            },
            {
              "expression": "source_flow0_overall_viability == 1",
              "text": "pending",
              "color": "orange"
            },
            {
              "expression": "source_flow0_overall_viability == 2",
              "text": "viable",
              "color": "green"
            },
            {
              "expression": "source_flow0_overall_viability == 3",
              "text": "prospect",
              "color": "yellow"
            },
            {
              "expression": "source_flow0_overall_viability == 4",
              "text": "non_viable",
              "color": "red"
            }
          ]
        },
        "description": "",
        "id": "12"
      },
      {
        "label": "Source -> Carrier1",
        "value_to_text_conditions": {
          "conditions": [
            {
              "expression": "source_flow1_overall_viability == 0",
              "text": "disabled",
              "color": "red"
            },
            {
              "expression": "source_flow1_overall_viability == 1",
              "text": "pending",
              "color": "orange"
            },
            {
              "expression": "source_flow1_overall_viability == 2",
              "text": "viable",
              "color": "green"
            },
            {
              "expression": "source_flow1_overall_viability == 3",
              "text": "prospect",
              "color": "yellow"
            },
            {
              "expression": "source_flow1_overall_viability == 4",
              "text": "non_viable",
              "color": "red"
            }
          ]
        },
        "description": "",
        "id": "13"
      },
      {
        "label": "Source Flow0 (repair mode)",
        "value_to_text_conditions": {
          "conditions": [
            {
              "expression": "source_flow0_overall_repair_mode == 0",
              "text": "off",
              "color": "red"
            },
            {
              "expression": "source_flow0_overall_repair_mode == 1",
              "text": "backup",
              "color": "orange"
            },
            {
              "expression": "source_flow0_overall_repair_mode == 2",
              "text": "instant",
              "color": "yellow"
            },
            {
              "expression": "source_flow0_overall_repair_mode == 3",
              "text": "proactive",
              "color": "green"
            },
            {
              "expression": "source_flow0_overall_repair_mode == 4",
              "text": "reactive",
              "color": "green"
            }
          ]
        },
        "description": "",
        "id": "14"
      },
      {
        "label": "Source Flow1 (repair mode)",
        "value_to_text_conditions": {
          "conditions": [
            {
              "expression": "source_flow1_overall_repair_mode == 0",
              "text": "off",
              "color": "red"
            },
            {
              "expression": "source_flow1_overall_repair_mode == 1",
              "text": "backup",
              "color": "orange"
            },
            {
              "expression": "source_flow1_overall_repair_mode == 2",
              "text": "instant",
              "color": "yellow"
            },
            {
              "expression": "source_flow1_overall_repair_mode == 3",
              "text": "proactive",
              "color": "green"
            },
            {
              "expression": "source_flow1_overall_repair_mode == 4",
              "text": "reactive",
              "color": "green"
            }
          ]
        },
        "description": "",
        "id": "15"
      },
      {
        "label": "Stream Bandwidth (in)",
        "value_over_time": {
          "expression": "source_stream_bw_in",
          "unit": "B/s"
        },
        "description": "",
        "id": "16"
      },
      {
        "label": "Carrier0 Bandwidth",
        "value_over_time": {
          "expression": "source_carrier0_bw_out",
          "unit": "B/s"
        },
        "description": "",
        "id": "17"
      },
      {
        "label": "Carrier1 Bandwidth",
        "value_over_time": {
          "expression": "source_carrier1_bw_out",
          "unit": "B/s"
        },
        "description": "",
        "id": "18"
      }
    ]
  },
  "variables": [
    {
      "id": "carrier0_delay",
      "label": "Carrier 0: Delay (ms)",
      "description": "Time emulation need to hold back packets",
      "paths": [
        "plumr_config.pipeline.delay_constant-1.delay_constant.delay"
      ]
    },
    {
      "id": "carrier1_delay",
      "label": "Carrier 1: Delay (ms)",
      "description": "Time emulation need to hold back packets",
      "paths": [
        "plumr_config.pipeline.delay_constant-2.delay_constant.delay"
      ]
    },
    {
      "id": "carrier0_jitter",
      "label": "Carrier 0: Jitter (ms)",
      "description": "Time varience in how long packets are delayed",
      "paths": [
        "plumr_config.pipeline.delay_constant-1.delay_constant.jitter"
      ]
    },
    {
      "id": "carrier1_jitter",
      "label": "Carrier 1: Jitter (ms)",
      "description": "Time varience in how long packets are delayed",
      "paths": [
        "plumr_config.pipeline.delay_constant-2.delay_constant.jitter"
      ]
    },
    {
      "id": "m21wx11z",
      "label": "Stream Timeout",
      "description": "Timeout for the stream in milliseconds.",
      "paths": [
        "plumr_config.pipeline.raft-2.raft.streams[0].realtime_stream.timeout"
      ]
    },
    {
      "id": "m2284787",
      "label": "Carrier0 loss (%)",
      "description": "Probability of packet loss, ranging from 0.0 to 100.",
      "paths": [
        "plumr_config.pipeline.loss_constant-1.loss_constant.loss_probability"
      ]
    },
    {
      "id": "m2284st8",
      "label": "Carrier1 loss (%)",
      "description": "Probability of packet loss, ranging from 0.0 to 100.",
      "paths": [
        "plumr_config.pipeline.loss_constant-2.loss_constant.loss_probability"
      ]
    }
  ]
}