Как стать автором
Обновить

Комментарии 54

Ну… Во-первых, т.к. формат бинарный, область применения у него несколько отличается от области применения json.
Во-вторых, есть же уже CBOR (про него даже была статья на хабре), вдохновлённый этим самым msgpack'ом, но расширяемый, поддерживающий массивы неопределённой длины и вообще, более приятный.
Думаю, что это как с линуксом, есть много дистрибутивов и каждому по душе что-то свое.
Насчет CBOR, отлично что написали — посмотрю, не знал раннее, но как вы заметили оба формата решают одну задачу.
Разные. JSON ещё и человекочитаемый.
Под задачей понималось сериализация и десериализация сообщений. В этом аспекте никто не говорил о том, что JSON плохой формат или что-то ещё. У нас используется MsgPack именно для упаковки и передачи сообщения от сервиса к сервису. Раньше был обычный JSON, сменив его на MsgPack мы получили экономию по трафику, что является бесспорным плюсом о чем я и поведал в данном посте.
Насколько я смотрел тесты в jsperf: JSON быстрее, чем msgpack. Но насчет экономии трафика полностью поддерживаю. Впрочем возможно это лишь такая реализация на js и вызвана его болячками.
вы же в курсе надеюсь что JSON.parse реализован не на javascript? Для обмена сообщениями очень даже неплохой вариант.
Конечно. Одна из самых часто используемых операций, написанная на С, поэтому и неплохо оптимизированная. Но в заголовке же:
MessagePack аналог JSON, но быстрее и меньше
Предположим у вас есть сервер на node.js. В этом случае сериализация будет происходить быстрее с использованием JSON. А теперь представим на секунду, что у нас очередь сообщений и воркеры, реализованные на… скажем… golang. И тут уже выигрыш будет на стороне MessagePack. А теперь представим что у нас есть возможность подключить имплементацию на Си в обе части вашего приложения и тогда и в случае с node.js все будет работать быстрее чем JSON.

Сам формат больше подходит для быстрой сериализации/десериализаци что делает его более подходящим для организации обмена данными внутри распределенного приложения.

Но да, я бы не стал использовать этот или какой-либо другой формат сериализации данных в контексте REST Api. Там пусть уж лучше будут старые добрые JSON или XML.
Насколько я понимаю ссылка на бенчмарки использует не совсем официальную библиотеку для javascript'а.
Могу ошибаться, конечно, но на сайте разработчика msgpack.org явно указано, что js порт работает только из под nodejs:

In the Browser

This library is compatible with Browserify.

If you want to use standalone, grab the file in the dist folder of this repo, and use in your own HTML page, the module will expose a msgpack5 global.

<script type="text/javascript"
        src="./msgpack5.min.js">
</script>

В вашем же примере используется форк 3х годичной давности github.com/creationix/msgpack-js-browser
Поэтому вполне возможно, что ситуация с javascript'ом также улучшилась.
НЛО прилетело и опубликовало эту надпись здесь
deflate, bzip
НЛО прилетело и опубликовало эту надпись здесь
Вне браузера MsgPack быстрее по-всем параметрам. Если нет задачи поддерживать браузер то обмен сообщениями (допустим два сервера) можно спокойно на MsgPack делать с использованием допустим MsgPack-RPC. Причем вам никто не мешает поддерживать два формата, поскольку они совместимы клиент можнт указывать, что он хочет получить. И получается клиент для вашего api на ruby будет использовать msgpack, а браузеры json.

Правда если это обмен между двумя серверами то стоит обратить внимание на ProtoBuf и Thrift.
Библиотека полностью совместима с JSON

Что это значит?
В плане стандартов сериализации, что все что у вас сериализировалось в json будет спокойно сериализироваться в бинарное представление за исключением указанных ограничений.
Наверно стоит уточнить, что под «стандартами сериализации» речь шла о структурах данных (массивы, объекты, встроенные типы и т.д.), которые можно сериализировать, т.к. похоже предыдущим комментом меня не поняли.
Действительно, и шарп поддерживается. Правда не хочется писать протофайлы, а просто сериализовать объекты как обычно
Спасибо за ссылку. Интересная штука. Хотя скорости протобафа вполне хватает.

PS: Оказывается автор Cap'n Proto — это автор протобафа (то, что вышло в public).
Мы тоже используем msgpack в работе. Очень нравится их подход к десериализации объектов в C++ и компактное представление сериализованных данных.
Посмотрел, опечалился.

В общем, взял CBOR, MessagePack, JSON и Pickle

Взял офигенно здоровый объект который передается у меня в приложении.
Пример объекта:

