text:
<!DOCTYPE html>

    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />

    <title>Справочник API — документация apimoex 1.2.0</title>
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
    <link rel="stylesheet" type="text/css" href="_static/aiohttp.css" />

    <link rel="index" title="Алфавитный указатель" href="genindex.html" />
    <link rel="search" title="Поиск" href="search.html" />
    <link rel="next" title="Список изменений" href="change_log.html" />
    <link rel="prev" title="Начало работы" href="getting_started.html" />

<link rel="stylesheet" href="_static/custom.css" type="text/css" />

<link rel="canonical" href="https://wlm1ke.github.io/apimoexapi.html"/>

<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
<link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet">

Справочник API¶

Функции-запросы¶

Справочная информация¶

Функции из данного раздела носят вспомогательный характер и нужны для получения данных для построения остальных
запросов.

apimoex.get_reference(session: Session, placeholder: str = 'boards') → List[Dict[str, str | int | float]]¶

Получить перечень доступных значений плейсхолдера в адресе запроса.

Например в описание запроса https://iss.moex.com/iss/reference/32 присутствует следующий адрес
/iss/engines/[engine]/markets/[market]/boards/[board]/securities с плейсхолдерами engines, markets и boards.

Описание запроса - https://iss.moex.com/iss/reference/28

Параметры:

session – Сессия интернет соединения.

placeholder – Наименование плейсхолдера в адресе запроса: engines, markets, boards, boardgroups, durations, securitytypes,
securitygroups, securitycollections

Результат:

Список словарей, которые напрямую конвертируется в pandas.DataFrame.

apimoex.find_securities(session: Session, string: str, columns: Tuple[str, ...] | None = ('secid', 'regnumber')) → List[Dict[str, str | int | float]]¶

Найти инструменты по части Кода, Названию, ISIN, Идентификатору Эмитента, Номеру гос.регистрации.

Один из вариантов использования - по регистрационному номеру узнать предыдущие тикеры эмитента, и с помощью
нескольких запросов об истории котировок собрать длинную историю с использованием всех предыдущих тикеров.

Описание запроса - https://iss.moex.com/iss/reference/5

Параметры:

session – Сессия интернет соединения.

string – Часть Кода, Названия, ISIN, Идентификатора Эмитента, Номера гос.регистрации.

columns – Кортеж столбцов, которые нужно загрузить - по умолчанию тикер и номер государственно регистрации.
Если пустой или None, то загружаются все столбцы.

Результат:

Список словарей, которые напрямую конвертируется в pandas.DataFrame.

apimoex.find_security_description(session: Session, security: str, columns: Tuple[str, ...] | None = ('name', 'title', 'value')) → List[Dict[str, str | int | float]]¶

Получить спецификацию инструмента.

Один из вариантов использования - по тикеру узнать дату начала торгов.

Описание запроса - https://iss.moex.com/iss/reference/13

Параметры:

session – Сессия интернет соединения.

security – Тикер ценной бумаги.

columns – Кортеж столбцов, которые нужно загрузить - по умолчанию краткое название, длинное название на русском и значение
показателя.

Результат:

Список словарей, которые напрямую конвертируется в pandas.DataFrame.

apimoex.get_index_tickers(session: Session, index: str, date: str | None = None, columns: Tuple[str, ...] | None = ('ticker', 'from', 'till', 'tradingsession'), market: str = 'index', engine: str = 'stock')¶

Получить информацию по составу указанного индекса за указанную дату.

Описание запроса - https://iss.moex.com/iss/reference/148

Список индексов - https://iss.moex.com/iss/statistics/engines/stock/markets/index/analytics

Параметры:

session – Сессия интернет соединения.

index – Название индекса. Например, IMOEX.

date – Дата вида ГГГГ-ММ-ДД. Если указано, то будут показаны только активные инструменты, по которым тогда рассчитывалось значение индекса. Если в указанный день не было торгов, то вернёт пустой список! При отсутствии данные будут загружены с начала истории.

columns – Кортеж столбцов, которые нужно загрузить - по умолчанию режим торгов, дата торгов, цена закрытия и объем в
штуках и стоимости. Если пустой или None, то загружаются все столбцы.

market – Рынок - по умолчанию индексы.

engine – Движок - по умолчанию акции.

Результат:

Список словарей, которые напрямую конвертируется в pandas.DataFrame.

Исторические данные по свечкам¶

MOEX ISS формирует свечки в формате HLOCV, при этом используются следующие условные числовые коды:

1 - 1 минута

10 - 10 минут

60 - 1 час

24 - 1 день

7 - 1 неделя

31 - 1 месяц

4 - 1 квартал

Для разных свечек и инструментов доступна информация за разные интервалы дат, уточнить которые можно с помощью функции
get_market_candle_borders() или get_board_candle_borders(), а получить исторические значения свечек с помощью
get_market_candles() или get_board_candles(), используя числовой код размера свечки.

