_ZN7httplib6detail16parse_query_textEPKcmRNSt3__18multimapINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESA_NS3_4lessISA_EENS8_INS3_4pairIKSA_SA_EEEEEE:
 7818|    581|                             Params &params) {
 7819|    581|  std::set<std::string> cache;
 7820|    581|  split(data, data + size, '&', [&](const char *b, const char *e) {
 7821|    581|    std::string kv(b, e);
 7822|    581|    if (cache.find(kv) != cache.end()) { return; }
 7823|    581|    cache.insert(std::move(kv));
 7824|       |
 7825|    581|    std::string key;
 7826|    581|    std::string val;
 7827|    581|    divide(b, static_cast<std::size_t>(e - b), '=',
 7828|    581|           [&](const char *lhs_data, std::size_t lhs_size, const char *rhs_data,
 7829|    581|               std::size_t rhs_size) {
 7830|    581|             key.assign(lhs_data, lhs_size);
 7831|    581|             val.assign(rhs_data, rhs_size);
 7832|    581|           });
 7833|       |
 7834|    581|    if (!key.empty()) {
 7835|    581|      params.emplace(decode_query_component(key), decode_query_component(val));
 7836|    581|    }
 7837|    581|  });
 7838|    581|}
_ZN7httplib6detail5splitEPKcS2_cNSt3__18functionIFvS2_S2_EEE:
 5334|    882|                  std::function<void(const char *, const char *)> fn) {
 5335|    882|  return split(b, e, d, (std::numeric_limits<size_t>::max)(), std::move(fn));
 5336|    882|}
_ZN7httplib6detail5splitEPKcS2_cmNSt3__18functionIFvS2_S2_EEE:
 5339|    882|                  std::function<void(const char *, const char *)> fn) {
 5340|    882|  size_t i = 0;
 5341|    882|  size_t beg = 0;
 5342|    882|  size_t count = 1;
 5343|       |
 5344|  42.6M|  while (e ? (b + i < e) : (b[i] != '\0')) {
  ------------------
  |  Branch (5344:10): [True: 42.6M, False: 0]
  |  Branch (5344:10): [True: 42.6M, False: 882]
  ------------------
 5345|  42.6M|    if (b[i] == d && count < m) {
  ------------------
  |  Branch (5345:9): [True: 4.26M, False: 38.3M]
  |  Branch (5345:22): [True: 4.26M, False: 0]
  ------------------
 5346|  4.26M|      auto r = trim(b, e, beg, i);
 5347|  4.26M|      if (r.first < r.second) { fn(&b[r.first], &b[r.second]); }
  ------------------
  |  Branch (5347:11): [True: 59.6k, False: 4.20M]
  ------------------
 5348|  4.26M|      beg = i + 1;
 5349|  4.26M|      count++;
 5350|  4.26M|    }
 5351|  42.6M|    i++;
 5352|  42.6M|  }
 5353|       |
 5354|    882|  if (i) {
  ------------------
  |  Branch (5354:7): [True: 882, False: 0]
  ------------------
 5355|    882|    auto r = trim(b, e, beg, i);
 5356|    882|    if (r.first < r.second) { fn(&b[r.first], &b[r.second]); }
  ------------------
  |  Branch (5356:9): [True: 788, False: 94]
  ------------------
 5357|    882|  }
 5358|    882|}
_ZN7httplib6detail4trimEPKcS2_mm:
 5290|  4.26M|                                      size_t right) {
 5291|  6.33M|  while (b + left < e && is_space_or_tab(b[left])) {
  ------------------
  |  Branch (5291:10): [True: 6.33M, False: 94]
  |  Branch (5291:26): [True: 2.06M, False: 4.26M]
  ------------------
 5292|  2.06M|    left++;
 5293|  2.06M|  }
 5294|  6.34M|  while (right > 0 && is_space_or_tab(b[right - 1])) {
  ------------------
  |  Branch (5294:10): [True: 6.34M, False: 65]
  |  Branch (5294:23): [True: 2.08M, False: 4.26M]
  ------------------
 5295|  2.08M|    right--;
 5296|  2.08M|  }
 5297|  4.26M|  return std::make_pair(left, right);
 5298|  4.26M|}