Тот самый объект эскперимента
{«collection»: [{«message»: {«result»: {«data»: {«32»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 64063, «d»: 0}}, «33»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 66063, «d»: 0}}, «34»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 68063, «d»: 0}}, «35»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 70063, «d»: 0}}, «36»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 72063, «d»: 0}}, «37»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 5, «pi»: 74037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 74063, «d»: 0}}, «38»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 76063, «d»: 0}}, «39»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 1, «pi»: 78039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 78063, «d»: 0}}, «40»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 80063, «d»: 0}}, «41»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 82063, «d»: 0}}, «42»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 84063, «d»: 0}}, «43»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 86063, «d»: 0}}, «44»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 88063, «d»: 0}}, «45»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 90063, «d»: 0}}, «46»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 92063, «d»: 0}}, «47»: {«16»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94016, «d»: 0}, «17»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94017, «d»: 0}, «18»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94018, «d»: 0}, «19»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94019, «d»: 0}, «20»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94020, «d»: 0}, «21»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94021, «d»: 0}, «22»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94022, «d»: 0}, «23»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94023, «d»: 0}, «24»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94024, «d»: 0}, «25»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94025, «d»: 0}, «26»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94026, «d»: 0}, «27»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94027, «d»: 0}, «28»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94028, «d»: 0}, «29»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94029, «d»: 0}, «30»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94030, «d»: 0}, «31»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94031, «d»: 0}, «32»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94032, «d»: 0}, «33»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94033, «d»: 0}, «34»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94034, «d»: 0}, «35»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94035, «d»: 0}, «36»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94036, «d»: 0}, «37»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94037, «d»: 0}, «38»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94038, «d»: 0}, «39»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94039, «d»: 0}, «40»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94040, «d»: 0}, «41»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94041, «d»: 0}, «42»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94042, «d»: 0}, «43»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94043, «d»: 0}, «44»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94044, «d»: 0}, «45»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94045, «d»: 0}, «46»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94046, «d»: 0}, «47»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94047, «d»: 0}, «48»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94048, «d»: 0}, «49»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94049, «d»: 0}, «50»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94050, «d»: 0}, «51»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94051, «d»: 0}, «52»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94052, «d»: 0}, «53»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94053, «d»: 0}, «54»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94054, «d»: 0}, «55»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94055, «d»: 0}, «56»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94056, «d»: 0}, «57»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94057, «d»: 0}, «58»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94058, «d»: 0}, «59»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94059, «d»: 0}, «60»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94060, «d»: 0}, «61»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94061, «d»: 0}, «62»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94062, «d»: 0}, «63»: {«l»: 1, «lt»: 1, «b»: 0, «pi»: 94063, «d»: 0}}}}, «done»: True}, «module»: "/map/load_chunks", «async»: 0.8028739863075316}]}


И скормил его всем упаковщикам. Пикл в этом списке лишь из-за того что сервер на пайтоне.

На выходе я получил такие цифры упаковки
Size test
19266 cbor
19284 msgpack
41726 json
25363 pickle

Ну, круто. Действительно качественная упаковка, жаль только под CBOR в пайтон версии нету stringref, былоб еще мельче.
А что со скоростью упаковки и распаковки?

Этот самый объект скушал 100 раз в цикле каждому упаковщику.
4.65940260887146 cbor
4.218739032745361 msgpack
0.2644484043121338 json
0.057727813720703125 pickle

4.5 секунды, как-то много всего для 100 разовой упаковки.
msgpack идет вместе с С++ кодом, а не упаковывается чисто на пайтоне, но все равно 4.2 секунды — слишком много
json показал нормальный результат, а вот пикл невероятно порадовал.

Упаковка пол беды, что с распаковкой?

4.128425598144531 cbor
7.117578029632568 msgpack
0.19976019859313965 json
0.08250904083251953 pickle

Хммм, CBOR показал такие-же как и при упаковке, а вот message pack подкачала.
JSON в пределах нормы, пикл снова радует.

Может эти упаковщики будут хорошо работать на С/С++ коде, но явно не в пайтоне.
К сожалению, я не очень знаком с python'ом, но насколько я понимаю сейчас существует 2 реализации самой библиотеки для данного языка. Здесь есть немного устаревшие графики сравнения производительности за апрель 2014 wtanaka.com/node/8100 с библиотекой msgpack-python. В ней автор статьи утверждает, что как раз наоборот по тестам упаковки/распаковки она получается быстрее json'а за исключением упаковки словаря.

Также, если я правильно понимаю, разработчик который в данный момент поддерживает форк для пайтона и на библиотеку которого я ссылаюсь в статье u-msgpack-python утверждает:
github.com/vsergeev/u-msgpack-python/issues/4