apimoex.get_market_candle_borders(session: Session, security: str, market: str = 'shares', engine: str = 'stock') → List[Dict[str, str | int | float]]¶

Получить таблицу интервалов доступных дат для свечей различного размера на рынке для всех режимов торгов.

Описание запроса - https://iss.moex.com/iss/reference/156

Параметры:

session – Сессия интернет соединения.

security – Тикер ценной бумаги.

market – Рынок - по умолчанию акции.

engine – Движок - по умолчанию акции.

Результат:

Список словарей, которые напрямую конвертируется в pandas.DataFrame.

apimoex.get_board_candle_borders(session: Session, security: str, board: str = 'TQBR', market: str = 'shares', engine: str = 'stock') → List[Dict[str, str | int | float]]¶

Получить таблицу интервалов доступных дат для свечей различного размера в указанном режиме торгов.

Описание запроса - https://iss.moex.com/iss/reference/48

Параметры:

session – Сессия интернет соединения.

security – Тикер ценной бумаги.

board – Режим торгов - по умолчанию основной режим торгов T+2.

market – Рынок - по умолчанию акции.

engine – Движок - по умолчанию акции.

Результат:

Список словарей, которые напрямую конвертируется в pandas.DataFrame.

apimoex.get_market_candles(session: Session, security: str, interval: int = 24, start: str | None = None, end: str | None = None, columns: Tuple[str, ...] | None = ('begin', 'open', 'close', 'high', 'low', 'value'), market: str = 'shares', engine: str = 'stock') → List[Dict[str, str | int | float]]¶

Получить свечи в формате HLOCV указанного инструмента на рынке для основного режима торгов за интервал дат.

Если торговля идет в нескольких основных режимах, то на один интервал времени может быть выдано несколько свечек -
по свечке на каждый режим. Предположительно такая ситуация может произойти для свечек длиннее 1 дня в периоды, когда
менялся режим торгов.

Описание запроса - https://iss.moex.com/iss/reference/155

Параметры:

session – Сессия интернет соединения.

security – Тикер ценной бумаги.

interval – Размер свечки - целое число 1 (1 минута), 10 (10 минут), 60 (1 час), 24 (1 день), 7 (1 неделя), 31 (1 месяц) или
4 (1 квартал). По умолчанию дневные данные.

start – Дата вида ГГГГ-ММ-ДД. При отсутствии данные будут загружены с начала истории.

end – Дата вида ГГГГ-ММ-ДД. При отсутствии данные будут загружены до конца истории. Для текущего дня будут
загружены не окончательные данные, если торги продолжаются.

columns – Кортеж столбцов, которые нужно загрузить - по умолчанию момент начала свечки и HLOCV. Если пустой или None, то
загружаются все столбцы.

market – Рынок - по умолчанию акции.

engine – Движок - по умолчанию акции.

Результат:

Список словарей, которые напрямую конвертируется в pandas.DataFrame.

apimoex.get_board_candles(session: Session, security: str, interval: int = 24, start: str | None = None, end: str | None = None, columns: Tuple[str, ...] | None = ('begin', 'open', 'close', 'high', 'low', 'value'), board: str = 'TQBR', market: str = 'shares', engine: str = 'stock') → List[Dict[str, str | int | float]]¶

Получить свечи в формате HLOCV указанного инструмента в указанном режиме торгов за интервал дат.

Описание запроса - https://iss.moex.com/iss/reference/46

Параметры:

session – Сессия интернет соединения.

security – Тикер ценной бумаги.

interval – Размер свечки - целое число 1 (1 минута), 10 (10 минут), 60 (1 час), 24 (1 день), 7 (1 неделя), 31 (1 месяц) или
4 (1 квартал). По умолчанию дневные данные.

start – Дата вида ГГГГ-ММ-ДД. При отсутствии данные будут загружены с начала истории.

end – Дата вида ГГГГ-ММ-ДД. При отсутствии данные будут загружены до конца истории. Для текущего дня будут
загружены не окончательные данные, если торги продолжаются.

columns – Кортеж столбцов, которые нужно загрузить - по умолчанию момент начала свечки и HLOCV. Если пустой или None, то
загружаются все столбцы.

board – Режим торгов - по умолчанию основной режим торгов T+2.

market – Рынок - по умолчанию акции.

engine – Движок - по умолчанию акции.

Результат:

Список словарей, которые напрямую конвертируется в pandas.DataFrame.

Исторические данные по дневным котировкам¶

В отличие от свечек, функции данного раздела предоставляют много вспомогательной информации и имеют более глубокую историю.
Функция get_board_dates() позволяет проверить для каких дат имеются исторические котировки.
Функция get_board_securities() позволяет получить данные о размере лотов и прочей информации по всем торгуемым бумагам в
конкретном режиме торгов. Функции get_market_history() и get_board_history() позволяют запросить исторические дневные
котировки с различной вспомогательной информацией для конкретной бумаги для всех режимов торгов рынка или для
конкретного режима торгов, соответственно.

apimoex.get_board_dates(session: Session, board: str = 'TQBR', market: str = 'shares', engine: str = 'stock') → List[Dict[str, str | int | float]]¶

Получить интервал дат, доступных в истории для рынка по заданному режиму торгов.

Описание запроса - https://iss.moex.com/iss/reference/26

Параметры:

session – Сессия интернет соединения.

board – Режим торгов - по умолчанию основной режим торгов T+2.

market – Рынок - по умолчанию акции.

engine – Движок - по умолчанию акции.

Результат:

Список из одного элемента - словаря с ключами „from“ и „till“.

apimoex.get_board_securities(session: Session, table: str = 'securities', columns: Tuple[str, ...] | None = ('SECID', 'REGNUMBER', 'LOTSIZE', 'SHORTNAME'), board: str = 'TQBR', market: str = 'shares', engine: str = 'stock') → List[Dict[str, str | int | float]]¶

Получить таблицу инструментов по режиму торгов со вспомогательной информацией.

Описание запроса - https://iss.moex.com/iss/reference/32

Параметры:

session – Сессия интернет соединения.

table – Таблица с данными, которую нужно вернуть: securities - справочник торгуемых ценных бумаг, marketdata -
данные с результатами торгов текущего дня.

columns – Кортеж столбцов, которые нужно загрузить - по умолчанию тикер, номер государственно регистрации,
размер лота и краткое название. Если пустой или None, то загружаются все столбцы.

board – Режим торгов - по умолчанию основной режим торгов T+2.

market – Рынок - по умолчанию акции.

engine – Движок - по умолчанию акции.

Результат:

Список словарей, которые напрямую конвертируется в pandas.DataFrame.

apimoex.get_market_history(session: Session, security: str, start: str | None = None, end: str | None = None, columns: Tuple[str, ...] | None = ('BOARDID', 'TRADEDATE', 'CLOSE', 'VOLUME', 'VALUE'), market: str = 'shares', engine: str = 'stock') → List[Dict[str, str | int | float]]¶

Получить историю по одной бумаге на рынке для всех режимов торгов за интервал дат.

На одну дату может приходиться несколько значений, если торги шли в нескольких режимах.

Описание запроса - https://iss.moex.com/iss/reference/63

Параметры:

session – Сессия интернет соединения.

security – Тикер ценной бумаги.

start – Дата вида ГГГГ-ММ-ДД. При отсутствии данные будут загружены с начала истории.

end – Дата вида ГГГГ-ММ-ДД. При отсутствии данные будут загружены до конца истории.

columns – Кортеж столбцов, которые нужно загрузить - по умолчанию режим торгов, дата торгов, цена закрытия и объем в
штуках и стоимости. Если пустой или None, то загружаются все столбцы.

market – Рынок - по умолчанию акции.

engine – Движок - по умолчанию акции.

Результат:

Список словарей, которые напрямую конвертируется в pandas.DataFrame.

apimoex.get_board_history(session: Session, security: str, start: str | None = None, end: str | None = None, columns: Tuple[str, ...] | None = ('BOARDID', 'TRADEDATE', 'CLOSE', 'VOLUME', 'VALUE'), board: str = 'TQBR', market: str = 'shares', engine: str = 'stock')¶

Получить историю торгов для указанной бумаги в указанном режиме торгов за указанный интервал дат.

Описание запроса - https://iss.moex.com/iss/reference/65

Параметры:

session – Сессия интернет соединения.

security – Тикер ценной бумаги.

start – Дата вида ГГГГ-ММ-ДД. При отсутствии данные будут загружены с начала истории.

end – Дата вида ГГГГ-ММ-ДД. При отсутствии данные будут загружены до конца истории.

columns – Кортеж столбцов, которые нужно загрузить - по умолчанию режим торгов, дата торгов, цена закрытия и объем в
штуках и стоимости. Если пустой или None, то загружаются все столбцы.

board – Режим торгов - по умолчанию основной режим торгов T+2.

market – Рынок - по умолчанию акции.

engine – Движок - по умолчанию акции.

Результат:

Список словарей, которые напрямую конвертируется в pandas.DataFrame.

Реализация произвольного запроса¶

Для осуществления запроса необходимо начать сессию соединений с MOEX ISS и передать клиенту корректный url и
дополнительные параметры:

Полный перечень возможных запросов к MOEX ISS

Официальное Руководство разработчика с дополнительной информацией

class apimoex.ISSClient(session: Session, url: str, query: dict | None = None)¶

Базовые классы: Iterable

Клиент для MOEX ISS.

Для работы клиента необходимо передать requests.Session.

Загружает данные для простых ответов с помощью метода get. Для ответов состоящих из нескольких блоков данных
поддерживается протокол итерируемого для отдельных блоков или метод get_all для их автоматического сбора.

get(start: int | None = None) → Dict[str, List[Dict[str, str | int | float]]]¶

Загрузка данных.