_ZN7httplib6detail15is_space_or_tabEc:
 5145|  12.6M|inline bool is_space_or_tab(char c) { return c == ' ' || c == '\t'; }
  ------------------
  |  Branch (5145:46): [True: 4.12M, False: 8.56M]
  |  Branch (5145:58): [True: 33.2k, False: 8.52M]
  ------------------
_ZZN7httplib6detail16parse_query_textEPKcmRNSt3__18multimapINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESA_NS3_4lessISA_EENS8_INS3_4pairIKSA_SA_EEEEEEENKUlS2_S2_E_clES2_S2_:
 7820|  36.1k|  split(data, data + size, '&', [&](const char *b, const char *e) {
 7821|  36.1k|    std::string kv(b, e);
 7822|  36.1k|    if (cache.find(kv) != cache.end()) { return; }
  ------------------
  |  Branch (7822:9): [True: 23.1k, False: 13.0k]
  ------------------
 7823|  13.0k|    cache.insert(std::move(kv));
 7824|       |
 7825|  13.0k|    std::string key;
 7826|  13.0k|    std::string val;
 7827|  13.0k|    divide(b, static_cast<std::size_t>(e - b), '=',
 7828|  13.0k|           [&](const char *lhs_data, std::size_t lhs_size, const char *rhs_data,
 7829|  13.0k|               std::size_t rhs_size) {
 7830|  13.0k|             key.assign(lhs_data, lhs_size);
 7831|  13.0k|             val.assign(rhs_data, rhs_size);
 7832|  13.0k|           });
 7833|       |
 7834|  13.0k|    if (!key.empty()) {
  ------------------
  |  Branch (7834:9): [True: 12.6k, False: 347]
  ------------------
 7835|  12.6k|      params.emplace(decode_query_component(key), decode_query_component(val));
 7836|  12.6k|    }
 7837|  13.0k|  });
_ZN7httplib6detail6divideEPKcmcNSt3__18functionIFvS2_mS2_mEEE:
 5315|  37.2k|           fn) {
 5316|  37.2k|  const auto it = std::find(data, data + size, d);
 5317|  37.2k|  const auto found = static_cast<std::size_t>(it != data + size);
 5318|  37.2k|  const auto lhs_data = data;
 5319|  37.2k|  const auto lhs_size = static_cast<std::size_t>(it - data);
 5320|  37.2k|  const auto rhs_data = it + found;
 5321|  37.2k|  const auto rhs_size = size - lhs_size - found;
 5322|       |
 5323|  37.2k|  fn(lhs_data, lhs_size, rhs_data, rhs_size);
 5324|  37.2k|}
_ZZZN7httplib6detail16parse_query_textEPKcmRNSt3__18multimapINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESA_NS3_4lessISA_EENS8_INS3_4pairIKSA_SA_EEEEEEENKUlS2_S2_E_clES2_S2_ENKUlS2_mS2_mE_clES2_mS2_m:
 7829|  13.0k|               std::size_t rhs_size) {
 7830|  13.0k|             key.assign(lhs_data, lhs_size);
 7831|  13.0k|             val.assign(rhs_data, rhs_size);
 7832|  13.0k|           });
