#include <iostream>
#include <string>
#include <vector>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <boost/foreach.hpp>
 
#include <boost/property_tree/ptree.hpp>
#include <map>
#include <string>
 
// Assumes all arrays are flat except for the special case in 1687_if_RAIL, which is ignored for counting
std::map<std::string, int> countFabricBlocks(const boost::property_tree::ptree* pt) {
    std::map<std::string, int> result;
    if (!pt) return result;
 
    auto pathsOpt = pt->get_child_optional("PATHS");
    if (!pathsOpt) return result;
 
    const auto& paths = pathsOpt.get();
 
    for (const auto& kv : paths) {
        const auto& arr = kv.second;
        // Check if the first value is "SERIAL"
        auto it = arr.begin();
        if (it == arr.end()) continue;
        if (it->second.get_value<std::string>() != "SERIAL") continue;
 
        // Check if the second value exists and is a string
        ++it;
        if (it == arr.end()) continue;
        std::string fabricName;
        try {
            fabricName = it->second.get_value<std::string>();
        } catch (...) {
            continue; // Not a string, skip
        }
        result[fabricName]++;
    }
    return result;
}
 
#include <boost/property_tree/json_parser.hpp>
#include <iostream>
 
int main() {
    std::string json_str = R"({
        "PATHS": {
            "SF_MAIN_RAIL": [
                "SERIAL",
                "rail_in_if",
                "cpu_C7T1_fabric1_inst",
                "down_if"
            ],
            "cpu_C7T1_fabric1_inst_to_codec_cpu_C7T1_comp1_inst_P12": [
                "SERIAL",
                "cpu_C7T1_fabric1_inst",
                "cpu_C7T1_comp1_inst_P6",
                "cpu_C7T1_comp1_inst_P0",
                "cpu_C7T1_comp1_inst_P3",
                "cpu_C7T1_comp1_inst_P10",
                "cpu_C7T1_comp1_inst_P12"
            ],
            "cpu_C7T1_fabric1_inst_to_codec_cpu_C7T1_comp1_inst_P11": [
                "SERIAL",
                "cpu_C7T1_fabric1_inst",
                "cpu_C7T1_comp1_inst_P7",
                "cpu_C7T1_comp1_inst_P1",
                "cpu_C7T1_comp1_inst_P4",
                "cpu_C7T1_comp1_inst_P11"
            ],
            "cpu_C7T1_fabric1_inst_to_codec_cpu_C7T1_comp1_inst_P5": [
                "SERIAL",
                "cpu_C7T1_fabric1_inst",
                "cpu_C7T1_comp1_inst_P8",
                "cpu_C7T1_comp1_inst_P2",
                "cpu_C7T1_comp1_inst_P5"
            ],
            "cpu_C7T1_fabric1_inst_to_codec_cpu_C7T1_comp1_inst_P9": [
                "SERIAL",
                "cpu_C7T1_fabric1_inst",
                "cpu_C7T1_comp1_inst_P9"
            ],
            "cpu_C7T1_fabric1_inst_to_codec_cpu_C7T1_comp1_inst_P5_2": [
                "SERIAL",
                "cpu_C7T1_fabric2_inst",
                "cpu_C7T1_comp1_inst_P8",
                "cpu_C7T1_comp1_inst_P2",
                "cpu_C7T1_comp1_inst_P5"
            ],
            "cpu_C7T1_fabric1_inst_to_codec_cpu_C7T1_comp1_inst_P9_2": [
                "SERIAL",
                "cpu_C7T1_fabric2_inst",
                "cpu_C7T1_comp1_inst_P9"
            ]
        }
    })";
 
    std::stringstream ss(json_str);
    boost::property_tree::ptree pt;
    boost::property_tree::read_json(ss, pt);
 
    auto result = countFabricBlocks(&pt);
 
    for (const auto& kv : result) {
        std::cout << "key: " << kv.first << ", value: " << kv.second << std::endl;
    }
    return 0;
}
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Ym9vc3QvcHJvcGVydHlfdHJlZS9wdHJlZS5ocHA+CiNpbmNsdWRlIDxib29zdC9wcm9wZXJ0eV90cmVlL3htbF9wYXJzZXIuaHBwPgojaW5jbHVkZSA8Ym9vc3QvZm9yZWFjaC5ocHA+CgojaW5jbHVkZSA8Ym9vc3QvcHJvcGVydHlfdHJlZS9wdHJlZS5ocHA+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzdHJpbmc+CgovLyBBc3N1bWVzIGFsbCBhcnJheXMgYXJlIGZsYXQgZXhjZXB0IGZvciB0aGUgc3BlY2lhbCBjYXNlIGluIDE2ODdfaWZfUkFJTCwgd2hpY2ggaXMgaWdub3JlZCBmb3IgY291bnRpbmcKc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gY291bnRGYWJyaWNCbG9ja3MoY29uc3QgYm9vc3Q6OnByb3BlcnR5X3RyZWU6OnB0cmVlKiBwdCkgewogICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gcmVzdWx0OwogICAgaWYgKCFwdCkgcmV0dXJuIHJlc3VsdDsKCiAgICBhdXRvIHBhdGhzT3B0ID0gcHQtPmdldF9jaGlsZF9vcHRpb25hbCgiUEFUSFMiKTsKICAgIGlmICghcGF0aHNPcHQpIHJldHVybiByZXN1bHQ7CgogICAgY29uc3QgYXV0byYgcGF0aHMgPSBwYXRoc09wdC5nZXQoKTsKCiAgICBmb3IgKGNvbnN0IGF1dG8mIGt2IDogcGF0aHMpIHsKICAgICAgICBjb25zdCBhdXRvJiBhcnIgPSBrdi5zZWNvbmQ7CiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpcnN0IHZhbHVlIGlzICJTRVJJQUwiCiAgICAgICAgYXV0byBpdCA9IGFyci5iZWdpbigpOwogICAgICAgIGlmIChpdCA9PSBhcnIuZW5kKCkpIGNvbnRpbnVlOwogICAgICAgIGlmIChpdC0+c2Vjb25kLmdldF92YWx1ZTxzdGQ6OnN0cmluZz4oKSAhPSAiU0VSSUFMIikgY29udGludWU7CgogICAgICAgIC8vIENoZWNrIGlmIHRoZSBzZWNvbmQgdmFsdWUgZXhpc3RzIGFuZCBpcyBhIHN0cmluZwogICAgICAgICsraXQ7CiAgICAgICAgaWYgKGl0ID09IGFyci5lbmQoKSkgY29udGludWU7CiAgICAgICAgc3RkOjpzdHJpbmcgZmFicmljTmFtZTsKICAgICAgICB0cnkgewogICAgICAgICAgICBmYWJyaWNOYW1lID0gaXQtPnNlY29uZC5nZXRfdmFsdWU8c3RkOjpzdHJpbmc+KCk7CiAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBOb3QgYSBzdHJpbmcsIHNraXAKICAgICAgICB9CiAgICAgICAgcmVzdWx0W2ZhYnJpY05hbWVdKys7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CgojaW5jbHVkZSA8Ym9vc3QvcHJvcGVydHlfdHJlZS9qc29uX3BhcnNlci5ocHA+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmludCBtYWluKCkgewogICAgc3RkOjpzdHJpbmcganNvbl9zdHIgPSBSIih7CiAgICAgICAgIlBBVEhTIjogewogICAgICAgICAgICAiU0ZfTUFJTl9SQUlMIjogWwogICAgICAgICAgICAgICAgIlNFUklBTCIsCiAgICAgICAgICAgICAgICAicmFpbF9pbl9pZiIsCiAgICAgICAgICAgICAgICAiY3B1X0M3VDFfZmFicmljMV9pbnN0IiwKICAgICAgICAgICAgICAgICJkb3duX2lmIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiY3B1X0M3VDFfZmFicmljMV9pbnN0X3RvX2NvZGVjX2NwdV9DN1QxX2NvbXAxX2luc3RfUDEyIjogWwogICAgICAgICAgICAgICAgIlNFUklBTCIsCiAgICAgICAgICAgICAgICAiY3B1X0M3VDFfZmFicmljMV9pbnN0IiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9jb21wMV9pbnN0X1A2IiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9jb21wMV9pbnN0X1AwIiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9jb21wMV9pbnN0X1AzIiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9jb21wMV9pbnN0X1AxMCIsCiAgICAgICAgICAgICAgICAiY3B1X0M3VDFfY29tcDFfaW5zdF9QMTIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJjcHVfQzdUMV9mYWJyaWMxX2luc3RfdG9fY29kZWNfY3B1X0M3VDFfY29tcDFfaW5zdF9QMTEiOiBbCiAgICAgICAgICAgICAgICAiU0VSSUFMIiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9mYWJyaWMxX2luc3QiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDciLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDEiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDQiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDExIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiY3B1X0M3VDFfZmFicmljMV9pbnN0X3RvX2NvZGVjX2NwdV9DN1QxX2NvbXAxX2luc3RfUDUiOiBbCiAgICAgICAgICAgICAgICAiU0VSSUFMIiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9mYWJyaWMxX2luc3QiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDgiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDIiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDUiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJjcHVfQzdUMV9mYWJyaWMxX2luc3RfdG9fY29kZWNfY3B1X0M3VDFfY29tcDFfaW5zdF9QOSI6IFsKICAgICAgICAgICAgICAgICJTRVJJQUwiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2ZhYnJpYzFfaW5zdCIsCiAgICAgICAgICAgICAgICAiY3B1X0M3VDFfY29tcDFfaW5zdF9QOSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImNwdV9DN1QxX2ZhYnJpYzFfaW5zdF90b19jb2RlY19jcHVfQzdUMV9jb21wMV9pbnN0X1A1XzIiOiBbCiAgICAgICAgICAgICAgICAiU0VSSUFMIiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9mYWJyaWMyX2luc3QiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDgiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDIiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDUiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJjcHVfQzdUMV9mYWJyaWMxX2luc3RfdG9fY29kZWNfY3B1X0M3VDFfY29tcDFfaW5zdF9QOV8yIjogWwogICAgICAgICAgICAgICAgIlNFUklBTCIsCiAgICAgICAgICAgICAgICAiY3B1X0M3VDFfZmFicmljMl9pbnN0IiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9jb21wMV9pbnN0X1A5IgogICAgICAgICAgICBdCiAgICAgICAgfQogICAgfSkiOwoKICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzKGpzb25fc3RyKTsKICAgIGJvb3N0Ojpwcm9wZXJ0eV90cmVlOjpwdHJlZSBwdDsKICAgIGJvb3N0Ojpwcm9wZXJ0eV90cmVlOjpyZWFkX2pzb24oc3MsIHB0KTsKCiAgICBhdXRvIHJlc3VsdCA9IGNvdW50RmFicmljQmxvY2tzKCZwdCk7CgogICAgZm9yIChjb25zdCBhdXRvJiBrdiA6IHJlc3VsdCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAia2V5OiAiIDw8IGt2LmZpcnN0IDw8ICIsIHZhbHVlOiAiIDw8IGt2LnNlY29uZCA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==