Параметры:

start – Номер элемента с которого нужно загрузить данные. Используется для дозагрузки данных, состоящих из
нескольких блоков. При отсутствии данные загружаются с начального элемента.

Результат:

Блок данных с отброшенной вспомогательной информацией - словарь, каждый ключ которого
соответствует одной из таблиц с данными. Таблицы являются списками словарей, которые напрямую конвертируются
в pandas.DataFrame.

get_all() → Dict[str, List[Dict[str, str | int | float]]]¶

Собирает все блоки данных для запросов, ответы на которые выдаются по частям отдельными блоками.

Результат:

Объединенные из всех блоков данные с отброшенной вспомогательной информацией - словарь, каждый ключ которого
соответствует одной из таблиц с данными. Таблицы являются списками словарей, которые напрямую конвертируются
в pandas.DataFrame.

apimoex

MOEX ISS API

Навигация

Начало работы

Установка

Пример использования реализованных запросов

Пример реализации запроса с помощью клиента

Справочник API

Функции-запросы

Справочная информация

Исторические данные по свечкам

Исторические данные по дневным котировкам

Реализация произвольного запроса

ISSClient

Список изменений

1.3.0 (2023-04-20)

1.2.0 (2020-02-03)

1.1.2 (2019-09-15)

1.1.1 (2019-09-13)

1.1.0 (2019-09-13)

1.0.2 (2019-09-12)

1.0.1 (2019-09-11)

1.0.0 (2019-09-11)

      ©2019, Mikhail Korotkov aka WLMike.

      |
      Powered by Sphinx 6.1.3

      |
      Page source


text:
/*
 * basic.css
 * ~~~~~~~~~
 *
 * Sphinx stylesheet -- basic theme.
 *
 * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
 * :license: BSD, see LICENSE for details.
 *
 */

/* -- main layout ----------------------------------------------------------- */

div.clearer {
    clear: both;
}

div.section::after {
    display: block;
    content: '';
    clear: left;
}

/* -- relbar ---------------------------------------------------------------- */

div.related {
    width: 100%;
    font-size: 90%;
}

div.related h3 {
    display: none;
}

div.related ul {
    margin: 0;
    padding: 0 0 0 10px;
    list-style: none;
}

div.related li {
    display: inline;
}

div.related li.right {
    float: right;
    margin-right: 5px;
}

/* -- sidebar --------------------------------------------------------------- */

div.sphinxsidebarwrapper {
    padding: 10px 5px 0 10px;
}

div.sphinxsidebar {
    float: left;
    width: 230px;
    margin-left: -100%;
    font-size: 90%;
    word-wrap: break-word;
    overflow-wrap : break-word;
}

div.sphinxsidebar ul {
    list-style: none;
}

div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
    margin-left: 20px;
    list-style: square;
}

div.sphinxsidebar ul ul {
    margin-top: 0;
    margin-bottom: 0;
}

div.sphinxsidebar form {
    margin-top: 10px;
}

div.sphinxsidebar input {
    border: 1px solid #98dbcc;
    font-family: sans-serif;
    font-size: 1em;
}

div.sphinxsidebar #searchbox form.search {
    overflow: hidden;
}

div.sphinxsidebar #searchbox input[type="text"] {
    float: left;
    width: 80%;
    padding: 0.25em;
    box-sizing: border-box;
}

div.sphinxsidebar #searchbox input[type="submit"] {
    float: left;
    width: 20%;
    border-left: none;
    padding: 0.25em;
    box-sizing: border-box;
}

img {
    border: 0;
    max-width: 100%;
}

/* -- search page ----------------------------------------------------------- */

ul.search {
    margin: 10px 0 0 20px;
    padding: 0;
}

ul.search li {
    padding: 5px 0 5px 20px;
    background-image: url(file.png);
    background-repeat: no-repeat;
    background-position: 0 7px;
}

ul.search li a {
    font-weight: bold;
}

ul.search li p.context {
    color: #888;
    margin: 2px 0 0 30px;
    text-align: left;
}

ul.keywordmatches li.goodmatch a {
    font-weight: bold;
}

/* -- index page ------------------------------------------------------------ */

table.contentstable {
    width: 90%;
    margin-left: auto;
    margin-right: auto;
}

table.contentstable p.biglink {
    line-height: 150%;
}

a.biglink {
    font-size: 1.3em;
}

span.linkdescr {
    font-style: italic;
    padding-top: 5px;
    font-size: 90%;
}

/* -- general index --------------------------------------------------------- */

table.indextable {
    width: 100%;
}

table.indextable td {
    text-align: left;
    vertical-align: top;
}

table.indextable ul {
    margin-top: 0;
    margin-bottom: 0;
    list-style-type: none;
}

table.indextable > tbody > tr > td > ul {
    padding-left: 0em;
}

table.indextable tr.pcap {
    height: 10px;
}

table.indextable tr.cap {
    margin-top: 10px;
    background-color: #f2f2f2;
}

img.toggler {
    margin-right: 3px;
    margin-top: 3px;
    cursor: pointer;
}

div.modindex-jumpbox {
    border-top: 1px solid #ddd;
    border-bottom: 1px solid #ddd;
    margin: 1em 0 1em 0;
    padding: 0.4em;
}

div.genindex-jumpbox {
    border-top: 1px solid #ddd;
    border-bottom: 1px solid #ddd;
    margin: 1em 0 1em 0;
    padding: 0.4em;
}

/* -- domain module index --------------------------------------------------- */

table.modindextable td {
    padding: 2px;
    border-collapse: collapse;
}

/* -- general body styles --------------------------------------------------- */

div.body {
    min-width: 360px;
    max-width: 800px;
}

div.body p, div.body dd, div.body li, div.body blockquote {
    -moz-hyphens: auto;
    -ms-hyphens: auto;
    -webkit-hyphens: auto;
    hyphens: auto;
}

a.headerlink {
    visibility: hidden;
}

h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
    visibility: visible;
}

div.body p.caption {
    text-align: inherit;
}

div.body td {
    text-align: left;
}

.first {
    margin-top: 0 !important;
}

p.rubric {
    margin-top: 30px;
    font-weight: bold;
}

img.align-left, figure.align-left, .figure.align-left, object.align-left {
    clear: left;
    float: left;
    margin-right: 1em;
}

img.align-right, figure.align-right, .figure.align-right, object.align-right {
    clear: right;
    float: right;
    margin-left: 1em;
}