_ZN7httplib22decode_query_componentERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEb:
 9861|  72.1k|                                          bool plus_as_space) {
 9862|  72.1k|  std::string result;
 9863|  72.1k|  result.reserve(component.size());
 9864|       |
 9865|  36.9M|  for (size_t i = 0; i < component.size(); i++) {
  ------------------
  |  Branch (9865:22): [True: 36.8M, False: 72.1k]
  ------------------
 9866|  36.8M|    if (component[i] == '%' && i + 2 < component.size()) {
  ------------------
  |  Branch (9866:9): [True: 558k, False: 36.2M]
  |  Branch (9866:32): [True: 548k, False: 10.2k]
  ------------------
 9867|   548k|      auto val = 0;
 9868|   548k|      if (detail::from_hex_to_i(component, i + 1, 2, val)) {
  ------------------
  |  Branch (9868:11): [True: 154k, False: 393k]
  ------------------
 9869|   154k|        result += static_cast<char>(val);
 9870|   154k|        i += 2;
 9871|   393k|      } else {
 9872|   393k|        result += component[i];
 9873|   393k|      }
 9874|  36.2M|    } else if (component[i] == '+' && plus_as_space) {
  ------------------
  |  Branch (9874:16): [True: 8.57k, False: 36.2M]
  |  Branch (9874:39): [True: 8.19k, False: 384]
  ------------------
 9875|  8.19k|      result += ' '; // + becomes space in form-urlencoded
 9876|  36.2M|    } else {
 9877|  36.2M|      result += component[i];
 9878|  36.2M|    }
 9879|  36.8M|  }
 9880|  72.1k|  return result;
 9881|  72.1k|}
_ZN7httplib6detail13from_hex_to_iERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEmmRi:
 4511|   763k|                          int &val) {
 4512|   763k|  if (i >= s.size()) { return false; }
  ------------------
  |  Branch (4512:7): [True: 10, False: 763k]
  ------------------
 4513|       |
 4514|   763k|  val = 0;
 4515|  1.27M|  for (; cnt; i++, cnt--) {
  ------------------
  |  Branch (4515:10): [True: 1.04M, False: 230k]
  ------------------
 4516|  1.04M|    if (!s[i]) { return false; }
  ------------------
  |  Branch (4516:9): [True: 1.98k, False: 1.03M]
  ------------------
 4517|  1.03M|    auto v = 0;
 4518|  1.03M|    if (is_hex(s[i], v)) {
  ------------------
  |  Branch (4518:9): [True: 507k, False: 530k]
  ------------------
 4519|   507k|      val = val * 16 + v;
 4520|   530k|    } else {
 4521|   530k|      return false;
 4522|   530k|    }
 4523|  1.03M|  }
 4524|   230k|  return true;
 4525|   763k|}
_ZN7httplib6detail6is_hexEcRi:
 4496|  1.03M|inline bool is_hex(char c, int &v) {
 4497|  1.03M|  if (is_ascii_digit(c)) {
  ------------------
  |  Branch (4497:7): [True: 14.9k, False: 1.02M]
  ------------------
 4498|  14.9k|    v = c - '0';
 4499|  14.9k|    return true;
 4500|  1.02M|  } else if ('A' <= c && c <= 'F') {
  ------------------
  |  Branch (4500:14): [True: 678k, False: 344k]
  |  Branch (4500:26): [True: 55.9k, False: 622k]
  ------------------
 4501|  55.9k|    v = c - 'A' + 10;
 4502|  55.9k|    return true;
 4503|   967k|  } else if ('a' <= c && c <= 'f') {
  ------------------
  |  Branch (4503:14): [True: 621k, False: 345k]
  |  Branch (4503:26): [True: 436k, False: 185k]
  ------------------
 4504|   436k|    v = c - 'a' + 10;
 4505|   436k|    return true;
 4506|   436k|  }
 4507|   530k|  return false;
 4508|  1.03M|}
_ZN7httplib6detail14is_ascii_digitEc:
  547|  6.78M|inline bool is_ascii_digit(char c) { return '0' <= c && c <= '9'; }
  ------------------
  |  Branch (547:45): [True: 2.02M, False: 4.75M]
  |  Branch (547:57): [True: 1.09M, False: 934k]
  ------------------