msgpack-python should be faster when used with its native library backend (it only falls back to pure Python when the library is unavailable). msgpack-python also supports a streaming unpacking mode and finer control over the unpacking process if you need them.

I'm not sure why msgpack-python is not listed on there — it always used to be. I think the author took it down temporarily to implement msgpack 2.0, but I would expect it to have been back up by now.

Думаю, можно попробовать тест с msgpack-python и получить совершенно другие цифры из-за её специфики реализации. Всего лишь предположение.
Также разработчику u-msgpack-python можно сообщить о ваших наблюдениях через тикет на гитхабе github.com/vsergeev/u-msgpack-python/issues

Думаю указав на это можно будет получить соответствующий патч, либо прояснить причину столь существенной просадки производительности по вашим тестам.
Немного добавки.
Хоть пикл и показал крутые результаты скорости, но у него есть язвимость при которой можно исполнить произвольный python код.

Но вот я решил поиграться с json и добавить к нему zlib.

Результат поразил:
Длинна json+zlib 2969 байт. Да, это в 7 раз компактней чем CBOR.
Скорость упаковки: 0.33598756790161133, это всего в 1.6 раза медленнее чем обычный просто json
Скорость распаковки: 0.21756720542907715 менее чем в 1.1

Я в шоке немного. Так что если у вас Пайтон сервер и клиент на JSе, то можете смело использовать json+zlib в вебсокетах, потому что их браузер не жмет.
В общем JSON + ZIP будет в разы компактнее и в разы медленнее, чем CBOR.

Это очевидно, и тесты это подтверждают.

У вас, наверное, специфические данные или не Си реализация CBOR.
CBOR точно не C реализация и С реализацию я не нашел под пайтон.
MessagePack — с С реализацией но по тестам тупит.

JSON+ZIP потери скорости не замечены, а вот объем данных стал куда меньше, даже чем у CBOR и MessagePack, немного поигрался и нашел что упаковка c уровнем компресии 5 сокращает объем до 2558 байт против распаковых 41кб.

Я уже даже не знаю что важнее, освободить сокет в 16 раз или потерять 10-30% скорости на упаковке распаковке сообщения но каждой из нод сервера. Пожалуй я выберу json+zip, а точнее я уже реализовал ее.

Немного кратко, пишу игру, данные которые я предоставил — это выгрузка карты для пользователя. Огромный кусок где-то на 2500+ ячеек (в зависимости от разрешения монитора). Данная связка тратит мало процессорного времени, но передача 40кб или даже 20кб для пользователей с туповатым инетом немного напряжна.

А теперь о потерях производительности. У меня есть балансировщик который держит коннекты и помнит залогиненых юзеров, все запросы он передает на бекенд ноды. Бекенд ноды принимают запрос, делают выборки и отправляют инфу обратно на балансировщик с указанием юзера. Т.к. балансировщик и бекенд тоже общаются, включая эти-же запросы, то балансировщику куда проще принять 2.5кб чем 40кб или 20кб. Упаковки данных в zip происходит на нодах, а значит узкое место — балансровщик и он не теряет в производительности.

В итоге это решение мне позволило произвести сетевые оптимизация внутри сети, и уменьшить отклик для пользователей за счет снижения кол-ва данных. То что упаковка и распаковка сообщений стала на 10-30% дольше — абсолютно не важно, потому что это может быть 1/5000 всего времени затраченного на обработку запроса.

Но я не говорю что это хорошее решения для общейния сервер<->сервер, только для клиент<->сервер.
Для связи сервер-сервер я буду использовать pickle (если сервера в локальной сети), если нет искать другую шуструю альтернативу.
Ясно, что zip будет жать тексты гораздо лучше, чем CBOR.

Грузить бэкенд дополнительной архивацией не надо, если это принципиально важно — лучше настроить сжатие ответа на nginx или что там у вас. Так что лучше будет оставить только JSON, а упаковку трафика высенси на фронтэнд.

А разве на траффик вебсокета нджинкс как-то повлияет?