img.align-center, figure.align-center, .figure.align-center, object.align-center {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

img.align-default, figure.align-default, .figure.align-default {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

.align-left {
    text-align: left;
}

.align-center {
    text-align: center;
}

.align-default {
    text-align: center;
}

.align-right {
    text-align: right;
}

/* -- sidebars -------------------------------------------------------------- */

div.sidebar,
aside.sidebar {
    margin: 0 0 0.5em 1em;
    border: 1px solid #ddb;
    padding: 7px;
    background-color: #ffe;
    width: 40%;
    float: right;
    clear: right;
    overflow-x: auto;
}

p.sidebar-title {
    font-weight: bold;
}

nav.contents,
aside.topic,
div.admonition, div.topic, blockquote {
    clear: left;
}

/* -- topics ---------------------------------------------------------------- */

nav.contents,
aside.topic,
div.topic {
    border: 1px solid #ccc;
    padding: 7px;
    margin: 10px 0 10px 0;
}

p.topic-title {
    font-size: 1.1em;
    font-weight: bold;
    margin-top: 10px;
}

/* -- admonitions ----------------------------------------------------------- */

div.admonition {
    margin-top: 10px;
    margin-bottom: 10px;
    padding: 7px;
}

div.admonition dt {
    font-weight: bold;
}

p.admonition-title {
    margin: 0px 10px 5px 0px;
    font-weight: bold;
}

div.body p.centered {
    text-align: center;
    margin-top: 25px;
}

/* -- content of sidebars/topics/admonitions -------------------------------- */

div.sidebar > :last-child,
aside.sidebar > :last-child,
nav.contents > :last-child,
aside.topic > :last-child,
div.topic > :last-child,
div.admonition > :last-child {
    margin-bottom: 0;
}

div.sidebar::after,
aside.sidebar::after,
nav.contents::after,
aside.topic::after,
div.topic::after,
div.admonition::after,
blockquote::after {
    display: block;
    content: '';
    clear: both;
}

/* -- tables ---------------------------------------------------------------- */

table.docutils {
    margin-top: 10px;
    margin-bottom: 10px;
    border: 0;
    border-collapse: collapse;
}

table.align-center {
    margin-left: auto;
    margin-right: auto;
}

table.align-default {
    margin-left: auto;
    margin-right: auto;
}

table caption span.caption-number {
    font-style: italic;
}

table caption span.caption-text {
}

table.docutils td, table.docutils th {
    padding: 1px 8px 1px 5px;
    border-top: 0;
    border-left: 0;
    border-right: 0;
    border-bottom: 1px solid #aaa;
}

th {
    text-align: left;
    padding-right: 5px;
}

table.citation {
    border-left: solid 1px gray;
    margin-left: 1px;
}

table.citation td {
    border-bottom: none;
}

th > :first-child,
td > :first-child {
    margin-top: 0px;
}

th > :last-child,
td > :last-child {
    margin-bottom: 0px;
}

/* -- figures --------------------------------------------------------------- */

div.figure, figure {
    margin: 0.5em;
    padding: 0.5em;
}

div.figure p.caption, figcaption {
    padding: 0.3em;
}

div.figure p.caption span.caption-number,
figcaption span.caption-number {
    font-style: italic;
}

div.figure p.caption span.caption-text,
figcaption span.caption-text {
}

/* -- field list styles ----------------------------------------------------- */

table.field-list td, table.field-list th {
    border: 0 !important;
}

.field-list ul {
    margin: 0;
    padding-left: 1em;
}

.field-list p {
    margin: 0;
}

.field-name {
    -moz-hyphens: manual;
    -ms-hyphens: manual;
    -webkit-hyphens: manual;
    hyphens: manual;
}

/* -- hlist styles ---------------------------------------------------------- */

table.hlist {
    margin: 1em 0;
}

table.hlist td {
    vertical-align: top;
}

/* -- object description styles --------------------------------------------- */

.sig {
	font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
}

.sig-name, code.descname {
    background-color: transparent;
    font-weight: bold;
}

.sig-name {
	font-size: 1.1em;
}

code.descname {
    font-size: 1.2em;
}

.sig-prename, code.descclassname {
    background-color: transparent;
}

.optional {
    font-size: 1.3em;
}

.sig-paren {
    font-size: larger;
}

.sig-param.n {
	font-style: italic;
}

/* C++ specific styling */

.sig-inline.c-texpr,
.sig-inline.cpp-texpr {
	font-family: unset;
}

.sig.c   .k, .sig.c   .kt,
.sig.cpp .k, .sig.cpp .kt {
	color: #0033B3;
}

.sig.c   .m,
.sig.cpp .m {
	color: #1750EB;
}

.sig.c   .s, .sig.c   .sc,
.sig.cpp .s, .sig.cpp .sc {
	color: #067D17;
}

/* -- other body styles ----------------------------------------------------- */

ol.arabic {
    list-style: decimal;
}

ol.loweralpha {
    list-style: lower-alpha;
}

ol.upperalpha {
    list-style: upper-alpha;
}

ol.lowerroman {
    list-style: lower-roman;
}

ol.upperroman {
    list-style: upper-roman;
}

:not(li) > ol > li:first-child > :first-child,
:not(li) > ul > li:first-child > :first-child {
    margin-top: 0px;
}

:not(li) > ol > li:last-child > :last-child,
:not(li) > ul > li:last-child > :last-child {
    margin-bottom: 0px;
}

ol.simple ol p,
ol.simple ul p,
ul.simple ol p,
ul.simple ul p {
    margin-top: 0;
}

ol.simple > li:not(:first-child) > p,
ul.simple > li:not(:first-child) > p {
    margin-top: 0;
}

ol.simple p,
ul.simple p {
    margin-bottom: 0;
}

aside.footnote > span,
div.citation > span {
    float: left;
}
aside.footnote > span:last-of-type,
div.citation > span:last-of-type {
  padding-right: 0.5em;
}
aside.footnote > p {
  margin-left: 2em;
}
div.citation > p {
  margin-left: 4em;
}
aside.footnote > p:last-of-type,
div.citation > p:last-of-type {
    margin-bottom: 0em;
}
aside.footnote > p:last-of-type:after,
div.citation > p:last-of-type:after {
    content: "";
    clear: both;
}

dl.field-list {
    display: grid;
    grid-template-columns: fit-content(30%) auto;
}

dl.field-list > dt {
    font-weight: bold;
    word-break: break-word;
    padding-left: 0.5em;
    padding-right: 5px;
}

dl.field-list > dd {
    padding-left: 0.5em;
    margin-top: 0em;
    margin-left: 0em;
    margin-bottom: 0em;
}

dl {
    margin-bottom: 15px;
}

dd > :first-child {
    margin-top: 0px;
}

dd ul, dd table {
    margin-bottom: 10px;
}

dd {
    margin-top: 3px;
    margin-bottom: 10px;
    margin-left: 30px;
}

dl > dd:last-child,
dl > dd:last-child > :last-child {
    margin-bottom: 0;
}

dt:target, span.highlighted {
    background-color: #fbe54e;
}

rect.highlighted {
    fill: #fbe54e;
}

dl.glossary dt {
    font-weight: bold;
    font-size: 1.1em;
}

.versionmodified {
    font-style: italic;
}

.system-message {
    background-color: #fda;
    padding: 5px;
    border: 3px solid red;
}

.footnote:target  {
    background-color: #ffa;
}

.line-block {
    display: block;
    margin-top: 1em;
    margin-bottom: 1em;
}

.line-block .line-block {
    margin-top: 0;
    margin-bottom: 0;
    margin-left: 1.5em;
}

.guilabel, .menuselection {
    font-family: sans-serif;
}

.accelerator {
    text-decoration: underline;
}

.classifier {
    font-style: oblique;
}

.classifier:before {
    font-style: normal;
    margin: 0 0.5em;
    content: ":";
    display: inline-block;
}

abbr, acronym {
    border-bottom: dotted 1px;
    cursor: help;
}

/* -- code displays --------------------------------------------------------- */

pre {
    overflow: auto;
    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
}

pre, div[class*="highlight-"] {
    clear: both;
}

span.pre {
    -moz-hyphens: none;
    -ms-hyphens: none;
    -webkit-hyphens: none;
    hyphens: none;
    white-space: nowrap;
}

div[class*="highlight-"] {
    margin: 1em 0;
}

td.linenos pre {
    border: 0;
    background-color: transparent;
    color: #aaa;
}

table.highlighttable {
    display: block;
}

table.highlighttable tbody {
    display: block;
}

table.highlighttable tr {
    display: flex;
}

table.highlighttable td {
    margin: 0;
    padding: 0;
}

table.highlighttable td.linenos {
    padding-right: 0.5em;
}

table.highlighttable td.code {
    flex: 1;
    overflow: hidden;
}

.highlight .hll {
    display: block;
}

div.highlight pre,
table.highlighttable pre {
    margin: 0;
}

div.code-block-caption + div {
    margin-top: 0;
}

div.code-block-caption {
    margin-top: 1em;
    padding: 2px 5px;
    font-size: small;
}

div.code-block-caption code {
    background-color: transparent;
}

table.highlighttable td.linenos,
span.linenos,
div.highlight span.gp {  /* gp: Generic.Prompt */
  user-select: none;
  -webkit-user-select: text; /* Safari fallback only */
  -webkit-user-select: none; /* Chrome/Safari */
  -moz-user-select: none; /* Firefox */
  -ms-user-select: none; /* IE10+ */
}

div.code-block-caption span.caption-number {
    padding: 0.1em 0.3em;
    font-style: italic;
}

div.code-block-caption span.caption-text {
}

div.literal-block-wrapper {
    margin: 1em 0;
}

code.xref, a code {
    background-color: transparent;
    font-weight: bold;
}

h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
    background-color: transparent;
}

.viewcode-link {
    float: right;
}

.viewcode-back {
    float: right;
    font-family: sans-serif;
}

div.viewcode-block:target {
    margin: -1px -10px;
    padding: 0 10px;
}

/* -- math display ---------------------------------------------------------- */

img.math {
    vertical-align: middle;
}

div.body div.math p {
    text-align: center;
}

span.eqno {
    float: right;
}

span.eqno a.headerlink {
    position: absolute;
    z-index: 1;
}

div.math:hover a.headerlink {
    visibility: visible;
}

/* -- printout stylesheet --------------------------------------------------- */

@media print {
    div.document,
    div.documentwrapper,
    div.bodywrapper {
        margin: 0 !important;
        width: 100%;
    }

    div.sphinxsidebar,
    div.related,
    div.footer,
    #top-link {
        display: none;
    }
}

repo_language: Python

mime_type: text/plain


text:
/**@constructor*/
BaseStemmer = function() {
    this.setCurrent = function(value) {
        this.current = value;
        this.cursor = 0;
        this.limit = this.current.length;
        this.limit_backward = 0;
        this.bra = this.cursor;
        this.ket = this.limit;
    };

    this.getCurrent = function() {
        return this.current;
    };

    this.copy_from = function(other) {
        this.current          = other.current;
        this.cursor           = other.cursor;
        this.limit            = other.limit;
        this.limit_backward   = other.limit_backward;
        this.bra              = other.bra;
        this.ket              = other.ket;
    };

    this.in_grouping = function(s, min, max) {
        if (this.cursor >= this.limit) return false;
        var ch = this.current.charCodeAt(this.cursor);
        if (ch > max || ch < min) return false;
        ch -= min;
        if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
        this.cursor++;
        return true;
    };

    this.in_grouping_b = function(s, min, max) {
        if (this.cursor <= this.limit_backward) return false;
        var ch = this.current.charCodeAt(this.cursor - 1);
        if (ch > max || ch < min) return false;
        ch -= min;
        if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
        this.cursor--;
        return true;
    };

    this.out_grouping = function(s, min, max) {
        if (this.cursor >= this.limit) return false;
        var ch = this.current.charCodeAt(this.cursor);
        if (ch > max || ch < min) {
            this.cursor++;
            return true;
        }
        ch -= min;
        if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) == 0) {
            this.cursor++;
            return true;
        }
        return false;
    };

    this.out_grouping_b = function(s, min, max) {
        if (this.cursor <= this.limit_backward) return false;
        var ch = this.current.charCodeAt(this.cursor - 1);
        if (ch > max || ch < min) {
            this.cursor--;
            return true;
        }
        ch -= min;
        if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) {
            this.cursor--;
            return true;
        }
        return false;
    };

    this.eq_s = function(s)
    {
        if (this.limit - this.cursor < s.length) return false;
        if (this.current.slice(this.cursor, this.cursor + s.length) != s)
        {
            return false;
        }
        this.cursor += s.length;
        return true;
    };

    this.eq_s_b = function(s)
    {
        if (this.cursor - this.limit_backward < s.length) return false;
        if (this.current.slice(this.cursor - s.length, this.cursor) != s)
        {
            return false;
        }
        this.cursor -= s.length;
        return true;
    };

    /** @return {number} */ this.find_among = function(v)
    {
        var i = 0;
        var j = v.length;

        var c = this.cursor;
        var l = this.limit;

        var common_i = 0;
        var common_j = 0;

        var first_key_inspected = false;

        while (true)
        {
            var k = i + ((j - i) >>> 1);
            var diff = 0;
            var common = common_i < common_j ? common_i : common_j; // smaller
            // w[0]: string, w[1]: substring_i, w[2]: result, w[3]: function (optional)
            var w = v[k];
            var i2;
            for (i2 = common; i2 < w[0].length; i2++)
            {
                if (c + common == l)
                {
                    diff = -1;
                    break;
                }
                diff = this.current.charCodeAt(c + common) - w[0].charCodeAt(i2);
                if (diff != 0) break;
                common++;
            }
            if (diff < 0)
            {
                j = k;
                common_j = common;
            }
            else
            {
                i = k;
                common_i = common;
            }
            if (j - i <= 1)
            {
                if (i > 0) break; // v->s has been inspected
                if (j == i) break; // only one item in v

                // - but now we need to go round once more to get
                // v->s inspected. This looks messy, but is actually
                // the optimal approach.

                if (first_key_inspected) break;
                first_key_inspected = true;
            }
        }
        do {
            var w = v[i];
            if (common_i >= w[0].length)
            {
                this.cursor = c + w[0].length;
                if (w.length < 4) return w[2];
                var res = w[3](this);
                this.cursor = c + w[0].length;
                if (res) return w[2];
            }
            i = w[1];
        } while (i >= 0);
        return 0;
    };

    // find_among_b is for backwards processing. Same comments apply
    this.find_among_b = function(v)
    {
        var i = 0;
        var j = v.length

        var c = this.cursor;
        var lb = this.limit_backward;

        var common_i = 0;
        var common_j = 0;

        var first_key_inspected = false;

        while (true)
        {
            var k = i + ((j - i) >> 1);
            var diff = 0;
            var common = common_i < common_j ? common_i : common_j;
            var w = v[k];
            var i2;
            for (i2 = w[0].length - 1 - common; i2 >= 0; i2--)
            {
                if (c - common == lb)
                {
                    diff = -1;
                    break;
                }
                diff = this.current.charCodeAt(c - 1 - common) - w[0].charCodeAt(i2);
                if (diff != 0) break;
                common++;
            }
            if (diff < 0)
            {
                j = k;
                common_j = common;
            }
            else
            {
                i = k;
                common_i = common;
            }
            if (j - i <= 1)
            {
                if (i > 0) break;
                if (j == i) break;
                if (first_key_inspected) break;
                first_key_inspected = true;
            }
        }
        do {
            var w = v[i];
            if (common_i >= w[0].length)
            {
                this.cursor = c - w[0].length;
                if (w.length < 4) return w[2];
                var res = w[3](this);
                this.cursor = c - w[0].length;
                if (res) return w[2];
            }
            i = w[1];
        } while (i >= 0);
        return 0;
    };

    /* to replace chars between c_bra and c_ket in this.current by the
     * chars in s.
     */
    this.replace_s = function(c_bra, c_ket, s)
    {
        var adjustment = s.length - (c_ket - c_bra);
        this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket);
        this.limit += adjustment;
        if (this.cursor >= c_ket) this.cursor += adjustment;
        else if (this.cursor > c_bra) this.cursor = c_bra;
        return adjustment;
    };

    this.slice_check = function()
    {
        if (this.bra < 0 ||
            this.bra > this.ket ||
            this.ket > this.limit ||
            this.limit > this.current.length)
        {
            return false;
        }
        return true;
    };

    this.slice_from = function(s)
    {
        var result = false;
        if (this.slice_check())
        {
            this.replace_s(this.bra, this.ket, s);
            result = true;
        }
        return result;
    };

    this.slice_del = function()
    {
        return this.slice_from("");
    };

    this.insert = function(c_bra, c_ket, s)
    {
        var adjustment = this.replace_s(c_bra, c_ket, s);
        if (c_bra <= this.bra) this.bra += adjustment;
        if (c_bra <= this.ket) this.ket += adjustment;
    };

    this.slice_to = function()
    {
        var result = '';
        if (this.slice_check())
        {
            result = this.current.slice(this.bra, this.ket);
        }
        return result;
    };

    this.assign_to = function()
    {
        return this.current.slice(0, this.limit);
    };
};


text:
var DOCUMENTATION_OPTIONS = {
    URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
    VERSION: '1.2.0',
    LANGUAGE: 'ru',
    COLLAPSE_INDEX: false,
    BUILDER: 'html',
    FILE_SUFFIX: '.html',
    LINK_SUFFIX: '.html',
    HAS_SOURCE: true,
    SOURCELINK_SUFFIX: '.txt',
    NAVIGATION_WITH_KEYS: false,
    SHOW_SEARCH_SUMMARY: true,
    ENABLE_SEARCH_SHORTCUTS: true,
};