_ZN7httplib21decode_path_componentERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
 9768|    235|inline std::string decode_path_component(const std::string &component) {
 9769|    235|  std::string result;
 9770|    235|  result.reserve(component.size());
 9771|       |
 9772|  3.78M|  for (size_t i = 0; i < component.size(); i++) {
  ------------------
  |  Branch (9772:22): [True: 3.78M, False: 235]
  ------------------
 9773|  3.78M|    if (component[i] == '%' && i + 1 < component.size()) {
  ------------------
  |  Branch (9773:9): [True: 215k, False: 3.56M]
  |  Branch (9773:32): [True: 215k, False: 10]
  ------------------
 9774|   215k|      if (component[i + 1] == 'u') {
  ------------------
  |  Branch (9774:11): [True: 4.75k, False: 210k]
  ------------------
 9775|       |        // Unicode %uXXXX encoding
 9776|  4.75k|        auto val = 0;
 9777|  4.75k|        if (detail::from_hex_to_i(component, i + 2, 4, val)) {
  ------------------
  |  Branch (9777:13): [True: 3.48k, False: 1.26k]
  ------------------
 9778|       |          // 4 digits Unicode codes: val is 0x0000-0xFFFF (from 4 hex digits),
 9779|       |          // so to_utf8 writes at most 3 bytes. buff[4] is safe.
 9780|  3.48k|          char buff[4];
 9781|  3.48k|          size_t len = detail::to_utf8(val, buff);
 9782|  3.48k|          if (len > 0) { result.append(buff, len); }
  ------------------
  |  Branch (9782:15): [True: 2.50k, False: 979]
  ------------------
 9783|  3.48k|          i += 5; // 'u0000'
 9784|  3.48k|        } else {
 9785|  1.26k|          result += component[i];
 9786|  1.26k|        }
 9787|   210k|      } else {
 9788|       |        // Standard %XX encoding
 9789|   210k|        auto val = 0;
 9790|   210k|        if (detail::from_hex_to_i(component, i + 1, 2, val)) {
  ------------------
  |  Branch (9790:13): [True: 72.2k, False: 138k]
  ------------------
 9791|       |          // 2 digits hex codes
 9792|  72.2k|          result += static_cast<char>(val);
 9793|  72.2k|          i += 2; // 'XX'
 9794|   138k|        } else {
 9795|   138k|          result += component[i];
 9796|   138k|        }
 9797|   210k|      }
 9798|  3.56M|    } else {
 9799|  3.56M|      result += component[i];
 9800|  3.56M|    }
 9801|  3.78M|  }
 9802|    235|  return result;
 9803|    235|}
_ZN7httplib6detail7to_utf8EiPc:
 4623|  3.48k|inline size_t to_utf8(int code, char *buff) {
 4624|  3.48k|  if (code < 0x0080) {
  ------------------
  |  Branch (4624:7): [True: 915, False: 2.57k]
  ------------------
 4625|    915|    buff[0] = static_cast<char>(code & 0x7F);
 4626|    915|    return 1;
 4627|  2.57k|  } else if (code < 0x0800) {
  ------------------
  |  Branch (4627:14): [True: 487, False: 2.08k]
  ------------------
 4628|    487|    buff[0] = static_cast<char>(0xC0 | ((code >> 6) & 0x1F));
 4629|    487|    buff[1] = static_cast<char>(0x80 | (code & 0x3F));
 4630|    487|    return 2;
 4631|  2.08k|  } else if (code < 0xD800) {
  ------------------
  |  Branch (4631:14): [True: 727, False: 1.35k]
  ------------------
 4632|    727|    buff[0] = static_cast<char>(0xE0 | ((code >> 12) & 0xF));
 4633|    727|    buff[1] = static_cast<char>(0x80 | ((code >> 6) & 0x3F));
 4634|    727|    buff[2] = static_cast<char>(0x80 | (code & 0x3F));
 4635|    727|    return 3;
 4636|  1.35k|  } else if (code < 0xE000) { // D800 - DFFF is invalid...
  ------------------
  |  Branch (4636:14): [True: 979, False: 380]
  ------------------
 4637|    979|    return 0;
 4638|    979|  } else if (code < 0x10000) {
  ------------------
  |  Branch (4638:14): [True: 380, False: 0]
  ------------------
 4639|    380|    buff[0] = static_cast<char>(0xE0 | ((code >> 12) & 0xF));
 4640|    380|    buff[1] = static_cast<char>(0x80 | ((code >> 6) & 0x3F));
 4641|    380|    buff[2] = static_cast<char>(0x80 | (code & 0x3F));
 4642|    380|    return 3;
 4643|    380|  } else if (code < 0x110000) {
  ------------------
  |  Branch (4643:14): [True: 0, False: 0]
  ------------------
 4644|      0|    buff[0] = static_cast<char>(0xF0 | ((code >> 18) & 0x7));
 4645|      0|    buff[1] = static_cast<char>(0x80 | ((code >> 12) & 0x3F));
 4646|      0|    buff[2] = static_cast<char>(0x80 | ((code >> 6) & 0x3F));
 4647|      0|    buff[3] = static_cast<char>(0x80 | (code & 0x3F));
 4648|      0|    return 4;
 4649|      0|  }
 4650|       |
 4651|       |  // NOTREACHED
 4652|      0|  return 0;
 4653|  3.48k|}
_ZN7httplib22encode_query_componentERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEb:
 9806|  24.7k|                                          bool space_as_plus) {
 9807|  24.7k|  std::string result;
 9808|  24.7k|  result.reserve(component.size() * 3);
 9809|       |
 9810|  5.76M|  for (size_t i = 0; i < component.size(); i++) {
  ------------------
  |  Branch (9810:22): [True: 5.74M, False: 24.7k]
  ------------------
 9811|  5.74M|    auto c = static_cast<unsigned char>(component[i]);
 9812|       |
 9813|       |    // Unreserved characters per RFC 3986
 9814|  5.74M|    if (detail::is_ascii_alnum(static_cast<char>(c)) || c == '-' || c == '.' ||
  ------------------
  |  Branch (9814:9): [True: 1.22M, False: 4.51M]
  |  Branch (9814:57): [True: 2.98k, False: 4.51M]
  |  Branch (9814:69): [True: 7.46k, False: 4.50M]
  ------------------
 9815|  4.50M|        c == '_' || c == '~') {
  ------------------
  |  Branch (9815:9): [True: 989, False: 4.50M]
  |  Branch (9815:21): [True: 922, False: 4.50M]
  ------------------
 9816|  1.23M|      result += static_cast<char>(c);
 9817|  1.23M|    }
 9818|       |    // Space handling
 9819|  4.50M|    else if (c == ' ') {
  ------------------
  |  Branch (9819:14): [True: 8.76k, False: 4.49M]
  ------------------
 9820|  8.76k|      if (space_as_plus) {
  ------------------
  |  Branch (9820:11): [True: 8.76k, False: 0]
  ------------------
 9821|  8.76k|        result += '+';
 9822|  8.76k|      } else {
 9823|      0|        result += "%20";
 9824|      0|      }
 9825|  8.76k|    }
 9826|       |    // Plus sign handling
 9827|  4.49M|    else if (c == '+') {
  ------------------
  |  Branch (9827:14): [True: 342, False: 4.49M]
  ------------------
 9828|    342|      if (space_as_plus) {
  ------------------
  |  Branch (9828:11): [True: 342, False: 0]
  ------------------
 9829|    342|        result += "%2B";
 9830|    342|      } else {
 9831|      0|        result += static_cast<char>(c);
 9832|      0|      }
 9833|    342|    }
 9834|       |    // Query-safe sub-delimiters (excluding & and = which are query delimiters)
 9835|  4.49M|    else if (c == '!' || c == '$' || c == '\'' || c == '(' || c == ')' ||
  ------------------
  |  Branch (9835:14): [True: 1.12k, False: 4.49M]
  |  Branch (9835:26): [True: 845, False: 4.49M]
  |  Branch (9835:38): [True: 771, False: 4.49M]
  |  Branch (9835:51): [True: 1.04k, False: 4.49M]
  |  Branch (9835:63): [True: 1.01k, False: 4.49M]
  ------------------
 9836|  4.49M|             c == '*' || c == ',' || c == ';') {
  ------------------
  |  Branch (9836:14): [True: 1.62k, False: 4.48M]
  |  Branch (9836:26): [True: 1.38k, False: 4.48M]
  |  Branch (9836:38): [True: 983, False: 4.48M]
  ------------------
 9837|  8.79k|      result += static_cast<char>(c);
 9838|  8.79k|    }
 9839|       |    // Colon and @ are allowed in query
 9840|  4.48M|    else if (c == ':' || c == '@') {
  ------------------
  |  Branch (9840:14): [True: 1.21k, False: 4.48M]
  |  Branch (9840:26): [True: 831, False: 4.48M]
  ------------------
 9841|  2.04k|      result += static_cast<char>(c);
 9842|  2.04k|    }
 9843|       |    // Forward slash is allowed in query values
 9844|  4.48M|    else if (c == '/') {
  ------------------
  |  Branch (9844:14): [True: 11.0k, False: 4.47M]
  ------------------
 9845|  11.0k|      result += static_cast<char>(c);
 9846|  11.0k|    }
 9847|       |    // Question mark is allowed in query values (after first ?)
 9848|  4.47M|    else if (c == '?') {
  ------------------
  |  Branch (9848:14): [True: 874, False: 4.47M]
  ------------------
 9849|    874|      result += static_cast<char>(c);
 9850|  4.47M|    } else {
 9851|  4.47M|      result += '%';
 9852|  4.47M|      char hex[3];
 9853|  4.47M|      snprintf(hex, sizeof(hex), "%02X", c);
 9854|  4.47M|      result.append(hex, 2);
 9855|  4.47M|    }
 9856|  5.74M|  }
 9857|  24.7k|  return result;
 9858|  24.7k|}
