/**
 * Функция парсит значения типа:
 * "C=RU, S=КДА, L=Сочи, CN=Петров Сидор Иванович, E=sidorov@dresa.takova.net"
 * на
 * [ 'C', 'RU' ],
 * [ 'S', 'КДА' ],
 * [ 'L', 'Сочи' ],
 * [ 'CN', 'Петров Сидор Иванович' ],
 * [ 'E', 'sidorov@dresa.takova.net' ]
 * с учётом внутренних запятых и прочих каламбуров
 */
export function parseCertificatePairs(str) {
  let m;
  const keyValuePairs = Object.assign([], {
      byKey: function(key) {
          const value = this.find(el => el[0] == key);
          return (value && value[1]) || '';
      }
  });
  const regex = /\s?([A-ZА-Я]*)=(.*?(?=(,?\s?[A-ZА-Я]*=)|$))/g;
  
  while ((m = regex.exec(str)) !== null) {
      // This is necessary to avoid infinite loops with zero-width matches
      if (m.index === regex.lastIndex) regex.lastIndex++;
      let key = null;
      let value = null;
      m.forEach((match, groupIndex) => {
          if (match && groupIndex === 1) key = match?.trim();
          if (match && groupIndex === 2) value = match?.trim();
      });
      if (key !== null && key !== undefined) keyValuePairs.push([key, value || '']);
  }
  return keyValuePairs;
}