{"version":3,"file":"foxford-utils.mjs","sources":["../../src/qid.js","../../src/uuid.js","../../src/pickBy.js","../../src/collapse.js","../../src/debounce.js","../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../../src/indexById.js","../../src/pluralize.js","../../src/rawMarkup.js","../../src/capitalize.js","../../src/getFilesSize.js","../../src/getMimeTypes.js","../../src/getRandomInt.js","../../src/indexByGroupId.js","../../src/scrollToElement.js","../../src/pluralizeByType.js","../../src/base64ToArrayBuffer.js","../../src/parseStringListToArray.js","../../src/transformOptionsForSelect.js","../../src/objects.js","../../src/browser.js","../../src/dom.js","../../src/caseConverters.js","../../src/array.js","../../src/strings.js","../../src/currency-codes.js","../../src/colors.js","../../src/url.js","../../src/files.js","../../src/mime-types/images.js","../../src/mime-types/files.js","../../src/mime-types/audio.js","../../src/functions.js"],"sourcesContent":["/**\n * Generate unique qid\n * @param {number} length of unique id\n * @param {boolean} number use number in string\n * @return {string}\n */\nexport function qid(length = 6, number = true) {\n  let text = ''\n  const possible = `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz${\n    number ? '0123456789' : ''\n  }`\n\n  for (let i = 0; i < length; i++) {\n    text += possible.charAt(Math.floor(Math.random() * possible.length))\n  }\n\n  return text\n}\n","/**\n * Generate unique grouped id\n * @returns {string}\n */\nexport function uuid() {\n  function s4() {\n    return Math.floor((1 + Math.random()) * 0x10000)\n      .toString(16)\n      .substring(1)\n  }\n\n  return `${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`\n}\n","/**\n * Filter object fields\n *\n * @export\n * @param {object} object - input object\n * @param {function} filterFunc - function for filtering\n * @returns {object} - resulting objetc with filered fields\n */\nexport function pickBy(obj, filterFunc) {\n  const newObj = {}\n\n  Object.entries(obj).map((entry) => {\n    const key = entry[0]\n    const value = entry[1]\n\n    if (filterFunc(key, value)) newObj[key] = value\n\n    return [key, value]\n  })\n\n  return newObj\n}\n","function toggleOnClickHandler({ currentTarget }) {\n  if (!currentTarget) return false\n\n  const toggleArrow = currentTarget.querySelector('.toggle_arrow')\n  const arrowClass = 'down'\n  const toggleClass = 'expanded'\n\n  if (Array.from(toggleArrow.classList).indexOf(arrowClass) !== -1) {\n    toggleArrow.classList.remove(arrowClass)\n    currentTarget.classList.remove(toggleClass)\n  } else {\n    currentTarget.classList.add(toggleClass)\n    toggleArrow.classList.add(arrowClass)\n  }\n\n  return true\n}\n\nexport class Collapse {\n  constructor() {\n    this.init = this.init.bind(this)\n    this.makeCollapse = this.makeCollapse.bind(this)\n    this.destroy = this.destroy.bind(this)\n    this.onClickHandler = toggleOnClickHandler\n  }\n\n  makeCollapse(collapse) {\n    if (Array.from(collapse.classList).indexOf('js') !== -1) return false\n\n    collapse.addEventListener('click', this.onClickHandler)\n\n    return collapse.classList.add('js')\n  }\n\n  init() {\n    setTimeout(() => {\n      if (!document.querySelectorAll || !document.body.classList) return false\n\n      this.collapses = window.document.querySelectorAll('.toggle_element')\n\n      return Array.from(this.collapses).forEach(this.makeCollapse)\n    }, 0)\n  }\n\n  destroy() {\n    const collapses = window.document.querySelectorAll('.toggle_element')\n\n    Array.from(collapses).forEach((item) => {\n      item.removeEventListener('click', this.makeCollapse)\n    })\n  }\n\n  reinit() {\n    this.destroy()\n    this.init()\n  }\n}\n","/**\n * Decorate function with debounce\n *\n * @export\n * @param {function} f - function\n * @param {number} ms - debounce\n * @returns {function} - decorated function\n */\nexport function debounce(f, ms) {\n  let timer = null\n\n  return function decoratedFunction(...args) {\n    const onComplete = () => {\n      f.apply(this, args)\n      timer = null\n    }\n\n    if (timer) {\n      clearTimeout(timer)\n    }\n\n    timer = setTimeout(onComplete, ms)\n\n    return timer\n  }\n}\n","export default function _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}","import defineProperty from \"./defineProperty.js\";\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    });\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nexport default function _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}","/*\n  Функция превращает массив:\n    [{ id: 1, name: 'item 1' }, ... ]\n\n  В объект:\n    {\n      '1': {\n        id: 1,\n        name: 'item 1'\n      },\n      ...\n    }\n*/\nexport function indexById(items) {\n  return items.reduce((all, item) => {\n    const newAll = { ...all }\n\n    newAll[item.id] = item\n\n    return newAll\n  }, {})\n}\n","// @docs: http://localization-guide.readthedocs.io/en/latest/l10n/pluralforms.html\n// @example\n// pluralize(1, ['штука', 'штуки', 'штук'])\nexport function pluralize(counter, forms) {\n  const n = Math.abs(counter)\n  const id =\n    n % 10 === 1 && n % 100 !== 11\n      ? 0\n      : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20)\n      ? 1\n      : 2\n\n  return forms[id]\n}\n","/**\n * @example\n * <div dangerouslySetInnerHTML={rawMarkup('<b>text</b>')} />\n */\nexport function rawMarkup(text) {\n  return { __html: text }\n}\n","// @flow\n/**\n * Capitalize string\n * @param {string} str\n */\nexport const capitalize = (str: string): string => {\n  return str.length ? str[0].toUpperCase() + str.slice(1) : ''\n}\n","// @flow\n/**\n * getFilesSize - increment attachments and add new files\n * @param {Array[Object]} attachments\n * @param {Array} files\n */\nexport function getFilesSize(attachments: [], files: []): number {\n  let size = 0\n\n  attachments.concat(files).forEach((file) => {\n    size += file.size\n  })\n\n  return size\n}\n","// @flow\n/**\n * Return array of mime-types from array of files\n * @param {Array[File]} files\n */\ntype MimeFiles = Array<{\n  extensions: Array<string>,\n  mime: string,\n}>\n\nexport const getMimeTypes = (files: MimeFiles): Array<string> => {\n  const data = files.reduce((acc, file) => [...acc, file.mime], [])\n\n  return data\n}\n","// Возвращает случайное целое число между min (включительно) и max (не включая max)\nexport function getRandomInt(min, max) {\n  return Math.floor(Math.random() * (max - min)) + min\n}\n","/*\n  Функция превращает массив:\n    [{ id: 1, name: 'item 1', group: { id: 1 } }, ... ]\n\n  В объект:\n    {\n      '100': {\n        id: 1,\n        name: 'item 1',\n        group: { id: 100 }\n      },\n      ...\n    }\n*/\nexport function indexByGroupId(items) {\n  return items.reduce((all, item) => {\n    const newAll = { ...all }\n\n    newAll[item.group.id] = item\n\n    return newAll\n  }, {})\n}\n","function getElementPosition(elem) {\n  const { top, left } = elem.getBoundingClientRect()\n  const { pageYOffset, pageXOffset } = window\n\n  return {\n    top: top + pageYOffset,\n    left: left + pageXOffset,\n  }\n}\n\nexport function scrollToElement(selector) {\n  const field = document.querySelector(selector)\n  if (!field) return false\n  const { top } = getElementPosition(field)\n\n  return window.scrollTo(0, top)\n}\n","import { pluralize } from './pluralize'\n\nconst TYPES = {\n  tasks: ['задача', 'задачи', 'задач'],\n  exercises: ['занятие', 'занятия', 'занятий'],\n  members: ['участник', 'участника', 'участников'],\n  hours: ['час', 'часа', 'часов'],\n  seconds: ['секунда', 'секунды', 'секунд'],\n  minutes: ['минута', 'минуты', 'минут'],\n  remains: ['остался', 'осталось', 'осталось'],\n  days: ['день', 'дня', 'дней'],\n  points: ['балл', 'балла', 'баллов'],\n  students: ['ученик', 'ученика', 'учеников'],\n  studentsParentalCase: ['ученика', 'учеников', 'учеников'],\n}\n\n/**\n * Get a pluralized string for a preset by type\n *\n * @param {number} counter\n * @param {strung} type\n */\nexport function pluralizeByType(counter, type) {\n  return pluralize(counter || 0, TYPES[type])\n}\n","/**\n * Конвертим base64 в буфер\n *\n * @param {string} base64\n */\nexport function base64ToArrayBuffer(base64) {\n  const binaryString = window.atob(base64)\n  const len = binaryString.length\n  const bytes = new Uint8Array(len)\n\n  for (let i = 0; i < len; i++) {\n    bytes[i] = binaryString.charCodeAt(i)\n  }\n\n  return bytes.buffer\n}\n","/**\n * Функция для парсинга строки вида:\n * \"— Преподаватель кафедры общей физики МФТИ <br>\n * — Старший преподаватель вечерней физико-технической школы МФТИ\"\n * в массив\n *\n * @export\n * @param {any} string\n * @returns array\n */\nexport function parseStringListToArray(string = '') {\n  return string\n    .split(/(?:^|<br>|\\n)\\s*[-\\u\\u2010-\\u2015\\ufe58\\ufe63\\uff0d]/gm)\n    .filter(({ length }) => length)\n}\n","/* eslint-disable camelcase */\n/**\n * Function for transforming otions like grade options into select values\n *\n * @export\n * @param {array} options array of {object} { id, name, image_url }\n * @returns {array} selectOptions { value, label, image_url }\n */\nexport function transformOptionsForSelect(options) {\n  return options.map(({ id, name, image_url }) => ({\n    value: id,\n    label: name,\n    image_url,\n  }))\n}\n","/**\n * Глубокий мерж объектов\n *\n * @param {object} target\n * @param {object} source\n */\nexport const merge = (target, source) => {\n  /*\n   Iterate through `source` properties and if an `Object`\n   set property to merge of `target` and `source` properties\n  */\n  // eslint-disable-next-line no-restricted-syntax\n  for (const key of Object.keys(source)) {\n    if (source[key] instanceof Object && key in target) {\n      Object.assign(source[key], merge(target[key], source[key]))\n    }\n  }\n\n  // Join `target` and modified `source`\n  Object.assign(target || {}, source)\n\n  return target\n}\n","// @flow\n/**\n * Detect IE\n * @returns version of IE or false, if browser is not Internet Explorer\n */\nexport const detectIE = (): boolean | number => {\n  const ua: string = window.navigator.userAgent\n\n  const msie = ua.indexOf('MSIE ')\n\n  if (msie > 0) {\n    // IE 10 or older => return version number\n    return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10)\n  }\n\n  const trident = ua.indexOf('Trident/')\n\n  if (trident > 0) {\n    // IE 11 => return version number\n    const rv = ua.indexOf('rv:')\n\n    return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10)\n  }\n\n  const edge = ua.indexOf('Edge/')\n\n  if (edge > 0) {\n    // Edge (IE 12+) => return version number\n    return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10)\n  }\n\n  // other browser\n  return false\n}\n","/**\n * Function returnes outer height of the element\n *\n * @export\n * @param {node} el\n * @returns {number} height\n */\nexport function outerHeight(el) {\n  const style = getComputedStyle(el)\n  let height = el.offsetHeight\n\n  height += parseInt(style.marginTop) + parseInt(style.marginBottom)\n\n  return height\n}\n\n/**\n * Serialize form data\n *\n * @export\n * @param {form} form\n * @returns {array} s\n */\nexport function serializeArray(form) {\n  let field\n  let l\n  const s = []\n\n  if (typeof form === 'object' && form.nodeName === 'FORM') {\n    const len = form.elements.length\n\n    for (let i = 0; i < len; i++) {\n      field = form.elements[i]\n      if (\n        field.name &&\n        !field.disabled &&\n        field.type !== 'file' &&\n        field.type !== 'reset' &&\n        field.type !== 'submit' &&\n        field.type !== 'button'\n      ) {\n        if (field.type === 'select-multiple') {\n          l = form.elements[i].options.length\n          for (let j = 0; j < l; j++) {\n            if (field.options[j].selected) {\n              s[s.length] = { name: field.name, value: field.options[j].value }\n            }\n          }\n        } else if ((field.type !== 'checkbox' && field.type !== 'radio') || field.checked) {\n          s[s.length] = { name: field.name, value: field.value }\n        }\n      }\n    }\n  }\n\n  return s\n}\n\n/**\n * Check if element placed inside current viewport\n *\n * @param {node} el\n */\nexport function isElementInViewport(el) {\n  const rect = el.getBoundingClientRect()\n\n  return (\n    rect.top >= 0 &&\n    rect.left >= 0 &&\n    rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n    rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n  )\n}\n","// @flow\n\ntype ObjectType = {\n  [string]: string,\n}\n\n/**\n * Convert object keys to camelCase\n * @param {object} obj\n */\nexport const toCamelCase = (obj: ObjectType): ObjectType => {\n  const result = {}\n\n  Object.entries(obj).forEach(([key, value]) => {\n    const newKey: string = key\n      .split('_')\n      .map((part, i) => (i === 0 ? part : part[0].toUpperCase() + part.slice(1)))\n      .join('')\n\n    result[newKey] = value\n  })\n\n  return result\n}\n\n/**\n * Convert camelCase keys in object to undercase\n * @param {object} obj\n */\nexport const toUnderscoredCase = (obj: ObjectType): ObjectType => {\n  const result = {}\n\n  Object.entries(obj).forEach(([key, value]) => {\n    const newKey = key\n      .split(/(?=[A-Z])/)\n      .join('_')\n      .toLowerCase()\n\n    result[newKey] = value\n  })\n\n  return result\n}\n","/**\n * Function splits [arr] by arrays of [limit] elements\n *\n * @param {*} arr - any array\n * @param {*} limit - length of new arrays\n */\nexport const splitEvery = (limit = 1, arr = []) =>\n  arr.reduce((acc, item, index) => {\n    if (!(index % limit)) {\n      acc[acc.length] = []\n    }\n\n    acc[acc.length - 1].push(item)\n\n    return acc\n  }, [])\n\n/**\n * Remove duplicated elements from array\n *\n * @param {array} arrArg - array to deduplicate\n */\nexport const uniq = (arrArg) => arrArg.filter((elem, pos, arr) => arr.indexOf(elem) === pos)\n\n/**\n * Remove element from array by index\n *\n * @param {array} arr\n * @param {number} index\n */\nexport const removeElFromArr = (arr, index) => {\n  const newArr = [...arr]\n\n  newArr.splice(index, 1)\n\n  return newArr\n}\n\n/**\n * Merge two arrays of objects by field\n *\n * @param {array} [arr1=[]] - Array 1\n * @param {array} [arr2=[]] - Array 2\n * @returns {array}\n */\nexport function mergeByKey(arr1 = [], arr2 = [], key = 'id') {\n  return arr1.map((el1) => {\n    const el2 = arr2.find((el) => `${el[key]}` === `${el1[key]}`)\n\n    return el2 ? { ...el1, ...el2 } : el1\n  })\n}\n","/**\n * Функция принимает Ф.И.О, возвращает Ф.И.\n *\n * @param {string} fullName\n * @returns {string} shortName\n */\nexport const makeShortNameFromFull = (fullName = '') => {\n  const nameArr = fullName.split(' ')\n\n  return nameArr.length === 3\n    ? nameArr.splice(0, 2).reverse().join(' ')\n    : nameArr.reverse().join(' ')\n}\n\n/**\n * Extracts all decimals from string\n *\n * @param {string} [str='']\n * @returns {string}\n */\nexport const extractDigits = (str = '') => typeof str === 'string' && str.replace(/\\D/gim, '')\n","/* eslint-disable */\nexport const CURRENCY_DIRECTORY = {\n  ALL: '\\u004C\\u0065\\u006b',\n  AFN: '\\u060B',\n  ARS: '\\u0024',\n  AWG: '\\u0192',\n  AUD: '\\u0024',\n  AZN: '\\u20BC',\n  BSD: '\\u0024',\n  BBD: '\\u0024',\n  BYR: '\\u0042\\u0072',\n  BZD: '\\u0042\\u005a\\u0024',\n  BMD: '\\u0024',\n  BOB: '\\u0024\\u0062',\n  BAM: '\\u004B\\u004d',\n  BWP: '\\u0050',\n  BGN: '\\u043B\\u0432',\n  BRL: '\\u0052\\u0024',\n  BND: '\\u0024',\n  KHR: '\\u17DB',\n  CAD: '\\u0043\\u0024',\n  KYD: '\\u0024',\n  CLP: '\\u0024',\n  CNY: '\\u00A5',\n  COP: '\\u0024',\n  CRC: '\\u20A1',\n  HRK: '\\u006B\\u006e',\n  CUP: '\\u20B1',\n  CZK: '\\u004B\\u010d',\n  DKK: '\\u006B\\u0072',\n  DOP: '\\u0052\\u0044\\u0024',\n  XCD: '\\u0024',\n  EGP: '\\u00A3',\n  SVC: '\\u0024',\n  EEK: '\\u006B\\u0072',\n  EUR: '\\u20AC',\n  FKP: '\\u00A3',\n  FJD: '\\u0024',\n  FRF: '\\u20A3',\n  GHC: '\\u00A2',\n  GIP: '\\u00A3',\n  GTQ: '\\u0051',\n  GGP: '\\u00A3',\n  GYD: '\\u0024',\n  HNL: '\\u004C',\n  HKD: '\\u0024',\n  HUF: '\\u0046\\u0074',\n  ISK: '\\u006B\\u0072',\n  INR: '\\u20A8',\n  IDR: '\\u0052\\u0070',\n  IRR: '\\uFDFC',\n  IMP: '\\u00A3',\n  ILS: '\\u20AA',\n  JMD: '\\u004A\\u0024',\n  JPY: '\\u00A5',\n  JEP: '\\u00A3',\n  KZT: '\\u20B8',\n  KGS: '\\u004B\\u0047\\u0053',\n  LAK: '\\u20AD',\n  LVL: '\\u004C\\u0073',\n  LBP: '\\u00A3',\n  LRD: '\\u0024',\n  LTL: '\\u004C\\u0074',\n  MKD: '\\u0434\\u0435\\u043d',\n  MYR: '\\u0052\\u004d',\n  MUR: '\\u20A8',\n  MXN: '\\u0024',\n  MNT: '\\u20AE',\n  MZN: '\\u004D\\u0054',\n  NAD: '\\u0024',\n  NPR: '\\u20A8',\n  ANG: '\\u0192',\n  NZD: '\\u0024',\n  NIO: '\\u0043\\u0024',\n  NGN: '\\u20A6',\n  KPW: '\\u20A9',\n  NOK: '\\u006B\\u0072',\n  OMR: '\\uFDFC',\n  PKR: '\\u20A8',\n  PAB: '\\u0042\\u002f\\u002e',\n  PYG: '\\u0047\\u0073',\n  PEN: '\\u0053\\u002f\\u002e',\n  PHP: '\\u20B1',\n  PLN: '\\u007A\\u0142',\n  QAR: '\\uFDFC',\n  RON: '\\u006C\\u0065\\u0069',\n  RUR: '\\u20BD',\n  SHP: '\\u00A3',\n  SAR: '\\uFDFC',\n  RSD: '\\u0414\\u0438\\u043d\\u002e',\n  SCR: '\\u20A8',\n  SGD: '\\u0024',\n  SBD: '\\u0024',\n  SOS: '\\u0053',\n  ZAR: '\\u0052',\n  KRW: '\\u20A9',\n  LKR: '\\u20A8',\n  SEK: '\\u006B\\u0072',\n  CHF: '\\u0043\\u0048\\u0046',\n  SRD: '\\u0024',\n  SYP: '\\u00A3',\n  TWD: '\\u004E\\u0054\\u0024',\n  THB: '\\u0E3F',\n  TTD: '\\u0054\\u0054\\u0024',\n  TRY: '\\u20A4',\n  TRL: '\\u20A4',\n  TVD: '\\u0024',\n  UAH: '\\u20B4',\n  GBP: '\\u00A3',\n  USD: '\\u0024',\n  UYU: '\\u0024\\u0055',\n  UZS: '\\u043B\\u0432',\n  VEF: '\\u0042\\u0073',\n  VND: '\\u20AB',\n  YER: '\\uFDFC',\n  ZWD: '\\u005A\\u0024',\n}\n\n/**\n * Возвращает знак валюты по ISO коду.\n *\n * @param {String} currencyCode Код валюты.\n * @returns {String}\n */\nexport function getCurrencySymbol(currencyCode) {\n  return CURRENCY_DIRECTORY[currencyCode] || currencyCode\n}\n","export function colorLuminance(rawHex, lum = 0) {\n  // validate hex string\n  let hex = String(rawHex).replace(/[^0-9a-f]/gi, '')\n\n  if (hex.length < 6) {\n    hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]\n  }\n\n  // convert to decimal and change luminosity\n  let rgb = '#'\n\n  for (let i = 0; i < 3; i++) {\n    let c = hex && parseInt(hex.substr(i * 2, 2), 16)\n\n    c = Math.round(Math.min(Math.max(0, c + c * lum), 255)).toString(16)\n    rgb += `00${c}`.substr(c.length)\n  }\n\n  return rgb\n}\n\nexport function getGradient(degree, color) {\n  return `linear-gradient(${degree}, ${colorLuminance(`#${color}`, +0.09)}, ${colorLuminance(\n    `#${color}`,\n    -0.09\n  )})`\n}\n\n/**\n * Возвращает цвет по строке\n *\n * @param {string} string строка имени\n * @param {Array} colors массив цветов (hex коды или имёна)\n * @return {string} цвет из массива цветов\n */\nexport const getColorByString = (string, colors) => {\n  let i = string.length\n  let sum = 0\n\n  while (i--) {\n    sum += string.charCodeAt(i)\n  }\n\n  return colors ? colors[sum % colors.length] : null\n}\n","import qs from 'query-string'\n\n/**\n * Хэлпер для создания строки URL адреса\n * @param   {String} url            Путь\n * @param   {Object} query          Объект параметров запроса\n * @example\n * createPath('/library', { id: 1 })  // => /library?id=1\n * @returns {String}                Итоговый путь\n */\nexport function createPath(u, query) {\n  let url = u\n\n  const hashExist = url.includes('#')\n  const hash = hashExist ? url.split('#')[1] : ''\n\n  if (hashExist) {\n    url = url.replace('#', '')\n    url = url.replace(hash, '')\n  }\n\n  const [urlPath, urlQuery] = url.split('?')\n\n  const queryParams = qs.stringify(\n    {\n      ...qs.parse(urlQuery),\n      ...query,\n    },\n    { encode: false }\n  )\n\n  return [urlPath, queryParams].filter((s) => !!s).join('?') + (hashExist ? `#${hash}` : '')\n}\n\n/**\n * Хэлпер для того чтобы парсить строку запроса (location.search)\n * @param  {String} query Строка запроса\n * @return {Object}       Объект содержащий параметры запроса\n * @example\n * parseQueryString('/library?id=1')  // => { id: 1 }\n */\nexport function parseQueryString(query) {\n  return qs.parse(query)\n}\n\n/**\n * Функция извлекает URL следующей страницы из HTTP заголовка Link\n *\n * @param  {String} link Содержимое заголовка Link\n * @return {String}      URL адрес следующей страницы или пустая строка\n *\n * @example\n *   var link = \"<http://localhost:3500/api/library/pupil_courses?page=2>; rel='next'\"\n *   var url = getNextPageURLFromLinkHeader(link)\n *   url === 'http://localhost:3500/api/library/pupil_courses?page=2'\n */\nexport function getNextPageURLFromLinkHeader(link = '') {\n  const result = link.match(/<([^>]+)>/)\n\n  return result ? result[1] : ''\n}\n\n/**\n * Функция извлекает номер следующей страницы из HTTP заголовка Link\n *\n * @param  {String} link Содержимое заголовка Link\n * @return {Number} page номер страницы или null\n *\n * @example\n *   var link = \"<http://localhost:3500/api/library/pupil_courses?page=2>; rel='next'\"\n *   var url = getNextPageURLFromLinkHeader(link)\n *   url === 'http://localhost:3500/api/library/pupil_courses?page=2'\n */\nexport function getNextPageFromLinkHeader(link = '') {\n  return link ? parseInt(/[?&]page=([^&>]+)[&>]/gi.exec(link)[1]) || null : null\n}\n\n/**\n * Generate url param string\n *\n * @export\n * @param {object} object\n * @returns {string}\n */\nexport function makeParamString(object = {}) {\n  return Object.keys(object)\n    .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(object[key])}`)\n    .join('&')\n}\n","// @flow\nimport images from './mime-types/images'\nimport files from './mime-types/files'\nimport audio from './mime-types/audio'\nimport { getMimeTypes } from './getMimeTypes'\n\nconst MimeTypes = {\n  images,\n  files,\n  audio,\n}\n\nconst getExtentensions = (files) => files.reduce((acc, file) => [...acc, ...file.extensions], [])\n\nexport const mimeImages = (): string[] => getMimeTypes(MimeTypes.images)\n\nexport const mimeFiles = (): string[] => getMimeTypes(MimeTypes.files)\n\nexport const mimeAudio = (): string[] => getMimeTypes(MimeTypes.audio)\n\nexport const acceptFileTypes = (): string[] => [...mimeImages(), ...mimeFiles()]\n\nexport const acceptAllTypes = (): string[] => [...mimeImages(), ...mimeFiles(), ...mimeAudio()]\n\nexport const acceptImagesExtensions = (): string[] => getExtentensions(MimeTypes.images)\n\nexport const acceptFilesExtensions = (): string[] => getExtentensions(MimeTypes.files)\n\nexport const acceptAudioExtensions = (): string[] => getExtentensions(MimeTypes.audio)\n\nexport const acceptAllExtensions = (): string[] => [\n  ...acceptFilesExtensions(),\n  ...acceptImagesExtensions(),\n  ...acceptAudioExtensions(),\n]\n","// @flow\nexport default [\n  {\n    mime: 'image/jpeg',\n    extensions: ['jpg', 'jpeg'],\n  },\n  {\n    mime: 'image/png',\n    extensions: ['png'],\n  },\n  {\n    mime: 'image/gif',\n    extensions: ['gif'],\n  },\n]\n","// @flow\nexport default [\n  {\n    mime: 'application/vnd.oasis.opendocument.text',\n    extensions: ['odt'],\n  },\n  {\n    mime: 'application/vnd.oasis.opendocument.formula',\n    extensions: ['odf'],\n  },\n  {\n    mime: 'application/vnd.oasis.opendocument.presentation',\n    extensions: ['odp'],\n  },\n  {\n    mime: 'application/vnd.ms-powerpoint',\n    extensions: ['ppt'],\n  },\n  {\n    mime: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n    extensions: ['pptx'],\n  },\n  {\n    mime: 'application/msword',\n    extensions: ['doc', 'dot'],\n  },\n  {\n    mime: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n    extensions: ['docx'],\n  },\n  {\n    mime: 'application/pdf',\n    extensions: ['pdf'],\n  },\n  {\n    mime: 'application/excel, application/x-excel, application/vnd.ms-excel, application/x-msexcel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n    extensions: ['xls', 'xlsx'],\n  },\n]\n","// @flow\nexport default [\n  {\n    mime: 'audio/mpeg, audio/mp3',\n    extensions: ['mp3'],\n  },\n  {\n    mime: 'audio/wav',\n    extensions: ['wav'],\n  },\n]\n","function wrapField(wrapper, field) {\n  return `${wrapper}[${field}]`\n}\n\nexport function wrapFormFields(wrapper, formFieldsString, untouchables = []) {\n  const parts = formFieldsString.split('&')\n  const newFields = []\n  let oldField\n  let newPart\n\n  parts.forEach((oldPart) => {\n    oldField = oldPart.substr(0, oldPart.indexOf('='))\n\n    if (untouchables.includes(oldField)) {\n      newPart = oldPart\n    } else {\n      newPart = oldPart.replace(oldField, wrapField(wrapper, oldField))\n    }\n\n    newFields.push(newPart)\n  })\n\n  return newFields.join('&')\n}\n\n/**\n * Function returns function for cheking if idToMatch matches object's id\n *\n * Usage: arr.find(matchesId(id))\n *\n * @param {string | object} idToMatch - id that will be matching in returned function\n *\n * @return {function}\n */\nexport const matchesId =\n  (idToMatch) =>\n  ({ id }) =>\n    String(id) === String(idToMatch)\n\n/**\n * Detects if Enter key was pressed\n *\n * @export\n * @param {array} options array of {object} { id, name }\n * @returns {array} selectOprions { value, label }\n */\nexport function detectEnterKey(e) {\n  const enterKey = 13\n  const charCode = typeof e.which === 'number' ? e.which : e.keyCode\n\n  return enterKey === charCode\n}\n\n/**\n * Make options for select\n * @param {numer} value\n * @param {string} label\n */\nexport const makeOption = (value, label) => (value ? { value, label } : undefined)\n\n/**\n * Make loadOptionsFunction for select\n *\n * @param {function} func - function to load array of options\n * @param {object} args - function's arguments\n * @param {array} defaultOptions - array of default options:\n *    @param {string} label\n *    @param {number} id\n */\nexport const makeLoadOptionsFunc = (func, args, defaultOptions) => {\n  const response = func(args)\n\n  return response\n    ? response.then((options) => ({ options, ...defaultOptions }))\n    : Promise.resolve({ options: defaultOptions })\n}\n"],"names":["qid","length","number","text","possible","i","charAt","Math","floor","random","uuid","s4","toString","substring","pickBy","obj","filterFunc","newObj","Object","entries","map","entry","key","value","toggleOnClickHandler","_ref","currentTarget","toggleArrow","querySelector","arrowClass","toggleClass","Array","from","classList","indexOf","remove","add","Collapse","constructor","this","init","bind","makeCollapse","destroy","onClickHandler","collapse","addEventListener","setTimeout","document","querySelectorAll","body","collapses","window","forEach","item","removeEventListener","reinit","debounce","f","ms","timer","_len","arguments","args","_key","onComplete","apply","clearTimeout","_defineProperty","defineProperty","enumerable","configurable","writable","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","push","_objectSpread2","target","source","getOwnPropertyDescriptors","defineProperties","indexById","items","reduce","all","newAll","id","pluralize","counter","forms","n","abs","rawMarkup","__html","capitalize","str","toUpperCase","slice","getFilesSize","attachments","files","size","concat","file","getMimeTypes","acc","mime","getRandomInt","min","max","indexByGroupId","group","scrollToElement","selector","field","top","elem","left","getBoundingClientRect","pageYOffset","pageXOffset","getElementPosition","scrollTo","TYPES","tasks","exercises","members","hours","seconds","minutes","remains","days","points","students","studentsParentalCase","pluralizeByType","type","base64ToArrayBuffer","base64","binaryString","atob","len","bytes","Uint8Array","charCodeAt","buffer","parseStringListToArray","string","split","transformOptionsForSelect","options","name","image_url","label","merge","assign","detectIE","ua","navigator","userAgent","msie","parseInt","rv","edge","outerHeight","el","style","getComputedStyle","offsetHeight","marginTop","marginBottom","serializeArray","form","l","s","nodeName","elements","disabled","j","selected","checked","isElementInViewport","rect","bottom","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","toCamelCase","result","newKey","part","join","toUnderscoredCase","_ref2","toLowerCase","splitEvery","limit","arr","index","uniq","arrArg","pos","removeElFromArr","newArr","splice","mergeByKey","arr1","arr2","el1","el2","find","makeShortNameFromFull","fullName","nameArr","reverse","extractDigits","replace","CURRENCY_DIRECTORY","ALL","AFN","ARS","AWG","AUD","AZN","BSD","BBD","BYR","BZD","BMD","BOB","BAM","BWP","BGN","BRL","BND","KHR","CAD","KYD","CLP","CNY","COP","CRC","HRK","CUP","CZK","DKK","DOP","XCD","EGP","SVC","EEK","EUR","FKP","FJD","FRF","GHC","GIP","GTQ","GGP","GYD","HNL","HKD","HUF","ISK","INR","IDR","IRR","IMP","ILS","JMD","JPY","JEP","KZT","KGS","LAK","LVL","LBP","LRD","LTL","MKD","MYR","MUR","MXN","MNT","MZN","NAD","NPR","ANG","NZD","NIO","NGN","KPW","NOK","OMR","PKR","PAB","PYG","PEN","PHP","PLN","QAR","RON","RUR","SHP","SAR","RSD","SCR","SGD","SBD","SOS","ZAR","KRW","LKR","SEK","CHF","SRD","SYP","TWD","THB","TTD","TRY","TRL","TVD","UAH","GBP","USD","UYU","UZS","VEF","VND","YER","ZWD","getCurrencySymbol","currencyCode","colorLuminance","rawHex","lum","hex","String","rgb","c","substr","round","getGradient","degree","color","getColorByString","colors","sum","createPath","u","query","url","hashExist","includes","hash","urlPath","urlQuery","qs","stringify","parse","encode","parseQueryString","getNextPageURLFromLinkHeader","link","match","getNextPageFromLinkHeader","exec","makeParamString","encodeURIComponent","MimeTypes","extensions","getExtentensions","mimeImages","mimeFiles","mimeAudio","acceptFileTypes","acceptAllTypes","acceptImagesExtensions","acceptFilesExtensions","acceptAudioExtensions","acceptAllExtensions","wrapField","wrapper","wrapFormFields","formFieldsString","untouchables","parts","newFields","oldField","newPart","oldPart","matchesId","idToMatch","detectEnterKey","e","which","keyCode","makeOption","undefined","makeLoadOptionsFunc","func","defaultOptions","response","then","_objectSpread","Promise","resolve"],"mappings":"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"}