constructor(search) {
    /** @private @const {!Map<string, !Array<string>>} */
    this.paramMap_ = new Map();
    if (search.indexOf('?') == 0) {
      search = search.substring(1);
    }
    const params = search.split('&');
    for (let p of params) {
      let key = p;
      let val = '';
      const keyValueSplit = p.split('=');
      const isKV = keyValueSplit.length > 1;
      if (isKV) {
        key = decodeURIComponent(keyValueSplit[0].replace('+', ' '));
        val = decodeURIComponent(keyValueSplit[1].replace('+', ' '));
      }
      let entries = this.paramMap_.get(key);
      if (entries == null) {
        entries = [];
        this.paramMap_.set(key, entries);
      }
      entries.push(val);
    }
  }
@param {string} search The search string from URL resolution. May
    optionally begin with '?', and is expected to be URL-encoded.