нет, но тут речь вроде не о вебсокете была
Си CBOR быстрее JSON+ZIP в ~5 раз и лидирует по компактности упакованных данных, обгоняя JSON и MessagePack.
json из коробки крайне медленный. Лучше использовать ujson или на крайняк simplejson.
Я про это вот тут habrahabr.ru/post/228707/ писал.
ЗЫ про размер не ascii то же там писал. :)
Protobuf немного в другом ключе, там требуется явное описание структуры ваших данных, которые вы передаете от сервиса к сервису. Кроме того каждый тип вашего сообщения будет требовать отдельные .proto файлы, дабы всем этим управлять.
То есть фактически Protobuf «за занавесом» эмулирует полную передачу объекта и его восстановления в случае, если это возможно. Очень актуально в контексте передачи классов между C и Java, например, чтобы быть точно уверенным, что по обе стороны будет все ок. Кроме того, актуальность .proto файлов, естественно ложится на плечи разработчика. Тут, как говорится, дело вкуса. Если вам по вкусу жесткая типизация каждого сообщения в вашей системе — тогда да, бесспорно Protobuf является отличным выбором. Если вам по вкусу слабая типизации и возможность добавить новое поле в состав сообщения «на лету», как с JSON'ом, — тогда выбор будет в пользу MsgPack или его аналогов, как приводили примеры выше.
Т.е. выбор чисто удобства описания сообщений, вот так все просто?
А ничего что protobuf может в разы (в зависимости от сообщения) меньше трафика есть и так же в разы быстрее?
Я уже не говорю, что статическая типизация сильно уменьшает количество попоболи при разработке.
Ибо за «возможность добавить новое поле в состав сообщения «на лету», как с JSON'ом» очень часто хочется ломать руки разработчикам, ибо повально злоупотребляют такими возможностями…
Без цифр, фразы «в разы», ничем не подкрепляются.
Если вам удобно поддерживать protobuf, никто же вам не навязывает, что-либо другое :)

очень часто хочется ломать руки разработчикам

Хочется, если это делать бездумно. Если нам в какой-то момент времени Х потребовалось прямо сейчас получить специфическую отладочную информацию от сервиса — это бывает крайне удобно в условиях продакшна. И я не говорю, что это правильно или ещё чего, это действительно просто удобно. Разработчики часто балансируют вокруг данного слова выбирая, например, какие-либо фреймворки.
А что там подкреплять-то?
Это же не многомесячные исследования. Банально все проверяется в реале.

Хотя бы такой простой момент. Msgpack при сериализации передает названия полей в сообщении. Protobuf это не требуется. Так как протокол предкомпилируется. В итоге чем больше передаваемый объект и чем более человекочитаемы названия полей у объекта, тем больший выигрыш дает Protobuf.

Пример с сайта Msgpack будет выглядеть примерно так:
JSON: {«compact»:true, «schema»:0} — 27 bytes
Msgpack: 82 A7 compact C3 A6 schema 00 — 18 bytes
Protobuf: 82 P1 C3 P2 00 — порядка 5 байт (+- пару байт, ибо в лом было писать код для точного вывода и так понятен порядок цифр)

Со скоростью превосходство может и не настолько большое, но оно все равно есть. При желании гуглится легко.
Protobuf не обязательно нужен proto файл, например в библиотеке protobuf-net структура берется прямо из сериализуемого объекта
Я правильно понимаю, что protobuf-net это эта code.google.com/p/protobuf-net/
и она заточена под .NET платформу?
Конкретно эта реализация да. Возможно, для других языков есть такой же вариант
А чем оно лучше BSON?
Ответ автора MsgPack. Кому лень читать — MessagePack или protobuf или thrift — форматы для обмена данными по сети, а bson — для хранения данных.
:facepalm:

Интересно, а какова целевая ниша для MsgPack, с точки зрения автора MsgPack? )
Если у вас десяток серверов, между ними организована шина данных в виде очереди сообщений на каком ZeroMQ/RabbitMQ/etc, и наблюдается очень интенсивный обмен данными между нодами — это имеет смысл.
Вот как раз в такой ситуации (распределенная система с общей шиной в виде RabbitMQ) мы использовали Protobuf. Потому как размер сообщений в разы меньше чем в JSON-е либо MsgPack. А для большинства брокеров сообещний, чем меньше размер сообщения — тем выше их производительность.
А за счет чего это «в разы»? Насколько я понимаю MsgPack не такой уж и жирный что бы что-либо было «в разы» легче.
Я выше приводил пример за счет чего.
Не заметил, спасибо. Я как-то так и думал.
Есть у меня свой MessagePack, ну даже скорее CBOR :)
И что в нем хорошего по сравнению с конкурентами? Ну, помимо того, что оно «свое», конечно? :)
Используем MesssagePack для сериализации объектов в блобы в качестве более быстрой реализации NSCoding на iOS: github.com/VoltMobi/messagepackcoder
В свое время использовали igbinary, но msgpack явно поинтереснее него.
Использую MessagePack для хранения информации в токенах авторизации. Выбран за компактность и скорость упаковки/распаковки.
Понравился MessagePack.
Если уж у вас цель — минимизировать трафик, то JSON можно скормить его алгоритму HPack, реализация которого тоже есть во всех языках, а дальше запаковать GZIP.
Если у вас большие коллекции, то вы ужмете весь трафик вплоть до 80%.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории