code: public static void decodeUtf8To(String query, int offset, int length, MultiMap<String> map) {
          Utf8StringBuilder buffer = new Utf8StringBuilder();
          synchronized (map) {
              String key = null;
              String value = null;
  
              int end = offset + length;
              for (int i = offset; i < end; i++) {
                  char c = query.charAt(i);
                  switch (c) {
                      case '&':
                          value = buffer.toReplacedString();
                          buffer.reset();
                          if (key != null) {
                              map.add(key, value);
                          } else if (value != null && value.length() > 0) {
                              map.add(value, "");
                          }
                          key = null;
                          value = null;
                          break;
  
                      case '=':
                          if (key != null) {
                              buffer.append(c);
                              break;
                          }
                          key = buffer.toReplacedString();
                          buffer.reset();
                          break;
  
                      case '+':
                          buffer.append((byte) ' ');
                          break;
  
                      case '%':
                          if (i + 2 < end) {
                              char hi = query.charAt(++i);
                              char lo = query.charAt(++i);
                              buffer.append(decodeHexByte(hi, lo));
                          } else {
                              throw new Utf8Appendable.NotUtf8Exception("Incomplete % encoding");
                          }
                          break;
  
                      default:
                          buffer.append(c);
                          break;
                  }
              }
  
              if (key != null) {
                  value = buffer.toReplacedString();
                  buffer.reset();
                  map.add(key, value);
              } else if (buffer.length() > 0) {
                  map.add(buffer.toReplacedString(), "");
              }
          }
      }
docs: Decoded parameters to Map.
  
  @param query  the string containing the encoded parameters
  @param offset the offset within raw to decode from
  @param length the length of the section to decode
  @param map    the {@link MultiMap} to populate