_ZN7httplib6detail14is_ascii_alnumEc:
  553|  5.74M|inline bool is_ascii_alnum(char c) {
  554|  5.74M|  return is_ascii_digit(c) || is_ascii_alpha(c);
  ------------------
  |  Branch (554:10): [True: 1.07M, False: 4.66M]
  |  Branch (554:31): [True: 149k, False: 4.51M]
  ------------------
  555|  5.74M|}
_ZN7httplib6detail14is_ascii_alphaEc:
  549|  4.66M|inline bool is_ascii_alpha(char c) {
  550|  4.66M|  return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
  ------------------
  |  Branch (550:11): [True: 142k, False: 4.52M]
  |  Branch (550:23): [True: 134k, False: 7.32k]
  |  Branch (550:37): [True: 26.3k, False: 4.50M]
  |  Branch (550:49): [True: 14.7k, False: 11.5k]
  ------------------
  551|  4.66M|}
_ZN7httplib6detail22normalize_query_stringERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 7848|    301|inline std::string normalize_query_string(const std::string &query) {
 7849|    301|  std::string result;
 7850|    301|  split(query.data(), query.data() + query.size(), '&',
 7851|    301|        [&](const char *b, const char *e) {
 7852|    301|          std::string key;
 7853|    301|          std::string val;
 7854|    301|          divide(b, static_cast<std::size_t>(e - b), '=',
 7855|    301|                 [&](const char *lhs_data, std::size_t lhs_size,
 7856|    301|                     const char *rhs_data, std::size_t rhs_size) {
 7857|    301|                   key.assign(lhs_data, lhs_size);
 7858|    301|                   val.assign(rhs_data, rhs_size);
 7859|    301|                 });
 7860|       |
 7861|    301|          if (!key.empty()) {
 7862|    301|            auto dec_key = decode_query_component(key);
 7863|    301|            auto dec_val = decode_query_component(val);
 7864|       |
 7865|    301|            if (!result.empty()) { result += '&'; }
 7866|    301|            result += encode_query_component(dec_key);
 7867|    301|            if (!val.empty() || std::find(b, e, '=') != e) {
 7868|    301|              result += '=';
 7869|    301|              result += encode_query_component(dec_val);
 7870|    301|            }
 7871|    301|          }
 7872|    301|        });
 7873|    301|  return result;
 7874|    301|}
_ZZN7httplib6detail22normalize_query_stringERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEENKUlPKcSB_E_clESB_SB_:
 7851|  24.2k|        [&](const char *b, const char *e) {
 7852|  24.2k|          std::string key;
 7853|  24.2k|          std::string val;
 7854|  24.2k|          divide(b, static_cast<std::size_t>(e - b), '=',
 7855|  24.2k|                 [&](const char *lhs_data, std::size_t lhs_size,
 7856|  24.2k|                     const char *rhs_data, std::size_t rhs_size) {
 7857|  24.2k|                   key.assign(lhs_data, lhs_size);
 7858|  24.2k|                   val.assign(rhs_data, rhs_size);
 7859|  24.2k|                 });
 7860|       |
 7861|  24.2k|          if (!key.empty()) {
  ------------------
  |  Branch (7861:15): [True: 23.3k, False: 924]
  ------------------
 7862|  23.3k|            auto dec_key = decode_query_component(key);
 7863|  23.3k|            auto dec_val = decode_query_component(val);
 7864|       |
 7865|  23.3k|            if (!result.empty()) { result += '&'; }
  ------------------
  |  Branch (7865:17): [True: 23.0k, False: 253]
  ------------------
 7866|  23.3k|            result += encode_query_component(dec_key);
 7867|  23.3k|            if (!val.empty() || std::find(b, e, '=') != e) {
  ------------------
  |  Branch (7867:17): [True: 670, False: 22.6k]
  |  Branch (7867:17): [True: 1.32k, False: 22.0k]
  |  Branch (7867:33): [True: 659, False: 22.0k]
  ------------------
 7868|  1.32k|              result += '=';
 7869|  1.32k|              result += encode_query_component(dec_val);
 7870|  1.32k|            }
 7871|  23.3k|          }
 7872|  24.2k|        });
_ZZZN7httplib6detail22normalize_query_stringERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEENKUlPKcSB_E_clESB_SB_ENKUlSB_mSB_mE_clESB_mSB_m:
 7856|  24.2k|                     const char *rhs_data, std::size_t rhs_size) {
 7857|  24.2k|                   key.assign(lhs_data, lhs_size);
 7858|  24.2k|                   val.assign(rhs_data, rhs_size);
 7859|  24.2k|                 });
_ZN7httplib6detail13is_valid_pathERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 5011|    225|inline bool is_valid_path(const std::string &path) {
 5012|    225|  size_t level = 0;
 5013|    225|  size_t i = 0;
 5014|       |
 5015|       |  // Skip slash
 5016|  1.05M|  while (i < path.size() && path[i] == '/') {
  ------------------
  |  Branch (5016:10): [True: 1.04M, False: 13]
  |  Branch (5016:29): [True: 1.04M, False: 212]
  ------------------
 5017|  1.04M|    i++;
 5018|  1.04M|  }
 5019|       |
 5020|   938k|  while (i < path.size()) {
  ------------------
  |  Branch (5020:10): [True: 938k, False: 211]
  ------------------
 5021|       |    // Read component
 5022|   938k|    auto beg = i;
 5023|  3.66M|    while (i < path.size() && path[i] != '/') {
  ------------------
  |  Branch (5023:12): [True: 3.66M, False: 177]
  |  Branch (5023:31): [True: 2.72M, False: 938k]
  ------------------
 5024|  2.72M|      if (path[i] == '\0') {
  ------------------
  |  Branch (5024:11): [True: 9, False: 2.72M]
  ------------------
 5025|      9|        return false;
 5026|  2.72M|      } else if (path[i] == '\\') {
  ------------------
  |  Branch (5026:18): [True: 4, False: 2.72M]
  ------------------
 5027|      4|        return false;
 5028|      4|      }
 5029|  2.72M|      i++;
 5030|  2.72M|    }
 5031|       |
 5032|   938k|    auto len = i - beg;
 5033|   938k|    assert(len > 0);
  ------------------
  |  Branch (5033:5): [True: 938k, False: 0]
  ------------------
 5034|       |
 5035|   938k|    if (!path.compare(beg, len, ".")) {
  ------------------
  |  Branch (5035:9): [True: 6.47k, False: 931k]
  ------------------
 5036|  6.47k|      ;
 5037|   931k|    } else if (!path.compare(beg, len, "..")) {
  ------------------
  |  Branch (5037:16): [True: 52.2k, False: 879k]
  ------------------
 5038|  52.2k|      if (level == 0) { return false; }
  ------------------
  |  Branch (5038:11): [True: 1, False: 52.2k]
  ------------------
 5039|  52.2k|      level--;
 5040|   879k|    } else {
 5041|   879k|      level++;
 5042|   879k|    }
 5043|       |
 5044|       |    // Skip slash
 5045|  1.96M|    while (i < path.size() && path[i] == '/') {
  ------------------
  |  Branch (5045:12): [True: 1.96M, False: 198]
  |  Branch (5045:31): [True: 1.02M, False: 938k]
  ------------------
 5046|  1.02M|      i++;
 5047|  1.02M|    }
 5048|   938k|  }
 5049|       |
 5050|    211|  return true;
 5051|    225|}

LLVMFuzzerTestOneInput:
    7|  1.52k|extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
    8|  1.52k|  if (size < 2) return 0;
  ------------------
  |  Branch (8:7): [True: 1, False: 1.52k]
  ------------------
    9|       |
   10|       |  // Use first byte to select which parsing function to exercise
   11|  1.52k|  uint8_t selector = data[0];
   12|  1.52k|  const char *payload = reinterpret_cast<const char *>(data + 1);
   13|  1.52k|  size_t payload_size = size - 1;
   14|  1.52k|  std::string input(payload, payload_size);
   15|       |
   16|  1.52k|  switch (selector % 6) {
  ------------------
  |  Branch (16:11): [True: 1.52k, False: 0]
  ------------------
   17|    581|  case 0: {
  ------------------
  |  Branch (17:3): [True: 581, False: 944]
  ------------------
   18|       |    // parse_query_text
   19|    581|    httplib::Params params;
   20|    581|    httplib::detail::parse_query_text(payload, payload_size, params);
   21|    581|    break;
   22|      0|  }
   23|     73|  case 1: {
  ------------------
  |  Branch (23:3): [True: 73, False: 1.45k]
  ------------------
   24|       |    // decode_query_component
   25|     73|    httplib::decode_query_component(input, true);
   26|     73|    httplib::decode_query_component(input, false);
   27|     73|    break;
   28|      0|  }
   29|    235|  case 2: {
  ------------------
  |  Branch (29:3): [True: 235, False: 1.29k]
  ------------------
   30|       |    // decode_path_component
   31|    235|    httplib::decode_path_component(input);
   32|    235|    break;
   33|      0|  }
   34|    110|  case 3: {
  ------------------
  |  Branch (34:3): [True: 110, False: 1.41k]
  ------------------
   35|       |    // encode_query_component
   36|    110|    httplib::encode_query_component(input);
   37|    110|    break;
   38|      0|  }
   39|    301|  case 4: {
  ------------------
  |  Branch (39:3): [True: 301, False: 1.22k]
  ------------------
   40|       |    // normalize_query_string
   41|    301|    httplib::detail::normalize_query_string(input);
   42|    301|    break;
   43|      0|  }
   44|    225|  case 5: {
  ------------------
  |  Branch (44:3): [True: 225, False: 1.30k]
  ------------------
   45|       |    // is_valid_path
   46|    225|    httplib::detail::is_valid_path(input);
   47|    225|    break;
   48|      0|  }
   49|  1.52k|  }
   50|       |
   51|  1.52k|  return 0;
   52|  1.52k|}

