diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..6411db61 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.DS_Store +data_large.txt +data_prof.txt +result.json \ No newline at end of file diff --git a/case-study.md b/case-study.md new file mode 100644 index 00000000..b11931d7 --- /dev/null +++ b/case-study.md @@ -0,0 +1,66 @@ +# Case-study оптимизации + +## Актуальная проблема +В нашем проекте возникла серьёзная проблема. + +Необходимо было обработать файл с данными, чуть больше ста мегабайт. + +У нас уже была программа на `ruby`, которая умела делать нужную обработку. + +Она успешно работала на файлах размером пару мегабайт, но для большого файла она работала слишком долго, и не было понятно, закончит ли она вообще работу за какое-то разумное время. + +Я решил исправить эту проблему, оптимизировав эту программу. + +## Формирование метрики +Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: Время выполнения программы. + +## Гарантия корректности работы оптимизированной программы +Программа поставлялась с тестом. Выполнение этого теста в фидбек-лупе позволяет не допустить изменения логики программы при оптимизации. + +## Feedback-Loop +Для того, чтобы иметь возможность быстро проверять гипотезы я выстроил эффективный `feedback-loop`, который позволил мне получать обратную связь по эффективности сделанных изменений за 10-20 секунд. + +Вот как я построил `feedback_loop`: Создавал файл с N строк, чтобы программа могла выполнятся 10-20 секунд + +## Вникаем в детали системы, чтобы найти главные точки роста +Для того, чтобы найти "точки роста" для оптимизации я воспользовался RubyProf, с отчетами в виде Graph и CallStack + +Вот какие проблемы удалось найти и решить + +### Ваша находка №1 +- CallStack показал что программа 94.55% времени тратит на Array#select. С помощью Graph стало понятно что много времени тратиться на поиск сессий пользователя. +- Для решения данной проблемы, перед тем как проходится по пользователям, нужно подготовить данные users_sessions в виде хэша, ключем будет id пользователя, а значение массив его сессий, тогда мы один раз пройдемся по sessions +- Время выполнения программы уменьшилось с ~20 секунд до ~1 секунды, при входных данных в 30000 строк. Время выполнения программы на большом объёме данных больше 30 секунд. +- Отчет профилировщика стал указывать на другие проблемы, главная точкой роста изменилась. + +### Ваша находка №2 +- При объёме данных в 200к строк CallStack показал что программа 56.29% времени тратит на Array#+. С помощью Graph стало понятно что много времени тратиться на формирования списка пользователей (users). +- Рекомундуется использовать Array#concat (https://github.com/fastruby/fast-ruby?tab=readme-ov-file#arrayconcat-vs-array-code) +- Время выполнения программы особо не изменилось. +- Отчет профилировщика стал указывать на другие проблемы, главная точкой роста изменилась. + +### Ваша находка №3 +- При объёме данных в 200к строк CallStack показал что программа 56.92% времени тратит на Array#+. С помощью Graph стало понятно что много времени тратиться на формирования списка сессий (sessions). +- Рекомундуется использовать Array#concat (https://github.com/fastruby/fast-ruby?tab=readme-ov-file#arrayconcat-vs-array-code) +- Время выполнения программы уменьшилось с ~14 секунд до ~6 секунд, при входных данных в 200к строк. Время выполнения программы на большом объёме данных больше 30 секунд. +- Отчет профилировщика стал указывать на другие проблемы, главная точкой роста изменилась. + +### Ваша находка №4 +- При объёме данных в 400к строк CallStack показал что программа 52.94% времени тратит на Array#all?. С помощью Graph стало понятно что много времени тратиться на проверку уникальности браузера (uniqueBrowsers). +- Для этих данных лучше всего подойдет Set. +- Время выполнения программы уменьшилось с ~15 секунд до ~7 секунд, при входных данных в 400к строк. Время выполнения программы на большом объёме данных больше 30 секунд. +- Отчет профилировщика стал указывать на другие проблемы, главная точкой роста изменилась. + +### Ваша находка №5 +- При объёме данных в 700к строк CallStack показал что программа 53.64% времени тратит на Array#+. С помощью Graph стало понятно что много времени тратиться на формирования списка пользователей (users_objects). +- Рекомундуется использовать Array#concat (https://github.com/fastruby/fast-ruby?tab=readme-ov-file#arrayconcat-vs-array-code) +- Время выполнения программы уменьшилось с ~18 секунд до ~9 секунд, при входных данных в 700к строк. Время выполнения программы на большом объёме данных стало меньше 30 секунд. +- Отчет профилировщика стал указывать на другие проблемы, главная точкой роста изменилась. Сейчас большая часть времени тратиться на Array#map в методе collect_stats_from_users. + +## Результаты +В результате проделанной оптимизации наконец удалось обработать файл с данными. +Удалось улучшить метрику системы с более 15 минут до менее 30 секунд и уложиться в заданный бюджет. + +## Защита от регрессии производительности +Для защиты от потери достигнутого прогресса при дальнейших изменениях программы был создан performance тест. + diff --git a/data.txt b/data.txt index 393b0b8b..ac9d48ac 100644 --- a/data.txt +++ b/data.txt @@ -16,3 +16,4 @@ session,2,0,Chrome 35,6,2018-09-21 session,2,1,Safari 49,85,2017-05-22 session,2,2,Firefox 47,17,2018-02-02 session,2,3,Chrome 20,84,2016-11-25 +user,3,Evgeny,Araslanov,38 diff --git a/prof_reports/ruby_prof_callstack_after.html b/prof_reports/ruby_prof_callstack_after.html new file mode 100644 index 00000000..852be7f7 --- /dev/null +++ b/prof_reports/ruby_prof_callstack_after.html @@ -0,0 +1,4550 @@ + + + + + ruby-prof call tree + + + + + + + +
+
+ Call tree for application task-1-ruby-prof-callstack.rb
Generated on 2025-01-26 21:56:28 +0500 + with options {}
+
+
+ Threshold: + + + + + +
+ + + + +
+ Thread: 80, Fiber: 60 (100.00% ~ 8.554607236757874) + +
+ +
+
+ + diff --git a/prof_reports/ruby_prof_callstack_before.html b/prof_reports/ruby_prof_callstack_before.html new file mode 100644 index 00000000..a59a5267 --- /dev/null +++ b/prof_reports/ruby_prof_callstack_before.html @@ -0,0 +1,4554 @@ + + + + + ruby-prof call tree + + + + + + + +
+
+ Call tree for application task-1-ruby-prof-callstack.rb
Generated on 2025-01-26 21:49:05 +0500 + with options {}
+
+
+ Threshold: + + + + + +
+ + + + +
+ Thread: 80, Fiber: 60 (100.00% ~ 17.99441177211702) + +
+ +
+
+ + diff --git a/prof_reports/ruby_prof_graph_after.html b/prof_reports/ruby_prof_graph_after.html new file mode 100644 index 00000000..6459b577 --- /dev/null +++ b/prof_reports/ruby_prof_graph_after.html @@ -0,0 +1,21471 @@ + + + + + + +
+
+
+
Profile Report
+

Wall_time

+
+
+
Sunday, January 26 at 9:56:45 PM (+05)
+ +
+
+
+
+ + + + + + + + + + + + + +
Thread IDFiber IDTotal
80608.588097143918276
+ + + +

Thread 80, Fiber: 60

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
%Total%SelfTotalSelfWaitChildCallsNameLine
100.00%0.00%8.590.000.008.591 + + [global]# + + 10
  8.590.030.008.561/1Object#work10 +
  8.590.030.008.561/1[global]#10
100.00%0.33%8.590.030.008.561 + + Object#work + + 53
  4.760.000.004.767/7Object#collect_stats_from_users128 +
  2.890.770.002.133/39Array#each66 +
  0.370.000.000.371/1Object#select_sessions_for_users115 +
  0.210.210.000.001/1JSON::Ext::Generator::GeneratorMethods::Hash#to_json169 +
  0.170.120.000.062/1183712Array#map104 +
  0.060.060.000.001/215221Array#sort104 +
  0.050.050.000.001/1400001String#split60 +
  0.020.020.000.001/1Array#uniq104 +
  0.010.010.000.001/1<Class::IO>#read60 +
  0.000.000.000.001/16IO#write169 +
  0.000.000.000.0012/12ProgressBar::Base#increment61 +
  0.000.000.000.001/1<Class::ProgressBar>#create57 +
  0.000.000.000.001/1Enumerable#count100 +
  0.000.000.000.001/107611Array#join104 +
  0.000.000.000.001/107631Class#new93 +
  0.000.000.000.002/107612Array#count90 +
  0.000.000.000.001/1400001String#==57 +
  0.000.000.000.001/1560528Hash#[]=90 +
  0.000.000.000.002/39Enumerable#find
  0.000.000.000.0026/39<Class::ProgressBar::Format::Formatter>#process7
  0.370.200.000.181/39Enumerable#each_with_object
  2.890.770.002.133/39Object#work66
  4.761.030.003.737/39Object#collect_stats_from_users39
93.50%23.28%8.032.000.006.0339 + + Array#each + +
  2.460.700.001.761183710/1183712Array#map135 +
  1.130.680.000.46592390/592390Object#parse_session69 +
  0.400.400.000.00700000/1400001String#split67 +
  0.350.350.000.002798930/2798991Hash#[]119 +
  0.220.150.000.08215220/215221Array#sort147 +
  0.180.180.000.001721760/1721773String#+40 +
  0.160.080.000.08107610/107610Object#parse_user68 +
  0.150.090.000.06592390/592390Set#add96 +
  0.140.140.000.00968136/1560528Hash#[]=48 +
  0.140.060.000.08107610/107610Array#any?153 +
  0.130.130.000.00753270/753272Hash#merge129 +
  0.090.090.000.001400000/1400001String#==68 +
  0.080.080.000.001506540/1506540User#attributes40 +
  0.070.030.000.04107610/107610Array#all?159 +
  0.060.060.000.001400000/4792535Array#[]68 +
  0.060.060.000.00807610/807610Array#concat68 +
  0.050.040.000.01107610/107631Class#new120 +
  0.040.040.000.00753270/753270User#sessions129 +
  0.040.040.000.00592390/592394Array#<<49 +
  0.030.030.000.00107610/107611Array#join147 +
  0.020.020.000.00215220/215220Integer#to_s135 +
  0.010.010.000.00107610/107610Array#reverse165 +
  0.010.010.000.00107610/107610Array#sum135 +
  0.010.010.000.00107610/107610Array#max141 +
  0.010.010.000.00107610/107612Array#count129 +
  0.000.000.000.0052/52ProgressBar::Format::Molecule#lookup_value8 +
  0.000.000.000.0052/592455String#gsub!8 +
  0.000.000.000.0052/52ProgressBar::Format::Molecule#full_key8 +
  0.000.000.000.008/57ProgressBar::Time#time21 +
  0.000.000.000.008/21Kernel#respond_to?21 +
  4.760.000.004.767/7Object#work128
55.47%0.00%4.760.000.004.767 + + Object#collect_stats_from_users + + 38
  4.761.030.003.737/39Array#each39 +
  0.170.120.000.062/1183712Object#work104
  2.460.700.001.761183710/1183712Array#each
30.64%9.45%2.630.810.001.821183712 + + Array#map + +
  1.540.780.000.76592390/592390<Class::Date>#parse165 +
  0.110.110.000.00592390/592390Date#iso8601165 +
  0.110.110.000.001184780/1632354String#upcase107 +
  0.060.060.000.001184780/1184780String#to_i135 +
  1.540.780.000.76592390/592390Array#map
17.91%9.03%1.540.780.000.76592390 + + <Class::Date>#parse + +
  0.260.260.000.001184780/1184780Regexp#match +
  0.260.260.000.00592390/592455String#gsub! +
  0.130.130.000.00592390/592390MatchData#begin +
  0.050.050.000.00592390/592390String#[]= +
  0.030.030.000.00592390/592390MatchData#end +
  0.030.030.000.00592390/592390Integer#div +
  1.130.680.000.46592390/592390Array#each
13.20%7.88%1.130.680.000.46592390 + + Object#parse_session + + 27
  0.330.330.000.00592390/1400001String#split28 +
  0.130.130.000.002961950/4792535Array#[]30 +
  0.050.050.000.001/1400001Object#work60
  0.060.060.000.00107610/1400001Object#parse_user18
  0.330.330.000.00592390/1400001Object#parse_session28
  0.400.400.000.00700000/1400001Array#each
9.70%9.70%0.830.830.000.001400001 + + String#split + +
  0.370.000.000.371/1Object#work115
4.36%0.00%0.370.000.000.371 + + Object#select_sessions_for_users + + 46
  0.370.000.000.371/1Enumerable#each_with_object47 +
  0.370.000.000.371/1Object#select_sessions_for_users47
4.36%0.00%0.370.000.000.371 + + Enumerable#each_with_object + +
  0.370.200.000.181/39Array#each +
  0.000.000.000.001/2798991ProgressBar::Components::Percentage#initialize7
  0.000.000.000.001/2798991ProgressBar::Throttle#initialize9
  0.000.000.000.001/2798991ProgressBar::Components::Title#initialize9
  0.000.000.000.003/2798991ProgressBar::Output#initialize11
  0.000.000.000.002/2798991<Class::ProgressBar::Output>#detect21
  0.000.000.000.002/2798991ProgressBar::Calculators::Length#initialize9
  0.000.000.000.003/2798991ProgressBar::Components::Time#initialize22
  0.000.000.000.001/2798991ProgressBar::Projectors::SmoothedAverage#initialize14
  0.000.000.000.003/2798991ProgressBar::Components::Rate#initialize9
  0.000.000.000.002/2798991ProgressBar::Timer#initialize9
  0.000.000.000.005/2798991ProgressBar::Components::Bar#initialize18
  0.000.000.000.002/2798991ProgressBar::Progress#start19
  0.000.000.000.002/2798991ProgressBar::Projectors::SmoothedAverage#start21
  0.000.000.000.008/2798991ProgressBar::Base#initialize46
  0.000.000.000.0013/2798991ProgressBar::Components::Bar#to_s28
  0.000.000.000.0012/2798991ProgressBar::Output#refresh51
  0.350.350.000.002798930/2798991Array#each
4.04%4.04%0.350.350.000.002798991 + + Hash#[] + +
  0.060.060.000.001/215221Object#work104
  0.220.150.000.08215220/215221Array#each
3.26%2.38%0.280.200.000.08215221 + + Array#sort + +
  0.080.080.000.001199958/1199958Date#<=> +
  0.260.260.000.001184780/1184780<Class::Date>#parse
3.07%3.07%0.260.260.000.001184780 + + Regexp#match + +
  0.000.000.000.0013/592455<Class::ProgressBar::Format::Formatter>#process11
  0.000.000.000.0052/592455Array#each
  0.260.260.000.00592390/592455<Class::Date>#parse
2.97%2.97%0.260.260.000.00592455 + + String#gsub! + +
  0.210.210.000.001/1Object#work169
2.48%2.48%0.210.210.000.001 + + JSON::Ext::Generator::GeneratorMethods::Hash#to_json + +
  0.000.000.000.001/1JSON::Ext::Generator::State#initialize +
  0.000.000.000.0028/4792535ProgressBar::Projectors::SmoothedAverage#absolute67
  0.000.000.000.0013/4792535ProgressBar::Projectors::SmoothedAverage#progress33
  0.000.000.000.00104/4792535ProgressBar::Format::Molecule#lookup_value51
  0.020.020.000.00430440/4792535Object#parse_user20
  0.060.060.000.001400000/4792535Array#each
  0.130.130.000.002961950/4792535Object#parse_session30
2.47%2.47%0.210.210.000.004792535 + + Array#[] + +
  0.000.000.000.001/1560528Object#work90
  0.000.000.000.001/1560528ProgressBar::Base#initialize46
  0.060.060.000.00592390/1560528Set#add512
  0.140.140.000.00968136/1560528Array#each
2.30%2.30%0.200.200.000.001560528 + + Hash#[]= + +
  0.000.000.000.0013/1721773ProgressBar::Output#print_and_flush67
  0.180.180.000.001721760/1721773Array#each
2.14%2.14%0.180.180.000.001721773 + + String#+ + +
  0.160.080.000.08107610/107610Array#each
1.82%0.94%0.160.080.000.08107610 + + Object#parse_user + + 17
  0.060.060.000.00107610/1400001String#split18 +
  0.020.020.000.00430440/4792535Array#[]20 +
  0.010.010.000.00138633/1632354Array#all?
  0.030.030.000.00308941/1632354Array#any?
  0.110.110.000.001184780/1632354Array#map
1.76%1.76%0.150.150.000.001632354 + + String#upcase + +
  0.150.090.000.06592390/592390Array#each
1.76%1.11%0.150.090.000.06592390 + + Set#add + + 511
  0.060.060.000.00592390/1560528Hash#[]=512 +
  0.140.060.000.08107610/107610Array#each
1.63%0.68%0.140.060.000.08107610 + + Array#any? + +
  0.050.050.000.00308941/447587String#=~153 +
  0.030.030.000.00308941/1632354String#upcase153 +
  0.130.130.000.00592390/592390<Class::Date>#parse
1.57%1.57%0.130.130.000.00592390 + + MatchData#begin + +
  0.000.000.000.002/753272ProgressBar::Base#initialize71
  0.130.130.000.00753270/753272Array#each
1.54%1.54%0.130.130.000.00753272 + + Hash#merge + +
  0.110.110.000.00592390/592390Array#map
1.31%1.31%0.110.110.000.00592390 + + Date#iso8601 + +
  0.000.000.000.001/1400001Object#work57
  0.090.090.000.001400000/1400001Array#each
1.00%1.00%0.090.090.000.001400001 + + String#== + +
  0.080.080.000.001506540/1506540Array#each
0.93%0.93%0.080.080.000.001506540 + + User#attributes + +
  0.000.000.000.0013/447587ProgressBar::Calculators::Length#unix?94
  0.020.020.000.00138633/447587Array#all?
  0.050.050.000.00308941/447587Array#any?
0.89%0.89%0.080.080.000.00447587 + + String#=~ + +
  0.080.080.000.001199958/1199958Array#sort
0.88%0.88%0.080.080.000.001199958 + + Date#<=> + +
  0.070.030.000.04107610/107610Array#each
0.78%0.36%0.070.030.000.04107610 + + Array#all? + +
  0.020.020.000.00138633/447587String#=~159 +
  0.010.010.000.00138633/1632354String#upcase159 +
  0.060.060.000.001184780/1184780Array#map
0.69%0.69%0.060.060.000.001184780 + + String#to_i + +
  0.060.060.000.00807610/807610Array#each
0.67%0.67%0.060.060.000.00807610 + + Array#concat + +
  0.000.000.000.001/107631Set#initialize244
  0.000.000.000.001/107631ProgressBar::Throttle#initialize12
  0.000.000.000.002/107631ProgressBar::Timer#initialize9
  0.000.000.000.004/107631String#scan
  0.000.000.000.001/107631Object#work93
  0.000.000.000.002/107631ProgressBar::Output#initialize13
  0.000.000.000.001/107631<Class::ProgressBar::Output>#detect24
  0.000.000.000.008/107631ProgressBar::Base#initialize52
  0.000.000.000.001/107631<Class::ProgressBar>#create10
  0.050.040.000.01107610/107631Array#each
0.64%0.47%0.050.040.000.01107631 + + *Class#new + +
  0.010.010.000.00107610/107610User#initialize +
  0.000.000.000.001/1ProgressBar::Base#initialize +
  0.000.000.000.001/1ProgressBar::Projectors::SmoothedAverage#initialize +
  0.000.000.000.001/1ProgressBar::Output#initialize +
  0.000.000.000.001/1ProgressBar::Progress#initialize +
  0.000.000.000.004/4ProgressBar::Format::Molecule#initialize +
  0.000.000.000.001/1ProgressBar::Throttle#initialize +
  0.000.000.000.002/2ProgressBar::Timer#initialize +
  0.000.000.000.001/1ProgressBar::Components::Bar#initialize +
  0.000.000.000.001/1Set#initialize +
  0.000.000.000.001/1ProgressBar::Components::Rate#initialize +
  0.000.000.000.001/1ProgressBar::Calculators::Length#initialize +
  0.000.000.000.001/1ProgressBar::Components::Time#initialize +
  0.000.000.000.002/2ProgressBar::Time#initialize +
  0.000.000.000.001/1ProgressBar::Components::Title#initialize +
  0.000.000.000.001/1ProgressBar::Components::Percentage#initialize +
  0.000.000.000.001/1Hash#initialize +
  0.050.050.000.00592390/592390<Class::Date>#parse
0.58%0.58%0.050.050.000.00592390 + + String#[]= + +
  0.040.040.000.00753270/753270Array#each
0.49%0.49%0.040.040.000.00753270 + + User#sessions + +
  0.000.000.000.004/592394String#scan
  0.040.040.000.00592390/592394Array#each
0.44%0.44%0.040.040.000.00592394 + + Array#<< + +
  0.030.030.000.00592390/592390<Class::Date>#parse
0.38%0.38%0.030.030.000.00592390 + + MatchData#end + +
  0.000.000.000.001/107611Object#work104
  0.030.030.000.00107610/107611Array#each
0.35%0.35%0.030.030.000.00107611 + + Array#join + +
  0.030.030.000.00592390/592390<Class::Date>#parse
0.31%0.31%0.030.030.000.00592390 + + Integer#div + +
  0.020.020.000.001/1Object#work104
0.25%0.25%0.020.020.000.001 + + Array#uniq + +
  0.020.020.000.00215220/215220Array#each
0.24%0.24%0.020.020.000.00215220 + + Integer#to_s + +
  0.010.010.000.00107610/107610Class#new
0.17%0.17%0.010.010.000.00107610 + + User#initialize + + 11
  0.010.010.000.00107610/107610Array#each
0.10%0.10%0.010.010.000.00107610 + + Array#reverse + +
  0.010.010.000.00107610/107610Array#each
0.08%0.08%0.010.010.000.00107610 + + Array#sum + +
  0.010.010.000.00107610/107610Array#each
0.08%0.08%0.010.010.000.00107610 + + Array#max + +
  0.000.000.000.002/107612Object#work90
  0.010.010.000.00107610/107612Array#each
0.07%0.07%0.010.010.000.00107612 + + Array#count + +
  0.000.000.000.0015/16IO#print
  0.000.000.000.001/16Object#work169
0.06%0.06%0.010.010.000.0016 + + IO#write + +
  0.010.010.000.001/1Object#work60
0.06%0.06%0.010.010.000.001 + + <Class::IO>#read + +
  0.000.000.000.001/13ProgressBar::Base#start89
  0.000.000.000.0012/13ProgressBar::Base#increment142
0.04%0.00%0.000.000.000.0013 + + ProgressBar::Base#update_progress + + 226
  0.000.000.000.0013/13ProgressBar::Output#with_refresh227 +
  0.000.000.000.0013/27ProgressBar::Base#output227 +
  0.000.000.000.0013/13ProgressBar::Base#update_progress227
0.04%0.00%0.000.000.000.0013 + + ProgressBar::Output#with_refresh + + 45
  0.000.000.000.0013/13ProgressBar::Output#refresh47 +
  0.000.000.000.0012/12ProgressBar::Projectors::SmoothedAverage#increment229 +
  0.000.000.000.0012/12ProgressBar::Progress#increment228 +
  0.000.000.000.0013/37ProgressBar::Base#finished?230 +
  0.000.000.000.001/1ProgressBar::Timer#stop230 +
  0.000.000.000.001/2ProgressBar::Projectors::SmoothedAverage#start229 +
  0.000.000.000.0013/51ProgressBar::Base#progressable228 +
  0.000.000.000.001/2ProgressBar::Progress#start228 +
  0.000.000.000.0013/14ProgressBar::Base#projector229 +
  0.000.000.000.001/29ProgressBar::Base#timer230 +
  0.000.000.000.0012/12Object#work61
0.04%0.00%0.000.000.000.0012 + + ProgressBar::Base#increment + + 141
  0.000.000.000.0012/13ProgressBar::Base#update_progress142 +
  0.000.000.000.0013/13ProgressBar::Output#with_refresh47
0.04%0.00%0.000.000.000.0013 + + ProgressBar::Output#refresh + + 50
  0.000.000.000.0013/13ProgressBar::Throttle#choke51 +
  0.000.000.000.0013/26ProgressBar::Base#stopped?51 +
  0.000.000.000.0013/13ProgressBar::Output#throttle51 +
  0.000.000.000.0013/39ProgressBar::Output#bar51 +
  0.000.000.000.0012/2798991Hash#[]51 +
  0.000.000.000.0013/13ProgressBar::Output#refresh51
0.04%0.00%0.000.000.000.0013 + + ProgressBar::Throttle#choke + + 15
  0.000.000.000.0013/13ProgressBar::Output#print_and_flush54 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#length_changed?52 +
  0.000.000.000.0011/36ProgressBar::Timer#elapsed_seconds16 +
  0.000.000.000.0013/13ProgressBar::Timer#restart20 +
  0.000.000.000.001/1ProgressBar::Outputs::Tty#clear52 +
  0.000.000.000.0013/64ProgressBar::Timer#started?16 +
  0.000.000.000.0037/37ProgressBar::Throttle#timer16 +
  0.000.000.000.0012/21Hash#fetch16 +
  0.000.000.000.0013/27ProgressBar::Output#length_calculator52 +
  0.000.000.000.0011/11ProgressBar::Throttle#rate16 +
  0.000.000.000.0011/11Float#>=16 +
  0.000.000.000.0013/28BasicObject#!16 +
  0.000.000.000.0013/13ProgressBar::Throttle#choke54
0.03%0.00%0.000.000.000.0013 + + ProgressBar::Output#print_and_flush + + 66
  0.000.000.000.0013/1721773String#+67 +
  0.000.000.000.0013/13ProgressBar::Outputs::Tty#bar_update_string67 +
  0.000.000.000.0013/15IO#print67 +
  0.000.000.000.0013/13ProgressBar::Outputs::Tty#eol67 +
  0.000.000.000.0026/29ProgressBar::Output#stream67 +
  0.000.000.000.0013/13IO#flush68 +
  0.000.000.000.0013/13ProgressBar::Output#print_and_flush67
0.01%0.00%0.000.000.000.0013 + + ProgressBar::Outputs::Tty#bar_update_string + + 15
  0.000.000.000.0013/13ProgressBar::Base#to_s16 +
  0.000.000.000.0013/39ProgressBar::Output#bar16 +
  0.000.000.000.0013/13ProgressBar::Outputs::Tty#bar_update_string16
0.01%0.00%0.000.000.000.0013 + + ProgressBar::Base#to_s + + 169
  0.000.000.000.0013/13<Class::ProgressBar::Format::Formatter>#process172 +
  0.000.000.000.0013/13ProgressBar::Output#length172 +
  0.000.000.000.0013/27ProgressBar::Base#output172 +
  0.000.000.000.0013/13ProgressBar::Base#to_s172
0.01%0.00%0.000.000.000.0013 + + <Class::ProgressBar::Format::Formatter>#process + + 4
  0.000.000.000.0026/39Array#each7 +
  0.000.000.000.0013/13String#dup5 +
  0.000.000.000.0013/13ProgressBar::Format::String#non_bar_molecules7 +
  0.000.000.000.0013/13ProgressBar::Format::String#displayable_length13 +
  0.000.000.000.0013/592455String#gsub!11 +
  0.000.000.000.0013/13ProgressBar::Format::String#bar_molecule_placeholder_length13 +
  0.000.000.000.0013/14ProgressBar::Format::String#bar_molecules18 +
  0.000.000.000.0013/26Integer#<16 +
  0.000.000.000.0013/40Integer#-13 +
  0.000.000.000.0013/37Integer#+13 +
  0.000.000.000.0052/52Array#each
0.01%0.00%0.000.000.000.0052 + + ProgressBar::Format::Molecule#lookup_value + + 50
  0.000.000.000.0013/13ProgressBar::Components::Time#estimated_with_friendly_oob56 +
  0.000.000.000.0013/13ProgressBar::Components::Bar#complete_bar54 +
  0.000.000.000.0013/14ProgressBar::Components::Time#elapsed_with_label56 +
  0.000.000.000.0013/13ProgressBar::Components::Percentage#justified_percentage_with_precision56 +
  0.000.000.000.0052/60ProgressBar::Format::Molecule#bar_molecule?53 +
  0.000.000.000.00104/104ProgressBar::Format::Molecule#method_name51 +
  0.000.000.000.00104/4792535Array#[]51 +
  0.000.000.000.0052/65String#to_s56 +
  0.000.000.000.0026/26ProgressBar::Base#time_component51 +
  0.000.000.000.0013/13ProgressBar::Base#percentage_component51 +
  0.000.000.000.0013/13ProgressBar::Base#bar_component51 +
  0.000.000.000.001/1Object#work57
0.00%0.00%0.000.000.000.001 + + <Class::ProgressBar>#create + + 9
  0.000.000.000.001/107631Class#new10 +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#initialize + + 45
  0.000.000.000.001/1ProgressBar::Base#start84 +
  0.000.000.000.008/107631Class#new52 +
  0.000.000.000.001/1<Class::ProgressBar::Output>#detect81 +
  0.000.000.000.001/1ProgressBar::Base#time_component=79 +
  0.000.000.000.001/1<Class::String>#new82 +
  0.000.000.000.001/1<Class::ProgressBar::Projector>#from_type66 +
  0.000.000.000.001/1ProgressBar::Base#percentage_component=77 +
  0.000.000.000.002/21Hash#fetch48 +
  0.000.000.000.008/2798991Hash#[]46 +
  0.000.000.000.002/753272Hash#merge71 +
  0.000.000.000.001/1ProgressBar::Base#timer=52 +
  0.000.000.000.001/1ProgressBar::Base#title_component=75 +
  0.000.000.000.001/1Hash#any?53 +
  0.000.000.000.001/1ProgressBar::Base#autofinish=49 +
  0.000.000.000.001/1ProgressBar::Base#output=81 +
  0.000.000.000.001/1ProgressBar::Base#autostart=48 +
  0.000.000.000.001/1ProgressBar::Base#autostart84 +
  0.000.000.000.001/1ProgressBar::Base#projector=66 +
  0.000.000.000.001/1ProgressBar::Base#bar_component=76 +
  0.000.000.000.001/1560528Hash#[]=46 +
  0.000.000.000.001/1ProgressBar::Base#progressable=69 +
  0.000.000.000.001/51ProgressBar::Base#progressable71 +
  0.000.000.000.001/29ProgressBar::Base#timer71 +
  0.000.000.000.001/1ProgressBar::Base#finished=50 +
  0.000.000.000.001/1ProgressBar::Outputs::Tty#resolve_format82 +
  0.000.000.000.001/1ProgressBar::Base#rate_component=78 +
  0.000.000.000.001/14ProgressBar::Base#projector71 +
  0.000.000.000.001/27ProgressBar::Base#output82 +
  0.000.000.000.001/1ProgressBar::Base#initialize84
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#start + + 87
  0.000.000.000.001/13ProgressBar::Base#update_progress89 +
  0.000.000.000.001/14ProgressBar::Timer#start88 +
  0.000.000.000.001/29ProgressBar::Base#timer88 +
  0.000.000.000.0013/13ProgressBar::Throttle#choke52
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#length_changed? + + 18
  0.000.000.000.0013/13ProgressBar::Calculators::Length#calculate_length20 +
  0.000.000.000.0013/13BasicObject#!=22 +
  0.000.000.000.0026/40ProgressBar::Calculators::Length#current_length19 +
  0.000.000.000.0013/14ProgressBar::Calculators::Length#current_length=20 +
  0.000.000.000.0012/12ProgressBar::Output#with_refresh229
0.00%0.00%0.000.000.000.0012 + + ProgressBar::Projectors::SmoothedAverage#increment + + 28
  0.000.000.000.0012/14ProgressBar::Projectors::SmoothedAverage#progress=29 +
  0.000.000.000.0012/13ProgressBar::Projectors::SmoothedAverage#progress29 +
  0.000.000.000.0012/37Integer#+29 +
  0.000.000.000.0012/12ProgressBar::Output#with_refresh228
0.00%0.00%0.000.000.000.0012 + + ProgressBar::Progress#increment + + 31
  0.000.000.000.0012/14ProgressBar::Progress#progress=38 +
  0.000.000.000.0036/113ProgressBar::Progress#progress32 +
  0.000.000.000.0012/37Integer#+38 +
  0.000.000.000.0024/125Integer#==32 +
  0.000.000.000.0024/205ProgressBar::Progress#total32 +
  0.000.000.000.0011/36ProgressBar::Components::Time#estimated_seconds_remaining97
  0.000.000.000.0014/36ProgressBar::Timer#elapsed_whole_seconds64
  0.000.000.000.0011/36ProgressBar::Throttle#choke16
0.00%0.00%0.000.000.000.0036 + + ProgressBar::Timer#elapsed_seconds + + 57
  0.000.000.000.0034/49ProgressBar::Time#now60 +
  0.000.000.000.0036/36Time#-60 +
  0.000.000.000.0036/64ProgressBar::Timer#started?58 +
  0.000.000.000.0036/111ProgressBar::Timer#started_at60 +
  0.000.000.000.0036/87ProgressBar::Timer#stopped_at60 +
  0.000.000.000.0034/49ProgressBar::Timer#time60 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#length_changed?20
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#calculate_length + + 25
  0.000.000.000.0013/13ProgressBar::Calculators::Length#terminal_width26 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#length_override26 +
  0.000.000.000.002/15ProgressBar::Outputs::Tty#clear11
  0.000.000.000.0013/15ProgressBar::Output#print_and_flush67
0.00%0.00%0.000.000.000.0015 + + IO#print + +
  0.000.000.000.0015/16IO#write +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#calculate_length26
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#terminal_width + + 43
  0.000.000.000.0013/13ProgressBar::Calculators::Length#dynamic_width46 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#unix?44 +
  0.000.000.000.0013/26Integer#<47 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#terminal_width46
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#dynamic_width + + 56
  0.000.000.000.0013/13ProgressBar::Calculators::Length#dynamic_width_via_output_stream_object58 +
  0.000.000.000.0013/14IO#tty?57 +
  0.000.000.000.0013/21Kernel#respond_to?57 +
  0.000.000.000.0039/52ProgressBar::Calculators::Length#output57 +
  0.000.000.000.0013/13ProgressBar::Format::Molecule#lookup_value56
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Time#estimated_with_friendly_oob + + 43
  0.000.000.000.0013/13ProgressBar::Components::Time#estimated_with_elapsed_fallback44 +
  0.000.000.000.001/14ProgressBar::Components::Time#estimated_with_elapsed_fallback89
  0.000.000.000.0013/14ProgressBar::Format::Molecule#lookup_value56
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Components::Time#elapsed_with_label + + 31
  0.000.000.000.0014/14ProgressBar::Components::Time#elapsed32 +
  0.000.000.000.0013/13ProgressBar::Format::Molecule#lookup_value54
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Bar#complete_bar + + 41
  0.000.000.000.0013/13ProgressBar::Components::Bar#to_s44 +
  0.000.000.000.0013/14ProgressBar::Components::Bar#length=42 +
  0.000.000.000.0013/13ProgressBar::Components::Time#estimated_with_friendly_oob44
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Time#estimated_with_elapsed_fallback + + 88
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated_with_label91 +
  0.000.000.000.001/14ProgressBar::Components::Time#elapsed_with_label89 +
  0.000.000.000.0013/50ProgressBar::Progress#finished?89 +
  0.000.000.000.0013/47ProgressBar::Components::Time#progress89 +
  0.000.000.000.0014/14ProgressBar::Components::Time#elapsed_with_label32
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Components::Time#elapsed + + 80
  0.000.000.000.0014/14ProgressBar::Timer#elapsed_whole_seconds83 +
  0.000.000.000.0014/38String#%85 +
  0.000.000.000.0014/25ProgressBar::Timer#divide_seconds83 +
  0.000.000.000.0042/86ProgressBar::Components::Time#timer81 +
  0.000.000.000.0014/64ProgressBar::Timer#started?81 +
  0.000.000.000.0013/13ProgressBar::Components::Bar#complete_bar44
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Bar#to_s + + 25
  0.000.000.000.0013/13ProgressBar::Components::Bar#standard_complete_string29 +
  0.000.000.000.0013/13ProgressBar::Components::Bar#incomplete_string29 +
  0.000.000.000.0013/25ProgressBar::Progress#unknown?26 +
  0.000.000.000.0013/39ProgressBar::Components::Bar#progress26 +
  0.000.000.000.0013/13Symbol#==28 +
  0.000.000.000.0013/2798991Hash#[]28 +
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated_with_elapsed_fallback91
0.00%0.00%0.000.000.000.0012 + + ProgressBar::Components::Time#estimated_with_label + + 27
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated28 +
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated_with_label28
0.00%0.00%0.000.000.000.0012 + + ProgressBar::Components::Time#estimated + + 66
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated_seconds_remaining67 +
  0.000.000.000.0011/25ProgressBar::Timer#divide_seconds71 +
  0.000.000.000.0011/38String#%76 +
  0.000.000.000.0011/25Integer#>73 +
  0.000.000.000.0011/86ProgressBar::Components::Time#timer71 +
  0.000.000.000.001/1Object#work100
0.00%0.00%0.000.000.000.001 + + Enumerable#count + +
  0.000.000.000.001/1Set#each +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + Set#initialize + + 243
  0.000.000.000.001/107631Class#new244 +
  0.000.000.000.001/2NilClass#nil?246 +
  0.000.000.000.001/1Enumerable#count
0.00%0.00%0.000.000.000.001 + + Set#each + + 499
  0.000.000.000.001/1Hash#each_key501 +
  0.000.000.000.001/1Kernel#block_given?500 +
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated67
0.00%0.00%0.000.000.000.0012 + + ProgressBar::Components::Time#estimated_seconds_remaining + + 94
  0.000.000.000.0011/36ProgressBar::Timer#elapsed_seconds97 +
  0.000.000.000.0012/25ProgressBar::Progress#unknown?95 +
  0.000.000.000.0012/12ProgressBar::Projectors::SmoothedAverage#none?95 +
  0.000.000.000.0011/11ProgressBar::Progress#none?95 +
  0.000.000.000.0011/205ProgressBar::Progress#total97 +
  0.000.000.000.0011/11Float#round97 +
  0.000.000.000.0011/11ProgressBar::Timer#reset?95 +
  0.000.000.000.0011/51ProgressBar::Timer#stopped?95 +
  0.000.000.000.0033/86ProgressBar::Components::Time#timer95 +
  0.000.000.000.0034/47ProgressBar::Components::Time#progress95 +
  0.000.000.000.0023/23ProgressBar::Components::Time#projector95 +
  0.000.000.000.0011/23ProgressBar::Projectors::SmoothedAverage#projection97 +
  0.000.000.000.0011/25Float#-97 +
  0.000.000.000.0011/89Integer#/97 +
  0.000.000.000.0011/38Float#*97 +
  0.000.000.000.001/1JSON::Ext::Generator::GeneratorMethods::Hash#to_json
0.00%0.00%0.000.000.000.001 + + JSON::Ext::Generator::State#initialize + +
  0.000.000.000.001/27ProgressBar::Base#initialize82
  0.000.000.000.0013/27ProgressBar::Base#to_s172
  0.000.000.000.0013/27ProgressBar::Base#update_progress227
0.00%0.00%0.000.000.000.0027 + + ProgressBar::Base#output + +
  0.000.000.000.001/2Set#initialize246
  0.000.000.000.001/2ProgressBar::Progress#total=65
0.00%0.00%0.000.000.000.002 + + NilClass#nil? + +
  0.000.000.000.001/1Set#each500
0.00%0.00%0.000.000.000.001 + + Kernel#block_given? + +
  0.000.000.000.001/1Set#each501
0.00%0.00%0.000.000.000.001 + + Hash#each_key + +
  0.000.000.000.001/1ProgressBar::Output#with_refresh230
0.00%0.00%0.000.000.000.001 + + ProgressBar::Timer#stop + + 17
  0.000.000.000.001/49ProgressBar::Time#now20 +
  0.000.000.000.001/64ProgressBar::Timer#started?18 +
  0.000.000.000.001/49ProgressBar::Timer#time20 +
  0.000.000.000.001/28ProgressBar::Timer#stopped_at=20 +
  0.000.000.000.001/1ProgressBar::Base#initialize82
0.00%0.00%0.000.000.000.001 + + ProgressBar::Outputs::Tty#resolve_format + + 23
  0.000.000.000.001/1ProgressBar::Base#initialize75
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#title_component= + +
  0.000.000.000.001/1ProgressBar::Base#initialize52
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#timer= + +
  0.000.000.000.001/29ProgressBar::Base#start88
  0.000.000.000.001/29ProgressBar::Base#initialize71
  0.000.000.000.001/29ProgressBar::Output#with_refresh230
  0.000.000.000.0026/29ProgressBar::Base#stopped?124
0.00%0.00%0.000.000.000.0029 + + ProgressBar::Base#timer + +
  0.000.000.000.001/1ProgressBar::Base#initialize79
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#time_component= + +
  0.000.000.000.001/1ProgressBar::Base#initialize78
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#rate_component= + +
  0.000.000.000.001/1ProgressBar::Base#initialize66
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#projector= + +
  0.000.000.000.001/14ProgressBar::Base#initialize71
  0.000.000.000.0013/14ProgressBar::Output#with_refresh229
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Base#projector + +
  0.000.000.000.001/1ProgressBar::Base#initialize69
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#progressable= + +
  0.000.000.000.001/51ProgressBar::Base#initialize71
  0.000.000.000.0013/51ProgressBar::Output#with_refresh228
  0.000.000.000.0037/51ProgressBar::Base#finished?130
0.00%0.00%0.000.000.000.0051 + + ProgressBar::Base#progressable + +
  0.000.000.000.001/1ProgressBar::Base#initialize77
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#percentage_component= + +
  0.000.000.000.001/1ProgressBar::Base#initialize81
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#output= + +
  0.000.000.000.0024/37ProgressBar::Base#stopped?124
  0.000.000.000.0013/37ProgressBar::Output#with_refresh230
0.00%0.00%0.000.000.000.0037 + + ProgressBar::Base#finished? + + 129
  0.000.000.000.0037/50ProgressBar::Progress#finished?130 +
  0.000.000.000.0037/37ProgressBar::Base#finished130 +
  0.000.000.000.0037/37ProgressBar::Base#autofinish130 +
  0.000.000.000.0037/51ProgressBar::Base#progressable130 +
  0.000.000.000.001/1ProgressBar::Base#initialize50
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#finished= + +
  0.000.000.000.001/1ProgressBar::Base#initialize76
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#bar_component= + +
  0.000.000.000.001/1ProgressBar::Base#initialize48
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#autostart= + +
  0.000.000.000.001/1ProgressBar::Base#initialize84
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#autostart + +
  0.000.000.000.001/1ProgressBar::Base#initialize49
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#autofinish= + +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + Hash#initialize + +
  0.000.000.000.001/21<Class::ProgressBar::Projector>#from_type11
  0.000.000.000.001/21ProgressBar::Throttle#initialize12
  0.000.000.000.001/21ProgressBar::Progress#initialize13
  0.000.000.000.004/21ProgressBar::Format::Molecule#initialize35
  0.000.000.000.002/21ProgressBar::Base#initialize48
  0.000.000.000.0012/21ProgressBar::Throttle#choke16
0.00%0.00%0.000.000.000.0021 + + Hash#fetch + +
  0.000.000.000.001/1ProgressBar::Base#initialize53
0.00%0.00%0.000.000.000.001 + + Hash#any? + +
  0.000.000.000.001/1ProgressBar::Base#initialize82
0.00%0.00%0.000.000.000.001 + + <Class::String>#new + +
  0.000.000.000.001/1String#initialize +
  0.000.000.000.001/1ProgressBar::Base#initialize66
0.00%0.00%0.000.000.000.001 + + <Class::ProgressBar::Projector>#from_type + + 10
  0.000.000.000.001/21Hash#fetch11 +
  0.000.000.000.001/1ProgressBar::Base#initialize81
0.00%0.00%0.000.000.000.001 + + <Class::ProgressBar::Output>#detect + + 20
  0.000.000.000.001/107631Class#new24 +
  0.000.000.000.001/14IO#tty?23 +
  0.000.000.000.001/1Kernel#is_a?21 +
  0.000.000.000.002/2798991Hash#[]21 +
  0.000.000.000.001/1<Class::String>#new
0.00%0.00%0.000.000.000.001 + + String#initialize + +
  0.000.000.000.001/49ProgressBar::Timer#stop20
  0.000.000.000.0014/49ProgressBar::Timer#start13
  0.000.000.000.0034/49ProgressBar::Timer#elapsed_seconds60
0.00%0.00%0.000.000.000.0049 + + ProgressBar::Timer#time + +
  0.000.000.000.001/28ProgressBar::Timer#stop20
  0.000.000.000.0013/28ProgressBar::Timer#reset45
  0.000.000.000.0014/28ProgressBar::Timer#start14
0.00%0.00%0.000.000.000.0028 + + ProgressBar::Timer#stopped_at= + +
  0.000.000.000.001/64ProgressBar::Timer#stop18
  0.000.000.000.0014/64ProgressBar::Components::Time#elapsed81
  0.000.000.000.0013/64ProgressBar::Throttle#choke16
  0.000.000.000.0036/64ProgressBar::Timer#elapsed_seconds58
0.00%0.00%0.000.000.000.0064 + + ProgressBar::Timer#started? + + 35
  0.000.000.000.0064/111ProgressBar::Timer#started_at36 +
  0.000.000.000.001/14ProgressBar::Base#start88
  0.000.000.000.0013/14ProgressBar::Timer#restart54
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Timer#start + + 12
  0.000.000.000.0014/49ProgressBar::Time#now13 +
  0.000.000.000.0014/51ProgressBar::Timer#stopped?13 +
  0.000.000.000.0014/27ProgressBar::Timer#started_at=13 +
  0.000.000.000.0014/28ProgressBar::Timer#stopped_at=14 +
  0.000.000.000.0014/49ProgressBar::Timer#time13 +
  0.000.000.000.002/2Class#new
0.00%0.00%0.000.000.000.002 + + ProgressBar::Timer#initialize + + 8
  0.000.000.000.002/107631Class#new9 +
  0.000.000.000.002/2ProgressBar::Timer#time=9 +
  0.000.000.000.002/2798991Hash#[]9 +
  0.000.000.000.001/49ProgressBar::Timer#stop20
  0.000.000.000.0014/49ProgressBar::Timer#start13
  0.000.000.000.0034/49ProgressBar::Timer#elapsed_seconds60
0.00%0.00%0.000.000.000.0049 + + ProgressBar::Time#now + + 15
  0.000.000.000.0049/49<Class::Time>#now16 +
  0.000.000.000.0049/49ProgressBar::Time#unmocked_time_method16 +
  0.000.000.000.0049/57ProgressBar::Time#time16 +
  0.000.000.000.002/14ProgressBar::Projectors::SmoothedAverage#start21
  0.000.000.000.0012/14ProgressBar::Projectors::SmoothedAverage#increment29
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Projectors::SmoothedAverage#progress= + + 42
  0.000.000.000.0014/14<Class::ProgressBar::Projectors::SmoothedAverage>#calculate44 +
  0.000.000.000.0014/14ProgressBar::Projectors::SmoothedAverage#absolute44 +
  0.000.000.000.0014/16Array#[]=43 +
  0.000.000.000.0014/17ProgressBar::Projectors::SmoothedAverage#projection=44 +
  0.000.000.000.0014/14Kernel#class44 +
  0.000.000.000.0014/14ProgressBar::Projectors::SmoothedAverage#strength44 +
  0.000.000.000.0014/57ProgressBar::Projectors::SmoothedAverage#samples43 +
  0.000.000.000.001/13ProgressBar::Projectors::SmoothedAverage#start21
  0.000.000.000.0012/13ProgressBar::Projectors::SmoothedAverage#increment29
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Projectors::SmoothedAverage#progress + + 32
  0.000.000.000.0013/4792535Array#[]33 +
  0.000.000.000.0013/57ProgressBar::Projectors::SmoothedAverage#samples33 +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Projectors::SmoothedAverage#initialize + + 11
  0.000.000.000.001/2ProgressBar::Projectors::SmoothedAverage#start16 +
  0.000.000.000.001/1ProgressBar::Projectors::SmoothedAverage#samples=12 +
  0.000.000.000.001/1ProgressBar::Projectors::SmoothedAverage#strength=14 +
  0.000.000.000.001/17ProgressBar::Projectors::SmoothedAverage#projection=13 +
  0.000.000.000.001/2798991Hash#[]14 +
  0.000.000.000.0025/205ProgressBar::Progress#unknown?90
  0.000.000.000.0039/205ProgressBar::Progress#percentage_completed_with_precision98
  0.000.000.000.0024/205ProgressBar::Progress#increment32
  0.000.000.000.0078/205ProgressBar::Progress#percentage_completed74
  0.000.000.000.0011/205ProgressBar::Components::Time#estimated_seconds_remaining97
  0.000.000.000.0028/205ProgressBar::Progress#progress=56
0.00%0.00%0.000.000.000.00205 + + ProgressBar::Progress#total + +
  0.000.000.000.002/14ProgressBar::Progress#start19
  0.000.000.000.0012/14ProgressBar::Progress#increment38
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Progress#progress= + + 55
  0.000.000.000.0028/205ProgressBar::Progress#total56 +
  0.000.000.000.0014/25Integer#>56 +
  0.000.000.000.001/113ProgressBar::Progress#start19
  0.000.000.000.001/113ProgressBar::Progress#total=65
  0.000.000.000.0011/113ProgressBar::Progress#none?86
  0.000.000.000.0013/113ProgressBar::Progress#percentage_completed_with_precision101
  0.000.000.000.0025/113ProgressBar::Progress#unknown?90
  0.000.000.000.0026/113ProgressBar::Progress#percentage_completed82
  0.000.000.000.0036/113ProgressBar::Progress#increment32
0.00%0.00%0.000.000.000.00113 + + ProgressBar::Progress#progress + +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Progress#initialize + + 12
  0.000.000.000.001/2ProgressBar::Progress#start15 +
  0.000.000.000.001/1ProgressBar::Progress#total=13 +
  0.000.000.000.001/21Hash#fetch13 +
  0.000.000.000.0013/50ProgressBar::Components::Time#estimated_with_elapsed_fallback89
  0.000.000.000.0037/50ProgressBar::Base#finished?130
0.00%0.00%0.000.000.000.0050 + + ProgressBar::Progress#finished? + + 27
  0.000.000.000.0050/125Integer#==28 +
  0.000.000.000.0013/13ProgressBar::Output#refresh51
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Output#throttle + +
  0.000.000.000.0013/39ProgressBar::Outputs::Tty#bar_update_string16
  0.000.000.000.0013/39ProgressBar::Outputs::Tty#eol28
  0.000.000.000.0013/39ProgressBar::Output#refresh51
0.00%0.00%0.000.000.000.0039 + + ProgressBar::Output#bar + +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Title#initialize + + 8
  0.000.000.000.001/1ProgressBar::Components::Title#title=9 +
  0.000.000.000.001/2798991Hash#[]9 +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Time#initialize + + 21
  0.000.000.000.001/1ProgressBar::Components::Time#progress=23 +
  0.000.000.000.001/1ProgressBar::Components::Time#timer=22 +
  0.000.000.000.001/1ProgressBar::Components::Time#projector=24 +
  0.000.000.000.003/2798991Hash#[]22 +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Rate#initialize + + 8
  0.000.000.000.001/1Kernel#lambda9 +
  0.000.000.000.001/1ProgressBar::Components::Rate#progress=11 +
  0.000.000.000.001/1ProgressBar::Components::Rate#rate_scale=9 +
  0.000.000.000.001/1ProgressBar::Components::Rate#timer=10 +
  0.000.000.000.003/2798991Hash#[]9 +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Percentage#initialize + + 6
  0.000.000.000.001/1ProgressBar::Components::Percentage#progress=7 +
  0.000.000.000.001/2798991Hash#[]7 +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Bar#initialize + + 17
  0.000.000.000.001/1ProgressBar::Components::Bar#progress=21 +
  0.000.000.000.001/14ProgressBar::Components::Bar#length=22 +
  0.000.000.000.001/1ProgressBar::Components::Bar#upa_steps=18 +
  0.000.000.000.005/2798991Hash#[]18 +
  0.000.000.000.001/1ProgressBar::Components::Bar#progress_mark=19 +
  0.000.000.000.001/1ProgressBar::Components::Bar#remainder_mark=20 +
  0.000.000.000.0013/26ProgressBar::Outputs::Tty#eol28
  0.000.000.000.0013/26ProgressBar::Output#refresh51
0.00%0.00%0.000.000.000.0026 + + ProgressBar::Base#stopped? + + 123
  0.000.000.000.0024/37ProgressBar::Base#finished?124 +
  0.000.000.000.0026/51ProgressBar::Timer#stopped?124 +
  0.000.000.000.0026/29ProgressBar::Base#timer124 +
  0.000.000.000.0037/37ProgressBar::Base#finished?130
0.00%0.00%0.000.000.000.0037 + + ProgressBar::Base#finished + +
  0.000.000.000.0037/37ProgressBar::Base#finished?130
0.00%0.00%0.000.000.000.0037 + + ProgressBar::Base#autofinish + +
  0.000.000.000.001/1<Class::ProgressBar::Output>#detect21
0.00%0.00%0.000.000.000.001 + + Kernel#is_a? + +
  0.000.000.000.0012/125BasicObject#!=
  0.000.000.000.0013/125ProgressBar::Progress#percentage_completed_with_precision98
  0.000.000.000.0026/125ProgressBar::Progress#percentage_completed75
  0.000.000.000.0024/125ProgressBar::Progress#increment32
  0.000.000.000.0050/125ProgressBar::Progress#finished?28
0.00%0.00%0.000.000.000.00125 + + Integer#== + +
  0.000.000.000.0013/37<Class::ProgressBar::Format::Formatter>#process13
  0.000.000.000.0012/37ProgressBar::Projectors::SmoothedAverage#increment29
  0.000.000.000.0012/37ProgressBar::Progress#increment38
0.00%0.00%0.000.000.000.0037 + + Integer#+ + +
  0.000.000.000.001/14<Class::ProgressBar::Output>#detect23
  0.000.000.000.0013/14ProgressBar::Calculators::Length#dynamic_width57
0.00%0.00%0.000.000.000.0014 + + IO#tty? + +
  0.000.000.000.002/2ProgressBar::Timer#initialize9
0.00%0.00%0.000.000.000.002 + + ProgressBar::Timer#time= + +
  0.000.000.000.0011/51ProgressBar::Components::Time#estimated_seconds_remaining95
  0.000.000.000.0014/51ProgressBar::Timer#start13
  0.000.000.000.0026/51ProgressBar::Base#stopped?124
0.00%0.00%0.000.000.000.0051 + + ProgressBar::Timer#stopped? + + 39
  0.000.000.000.0051/87ProgressBar::Timer#stopped_at40 +
  0.000.000.000.0013/27ProgressBar::Timer#reset44
  0.000.000.000.0014/27ProgressBar::Timer#start13
0.00%0.00%0.000.000.000.0027 + + ProgressBar::Timer#started_at= + +
  0.000.000.000.0011/111ProgressBar::Timer#reset?49
  0.000.000.000.0036/111ProgressBar::Timer#elapsed_seconds60
  0.000.000.000.0064/111ProgressBar::Timer#started?36
0.00%0.00%0.000.000.000.00111 + + ProgressBar::Timer#started_at + +
  0.000.000.000.0013/13ProgressBar::Throttle#choke20
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Timer#restart + + 52
  0.000.000.000.0013/14ProgressBar::Timer#start54 +
  0.000.000.000.0013/13ProgressBar::Timer#reset53 +
  0.000.000.000.0049/49ProgressBar::Time#now16
0.00%0.00%0.000.000.000.0049 + + ProgressBar::Time#unmocked_time_method + + 19
  0.000.000.000.002/2Enumerable#find20 +
  0.000.000.000.008/57Array#each
  0.000.000.000.0049/57ProgressBar::Time#now16
0.00%0.00%0.000.000.000.0057 + + ProgressBar::Time#time + +
  0.000.000.000.0037/37ProgressBar::Throttle#choke16
0.00%0.00%0.000.000.000.0037 + + ProgressBar::Throttle#timer + +
  0.000.000.000.0011/11ProgressBar::Throttle#choke16
0.00%0.00%0.000.000.000.0011 + + ProgressBar::Throttle#rate + +
  0.000.000.000.001/1ProgressBar::Projectors::SmoothedAverage#initialize14
0.00%0.00%0.000.000.000.001 + + ProgressBar::Projectors::SmoothedAverage#strength= + +
  0.000.000.000.0014/14ProgressBar::Projectors::SmoothedAverage#progress=44
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Projectors::SmoothedAverage#strength + +
  0.000.000.000.001/2ProgressBar::Output#with_refresh229
  0.000.000.000.001/2ProgressBar::Projectors::SmoothedAverage#initialize16
0.00%0.00%0.000.000.000.002 + + ProgressBar::Projectors::SmoothedAverage#start + + 19
  0.000.000.000.002/14ProgressBar::Projectors::SmoothedAverage#progress=21 +
  0.000.000.000.001/13ProgressBar::Projectors::SmoothedAverage#progress21 +
  0.000.000.000.002/16Array#[]=21 +
  0.000.000.000.002/57ProgressBar::Projectors::SmoothedAverage#samples21 +
  0.000.000.000.002/2798991Hash#[]21 +
  0.000.000.000.002/17ProgressBar::Projectors::SmoothedAverage#projection=20 +
  0.000.000.000.001/1ProgressBar::Projectors::SmoothedAverage#initialize12
0.00%0.00%0.000.000.000.001 + + ProgressBar::Projectors::SmoothedAverage#samples= + +
  0.000.000.000.002/57ProgressBar::Projectors::SmoothedAverage#start21
  0.000.000.000.0014/57ProgressBar::Projectors::SmoothedAverage#progress=43
  0.000.000.000.0013/57ProgressBar::Projectors::SmoothedAverage#progress33
  0.000.000.000.0028/57ProgressBar::Projectors::SmoothedAverage#absolute67
0.00%0.00%0.000.000.000.0057 + + ProgressBar::Projectors::SmoothedAverage#samples + +
  0.000.000.000.002/17ProgressBar::Projectors::SmoothedAverage#start20
  0.000.000.000.001/17ProgressBar::Projectors::SmoothedAverage#initialize13
  0.000.000.000.0014/17ProgressBar::Projectors::SmoothedAverage#progress=44
0.00%0.00%0.000.000.000.0017 + + ProgressBar::Projectors::SmoothedAverage#projection= + +
  0.000.000.000.0014/14ProgressBar::Projectors::SmoothedAverage#progress=44
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Projectors::SmoothedAverage#absolute + + 66
  0.000.000.000.0028/57ProgressBar::Projectors::SmoothedAverage#samples67 +
  0.000.000.000.0014/40Integer#-67 +
  0.000.000.000.0028/4792535Array#[]67 +
  0.000.000.000.001/1ProgressBar::Progress#initialize13
0.00%0.00%0.000.000.000.001 + + ProgressBar::Progress#total= + + 64
  0.000.000.000.001/2NilClass#nil?65 +
  0.000.000.000.001/113ProgressBar::Progress#progress65 +
  0.000.000.000.001/2ProgressBar::Output#with_refresh228
  0.000.000.000.001/2ProgressBar::Progress#initialize15
0.00%0.00%0.000.000.000.002 + + ProgressBar::Progress#start + + 18
  0.000.000.000.002/14ProgressBar::Progress#progress=19 +
  0.000.000.000.002/2ProgressBar::Progress#starting_position=19 +
  0.000.000.000.002/2798991Hash#[]19 +
  0.000.000.000.001/113ProgressBar::Progress#progress19 +
  0.000.000.000.001/27ProgressBar::Output#clear_string38
  0.000.000.000.0013/27ProgressBar::Output#length42
  0.000.000.000.0013/27ProgressBar::Throttle#choke52
0.00%0.00%0.000.000.000.0027 + + ProgressBar::Output#length_calculator + +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Output#initialize + + 10
  0.000.000.000.002/107631Class#new13 +
  0.000.000.000.001/1ProgressBar::Output#bar=11 +
  0.000.000.000.001/1ProgressBar::Output#throttle=13 +
  0.000.000.000.001/1ProgressBar::Output#length_calculator=14 +
  0.000.000.000.001/1ProgressBar::Output#stream=12 +
  0.000.000.000.001/29ProgressBar::Output#stream14 +
  0.000.000.000.003/2798991Hash#[]11 +
  0.000.000.000.001/1ProgressBar::Components::Title#initialize9
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Title#title= + +
  0.000.000.000.001/1ProgressBar::Components::Time#initialize22
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Time#timer= + +
  0.000.000.000.001/1ProgressBar::Components::Time#initialize24
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Time#projector= + +
  0.000.000.000.001/1ProgressBar::Components::Time#initialize23
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Time#progress= + +
  0.000.000.000.001/1ProgressBar::Components::Rate#initialize10
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Rate#timer= + +
  0.000.000.000.001/1ProgressBar::Components::Rate#initialize9
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Rate#rate_scale= + +
  0.000.000.000.001/1ProgressBar::Components::Rate#initialize11
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Rate#progress= + +
  0.000.000.000.001/1ProgressBar::Components::Percentage#initialize7
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Percentage#progress= + +
  0.000.000.000.001/1ProgressBar::Components::Bar#initialize18
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Bar#upa_steps= + +
  0.000.000.000.001/1ProgressBar::Components::Bar#initialize20
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Bar#remainder_mark= + +
  0.000.000.000.001/1ProgressBar::Components::Bar#initialize19
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Bar#progress_mark= + +
  0.000.000.000.001/1ProgressBar::Components::Bar#initialize21
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Bar#progress= + +
  0.000.000.000.001/14ProgressBar::Components::Bar#initialize22
  0.000.000.000.0013/14ProgressBar::Components::Bar#complete_bar42
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Components::Bar#length= + +
  0.000.000.000.001/1ProgressBar::Components::Rate#initialize9
0.00%0.00%0.000.000.000.001 + + Kernel#lambda + +
  0.000.000.000.0014/14ProgressBar::Projectors::SmoothedAverage#progress=44
0.00%0.00%0.000.000.000.0014 + + Kernel#class + + 18
  0.000.000.000.0011/25ProgressBar::Components::Time#estimated73
  0.000.000.000.0014/25ProgressBar::Progress#progress=56
0.00%0.00%0.000.000.000.0025 + + Integer#> + +
  0.000.000.000.0011/11ProgressBar::Throttle#choke16
0.00%0.00%0.000.000.000.0011 + + Float#>= + +
  0.000.000.000.004/28ProgressBar::Format::Molecule#non_bar_molecule?43
  0.000.000.000.0011/28ProgressBar::Timer#reset?49
  0.000.000.000.0013/28ProgressBar::Throttle#choke16
0.00%0.00%0.000.000.000.0028 + + BasicObject#! + +
  0.000.000.000.002/16ProgressBar::Projectors::SmoothedAverage#start21
  0.000.000.000.0014/16ProgressBar::Projectors::SmoothedAverage#progress=43
0.00%0.00%0.000.000.000.0016 + + Array#[]= + +
  0.000.000.000.0049/49ProgressBar::Time#now16
0.00%0.00%0.000.000.000.0049 + + <Class::Time>#now + + 225
  0.000.000.000.0014/14ProgressBar::Projectors::SmoothedAverage#progress=44
0.00%0.00%0.000.000.000.0014 + + <Class::ProgressBar::Projectors::SmoothedAverage>#calculate + + 56
  0.000.000.000.0014/25Float#-57 +
  0.000.000.000.0014/14Float#+57 +
  0.000.000.000.0014/80Integer#*57 +
  0.000.000.000.0014/38Float#*57 +
  0.000.000.000.0036/36ProgressBar::Timer#elapsed_seconds60
0.00%0.00%0.000.000.000.0036 + + Time#- + +
  0.000.000.000.0036/36Integer#fdiv +
  0.000.000.000.0036/87ProgressBar::Timer#elapsed_seconds60
  0.000.000.000.0051/87ProgressBar::Timer#stopped?40
0.00%0.00%0.000.000.000.0087 + + ProgressBar::Timer#stopped_at + +
  0.000.000.000.0013/13ProgressBar::Timer#restart53
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Timer#reset + + 43
  0.000.000.000.0013/27ProgressBar::Timer#started_at=44 +
  0.000.000.000.0013/28ProgressBar::Timer#stopped_at=45 +
  0.000.000.000.002/2Class#new
0.00%0.00%0.000.000.000.002 + + ProgressBar::Time#initialize + + 11
  0.000.000.000.002/2ProgressBar::Time#time=12 +
  0.000.000.000.002/2ProgressBar::Progress#start19
0.00%0.00%0.000.000.000.002 + + ProgressBar::Progress#starting_position= + +
  0.000.000.000.0013/13ProgressBar::Output#print_and_flush67
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Outputs::Tty#eol + + 27
  0.000.000.000.0013/26ProgressBar::Base#stopped?28 +
  0.000.000.000.0013/39ProgressBar::Output#bar28 +
  0.000.000.000.001/1ProgressBar::Output#initialize13
0.00%0.00%0.000.000.000.001 + + ProgressBar::Output#throttle= + +
  0.000.000.000.001/1ProgressBar::Output#initialize12
0.00%0.00%0.000.000.000.001 + + ProgressBar::Output#stream= + +
  0.000.000.000.002/29ProgressBar::Outputs::Tty#clear11
  0.000.000.000.001/29ProgressBar::Output#initialize14
  0.000.000.000.0026/29ProgressBar::Output#print_and_flush67
0.00%0.00%0.000.000.000.0029 + + ProgressBar::Output#stream + +
  0.000.000.000.001/1ProgressBar::Output#initialize14
0.00%0.00%0.000.000.000.001 + + ProgressBar::Output#length_calculator= + +
  0.000.000.000.001/1ProgressBar::Output#initialize11
0.00%0.00%0.000.000.000.001 + + ProgressBar::Output#bar= + +
  0.000.000.000.001/14ProgressBar::Calculators::Length#initialize11
  0.000.000.000.0013/14ProgressBar::Calculators::Length#length_changed?20
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Calculators::Length#current_length= + +
  0.000.000.000.0014/40ProgressBar::Calculators::Length#length15
  0.000.000.000.0026/40ProgressBar::Calculators::Length#length_changed?19
0.00%0.00%0.000.000.000.0040 + + ProgressBar::Calculators::Length#current_length + +
  0.000.000.000.0013/40ProgressBar::Components::Bar#incomplete_string82
  0.000.000.000.0013/40<Class::ProgressBar::Format::Formatter>#process13
  0.000.000.000.0014/40ProgressBar::Projectors::SmoothedAverage#absolute67
0.00%0.00%0.000.000.000.0040 + + Integer#- + +
  0.000.000.000.001/80ProgressBar::Format::String#bar_molecule_placeholder_length14
  0.000.000.000.0013/80ProgressBar::Progress#percentage_completed_with_precision101
  0.000.000.000.0026/80ProgressBar::Components::Bar#completed_length92
  0.000.000.000.0026/80ProgressBar::Progress#percentage_completed82
  0.000.000.000.0014/80<Class::ProgressBar::Projectors::SmoothedAverage>#calculate57
0.00%0.00%0.000.000.000.0080 + + Integer#* + +
  0.000.000.000.0013/13ProgressBar::Output#print_and_flush68
0.00%0.00%0.000.000.000.0013 + + IO#flush + +
  0.000.000.000.0011/25ProgressBar::Components::Time#estimated_seconds_remaining97
  0.000.000.000.0014/25<Class::ProgressBar::Projectors::SmoothedAverage>#calculate57
0.00%0.00%0.000.000.000.0025 + + Float#- + +
  0.000.000.000.0014/14<Class::ProgressBar::Projectors::SmoothedAverage>#calculate57
0.00%0.00%0.000.000.000.0014 + + Float#+ + +
  0.000.000.000.0011/38ProgressBar::Components::Time#estimated_seconds_remaining97
  0.000.000.000.0013/38ProgressBar::Progress#percentage_completed_with_precision101
  0.000.000.000.0014/38<Class::ProgressBar::Projectors::SmoothedAverage>#calculate57
0.00%0.00%0.000.000.000.0038 + + Float#* + +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#length_changed?22
0.00%0.00%0.000.000.000.0013 + + BasicObject#!= + +
  0.000.000.000.0012/125Integer#== +
  0.000.000.000.001/1BasicObject#== +
  0.000.000.000.002/2ProgressBar::Time#initialize12
0.00%0.00%0.000.000.000.002 + + ProgressBar::Time#time= + +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Throttle#initialize + + 8
  0.000.000.000.001/107631Class#new12 +
  0.000.000.000.001/1ProgressBar::Throttle#timer=12 +
  0.000.000.000.001/1ProgressBar::Throttle#rate=9 +
  0.000.000.000.001/1ProgressBar::Throttle#started_at=10 +
  0.000.000.000.001/1ProgressBar::Throttle#stopped_at=11 +
  0.000.000.000.001/21Hash#fetch12 +
  0.000.000.000.001/2798991Hash#[]9 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#calculate_length26
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#length_override + +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Calculators::Length#initialize + + 8
  0.000.000.000.001/1ProgressBar::Calculators::Length#length_override=9 +
  0.000.000.000.001/14ProgressBar::Calculators::Length#current_length=11 +
  0.000.000.000.001/1ProgressBar::Calculators::Length#output=10 +
  0.000.000.000.002/2798991Hash#[]9 +
  0.000.000.000.0036/36Time#-
0.00%0.00%0.000.000.000.0036 + + Integer#fdiv + +
  0.000.000.000.002/2ProgressBar::Time#unmocked_time_method20
0.00%0.00%0.000.000.000.002 + + Enumerable#find + +
  0.000.000.000.002/39Array#each +
  0.000.000.000.001/1ProgressBar::Throttle#initialize12
0.00%0.00%0.000.000.000.001 + + ProgressBar::Throttle#timer= + +
  0.000.000.000.001/1ProgressBar::Throttle#initialize11
0.00%0.00%0.000.000.000.001 + + ProgressBar::Throttle#stopped_at= + +
  0.000.000.000.001/1ProgressBar::Throttle#initialize10
0.00%0.00%0.000.000.000.001 + + ProgressBar::Throttle#started_at= + +
  0.000.000.000.001/1ProgressBar::Throttle#initialize9
0.00%0.00%0.000.000.000.001 + + ProgressBar::Throttle#rate= + +
  0.000.000.000.001/1ProgressBar::Throttle#choke52
0.00%0.00%0.000.000.000.001 + + ProgressBar::Outputs::Tty#clear + + 10
  0.000.000.000.002/15IO#print11 +
  0.000.000.000.001/1ProgressBar::Output#clear_string11 +
  0.000.000.000.002/29ProgressBar::Output#stream11 +
  0.000.000.000.0013/13ProgressBar::Base#to_s172
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Output#length + + 41
  0.000.000.000.0013/14ProgressBar::Calculators::Length#length42 +
  0.000.000.000.0013/27ProgressBar::Output#length_calculator42 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#terminal_width44
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#unix? + + 93
  0.000.000.000.0013/447587String#=~94 +
  0.000.000.000.001/1ProgressBar::Calculators::Length#initialize10
0.00%0.00%0.000.000.000.001 + + ProgressBar::Calculators::Length#output= + +
  0.000.000.000.001/1ProgressBar::Calculators::Length#initialize9
0.00%0.00%0.000.000.000.001 + + ProgressBar::Calculators::Length#length_override= + + 33
  0.000.000.000.001/1#<Class:0x0000000104082f00>#[]34 +
  0.000.000.000.0013/26<Class::ProgressBar::Format::Formatter>#process16
  0.000.000.000.0013/26ProgressBar::Calculators::Length#terminal_width47
0.00%0.00%0.000.000.000.0026 + + Integer#< + +
  0.000.000.000.0013/13<Class::ProgressBar::Format::Formatter>#process5
0.00%0.00%0.000.000.000.0013 + + String#dup + +
  0.000.000.000.0013/13Kernel#initialize_dup +
  0.000.000.000.001/1ProgressBar::Outputs::Tty#clear11
0.00%0.00%0.000.000.000.001 + + ProgressBar::Output#clear_string + + 37
  0.000.000.000.001/27String#*38 +
  0.000.000.000.001/14ProgressBar::Calculators::Length#length38 +
  0.000.000.000.001/27ProgressBar::Output#length_calculator38 +
  0.000.000.000.0013/13<Class::ProgressBar::Format::Formatter>#process7
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Format::String#non_bar_molecules + + 17
  0.000.000.000.001/2ProgressBar::Format::String#molecules18 +
  0.000.000.000.001/2Array#select18 +
  0.000.000.000.0013/13<Class::ProgressBar::Format::Formatter>#process13
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Format::String#displayable_length + + 9
  0.000.000.000.0013/13String#gsub10 +
  0.000.000.000.0013/13String#length10 +
  0.000.000.000.0013/14<Class::ProgressBar::Format::Formatter>#process18
  0.000.000.000.001/14ProgressBar::Format::String#bar_molecule_placeholder_length14
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Format::String#bar_molecules + + 21
  0.000.000.000.001/2Array#select22 +
  0.000.000.000.001/2ProgressBar::Format::String#molecules22 +
  0.000.000.000.0013/13<Class::ProgressBar::Format::Formatter>#process13
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Format::String#bar_molecule_placeholder_length + + 13
  0.000.000.000.001/14ProgressBar::Format::String#bar_molecules14 +
  0.000.000.000.001/1Array#size14 +
  0.000.000.000.001/80Integer#*14 +
  0.000.000.000.0013/52ProgressBar::Calculators::Length#dynamic_width_via_output_stream_object72
  0.000.000.000.0039/52ProgressBar::Calculators::Length#dynamic_width57
0.00%0.00%0.000.000.000.0052 + + ProgressBar::Calculators::Length#output + +
  0.000.000.000.001/14ProgressBar::Output#clear_string38
  0.000.000.000.0013/14ProgressBar::Output#length42
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Calculators::Length#length + + 14
  0.000.000.000.0014/40ProgressBar::Calculators::Length#current_length15 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#dynamic_width58
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#dynamic_width_via_output_stream_object + + 71
  0.000.000.000.0013/13IO#winsize72 +
  0.000.000.000.0013/52ProgressBar::Calculators::Length#output72 +
  0.000.000.000.008/21Array#each
  0.000.000.000.0013/21ProgressBar::Calculators::Length#dynamic_width57
0.00%0.00%0.000.000.000.0021 + + Kernel#respond_to? + +
  0.000.000.000.001/1ProgressBar::Calculators::Length#length_override=34
0.00%0.00%0.000.000.000.001 + + #<Class:0x0000000104082f00>#[] + +
  0.000.000.000.0013/13ProgressBar::Format::String#displayable_length10
0.00%0.00%0.000.000.000.0013 + + String#length + +
  0.000.000.000.0013/13ProgressBar::Format::String#displayable_length10
0.00%0.00%0.000.000.000.0013 + + String#gsub + +
  0.000.000.000.001/27ProgressBar::Output#clear_string38
  0.000.000.000.0013/27ProgressBar::Components::Bar#incomplete_string82
  0.000.000.000.0013/27ProgressBar::Components::Bar#standard_complete_string78
0.00%0.00%0.000.000.000.0027 + + String#* + +
  0.000.000.000.0052/52Array#each
0.00%0.00%0.000.000.000.0052 + + ProgressBar::Format::Molecule#full_key + + 46
  0.000.000.000.0052/116ProgressBar::Format::Molecule#key47 +
  0.000.000.000.0013/13String#dup
0.00%0.00%0.000.000.000.0013 + + Kernel#initialize_dup + +
  0.000.000.000.0013/13String#initialize_copy +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#dynamic_width_via_output_stream_object72
0.00%0.00%0.000.000.000.0013 + + IO#winsize + +
  0.000.000.000.001/1BasicObject#!=
0.00%0.00%0.000.000.000.001 + + BasicObject#== + +
  0.000.000.000.0013/65ProgressBar::Components::Percentage#justified_percentage_with_precision23
  0.000.000.000.0052/65ProgressBar::Format::Molecule#lookup_value56
0.00%0.00%0.000.000.000.0065 + + String#to_s + +
  0.000.000.000.0013/13Kernel#initialize_dup
0.00%0.00%0.000.000.000.0013 + + String#initialize_copy + +
  0.000.000.000.00104/104ProgressBar::Format::Molecule#lookup_value51
0.00%0.00%0.000.000.000.00104 + + ProgressBar::Format::Molecule#method_name + +
  0.000.000.000.004/116ProgressBar::Format::Molecule#initialize35
  0.000.000.000.0060/116ProgressBar::Format::Molecule#bar_molecule?39
  0.000.000.000.0052/116ProgressBar::Format::Molecule#full_key47
0.00%0.00%0.000.000.000.00116 + + ProgressBar::Format::Molecule#key + +
  0.000.000.000.004/60Array#select
  0.000.000.000.004/60ProgressBar::Format::Molecule#non_bar_molecule?43
  0.000.000.000.0052/60ProgressBar::Format::Molecule#lookup_value53
0.00%0.00%0.000.000.000.0060 + + ProgressBar::Format::Molecule#bar_molecule? + + 38
  0.000.000.000.0060/60Array#include?39 +
  0.000.000.000.0060/116ProgressBar::Format::Molecule#key39 +
  0.000.000.000.0013/13ProgressBar::Format::Molecule#lookup_value56
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Percentage#justified_percentage_with_precision + + 22
  0.000.000.000.0013/13ProgressBar::Progress#percentage_completed_with_precision23 +
  0.000.000.000.0013/13String#rjust23 +
  0.000.000.000.0013/13ProgressBar::Components::Percentage#progress23 +
  0.000.000.000.0013/65String#to_s23 +
  0.000.000.000.0026/26ProgressBar::Format::Molecule#lookup_value51
0.00%0.00%0.000.000.000.0026 + + ProgressBar::Base#time_component + +
  0.000.000.000.0013/13ProgressBar::Format::Molecule#lookup_value51
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Base#percentage_component + +
  0.000.000.000.0013/13ProgressBar::Format::Molecule#lookup_value51
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Base#bar_component + +
  0.000.000.000.0013/13ProgressBar::Components::Percentage#justified_percentage_with_precision23
0.00%0.00%0.000.000.000.0013 + + String#rjust + +
  0.000.000.000.0013/13ProgressBar::Components::Percentage#justified_percentage_with_precision23
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Progress#percentage_completed_with_precision + + 97
  0.000.000.000.0013/38String#%101 +
  0.000.000.000.0026/89Integer#/101 +
  0.000.000.000.0039/205ProgressBar::Progress#total98 +
  0.000.000.000.0013/13Integer#to_f101 +
  0.000.000.000.0013/89Kernel#nil?99 +
  0.000.000.000.0013/38Float#*101 +
  0.000.000.000.0013/27Float#floor101 +
  0.000.000.000.0013/80Integer#*101 +
  0.000.000.000.0013/113ProgressBar::Progress#progress101 +
  0.000.000.000.0013/125Integer#==98 +
  0.000.000.000.0013/13ProgressBar::Components::Percentage#justified_percentage_with_precision23
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Percentage#progress + +
  0.000.000.000.0060/60ProgressBar::Format::Molecule#bar_molecule?39
0.00%0.00%0.000.000.000.0060 + + Array#include? + +
  0.000.000.000.0013/13ProgressBar::Components::Bar#to_s28
0.00%0.00%0.000.000.000.0013 + + Symbol#== + +
  0.000.000.000.0011/38ProgressBar::Components::Time#estimated76
  0.000.000.000.0013/38ProgressBar::Progress#percentage_completed_with_precision101
  0.000.000.000.0014/38ProgressBar::Components::Time#elapsed85
0.00%0.00%0.000.000.000.0038 + + String#% + +
  0.000.000.000.0014/14ProgressBar::Components::Time#elapsed83
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Timer#elapsed_whole_seconds + + 63
  0.000.000.000.0014/36ProgressBar::Timer#elapsed_seconds64 +
  0.000.000.000.0014/27Float#floor64 +
  0.000.000.000.0011/25ProgressBar::Components::Time#estimated71
  0.000.000.000.0014/25ProgressBar::Components::Time#elapsed83
0.00%0.00%0.000.000.000.0025 + + ProgressBar::Timer#divide_seconds + + 67
  0.000.000.000.0050/50Integer#divmod68 +
  0.000.000.000.0013/25ProgressBar::Components::Bar#to_s26
  0.000.000.000.0012/25ProgressBar::Components::Time#estimated_seconds_remaining95
0.00%0.00%0.000.000.000.0025 + + ProgressBar::Progress#unknown? + + 89
  0.000.000.000.0050/89Kernel#nil?90 +
  0.000.000.000.0025/205ProgressBar::Progress#total90 +
  0.000.000.000.0025/113ProgressBar::Progress#progress90 +
  0.000.000.000.001/2ProgressBar::Format::String#bar_molecules22
  0.000.000.000.001/2ProgressBar::Format::String#non_bar_molecules18
0.00%0.00%0.000.000.000.002 + + ProgressBar::Format::String#molecules + + 25
  0.000.000.000.001/1String#scan29 +
  0.000.000.000.0011/86ProgressBar::Components::Time#estimated71
  0.000.000.000.0033/86ProgressBar::Components::Time#estimated_seconds_remaining95
  0.000.000.000.0042/86ProgressBar::Components::Time#elapsed81
0.00%0.00%0.000.000.000.0086 + + ProgressBar::Components::Time#timer + +
  0.000.000.000.0034/47ProgressBar::Components::Time#estimated_seconds_remaining95
  0.000.000.000.0013/47ProgressBar::Components::Time#estimated_with_elapsed_fallback89
0.00%0.00%0.000.000.000.0047 + + ProgressBar::Components::Time#progress + +
  0.000.000.000.0013/13ProgressBar::Components::Bar#to_s29
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Bar#standard_complete_string + + 77
  0.000.000.000.0013/26ProgressBar::Components::Bar#completed_length78 +
  0.000.000.000.0013/27String#*78 +
  0.000.000.000.0013/13ProgressBar::Components::Bar#progress_mark78 +
  0.000.000.000.0013/39ProgressBar::Components::Bar#to_s26
  0.000.000.000.0026/39ProgressBar::Components::Bar#completed_length92
0.00%0.00%0.000.000.000.0039 + + ProgressBar::Components::Bar#progress + +
  0.000.000.000.0013/13ProgressBar::Components::Bar#to_s29
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Bar#incomplete_string + + 81
  0.000.000.000.0013/26ProgressBar::Components::Bar#completed_length82 +
  0.000.000.000.0013/27String#*82 +
  0.000.000.000.0013/39ProgressBar::Components::Bar#length82 +
  0.000.000.000.0013/13ProgressBar::Components::Bar#remainder_mark82 +
  0.000.000.000.0013/40Integer#-82 +
  0.000.000.000.0013/89ProgressBar::Progress#percentage_completed_with_precision99
  0.000.000.000.0026/89ProgressBar::Progress#percentage_completed74
  0.000.000.000.0050/89ProgressBar::Progress#unknown?90
0.00%0.00%0.000.000.000.0089 + + Kernel#nil? + +
  0.000.000.000.0013/13ProgressBar::Progress#percentage_completed_with_precision101
0.00%0.00%0.000.000.000.0013 + + Integer#to_f + +
  0.000.000.000.0011/89ProgressBar::Components::Time#estimated_seconds_remaining97
  0.000.000.000.0026/89ProgressBar::Progress#percentage_completed82
  0.000.000.000.0026/89ProgressBar::Components::Bar#completed_length92
  0.000.000.000.0026/89ProgressBar::Progress#percentage_completed_with_precision101
0.00%0.00%0.000.000.000.0089 + + Integer#/ + +
  0.000.000.000.0013/27ProgressBar::Progress#percentage_completed_with_precision101
  0.000.000.000.0014/27ProgressBar::Timer#elapsed_whole_seconds64
0.00%0.00%0.000.000.000.0027 + + Float#floor + +
  0.000.000.000.001/1ProgressBar::Format::String#bar_molecule_placeholder_length14
0.00%0.00%0.000.000.000.001 + + Array#size + +
  0.000.000.000.001/2ProgressBar::Format::String#bar_molecules22
  0.000.000.000.001/2ProgressBar::Format::String#non_bar_molecules18
0.00%0.00%0.000.000.000.002 + + Array#select + +
  0.000.000.000.004/4ProgressBar::Format::Molecule#non_bar_molecule? +
  0.000.000.000.004/60ProgressBar::Format::Molecule#bar_molecule? +
  0.000.000.000.001/1ProgressBar::Format::String#molecules29
0.00%0.00%0.000.000.000.001 + + String#scan + +
  0.000.000.000.004/107631Class#new30 +
  0.000.000.000.004/4String#[]30 +
  0.000.000.000.004/592394Array#<<30 +
  0.000.000.000.004/4Array#select
0.00%0.00%0.000.000.000.004 + + ProgressBar::Format::Molecule#non_bar_molecule? + + 42
  0.000.000.000.004/60ProgressBar::Format::Molecule#bar_molecule?43 +
  0.000.000.000.004/28BasicObject#!43 +
  0.000.000.000.0013/13ProgressBar::Components::Bar#incomplete_string82
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Bar#remainder_mark + +
  0.000.000.000.0013/13ProgressBar::Components::Bar#standard_complete_string78
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Bar#progress_mark + +
  0.000.000.000.0013/39ProgressBar::Components::Bar#incomplete_string82
  0.000.000.000.0026/39ProgressBar::Components::Bar#completed_length92
0.00%0.00%0.000.000.000.0039 + + ProgressBar::Components::Bar#length + +
  0.000.000.000.0013/26ProgressBar::Components::Bar#incomplete_string82
  0.000.000.000.0013/26ProgressBar::Components::Bar#standard_complete_string78
0.00%0.00%0.000.000.000.0026 + + ProgressBar::Components::Bar#completed_length + + 91
  0.000.000.000.0026/26ProgressBar::Progress#percentage_completed92 +
  0.000.000.000.0026/89Integer#/92 +
  0.000.000.000.0026/39ProgressBar::Components::Bar#length92 +
  0.000.000.000.0026/39ProgressBar::Components::Bar#progress92 +
  0.000.000.000.0026/26Integer#floor92 +
  0.000.000.000.0026/80Integer#*92 +
  0.000.000.000.0050/50ProgressBar::Timer#divide_seconds68
0.00%0.00%0.000.000.000.0050 + + Integer#divmod + +
  0.000.000.000.004/4String#scan
0.00%0.00%0.000.000.000.004 + + String#[] + +
  0.000.000.000.0026/26ProgressBar::Components::Bar#completed_length92
0.00%0.00%0.000.000.000.0026 + + ProgressBar::Progress#percentage_completed + + 73
  0.000.000.000.0078/205ProgressBar::Progress#total74 +
  0.000.000.000.0026/26Integer#to_i82 +
  0.000.000.000.0026/80Integer#*82 +
  0.000.000.000.0026/89Integer#/82 +
  0.000.000.000.0026/89Kernel#nil?74 +
  0.000.000.000.0026/125Integer#==75 +
  0.000.000.000.0026/113ProgressBar::Progress#progress82 +
  0.000.000.000.0026/26ProgressBar::Components::Bar#completed_length92
0.00%0.00%0.000.000.000.0026 + + Integer#floor + +
  0.000.000.000.0011/11ProgressBar::Components::Time#estimated_seconds_remaining95
0.00%0.00%0.000.000.000.0011 + + ProgressBar::Timer#reset? + + 48
  0.000.000.000.0011/111ProgressBar::Timer#started_at49 +
  0.000.000.000.0011/28BasicObject#!49 +
  0.000.000.000.0012/23ProgressBar::Projectors::SmoothedAverage#none?53
  0.000.000.000.0011/23ProgressBar::Components::Time#estimated_seconds_remaining97
0.00%0.00%0.000.000.000.0023 + + ProgressBar::Projectors::SmoothedAverage#projection + +
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated_seconds_remaining95
0.00%0.00%0.000.000.000.0012 + + ProgressBar::Projectors::SmoothedAverage#none? + + 52
  0.000.000.000.0012/12Float#zero?53 +
  0.000.000.000.0012/23ProgressBar::Projectors::SmoothedAverage#projection53 +
  0.000.000.000.0011/11ProgressBar::Components::Time#estimated_seconds_remaining95
0.00%0.00%0.000.000.000.0011 + + ProgressBar::Progress#none? + + 85
  0.000.000.000.0011/11Integer#zero?86 +
  0.000.000.000.0011/113ProgressBar::Progress#progress86 +
  0.000.000.000.004/4Class#new
0.00%0.00%0.000.000.000.004 + + ProgressBar::Format::Molecule#initialize + + 33
  0.000.000.000.004/4String#to_sym35 +
  0.000.000.000.004/4ProgressBar::Format::Molecule#method_name=35 +
  0.000.000.000.004/21Hash#fetch35 +
  0.000.000.000.004/4ProgressBar::Format::Molecule#key=34 +
  0.000.000.000.004/116ProgressBar::Format::Molecule#key35 +
  0.000.000.000.0023/23ProgressBar::Components::Time#estimated_seconds_remaining95
0.00%0.00%0.000.000.000.0023 + + ProgressBar::Components::Time#projector + +
  0.000.000.000.0026/26ProgressBar::Progress#percentage_completed82
0.00%0.00%0.000.000.000.0026 + + Integer#to_i + + 247
  0.000.000.000.0011/11ProgressBar::Components::Time#estimated_seconds_remaining97
0.00%0.00%0.000.000.000.0011 + + Float#round + +
  0.000.000.000.004/4ProgressBar::Format::Molecule#initialize35
0.00%0.00%0.000.000.000.004 + + String#to_sym + +
  0.000.000.000.004/4ProgressBar::Format::Molecule#initialize35
0.00%0.00%0.000.000.000.004 + + ProgressBar::Format::Molecule#method_name= + +
  0.000.000.000.004/4ProgressBar::Format::Molecule#initialize34
0.00%0.00%0.000.000.000.004 + + ProgressBar::Format::Molecule#key= + +
  0.000.000.000.0011/11ProgressBar::Progress#none?86
0.00%0.00%0.000.000.000.0011 + + Integer#zero? + + 263
  0.000.000.000.0012/12ProgressBar::Projectors::SmoothedAverage#none?53
0.00%0.00%0.000.000.000.0012 + + Float#zero? + + 349
* indicates recursively called methods
+ +
+ + + + diff --git a/prof_reports/ruby_prof_graph_before.html b/prof_reports/ruby_prof_graph_before.html new file mode 100644 index 00000000..54ed9ae2 --- /dev/null +++ b/prof_reports/ruby_prof_graph_before.html @@ -0,0 +1,21529 @@ + + + + + + +
+
+
+
Profile Report
+

Wall_time

+
+
+
Sunday, January 26 at 9:48:37 PM (+05)
+ +
+
+
+
+ + + + + + + + + + + + + +
Thread IDFiber IDTotal
806017.91491174697876
+ + + +

Thread 80, Fiber: 60

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
%Total%SelfTotalSelfWaitChildCallsNameLine
100.00%0.00%17.910.000.0017.911 + + [global]# + + 10
  17.910.010.0017.911/1Object#work10 +
  17.910.010.0017.911/1[global]#10
100.00%0.04%17.910.010.0017.911 + + Object#work + + 53
  12.320.650.0011.673/39Array#each66 +
  4.760.000.004.767/7Object#collect_stats_from_users128 +
  0.360.000.000.361/1Object#select_sessions_for_users115 +
  0.160.110.000.052/1183712Array#map104 +
  0.150.150.000.001/1JSON::Ext::Generator::GeneratorMethods::Hash#to_json169 +
  0.060.060.000.001/1400001String#split60 +
  0.050.050.000.001/215221Array#sort104 +
  0.020.020.000.001/1Array#uniq104 +
  0.010.010.000.001/16IO#write169 +
  0.010.010.000.001/1<Class::IO>#read60 +
  0.000.000.000.0012/12ProgressBar::Base#increment61 +
  0.000.000.000.001/1<Class::ProgressBar>#create57 +
  0.000.000.000.001/1Enumerable#count100 +
  0.000.000.000.001/107631Class#new93 +
  0.000.000.000.001/107611Array#join104 +
  0.000.000.000.002/107612Array#count90 +
  0.000.000.000.001/1560528Hash#[]=90 +
  0.000.000.000.001/1400001String#==57 +
  0.000.000.000.002/39Enumerable#find
  0.000.000.000.0026/39<Class::ProgressBar::Format::Formatter>#process7
  0.360.190.000.171/39Enumerable#each_with_object
  4.761.000.003.767/39Object#collect_stats_from_users39
  12.320.650.0011.673/39Object#work66
97.37%10.25%17.441.840.0015.6139 + + Array#each + +
  9.499.490.000.00107610/107610Array#+121 +
  2.570.700.001.871183710/1183712Array#map135 +
  1.100.640.000.46592390/592390Object#parse_session69 +
  0.430.430.000.00700000/1400001String#split67 +
  0.340.340.000.002798930/2798991Hash#[]119 +
  0.200.120.000.08215220/215221Array#sort147 +
  0.170.170.000.001721760/1721773String#+40 +
  0.150.090.000.05592390/592390Set#add96 +
  0.150.080.000.06107610/107610Object#parse_user68 +
  0.140.140.000.00968136/1560528Hash#[]=48 +
  0.130.130.000.00753270/753272Hash#merge129 +
  0.130.060.000.07107610/107610Array#any?153 +
  0.120.100.000.01107610/107631Class#new120 +
  0.080.080.000.001400000/1400001String#==68 +
  0.070.070.000.001506540/1506540User#attributes40 +
  0.060.030.000.03107610/107610Array#all?159 +
  0.060.060.000.001400000/4792535Array#[]68 +
  0.050.050.000.00700000/700000Array#concat68 +
  0.050.050.000.00753270/753270User#sessions129 +
  0.040.040.000.00592390/592394Array#<<49 +
  0.030.030.000.00107610/107611Array#join147 +
  0.020.020.000.00215220/215220Integer#to_s135 +
  0.010.010.000.00107610/107610Array#reverse165 +
  0.010.010.000.00107610/107610Array#sum135 +
  0.010.010.000.00107610/107610Array#max141 +
  0.010.010.000.00107610/107612Array#count129 +
  0.000.000.000.0052/52ProgressBar::Format::Molecule#lookup_value8 +
  0.000.000.000.0052/592455String#gsub!8 +
  0.000.000.000.0052/52ProgressBar::Format::Molecule#full_key8 +
  0.000.000.000.008/21Kernel#respond_to?21 +
  0.000.000.000.008/57ProgressBar::Time#time21 +
  9.499.490.000.00107610/107610Array#each
52.98%52.98%9.499.490.000.00107610 + + Array#+ + +
  4.760.000.004.767/7Object#work128
26.59%0.00%4.760.000.004.767 + + Object#collect_stats_from_users + + 38
  4.761.000.003.767/39Array#each39 +
  0.160.110.000.052/1183712Object#work104
  2.570.700.001.871183710/1183712Array#each
15.27%4.51%2.740.810.001.931183712 + + Array#map + +
  1.640.830.000.81592390/592390<Class::Date>#parse165 +
  0.120.120.000.00592390/592390Date#iso8601165 +
  0.100.100.000.001184780/1632354String#upcase107 +
  0.060.060.000.001184780/1184780String#to_i135 +
  1.640.830.000.81592390/592390Array#map
9.16%4.63%1.640.830.000.81592390 + + <Class::Date>#parse + +
  0.270.270.000.00592390/592455String#gsub! +
  0.270.270.000.001184780/1184780Regexp#match +
  0.150.150.000.00592390/592390MatchData#begin +
  0.050.050.000.00592390/592390String#[]= +
  0.040.040.000.00592390/592390MatchData#end +
  0.030.030.000.00592390/592390Integer#div +
  1.100.640.000.46592390/592390Array#each
6.16%3.60%1.100.640.000.46592390 + + Object#parse_session + + 27
  0.330.330.000.00592390/1400001String#split28 +
  0.130.130.000.002961950/4792535Array#[]30 +
  0.050.050.000.00107610/1400001Object#parse_user18
  0.060.060.000.001/1400001Object#work60
  0.330.330.000.00592390/1400001Object#parse_session28
  0.430.430.000.00700000/1400001Array#each
4.85%4.85%0.870.870.000.001400001 + + String#split + +
  0.360.000.000.361/1Object#work115
2.00%0.00%0.360.000.000.361 + + Object#select_sessions_for_users + + 46
  0.360.000.000.361/1Enumerable#each_with_object47 +
  0.360.000.000.361/1Object#select_sessions_for_users47
2.00%0.00%0.360.000.000.361 + + Enumerable#each_with_object + +
  0.360.190.000.171/39Array#each +
  0.000.000.000.001/2798991ProgressBar::Components::Title#initialize9
  0.000.000.000.001/2798991ProgressBar::Components::Percentage#initialize7
  0.000.000.000.001/2798991ProgressBar::Throttle#initialize9
  0.000.000.000.002/2798991ProgressBar::Calculators::Length#initialize9
  0.000.000.000.002/2798991<Class::ProgressBar::Output>#detect21
  0.000.000.000.003/2798991ProgressBar::Components::Time#initialize22
  0.000.000.000.001/2798991ProgressBar::Projectors::SmoothedAverage#initialize14
  0.000.000.000.003/2798991ProgressBar::Output#initialize11
  0.000.000.000.002/2798991ProgressBar::Timer#initialize9
  0.000.000.000.005/2798991ProgressBar::Components::Bar#initialize18
  0.000.000.000.003/2798991ProgressBar::Components::Rate#initialize9
  0.000.000.000.002/2798991ProgressBar::Projectors::SmoothedAverage#start21
  0.000.000.000.002/2798991ProgressBar::Progress#start19
  0.000.000.000.008/2798991ProgressBar::Base#initialize46
  0.000.000.000.0012/2798991ProgressBar::Output#refresh51
  0.000.000.000.0013/2798991ProgressBar::Components::Bar#to_s28
  0.340.340.000.002798930/2798991Array#each
1.91%1.91%0.340.340.000.002798991 + + Hash#[] + +
  0.000.000.000.0013/592455<Class::ProgressBar::Format::Formatter>#process11
  0.000.000.000.0052/592455Array#each
  0.270.270.000.00592390/592455<Class::Date>#parse
1.52%1.52%0.270.270.000.00592455 + + String#gsub! + +
  0.270.270.000.001184780/1184780<Class::Date>#parse
1.52%1.52%0.270.270.000.001184780 + + Regexp#match + +
  0.050.050.000.001/215221Object#work104
  0.200.120.000.08215220/215221Array#each
1.40%0.97%0.250.170.000.08215221 + + Array#sort + +
  0.080.080.000.001199958/1199958Date#<=> +
  0.000.000.000.0028/4792535ProgressBar::Projectors::SmoothedAverage#absolute67
  0.000.000.000.0013/4792535ProgressBar::Projectors::SmoothedAverage#progress33
  0.000.000.000.00104/4792535ProgressBar::Format::Molecule#lookup_value51
  0.020.020.000.00430440/4792535Object#parse_user20
  0.060.060.000.001400000/4792535Array#each
  0.130.130.000.002961950/4792535Object#parse_session30
1.14%1.14%0.200.200.000.004792535 + + Array#[] + +
  0.000.000.000.001/1560528ProgressBar::Base#initialize46
  0.000.000.000.001/1560528Object#work90
  0.050.050.000.00592390/1560528Set#add512
  0.140.140.000.00968136/1560528Array#each
1.06%1.06%0.190.190.000.001560528 + + Hash#[]= + +
  0.000.000.000.0013/1721773ProgressBar::Output#print_and_flush67
  0.170.170.000.001721760/1721773Array#each
0.96%0.96%0.170.170.000.001721773 + + String#+ + +
  0.150.150.000.001/1Object#work169
0.86%0.86%0.150.150.000.001 + + JSON::Ext::Generator::GeneratorMethods::Hash#to_json + +
  0.000.000.000.001/1JSON::Ext::Generator::State#initialize +
  0.150.090.000.05592390/592390Array#each
0.82%0.53%0.150.090.000.05592390 + + Set#add + + 511
  0.050.050.000.00592390/1560528Hash#[]=512 +
  0.150.080.000.06107610/107610Array#each
0.81%0.45%0.150.080.000.06107610 + + Object#parse_user + + 17
  0.050.050.000.00107610/1400001String#split18 +
  0.020.020.000.00430440/4792535Array#[]20 +
  0.150.150.000.00592390/592390<Class::Date>#parse
0.81%0.81%0.150.150.000.00592390 + + MatchData#begin + +
  0.010.010.000.00138633/1632354Array#all?
  0.020.020.000.00308941/1632354Array#any?
  0.100.100.000.001184780/1632354Array#map
0.76%0.76%0.140.140.000.001632354 + + String#upcase + +
  0.000.000.000.002/753272ProgressBar::Base#initialize71
  0.130.130.000.00753270/753272Array#each
0.74%0.74%0.130.130.000.00753272 + + Hash#merge + +
  0.130.060.000.07107610/107610Array#each
0.71%0.31%0.130.060.000.07107610 + + Array#any? + +
  0.050.050.000.00308941/447587String#=~153 +
  0.020.020.000.00308941/1632354String#upcase153 +
  0.120.120.000.00592390/592390Array#map
0.69%0.69%0.120.120.000.00592390 + + Date#iso8601 + +
  0.000.000.000.001/107631Set#initialize244
  0.000.000.000.001/107631ProgressBar::Throttle#initialize12
  0.000.000.000.002/107631ProgressBar::Timer#initialize9
  0.000.000.000.001/107631Object#work93
  0.000.000.000.002/107631ProgressBar::Output#initialize13
  0.000.000.000.004/107631String#scan
  0.000.000.000.001/107631<Class::ProgressBar::Output>#detect24
  0.000.000.000.008/107631ProgressBar::Base#initialize52
  0.000.000.000.001/107631<Class::ProgressBar>#create10
  0.120.100.000.01107610/107631Array#each
0.64%0.56%0.120.100.000.01107631 + + *Class#new + +
  0.010.010.000.00107610/107610User#initialize +
  0.000.000.000.001/1ProgressBar::Base#initialize +
  0.000.000.000.001/1ProgressBar::Projectors::SmoothedAverage#initialize +
  0.000.000.000.001/1ProgressBar::Output#initialize +
  0.000.000.000.004/4ProgressBar::Format::Molecule#initialize +
  0.000.000.000.001/1ProgressBar::Progress#initialize +
  0.000.000.000.001/1ProgressBar::Throttle#initialize +
  0.000.000.000.002/2ProgressBar::Timer#initialize +
  0.000.000.000.001/1Set#initialize +
  0.000.000.000.001/1ProgressBar::Components::Bar#initialize +
  0.000.000.000.001/1ProgressBar::Components::Rate#initialize +
  0.000.000.000.001/1ProgressBar::Calculators::Length#initialize +
  0.000.000.000.001/1ProgressBar::Components::Time#initialize +
  0.000.000.000.002/2ProgressBar::Time#initialize +
  0.000.000.000.001/1ProgressBar::Components::Title#initialize +
  0.000.000.000.001/1ProgressBar::Components::Percentage#initialize +
  0.000.000.000.001/1Hash#initialize +
  0.000.000.000.001/1400001Object#work57
  0.080.080.000.001400000/1400001Array#each
0.45%0.45%0.080.080.000.001400001 + + String#== + +
  0.080.080.000.001199958/1199958Array#sort
0.43%0.43%0.080.080.000.001199958 + + Date#<=> + +
  0.070.070.000.001506540/1506540Array#each
0.40%0.40%0.070.070.000.001506540 + + User#attributes + +
  0.000.000.000.0013/447587ProgressBar::Calculators::Length#unix?94
  0.020.020.000.00138633/447587Array#all?
  0.050.050.000.00308941/447587Array#any?
0.40%0.40%0.070.070.000.00447587 + + String#=~ + +
  0.060.030.000.03107610/107610Array#each
0.36%0.17%0.060.030.000.03107610 + + Array#all? + +
  0.020.020.000.00138633/447587String#=~159 +
  0.010.010.000.00138633/1632354String#upcase159 +
  0.060.060.000.001184780/1184780Array#map
0.33%0.33%0.060.060.000.001184780 + + String#to_i + +
  0.050.050.000.00592390/592390<Class::Date>#parse
0.30%0.30%0.050.050.000.00592390 + + String#[]= + +
  0.050.050.000.00700000/700000Array#each
0.27%0.27%0.050.050.000.00700000 + + Array#concat + +
  0.050.050.000.00753270/753270Array#each
0.26%0.26%0.050.050.000.00753270 + + User#sessions + +
  0.040.040.000.00592390/592390<Class::Date>#parse
0.21%0.21%0.040.040.000.00592390 + + MatchData#end + +
  0.000.000.000.004/592394String#scan
  0.040.040.000.00592390/592394Array#each
0.20%0.20%0.040.040.000.00592394 + + Array#<< + +
  0.030.030.000.00592390/592390<Class::Date>#parse
0.17%0.17%0.030.030.000.00592390 + + Integer#div + +
  0.000.000.000.001/107611Object#work104
  0.030.030.000.00107610/107611Array#each
0.16%0.16%0.030.030.000.00107611 + + Array#join + +
  0.020.020.000.00215220/215220Array#each
0.11%0.11%0.020.020.000.00215220 + + Integer#to_s + +
  0.020.020.000.001/1Object#work104
0.11%0.11%0.020.020.000.001 + + Array#uniq + +
  0.010.010.000.00107610/107610Class#new
0.08%0.08%0.010.010.000.00107610 + + User#initialize + + 11
  0.010.010.000.00107610/107610Array#each
0.06%0.06%0.010.010.000.00107610 + + Array#reverse + +
  0.000.000.000.0015/16IO#print
  0.010.010.000.001/16Object#work169
0.05%0.05%0.010.010.000.0016 + + IO#write + +
  0.010.010.000.001/1Object#work60
0.05%0.05%0.010.010.000.001 + + <Class::IO>#read + +
  0.010.010.000.00107610/107610Array#each
0.04%0.04%0.010.010.000.00107610 + + Array#sum + +
  0.010.010.000.00107610/107610Array#each
0.04%0.04%0.010.010.000.00107610 + + Array#max + +
  0.000.000.000.002/107612Object#work90
  0.010.010.000.00107610/107612Array#each
0.03%0.03%0.010.010.000.00107612 + + Array#count + +
  0.000.000.000.001/13ProgressBar::Base#start89
  0.000.000.000.0012/13ProgressBar::Base#increment142
0.01%0.00%0.000.000.000.0013 + + ProgressBar::Base#update_progress + + 226
  0.000.000.000.0013/13ProgressBar::Output#with_refresh227 +
  0.000.000.000.0013/27ProgressBar::Base#output227 +
  0.000.000.000.0013/13ProgressBar::Base#update_progress227
0.01%0.00%0.000.000.000.0013 + + ProgressBar::Output#with_refresh + + 45
  0.000.000.000.0013/13ProgressBar::Output#refresh47 +
  0.000.000.000.0012/12ProgressBar::Projectors::SmoothedAverage#increment229 +
  0.000.000.000.0012/12ProgressBar::Progress#increment228 +
  0.000.000.000.0013/37ProgressBar::Base#finished?230 +
  0.000.000.000.001/1ProgressBar::Timer#stop230 +
  0.000.000.000.001/2ProgressBar::Projectors::SmoothedAverage#start229 +
  0.000.000.000.0013/51ProgressBar::Base#progressable228 +
  0.000.000.000.001/29ProgressBar::Base#timer230 +
  0.000.000.000.001/2ProgressBar::Progress#start228 +
  0.000.000.000.0013/14ProgressBar::Base#projector229 +
  0.000.000.000.0012/12Object#work61
0.01%0.00%0.000.000.000.0012 + + ProgressBar::Base#increment + + 141
  0.000.000.000.0012/13ProgressBar::Base#update_progress142 +
  0.000.000.000.0013/13ProgressBar::Output#with_refresh47
0.01%0.00%0.000.000.000.0013 + + ProgressBar::Output#refresh + + 50
  0.000.000.000.0013/13ProgressBar::Throttle#choke51 +
  0.000.000.000.0013/26ProgressBar::Base#stopped?51 +
  0.000.000.000.0013/13ProgressBar::Output#throttle51 +
  0.000.000.000.0013/39ProgressBar::Output#bar51 +
  0.000.000.000.0012/2798991Hash#[]51 +
  0.000.000.000.0013/13ProgressBar::Output#refresh51
0.01%0.00%0.000.000.000.0013 + + ProgressBar::Throttle#choke + + 15
  0.000.000.000.0013/13ProgressBar::Output#print_and_flush54 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#length_changed?52 +
  0.000.000.000.0011/36ProgressBar::Timer#elapsed_seconds16 +
  0.000.000.000.0013/13ProgressBar::Timer#restart20 +
  0.000.000.000.001/1ProgressBar::Outputs::Tty#clear52 +
  0.000.000.000.0013/64ProgressBar::Timer#started?16 +
  0.000.000.000.0037/37ProgressBar::Throttle#timer16 +
  0.000.000.000.0012/21Hash#fetch16 +
  0.000.000.000.0013/27ProgressBar::Output#length_calculator52 +
  0.000.000.000.0011/11Float#>=16 +
  0.000.000.000.0013/28BasicObject#!16 +
  0.000.000.000.0011/11ProgressBar::Throttle#rate16 +
  0.000.000.000.0013/13ProgressBar::Throttle#choke54
0.01%0.00%0.000.000.000.0013 + + ProgressBar::Output#print_and_flush + + 66
  0.000.000.000.0013/13ProgressBar::Outputs::Tty#bar_update_string67 +
  0.000.000.000.0013/15IO#print67 +
  0.000.000.000.0013/13ProgressBar::Outputs::Tty#eol67 +
  0.000.000.000.0026/29ProgressBar::Output#stream67 +
  0.000.000.000.0013/1721773String#+67 +
  0.000.000.000.0013/13IO#flush68 +
  0.000.000.000.0013/13ProgressBar::Output#print_and_flush67
0.01%0.00%0.000.000.000.0013 + + ProgressBar::Outputs::Tty#bar_update_string + + 15
  0.000.000.000.0013/13ProgressBar::Base#to_s16 +
  0.000.000.000.0013/39ProgressBar::Output#bar16 +
  0.000.000.000.0013/13ProgressBar::Outputs::Tty#bar_update_string16
0.01%0.00%0.000.000.000.0013 + + ProgressBar::Base#to_s + + 169
  0.000.000.000.0013/13<Class::ProgressBar::Format::Formatter>#process172 +
  0.000.000.000.0013/13ProgressBar::Output#length172 +
  0.000.000.000.0013/27ProgressBar::Base#output172 +
  0.000.000.000.0013/13ProgressBar::Base#to_s172
0.01%0.00%0.000.000.000.0013 + + <Class::ProgressBar::Format::Formatter>#process + + 4
  0.000.000.000.0026/39Array#each7 +
  0.000.000.000.0013/13String#dup5 +
  0.000.000.000.0013/13ProgressBar::Format::String#non_bar_molecules7 +
  0.000.000.000.0013/13ProgressBar::Format::String#displayable_length13 +
  0.000.000.000.0013/13ProgressBar::Format::String#bar_molecule_placeholder_length13 +
  0.000.000.000.0013/592455String#gsub!11 +
  0.000.000.000.0013/14ProgressBar::Format::String#bar_molecules18 +
  0.000.000.000.0013/26Integer#<16 +
  0.000.000.000.0013/40Integer#-13 +
  0.000.000.000.0013/37Integer#+13 +
  0.000.000.000.0052/52Array#each
0.00%0.00%0.000.000.000.0052 + + ProgressBar::Format::Molecule#lookup_value + + 50
  0.000.000.000.0013/13ProgressBar::Components::Time#estimated_with_friendly_oob56 +
  0.000.000.000.0013/13ProgressBar::Components::Bar#complete_bar54 +
  0.000.000.000.0013/14ProgressBar::Components::Time#elapsed_with_label56 +
  0.000.000.000.0013/13ProgressBar::Components::Percentage#justified_percentage_with_precision56 +
  0.000.000.000.0052/60ProgressBar::Format::Molecule#bar_molecule?53 +
  0.000.000.000.00104/104ProgressBar::Format::Molecule#method_name51 +
  0.000.000.000.00104/4792535Array#[]51 +
  0.000.000.000.0052/65String#to_s56 +
  0.000.000.000.0026/26ProgressBar::Base#time_component51 +
  0.000.000.000.0013/13ProgressBar::Base#percentage_component51 +
  0.000.000.000.0013/13ProgressBar::Base#bar_component51 +
  0.000.000.000.001/1Object#work57
0.00%0.00%0.000.000.000.001 + + <Class::ProgressBar>#create + + 9
  0.000.000.000.001/107631Class#new10 +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#initialize + + 45
  0.000.000.000.001/1ProgressBar::Base#start84 +
  0.000.000.000.008/107631Class#new52 +
  0.000.000.000.001/1<Class::ProgressBar::Output>#detect81 +
  0.000.000.000.001/1ProgressBar::Base#time_component=79 +
  0.000.000.000.001/1<Class::String>#new82 +
  0.000.000.000.001/1<Class::ProgressBar::Projector>#from_type66 +
  0.000.000.000.001/1ProgressBar::Base#percentage_component=77 +
  0.000.000.000.008/2798991Hash#[]46 +
  0.000.000.000.002/21Hash#fetch48 +
  0.000.000.000.001/1Hash#any?53 +
  0.000.000.000.001/1ProgressBar::Base#timer=52 +
  0.000.000.000.002/753272Hash#merge71 +
  0.000.000.000.001/1ProgressBar::Base#title_component=75 +
  0.000.000.000.001/1ProgressBar::Base#autofinish=49 +
  0.000.000.000.001/1ProgressBar::Base#progressable=69 +
  0.000.000.000.001/1ProgressBar::Base#autostart=48 +
  0.000.000.000.001/1ProgressBar::Base#output=81 +
  0.000.000.000.001/51ProgressBar::Base#progressable71 +
  0.000.000.000.001/1ProgressBar::Base#finished=50 +
  0.000.000.000.001/1ProgressBar::Base#projector=66 +
  0.000.000.000.001/27ProgressBar::Base#output82 +
  0.000.000.000.001/1ProgressBar::Outputs::Tty#resolve_format82 +
  0.000.000.000.001/14ProgressBar::Base#projector71 +
  0.000.000.000.001/29ProgressBar::Base#timer71 +
  0.000.000.000.001/1ProgressBar::Base#bar_component=76 +
  0.000.000.000.001/1560528Hash#[]=46 +
  0.000.000.000.001/1ProgressBar::Base#rate_component=78 +
  0.000.000.000.001/1ProgressBar::Base#autostart84 +
  0.000.000.000.001/1ProgressBar::Base#initialize84
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#start + + 87
  0.000.000.000.001/13ProgressBar::Base#update_progress89 +
  0.000.000.000.001/14ProgressBar::Timer#start88 +
  0.000.000.000.001/29ProgressBar::Base#timer88 +
  0.000.000.000.0012/12ProgressBar::Output#with_refresh229
0.00%0.00%0.000.000.000.0012 + + ProgressBar::Projectors::SmoothedAverage#increment + + 28
  0.000.000.000.0012/14ProgressBar::Projectors::SmoothedAverage#progress=29 +
  0.000.000.000.0012/13ProgressBar::Projectors::SmoothedAverage#progress29 +
  0.000.000.000.0012/37Integer#+29 +
  0.000.000.000.0013/13ProgressBar::Throttle#choke52
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#length_changed? + + 18
  0.000.000.000.0013/13ProgressBar::Calculators::Length#calculate_length20 +
  0.000.000.000.0013/13BasicObject#!=22 +
  0.000.000.000.0026/40ProgressBar::Calculators::Length#current_length19 +
  0.000.000.000.0013/14ProgressBar::Calculators::Length#current_length=20 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#length_changed?20
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#calculate_length + + 25
  0.000.000.000.0013/13ProgressBar::Calculators::Length#terminal_width26 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#length_override26 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#calculate_length26
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#terminal_width + + 43
  0.000.000.000.0013/13ProgressBar::Calculators::Length#dynamic_width46 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#unix?44 +
  0.000.000.000.0013/26Integer#<47 +
  0.000.000.000.0013/13ProgressBar::Format::Molecule#lookup_value56
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Time#estimated_with_friendly_oob + + 43
  0.000.000.000.0013/13ProgressBar::Components::Time#estimated_with_elapsed_fallback44 +
  0.000.000.000.0012/12ProgressBar::Output#with_refresh228
0.00%0.00%0.000.000.000.0012 + + ProgressBar::Progress#increment + + 31
  0.000.000.000.0012/14ProgressBar::Progress#progress=38 +
  0.000.000.000.0012/37Integer#+38 +
  0.000.000.000.0024/125Integer#==32 +
  0.000.000.000.0024/205ProgressBar::Progress#total32 +
  0.000.000.000.0036/113ProgressBar::Progress#progress32 +
  0.000.000.000.0013/37ProgressBar::Output#with_refresh230
  0.000.000.000.0024/37ProgressBar::Base#stopped?124
0.00%0.00%0.000.000.000.0037 + + ProgressBar::Base#finished? + + 129
  0.000.000.000.0037/50ProgressBar::Progress#finished?130 +
  0.000.000.000.0037/37ProgressBar::Base#finished130 +
  0.000.000.000.0037/37ProgressBar::Base#autofinish130 +
  0.000.000.000.0037/51ProgressBar::Base#progressable130 +
  0.000.000.000.001/49ProgressBar::Timer#stop20
  0.000.000.000.0014/49ProgressBar::Timer#start13
  0.000.000.000.0034/49ProgressBar::Timer#elapsed_seconds60
0.00%0.00%0.000.000.000.0049 + + ProgressBar::Time#now + + 15
  0.000.000.000.0049/49<Class::Time>#now16 +
  0.000.000.000.0049/49ProgressBar::Time#unmocked_time_method16 +
  0.000.000.000.0049/57ProgressBar::Time#time16 +
  0.000.000.000.002/14ProgressBar::Projectors::SmoothedAverage#start21
  0.000.000.000.0012/14ProgressBar::Projectors::SmoothedAverage#increment29
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Projectors::SmoothedAverage#progress= + + 42
  0.000.000.000.0014/14<Class::ProgressBar::Projectors::SmoothedAverage>#calculate44 +
  0.000.000.000.0014/14ProgressBar::Projectors::SmoothedAverage#absolute44 +
  0.000.000.000.0014/16Array#[]=43 +
  0.000.000.000.0014/17ProgressBar::Projectors::SmoothedAverage#projection=44 +
  0.000.000.000.0014/14Kernel#class44 +
  0.000.000.000.0014/14ProgressBar::Projectors::SmoothedAverage#strength44 +
  0.000.000.000.0014/57ProgressBar::Projectors::SmoothedAverage#samples43 +
  0.000.000.000.0013/26ProgressBar::Outputs::Tty#eol28
  0.000.000.000.0013/26ProgressBar::Output#refresh51
0.00%0.00%0.000.000.000.0026 + + ProgressBar::Base#stopped? + + 123
  0.000.000.000.0024/37ProgressBar::Base#finished?124 +
  0.000.000.000.0026/51ProgressBar::Timer#stopped?124 +
  0.000.000.000.0026/29ProgressBar::Base#timer124 +
  0.000.000.000.0013/13ProgressBar::Throttle#choke20
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Timer#restart + + 52
  0.000.000.000.0013/14ProgressBar::Timer#start54 +
  0.000.000.000.0013/13ProgressBar::Timer#reset53 +
  0.000.000.000.0011/36ProgressBar::Components::Time#estimated_seconds_remaining97
  0.000.000.000.0014/36ProgressBar::Timer#elapsed_whole_seconds64
  0.000.000.000.0011/36ProgressBar::Throttle#choke16
0.00%0.00%0.000.000.000.0036 + + ProgressBar::Timer#elapsed_seconds + + 57
  0.000.000.000.0034/49ProgressBar::Time#now60 +
  0.000.000.000.0036/36Time#-60 +
  0.000.000.000.0036/64ProgressBar::Timer#started?58 +
  0.000.000.000.0036/111ProgressBar::Timer#started_at60 +
  0.000.000.000.0034/49ProgressBar::Timer#time60 +
  0.000.000.000.0036/87ProgressBar::Timer#stopped_at60 +
  0.000.000.000.002/15ProgressBar::Outputs::Tty#clear11
  0.000.000.000.0013/15ProgressBar::Output#print_and_flush67
0.00%0.00%0.000.000.000.0015 + + IO#print + +
  0.000.000.000.0015/16IO#write +
  0.000.000.000.001/14ProgressBar::Components::Time#estimated_with_elapsed_fallback89
  0.000.000.000.0013/14ProgressBar::Format::Molecule#lookup_value56
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Components::Time#elapsed_with_label + + 31
  0.000.000.000.0014/14ProgressBar::Components::Time#elapsed32 +
  0.000.000.000.0013/13ProgressBar::Format::Molecule#lookup_value56
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Percentage#justified_percentage_with_precision + + 22
  0.000.000.000.0013/13ProgressBar::Progress#percentage_completed_with_precision23 +
  0.000.000.000.0013/13String#rjust23 +
  0.000.000.000.0013/13ProgressBar::Components::Percentage#progress23 +
  0.000.000.000.0013/65String#to_s23 +
  0.000.000.000.0013/13ProgressBar::Format::Molecule#lookup_value54
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Bar#complete_bar + + 41
  0.000.000.000.0013/13ProgressBar::Components::Bar#to_s44 +
  0.000.000.000.0013/14ProgressBar::Components::Bar#length=42 +
  0.000.000.000.0013/13ProgressBar::Components::Time#estimated_with_friendly_oob44
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Time#estimated_with_elapsed_fallback + + 88
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated_with_label91 +
  0.000.000.000.001/14ProgressBar::Components::Time#elapsed_with_label89 +
  0.000.000.000.0013/50ProgressBar::Progress#finished?89 +
  0.000.000.000.0013/47ProgressBar::Components::Time#progress89 +
  0.000.000.000.0014/14ProgressBar::Components::Time#elapsed_with_label32
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Components::Time#elapsed + + 80
  0.000.000.000.0014/14ProgressBar::Timer#elapsed_whole_seconds83 +
  0.000.000.000.0014/38String#%85 +
  0.000.000.000.0014/25ProgressBar::Timer#divide_seconds83 +
  0.000.000.000.0014/64ProgressBar::Timer#started?81 +
  0.000.000.000.0042/86ProgressBar::Components::Time#timer81 +
  0.000.000.000.0013/13ProgressBar::Components::Bar#complete_bar44
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Bar#to_s + + 25
  0.000.000.000.0013/13ProgressBar::Components::Bar#standard_complete_string29 +
  0.000.000.000.0013/13ProgressBar::Components::Bar#incomplete_string29 +
  0.000.000.000.0013/25ProgressBar::Progress#unknown?26 +
  0.000.000.000.0013/13Symbol#==28 +
  0.000.000.000.0013/2798991Hash#[]28 +
  0.000.000.000.0013/39ProgressBar::Components::Bar#progress26 +
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated_with_elapsed_fallback91
0.00%0.00%0.000.000.000.0012 + + ProgressBar::Components::Time#estimated_with_label + + 27
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated28 +
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated_with_label28
0.00%0.00%0.000.000.000.0012 + + ProgressBar::Components::Time#estimated + + 66
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated_seconds_remaining67 +
  0.000.000.000.0011/25ProgressBar::Timer#divide_seconds71 +
  0.000.000.000.0011/38String#%76 +
  0.000.000.000.0011/86ProgressBar::Components::Time#timer71 +
  0.000.000.000.0011/25Integer#>73 +
  0.000.000.000.001/1Object#work100
0.00%0.00%0.000.000.000.001 + + Enumerable#count + +
  0.000.000.000.001/1Set#each +
  0.000.000.000.001/1Enumerable#count
0.00%0.00%0.000.000.000.001 + + Set#each + + 499
  0.000.000.000.001/1Hash#each_key501 +
  0.000.000.000.001/1Kernel#block_given?500 +
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated67
0.00%0.00%0.000.000.000.0012 + + ProgressBar::Components::Time#estimated_seconds_remaining + + 94
  0.000.000.000.0011/36ProgressBar::Timer#elapsed_seconds97 +
  0.000.000.000.0011/11ProgressBar::Progress#none?95 +
  0.000.000.000.0012/12ProgressBar::Projectors::SmoothedAverage#none?95 +
  0.000.000.000.0012/25ProgressBar::Progress#unknown?95 +
  0.000.000.000.0011/11ProgressBar::Timer#reset?95 +
  0.000.000.000.0011/11Float#round97 +
  0.000.000.000.0011/51ProgressBar::Timer#stopped?95 +
  0.000.000.000.0033/86ProgressBar::Components::Time#timer95 +
  0.000.000.000.0023/23ProgressBar::Components::Time#projector95 +
  0.000.000.000.0034/47ProgressBar::Components::Time#progress95 +
  0.000.000.000.0011/23ProgressBar::Projectors::SmoothedAverage#projection97 +
  0.000.000.000.0011/25Float#-97 +
  0.000.000.000.0011/89Integer#/97 +
  0.000.000.000.0011/205ProgressBar::Progress#total97 +
  0.000.000.000.0011/38Float#*97 +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + Set#initialize + + 243
  0.000.000.000.001/107631Class#new244 +
  0.000.000.000.001/2NilClass#nil?246 +
  0.000.000.000.001/1JSON::Ext::Generator::GeneratorMethods::Hash#to_json
0.00%0.00%0.000.000.000.001 + + JSON::Ext::Generator::State#initialize + +
  0.000.000.000.001/27ProgressBar::Base#initialize82
  0.000.000.000.0013/27ProgressBar::Base#to_s172
  0.000.000.000.0013/27ProgressBar::Base#update_progress227
0.00%0.00%0.000.000.000.0027 + + ProgressBar::Base#output + +
  0.000.000.000.001/2ProgressBar::Progress#total=65
  0.000.000.000.001/2Set#initialize246
0.00%0.00%0.000.000.000.002 + + NilClass#nil? + +
  0.000.000.000.001/1Set#each500
0.00%0.00%0.000.000.000.001 + + Kernel#block_given? + +
  0.000.000.000.001/1Set#each501
0.00%0.00%0.000.000.000.001 + + Hash#each_key + +
  0.000.000.000.001/1ProgressBar::Output#with_refresh230
0.00%0.00%0.000.000.000.001 + + ProgressBar::Timer#stop + + 17
  0.000.000.000.001/49ProgressBar::Time#now20 +
  0.000.000.000.001/64ProgressBar::Timer#started?18 +
  0.000.000.000.001/28ProgressBar::Timer#stopped_at=20 +
  0.000.000.000.001/49ProgressBar::Timer#time20 +
  0.000.000.000.001/1ProgressBar::Base#initialize82
0.00%0.00%0.000.000.000.001 + + ProgressBar::Outputs::Tty#resolve_format + + 23
  0.000.000.000.001/1ProgressBar::Base#initialize75
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#title_component= + +
  0.000.000.000.001/1ProgressBar::Base#initialize52
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#timer= + +
  0.000.000.000.001/29ProgressBar::Base#start88
  0.000.000.000.001/29ProgressBar::Base#initialize71
  0.000.000.000.0026/29ProgressBar::Base#stopped?124
  0.000.000.000.001/29ProgressBar::Output#with_refresh230
0.00%0.00%0.000.000.000.0029 + + ProgressBar::Base#timer + +
  0.000.000.000.001/1ProgressBar::Base#initialize79
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#time_component= + +
  0.000.000.000.001/1ProgressBar::Base#initialize78
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#rate_component= + +
  0.000.000.000.001/1ProgressBar::Base#initialize66
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#projector= + +
  0.000.000.000.001/14ProgressBar::Base#initialize71
  0.000.000.000.0013/14ProgressBar::Output#with_refresh229
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Base#projector + +
  0.000.000.000.001/1ProgressBar::Base#initialize69
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#progressable= + +
  0.000.000.000.001/51ProgressBar::Base#initialize71
  0.000.000.000.0013/51ProgressBar::Output#with_refresh228
  0.000.000.000.0037/51ProgressBar::Base#finished?130
0.00%0.00%0.000.000.000.0051 + + ProgressBar::Base#progressable + +
  0.000.000.000.001/1ProgressBar::Base#initialize77
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#percentage_component= + +
  0.000.000.000.001/1ProgressBar::Base#initialize81
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#output= + +
  0.000.000.000.001/1ProgressBar::Base#initialize50
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#finished= + +
  0.000.000.000.001/1ProgressBar::Base#initialize76
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#bar_component= + +
  0.000.000.000.001/1ProgressBar::Base#initialize48
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#autostart= + +
  0.000.000.000.001/1ProgressBar::Base#initialize84
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#autostart + +
  0.000.000.000.001/1ProgressBar::Base#initialize49
0.00%0.00%0.000.000.000.001 + + ProgressBar::Base#autofinish= + +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + Hash#initialize + +
  0.000.000.000.001/21<Class::ProgressBar::Projector>#from_type11
  0.000.000.000.001/21ProgressBar::Throttle#initialize12
  0.000.000.000.001/21ProgressBar::Progress#initialize13
  0.000.000.000.004/21ProgressBar::Format::Molecule#initialize35
  0.000.000.000.002/21ProgressBar::Base#initialize48
  0.000.000.000.0012/21ProgressBar::Throttle#choke16
0.00%0.00%0.000.000.000.0021 + + Hash#fetch + +
  0.000.000.000.001/1ProgressBar::Base#initialize53
0.00%0.00%0.000.000.000.001 + + Hash#any? + +
  0.000.000.000.001/1ProgressBar::Base#initialize82
0.00%0.00%0.000.000.000.001 + + <Class::String>#new + +
  0.000.000.000.001/1String#initialize +
  0.000.000.000.001/1ProgressBar::Base#initialize66
0.00%0.00%0.000.000.000.001 + + <Class::ProgressBar::Projector>#from_type + + 10
  0.000.000.000.001/21Hash#fetch11 +
  0.000.000.000.001/1ProgressBar::Base#initialize81
0.00%0.00%0.000.000.000.001 + + <Class::ProgressBar::Output>#detect + + 20
  0.000.000.000.001/107631Class#new24 +
  0.000.000.000.001/14IO#tty?23 +
  0.000.000.000.001/1Kernel#is_a?21 +
  0.000.000.000.002/2798991Hash#[]21 +
  0.000.000.000.001/1<Class::String>#new
0.00%0.00%0.000.000.000.001 + + String#initialize + +
  0.000.000.000.001/49ProgressBar::Timer#stop20
  0.000.000.000.0014/49ProgressBar::Timer#start13
  0.000.000.000.0034/49ProgressBar::Timer#elapsed_seconds60
0.00%0.00%0.000.000.000.0049 + + ProgressBar::Timer#time + +
  0.000.000.000.001/28ProgressBar::Timer#stop20
  0.000.000.000.0014/28ProgressBar::Timer#start14
  0.000.000.000.0013/28ProgressBar::Timer#reset45
0.00%0.00%0.000.000.000.0028 + + ProgressBar::Timer#stopped_at= + +
  0.000.000.000.001/64ProgressBar::Timer#stop18
  0.000.000.000.0013/64ProgressBar::Throttle#choke16
  0.000.000.000.0036/64ProgressBar::Timer#elapsed_seconds58
  0.000.000.000.0014/64ProgressBar::Components::Time#elapsed81
0.00%0.00%0.000.000.000.0064 + + ProgressBar::Timer#started? + + 35
  0.000.000.000.0064/111ProgressBar::Timer#started_at36 +
  0.000.000.000.001/14ProgressBar::Base#start88
  0.000.000.000.0013/14ProgressBar::Timer#restart54
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Timer#start + + 12
  0.000.000.000.0014/49ProgressBar::Time#now13 +
  0.000.000.000.0014/51ProgressBar::Timer#stopped?13 +
  0.000.000.000.0014/27ProgressBar::Timer#started_at=13 +
  0.000.000.000.0014/28ProgressBar::Timer#stopped_at=14 +
  0.000.000.000.0014/49ProgressBar::Timer#time13 +
  0.000.000.000.002/2Class#new
0.00%0.00%0.000.000.000.002 + + ProgressBar::Timer#initialize + + 8
  0.000.000.000.002/107631Class#new9 +
  0.000.000.000.002/2ProgressBar::Timer#time=9 +
  0.000.000.000.002/2798991Hash#[]9 +
  0.000.000.000.001/13ProgressBar::Projectors::SmoothedAverage#start21
  0.000.000.000.0012/13ProgressBar::Projectors::SmoothedAverage#increment29
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Projectors::SmoothedAverage#progress + + 32
  0.000.000.000.0013/4792535Array#[]33 +
  0.000.000.000.0013/57ProgressBar::Projectors::SmoothedAverage#samples33 +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Projectors::SmoothedAverage#initialize + + 11
  0.000.000.000.001/2ProgressBar::Projectors::SmoothedAverage#start16 +
  0.000.000.000.001/1ProgressBar::Projectors::SmoothedAverage#samples=12 +
  0.000.000.000.001/1ProgressBar::Projectors::SmoothedAverage#strength=14 +
  0.000.000.000.001/17ProgressBar::Projectors::SmoothedAverage#projection=13 +
  0.000.000.000.001/2798991Hash#[]14 +
  0.000.000.000.0011/205ProgressBar::Components::Time#estimated_seconds_remaining97
  0.000.000.000.0025/205ProgressBar::Progress#unknown?90
  0.000.000.000.0028/205ProgressBar::Progress#progress=56
  0.000.000.000.0024/205ProgressBar::Progress#increment32
  0.000.000.000.0039/205ProgressBar::Progress#percentage_completed_with_precision98
  0.000.000.000.0078/205ProgressBar::Progress#percentage_completed74
0.00%0.00%0.000.000.000.00205 + + ProgressBar::Progress#total + +
  0.000.000.000.002/14ProgressBar::Progress#start19
  0.000.000.000.0012/14ProgressBar::Progress#increment38
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Progress#progress= + + 55
  0.000.000.000.0014/25Integer#>56 +
  0.000.000.000.0028/205ProgressBar::Progress#total56 +
  0.000.000.000.001/113ProgressBar::Progress#start19
  0.000.000.000.001/113ProgressBar::Progress#total=65
  0.000.000.000.0011/113ProgressBar::Progress#none?86
  0.000.000.000.0013/113ProgressBar::Progress#percentage_completed_with_precision101
  0.000.000.000.0026/113ProgressBar::Progress#percentage_completed82
  0.000.000.000.0025/113ProgressBar::Progress#unknown?90
  0.000.000.000.0036/113ProgressBar::Progress#increment32
0.00%0.00%0.000.000.000.00113 + + ProgressBar::Progress#progress + +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Progress#initialize + + 12
  0.000.000.000.001/2ProgressBar::Progress#start15 +
  0.000.000.000.001/1ProgressBar::Progress#total=13 +
  0.000.000.000.001/21Hash#fetch13 +
  0.000.000.000.0013/50ProgressBar::Components::Time#estimated_with_elapsed_fallback89
  0.000.000.000.0037/50ProgressBar::Base#finished?130
0.00%0.00%0.000.000.000.0050 + + ProgressBar::Progress#finished? + + 27
  0.000.000.000.0050/125Integer#==28 +
  0.000.000.000.0013/13ProgressBar::Output#refresh51
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Output#throttle + +
  0.000.000.000.0013/39ProgressBar::Outputs::Tty#bar_update_string16
  0.000.000.000.0013/39ProgressBar::Outputs::Tty#eol28
  0.000.000.000.0013/39ProgressBar::Output#refresh51
0.00%0.00%0.000.000.000.0039 + + ProgressBar::Output#bar + +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Title#initialize + + 8
  0.000.000.000.001/1ProgressBar::Components::Title#title=9 +
  0.000.000.000.001/2798991Hash#[]9 +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Time#initialize + + 21
  0.000.000.000.001/1ProgressBar::Components::Time#projector=24 +
  0.000.000.000.001/1ProgressBar::Components::Time#progress=23 +
  0.000.000.000.001/1ProgressBar::Components::Time#timer=22 +
  0.000.000.000.003/2798991Hash#[]22 +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Rate#initialize + + 8
  0.000.000.000.001/1Kernel#lambda9 +
  0.000.000.000.001/1ProgressBar::Components::Rate#progress=11 +
  0.000.000.000.003/2798991Hash#[]9 +
  0.000.000.000.001/1ProgressBar::Components::Rate#rate_scale=9 +
  0.000.000.000.001/1ProgressBar::Components::Rate#timer=10 +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Percentage#initialize + + 6
  0.000.000.000.001/1ProgressBar::Components::Percentage#progress=7 +
  0.000.000.000.001/2798991Hash#[]7 +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Bar#initialize + + 17
  0.000.000.000.001/1ProgressBar::Components::Bar#progress=21 +
  0.000.000.000.001/14ProgressBar::Components::Bar#length=22 +
  0.000.000.000.001/1ProgressBar::Components::Bar#remainder_mark=20 +
  0.000.000.000.001/1ProgressBar::Components::Bar#upa_steps=18 +
  0.000.000.000.005/2798991Hash#[]18 +
  0.000.000.000.001/1ProgressBar::Components::Bar#progress_mark=19 +
  0.000.000.000.0037/37ProgressBar::Base#finished?130
0.00%0.00%0.000.000.000.0037 + + ProgressBar::Base#finished + +
  0.000.000.000.0037/37ProgressBar::Base#finished?130
0.00%0.00%0.000.000.000.0037 + + ProgressBar::Base#autofinish + +
  0.000.000.000.001/1<Class::ProgressBar::Output>#detect21
0.00%0.00%0.000.000.000.001 + + Kernel#is_a? + +
  0.000.000.000.0012/125BasicObject#!=
  0.000.000.000.0013/125ProgressBar::Progress#percentage_completed_with_precision98
  0.000.000.000.0026/125ProgressBar::Progress#percentage_completed75
  0.000.000.000.0024/125ProgressBar::Progress#increment32
  0.000.000.000.0050/125ProgressBar::Progress#finished?28
0.00%0.00%0.000.000.000.00125 + + Integer#== + +
  0.000.000.000.0012/37ProgressBar::Projectors::SmoothedAverage#increment29
  0.000.000.000.0013/37<Class::ProgressBar::Format::Formatter>#process13
  0.000.000.000.0012/37ProgressBar::Progress#increment38
0.00%0.00%0.000.000.000.0037 + + Integer#+ + +
  0.000.000.000.001/14<Class::ProgressBar::Output>#detect23
  0.000.000.000.0013/14ProgressBar::Calculators::Length#dynamic_width57
0.00%0.00%0.000.000.000.0014 + + IO#tty? + +
  0.000.000.000.002/2ProgressBar::Timer#initialize9
0.00%0.00%0.000.000.000.002 + + ProgressBar::Timer#time= + +
  0.000.000.000.0011/51ProgressBar::Components::Time#estimated_seconds_remaining95
  0.000.000.000.0014/51ProgressBar::Timer#start13
  0.000.000.000.0026/51ProgressBar::Base#stopped?124
0.00%0.00%0.000.000.000.0051 + + ProgressBar::Timer#stopped? + + 39
  0.000.000.000.0051/87ProgressBar::Timer#stopped_at40 +
  0.000.000.000.0013/27ProgressBar::Timer#reset44
  0.000.000.000.0014/27ProgressBar::Timer#start13
0.00%0.00%0.000.000.000.0027 + + ProgressBar::Timer#started_at= + +
  0.000.000.000.0011/111ProgressBar::Timer#reset?49
  0.000.000.000.0036/111ProgressBar::Timer#elapsed_seconds60
  0.000.000.000.0064/111ProgressBar::Timer#started?36
0.00%0.00%0.000.000.000.00111 + + ProgressBar::Timer#started_at + +
  0.000.000.000.0049/49ProgressBar::Time#now16
0.00%0.00%0.000.000.000.0049 + + ProgressBar::Time#unmocked_time_method + + 19
  0.000.000.000.002/2Enumerable#find20 +
  0.000.000.000.008/57Array#each
  0.000.000.000.0049/57ProgressBar::Time#now16
0.00%0.00%0.000.000.000.0057 + + ProgressBar::Time#time + +
  0.000.000.000.0037/37ProgressBar::Throttle#choke16
0.00%0.00%0.000.000.000.0037 + + ProgressBar::Throttle#timer + +
  0.000.000.000.0011/11ProgressBar::Throttle#choke16
0.00%0.00%0.000.000.000.0011 + + ProgressBar::Throttle#rate + +
  0.000.000.000.001/1ProgressBar::Projectors::SmoothedAverage#initialize14
0.00%0.00%0.000.000.000.001 + + ProgressBar::Projectors::SmoothedAverage#strength= + +
  0.000.000.000.0014/14ProgressBar::Projectors::SmoothedAverage#progress=44
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Projectors::SmoothedAverage#strength + +
  0.000.000.000.001/2ProgressBar::Output#with_refresh229
  0.000.000.000.001/2ProgressBar::Projectors::SmoothedAverage#initialize16
0.00%0.00%0.000.000.000.002 + + ProgressBar::Projectors::SmoothedAverage#start + + 19
  0.000.000.000.002/14ProgressBar::Projectors::SmoothedAverage#progress=21 +
  0.000.000.000.002/16Array#[]=21 +
  0.000.000.000.001/13ProgressBar::Projectors::SmoothedAverage#progress21 +
  0.000.000.000.002/57ProgressBar::Projectors::SmoothedAverage#samples21 +
  0.000.000.000.002/2798991Hash#[]21 +
  0.000.000.000.002/17ProgressBar::Projectors::SmoothedAverage#projection=20 +
  0.000.000.000.001/1ProgressBar::Projectors::SmoothedAverage#initialize12
0.00%0.00%0.000.000.000.001 + + ProgressBar::Projectors::SmoothedAverage#samples= + +
  0.000.000.000.002/57ProgressBar::Projectors::SmoothedAverage#start21
  0.000.000.000.0014/57ProgressBar::Projectors::SmoothedAverage#progress=43
  0.000.000.000.0013/57ProgressBar::Projectors::SmoothedAverage#progress33
  0.000.000.000.0028/57ProgressBar::Projectors::SmoothedAverage#absolute67
0.00%0.00%0.000.000.000.0057 + + ProgressBar::Projectors::SmoothedAverage#samples + +
  0.000.000.000.002/17ProgressBar::Projectors::SmoothedAverage#start20
  0.000.000.000.001/17ProgressBar::Projectors::SmoothedAverage#initialize13
  0.000.000.000.0014/17ProgressBar::Projectors::SmoothedAverage#progress=44
0.00%0.00%0.000.000.000.0017 + + ProgressBar::Projectors::SmoothedAverage#projection= + +
  0.000.000.000.0014/14ProgressBar::Projectors::SmoothedAverage#progress=44
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Projectors::SmoothedAverage#absolute + + 66
  0.000.000.000.0014/40Integer#-67 +
  0.000.000.000.0028/4792535Array#[]67 +
  0.000.000.000.0028/57ProgressBar::Projectors::SmoothedAverage#samples67 +
  0.000.000.000.001/1ProgressBar::Progress#initialize13
0.00%0.00%0.000.000.000.001 + + ProgressBar::Progress#total= + + 64
  0.000.000.000.001/2NilClass#nil?65 +
  0.000.000.000.001/113ProgressBar::Progress#progress65 +
  0.000.000.000.001/2ProgressBar::Output#with_refresh228
  0.000.000.000.001/2ProgressBar::Progress#initialize15
0.00%0.00%0.000.000.000.002 + + ProgressBar::Progress#start + + 18
  0.000.000.000.002/14ProgressBar::Progress#progress=19 +
  0.000.000.000.002/2ProgressBar::Progress#starting_position=19 +
  0.000.000.000.002/2798991Hash#[]19 +
  0.000.000.000.001/113ProgressBar::Progress#progress19 +
  0.000.000.000.001/27ProgressBar::Output#clear_string38
  0.000.000.000.0013/27ProgressBar::Output#length42
  0.000.000.000.0013/27ProgressBar::Throttle#choke52
0.00%0.00%0.000.000.000.0027 + + ProgressBar::Output#length_calculator + +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Output#initialize + + 10
  0.000.000.000.002/107631Class#new13 +
  0.000.000.000.001/1ProgressBar::Output#bar=11 +
  0.000.000.000.001/1ProgressBar::Output#throttle=13 +
  0.000.000.000.001/1ProgressBar::Output#length_calculator=14 +
  0.000.000.000.001/1ProgressBar::Output#stream=12 +
  0.000.000.000.003/2798991Hash#[]11 +
  0.000.000.000.001/29ProgressBar::Output#stream14 +
  0.000.000.000.001/1ProgressBar::Components::Title#initialize9
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Title#title= + +
  0.000.000.000.001/1ProgressBar::Components::Time#initialize22
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Time#timer= + +
  0.000.000.000.001/1ProgressBar::Components::Time#initialize24
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Time#projector= + +
  0.000.000.000.001/1ProgressBar::Components::Time#initialize23
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Time#progress= + +
  0.000.000.000.001/1ProgressBar::Components::Rate#initialize10
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Rate#timer= + +
  0.000.000.000.001/1ProgressBar::Components::Rate#initialize9
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Rate#rate_scale= + +
  0.000.000.000.001/1ProgressBar::Components::Rate#initialize11
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Rate#progress= + +
  0.000.000.000.001/1ProgressBar::Components::Percentage#initialize7
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Percentage#progress= + +
  0.000.000.000.001/1ProgressBar::Components::Bar#initialize18
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Bar#upa_steps= + +
  0.000.000.000.001/1ProgressBar::Components::Bar#initialize20
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Bar#remainder_mark= + +
  0.000.000.000.001/1ProgressBar::Components::Bar#initialize19
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Bar#progress_mark= + +
  0.000.000.000.001/1ProgressBar::Components::Bar#initialize21
0.00%0.00%0.000.000.000.001 + + ProgressBar::Components::Bar#progress= + +
  0.000.000.000.001/14ProgressBar::Components::Bar#initialize22
  0.000.000.000.0013/14ProgressBar::Components::Bar#complete_bar42
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Components::Bar#length= + +
  0.000.000.000.001/1ProgressBar::Components::Rate#initialize9
0.00%0.00%0.000.000.000.001 + + Kernel#lambda + +
  0.000.000.000.0014/14ProgressBar::Projectors::SmoothedAverage#progress=44
0.00%0.00%0.000.000.000.0014 + + Kernel#class + + 18
  0.000.000.000.0011/25ProgressBar::Components::Time#estimated73
  0.000.000.000.0014/25ProgressBar::Progress#progress=56
0.00%0.00%0.000.000.000.0025 + + Integer#> + +
  0.000.000.000.0011/11ProgressBar::Throttle#choke16
0.00%0.00%0.000.000.000.0011 + + Float#>= + +
  0.000.000.000.004/28ProgressBar::Format::Molecule#non_bar_molecule?43
  0.000.000.000.0011/28ProgressBar::Timer#reset?49
  0.000.000.000.0013/28ProgressBar::Throttle#choke16
0.00%0.00%0.000.000.000.0028 + + BasicObject#! + +
  0.000.000.000.002/16ProgressBar::Projectors::SmoothedAverage#start21
  0.000.000.000.0014/16ProgressBar::Projectors::SmoothedAverage#progress=43
0.00%0.00%0.000.000.000.0016 + + Array#[]= + +
  0.000.000.000.0049/49ProgressBar::Time#now16
0.00%0.00%0.000.000.000.0049 + + <Class::Time>#now + + 225
  0.000.000.000.0014/14ProgressBar::Projectors::SmoothedAverage#progress=44
0.00%0.00%0.000.000.000.0014 + + <Class::ProgressBar::Projectors::SmoothedAverage>#calculate + + 56
  0.000.000.000.0014/25Float#-57 +
  0.000.000.000.0014/14Float#+57 +
  0.000.000.000.0014/80Integer#*57 +
  0.000.000.000.0014/38Float#*57 +
  0.000.000.000.0036/36ProgressBar::Timer#elapsed_seconds60
0.00%0.00%0.000.000.000.0036 + + Time#- + +
  0.000.000.000.0036/36Integer#fdiv +
  0.000.000.000.0036/87ProgressBar::Timer#elapsed_seconds60
  0.000.000.000.0051/87ProgressBar::Timer#stopped?40
0.00%0.00%0.000.000.000.0087 + + ProgressBar::Timer#stopped_at + +
  0.000.000.000.0013/13ProgressBar::Timer#restart53
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Timer#reset + + 43
  0.000.000.000.0013/28ProgressBar::Timer#stopped_at=45 +
  0.000.000.000.0013/27ProgressBar::Timer#started_at=44 +
  0.000.000.000.002/2Class#new
0.00%0.00%0.000.000.000.002 + + ProgressBar::Time#initialize + + 11
  0.000.000.000.002/2ProgressBar::Time#time=12 +
  0.000.000.000.002/2ProgressBar::Progress#start19
0.00%0.00%0.000.000.000.002 + + ProgressBar::Progress#starting_position= + +
  0.000.000.000.0013/13ProgressBar::Output#print_and_flush67
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Outputs::Tty#eol + + 27
  0.000.000.000.0013/26ProgressBar::Base#stopped?28 +
  0.000.000.000.0013/39ProgressBar::Output#bar28 +
  0.000.000.000.001/1ProgressBar::Output#initialize13
0.00%0.00%0.000.000.000.001 + + ProgressBar::Output#throttle= + +
  0.000.000.000.001/1ProgressBar::Output#initialize12
0.00%0.00%0.000.000.000.001 + + ProgressBar::Output#stream= + +
  0.000.000.000.002/29ProgressBar::Outputs::Tty#clear11
  0.000.000.000.001/29ProgressBar::Output#initialize14
  0.000.000.000.0026/29ProgressBar::Output#print_and_flush67
0.00%0.00%0.000.000.000.0029 + + ProgressBar::Output#stream + +
  0.000.000.000.001/1ProgressBar::Output#initialize14
0.00%0.00%0.000.000.000.001 + + ProgressBar::Output#length_calculator= + +
  0.000.000.000.001/1ProgressBar::Output#initialize11
0.00%0.00%0.000.000.000.001 + + ProgressBar::Output#bar= + +
  0.000.000.000.001/14ProgressBar::Calculators::Length#initialize11
  0.000.000.000.0013/14ProgressBar::Calculators::Length#length_changed?20
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Calculators::Length#current_length= + +
  0.000.000.000.0014/40ProgressBar::Calculators::Length#length15
  0.000.000.000.0026/40ProgressBar::Calculators::Length#length_changed?19
0.00%0.00%0.000.000.000.0040 + + ProgressBar::Calculators::Length#current_length + +
  0.000.000.000.0013/40ProgressBar::Components::Bar#incomplete_string82
  0.000.000.000.0013/40<Class::ProgressBar::Format::Formatter>#process13
  0.000.000.000.0014/40ProgressBar::Projectors::SmoothedAverage#absolute67
0.00%0.00%0.000.000.000.0040 + + Integer#- + +
  0.000.000.000.001/80ProgressBar::Format::String#bar_molecule_placeholder_length14
  0.000.000.000.0013/80ProgressBar::Progress#percentage_completed_with_precision101
  0.000.000.000.0026/80ProgressBar::Components::Bar#completed_length92
  0.000.000.000.0026/80ProgressBar::Progress#percentage_completed82
  0.000.000.000.0014/80<Class::ProgressBar::Projectors::SmoothedAverage>#calculate57
0.00%0.00%0.000.000.000.0080 + + Integer#* + +
  0.000.000.000.0013/13ProgressBar::Output#print_and_flush68
0.00%0.00%0.000.000.000.0013 + + IO#flush + +
  0.000.000.000.0011/25ProgressBar::Components::Time#estimated_seconds_remaining97
  0.000.000.000.0014/25<Class::ProgressBar::Projectors::SmoothedAverage>#calculate57
0.00%0.00%0.000.000.000.0025 + + Float#- + +
  0.000.000.000.0014/14<Class::ProgressBar::Projectors::SmoothedAverage>#calculate57
0.00%0.00%0.000.000.000.0014 + + Float#+ + +
  0.000.000.000.0011/38ProgressBar::Components::Time#estimated_seconds_remaining97
  0.000.000.000.0014/38<Class::ProgressBar::Projectors::SmoothedAverage>#calculate57
  0.000.000.000.0013/38ProgressBar::Progress#percentage_completed_with_precision101
0.00%0.00%0.000.000.000.0038 + + Float#* + +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#length_changed?22
0.00%0.00%0.000.000.000.0013 + + BasicObject#!= + +
  0.000.000.000.0012/125Integer#== +
  0.000.000.000.001/1BasicObject#== +
  0.000.000.000.002/2ProgressBar::Time#initialize12
0.00%0.00%0.000.000.000.002 + + ProgressBar::Time#time= + +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Throttle#initialize + + 8
  0.000.000.000.001/107631Class#new12 +
  0.000.000.000.001/1ProgressBar::Throttle#timer=12 +
  0.000.000.000.001/1ProgressBar::Throttle#rate=9 +
  0.000.000.000.001/1ProgressBar::Throttle#stopped_at=11 +
  0.000.000.000.001/1ProgressBar::Throttle#started_at=10 +
  0.000.000.000.001/21Hash#fetch12 +
  0.000.000.000.001/2798991Hash#[]9 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#calculate_length26
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#length_override + +
  0.000.000.000.001/1Class#new
0.00%0.00%0.000.000.000.001 + + ProgressBar::Calculators::Length#initialize + + 8
  0.000.000.000.001/1ProgressBar::Calculators::Length#length_override=9 +
  0.000.000.000.001/14ProgressBar::Calculators::Length#current_length=11 +
  0.000.000.000.001/1ProgressBar::Calculators::Length#output=10 +
  0.000.000.000.002/2798991Hash#[]9 +
  0.000.000.000.0036/36Time#-
0.00%0.00%0.000.000.000.0036 + + Integer#fdiv + +
  0.000.000.000.002/2ProgressBar::Time#unmocked_time_method20
0.00%0.00%0.000.000.000.002 + + Enumerable#find + +
  0.000.000.000.002/39Array#each +
  0.000.000.000.001/1ProgressBar::Throttle#initialize12
0.00%0.00%0.000.000.000.001 + + ProgressBar::Throttle#timer= + +
  0.000.000.000.001/1ProgressBar::Throttle#initialize11
0.00%0.00%0.000.000.000.001 + + ProgressBar::Throttle#stopped_at= + +
  0.000.000.000.001/1ProgressBar::Throttle#initialize10
0.00%0.00%0.000.000.000.001 + + ProgressBar::Throttle#started_at= + +
  0.000.000.000.001/1ProgressBar::Throttle#initialize9
0.00%0.00%0.000.000.000.001 + + ProgressBar::Throttle#rate= + +
  0.000.000.000.001/1ProgressBar::Throttle#choke52
0.00%0.00%0.000.000.000.001 + + ProgressBar::Outputs::Tty#clear + + 10
  0.000.000.000.002/15IO#print11 +
  0.000.000.000.001/1ProgressBar::Output#clear_string11 +
  0.000.000.000.002/29ProgressBar::Output#stream11 +
  0.000.000.000.0013/13ProgressBar::Base#to_s172
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Output#length + + 41
  0.000.000.000.0013/14ProgressBar::Calculators::Length#length42 +
  0.000.000.000.0013/27ProgressBar::Output#length_calculator42 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#terminal_width44
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#unix? + + 93
  0.000.000.000.0013/447587String#=~94 +
  0.000.000.000.001/1ProgressBar::Calculators::Length#initialize10
0.00%0.00%0.000.000.000.001 + + ProgressBar::Calculators::Length#output= + +
  0.000.000.000.001/1ProgressBar::Calculators::Length#initialize9
0.00%0.00%0.000.000.000.001 + + ProgressBar::Calculators::Length#length_override= + + 33
  0.000.000.000.001/1#<Class:0x0000000102562ef0>#[]34 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#terminal_width46
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#dynamic_width + + 56
  0.000.000.000.0013/13ProgressBar::Calculators::Length#dynamic_width_via_output_stream_object58 +
  0.000.000.000.0013/14IO#tty?57 +
  0.000.000.000.0013/21Kernel#respond_to?57 +
  0.000.000.000.0039/52ProgressBar::Calculators::Length#output57 +
  0.000.000.000.0013/26<Class::ProgressBar::Format::Formatter>#process16
  0.000.000.000.0013/26ProgressBar::Calculators::Length#terminal_width47
0.00%0.00%0.000.000.000.0026 + + Integer#< + +
  0.000.000.000.0013/13<Class::ProgressBar::Format::Formatter>#process5
0.00%0.00%0.000.000.000.0013 + + String#dup + +
  0.000.000.000.0013/13Kernel#initialize_dup +
  0.000.000.000.001/1ProgressBar::Outputs::Tty#clear11
0.00%0.00%0.000.000.000.001 + + ProgressBar::Output#clear_string + + 37
  0.000.000.000.001/27String#*38 +
  0.000.000.000.001/14ProgressBar::Calculators::Length#length38 +
  0.000.000.000.001/27ProgressBar::Output#length_calculator38 +
  0.000.000.000.0013/13<Class::ProgressBar::Format::Formatter>#process7
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Format::String#non_bar_molecules + + 17
  0.000.000.000.001/2ProgressBar::Format::String#molecules18 +
  0.000.000.000.001/2Array#select18 +
  0.000.000.000.0013/13<Class::ProgressBar::Format::Formatter>#process13
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Format::String#displayable_length + + 9
  0.000.000.000.0013/13String#gsub10 +
  0.000.000.000.0013/13String#length10 +
  0.000.000.000.0013/14<Class::ProgressBar::Format::Formatter>#process18
  0.000.000.000.001/14ProgressBar::Format::String#bar_molecule_placeholder_length14
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Format::String#bar_molecules + + 21
  0.000.000.000.001/2Array#select22 +
  0.000.000.000.001/2ProgressBar::Format::String#molecules22 +
  0.000.000.000.0013/13<Class::ProgressBar::Format::Formatter>#process13
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Format::String#bar_molecule_placeholder_length + + 13
  0.000.000.000.001/14ProgressBar::Format::String#bar_molecules14 +
  0.000.000.000.001/1Array#size14 +
  0.000.000.000.001/80Integer#*14 +
  0.000.000.000.0013/52ProgressBar::Calculators::Length#dynamic_width_via_output_stream_object72
  0.000.000.000.0039/52ProgressBar::Calculators::Length#dynamic_width57
0.00%0.00%0.000.000.000.0052 + + ProgressBar::Calculators::Length#output + +
  0.000.000.000.001/14ProgressBar::Output#clear_string38
  0.000.000.000.0013/14ProgressBar::Output#length42
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Calculators::Length#length + + 14
  0.000.000.000.0014/40ProgressBar::Calculators::Length#current_length15 +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#dynamic_width58
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Calculators::Length#dynamic_width_via_output_stream_object + + 71
  0.000.000.000.0013/13IO#winsize72 +
  0.000.000.000.0013/52ProgressBar::Calculators::Length#output72 +
  0.000.000.000.008/21Array#each
  0.000.000.000.0013/21ProgressBar::Calculators::Length#dynamic_width57
0.00%0.00%0.000.000.000.0021 + + Kernel#respond_to? + +
  0.000.000.000.001/1ProgressBar::Calculators::Length#length_override=34
0.00%0.00%0.000.000.000.001 + + #<Class:0x0000000102562ef0>#[] + +
  0.000.000.000.0013/13ProgressBar::Format::String#displayable_length10
0.00%0.00%0.000.000.000.0013 + + String#length + +
  0.000.000.000.0013/13ProgressBar::Format::String#displayable_length10
0.00%0.00%0.000.000.000.0013 + + String#gsub + +
  0.000.000.000.001/27ProgressBar::Output#clear_string38
  0.000.000.000.0013/27ProgressBar::Components::Bar#incomplete_string82
  0.000.000.000.0013/27ProgressBar::Components::Bar#standard_complete_string78
0.00%0.00%0.000.000.000.0027 + + String#* + +
  0.000.000.000.0052/52Array#each
0.00%0.00%0.000.000.000.0052 + + ProgressBar::Format::Molecule#full_key + + 46
  0.000.000.000.0052/116ProgressBar::Format::Molecule#key47 +
  0.000.000.000.0013/13String#dup
0.00%0.00%0.000.000.000.0013 + + Kernel#initialize_dup + +
  0.000.000.000.0013/13String#initialize_copy +
  0.000.000.000.0013/13ProgressBar::Calculators::Length#dynamic_width_via_output_stream_object72
0.00%0.00%0.000.000.000.0013 + + IO#winsize + +
  0.000.000.000.001/1BasicObject#!=
0.00%0.00%0.000.000.000.001 + + BasicObject#== + +
  0.000.000.000.0013/65ProgressBar::Components::Percentage#justified_percentage_with_precision23
  0.000.000.000.0052/65ProgressBar::Format::Molecule#lookup_value56
0.00%0.00%0.000.000.000.0065 + + String#to_s + +
  0.000.000.000.0013/13Kernel#initialize_dup
0.00%0.00%0.000.000.000.0013 + + String#initialize_copy + +
  0.000.000.000.00104/104ProgressBar::Format::Molecule#lookup_value51
0.00%0.00%0.000.000.000.00104 + + ProgressBar::Format::Molecule#method_name + +
  0.000.000.000.004/116ProgressBar::Format::Molecule#initialize35
  0.000.000.000.0060/116ProgressBar::Format::Molecule#bar_molecule?39
  0.000.000.000.0052/116ProgressBar::Format::Molecule#full_key47
0.00%0.00%0.000.000.000.00116 + + ProgressBar::Format::Molecule#key + +
  0.000.000.000.004/60Array#select
  0.000.000.000.004/60ProgressBar::Format::Molecule#non_bar_molecule?43
  0.000.000.000.0052/60ProgressBar::Format::Molecule#lookup_value53
0.00%0.00%0.000.000.000.0060 + + ProgressBar::Format::Molecule#bar_molecule? + + 38
  0.000.000.000.0060/60Array#include?39 +
  0.000.000.000.0060/116ProgressBar::Format::Molecule#key39 +
  0.000.000.000.0026/26ProgressBar::Format::Molecule#lookup_value51
0.00%0.00%0.000.000.000.0026 + + ProgressBar::Base#time_component + +
  0.000.000.000.0013/13ProgressBar::Format::Molecule#lookup_value51
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Base#percentage_component + +
  0.000.000.000.0013/13ProgressBar::Format::Molecule#lookup_value51
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Base#bar_component + +
  0.000.000.000.0013/13ProgressBar::Components::Percentage#justified_percentage_with_precision23
0.00%0.00%0.000.000.000.0013 + + String#rjust + +
  0.000.000.000.0013/13ProgressBar::Components::Percentage#justified_percentage_with_precision23
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Progress#percentage_completed_with_precision + + 97
  0.000.000.000.0013/38String#%101 +
  0.000.000.000.0026/89Integer#/101 +
  0.000.000.000.0039/205ProgressBar::Progress#total98 +
  0.000.000.000.0013/13Integer#to_f101 +
  0.000.000.000.0013/38Float#*101 +
  0.000.000.000.0013/89Kernel#nil?99 +
  0.000.000.000.0013/27Float#floor101 +
  0.000.000.000.0013/80Integer#*101 +
  0.000.000.000.0013/113ProgressBar::Progress#progress101 +
  0.000.000.000.0013/125Integer#==98 +
  0.000.000.000.0013/13ProgressBar::Components::Percentage#justified_percentage_with_precision23
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Percentage#progress + +
  0.000.000.000.0060/60ProgressBar::Format::Molecule#bar_molecule?39
0.00%0.00%0.000.000.000.0060 + + Array#include? + +
  0.000.000.000.0013/13ProgressBar::Components::Bar#to_s28
0.00%0.00%0.000.000.000.0013 + + Symbol#== + +
  0.000.000.000.0011/38ProgressBar::Components::Time#estimated76
  0.000.000.000.0014/38ProgressBar::Components::Time#elapsed85
  0.000.000.000.0013/38ProgressBar::Progress#percentage_completed_with_precision101
0.00%0.00%0.000.000.000.0038 + + String#% + +
  0.000.000.000.0014/14ProgressBar::Components::Time#elapsed83
0.00%0.00%0.000.000.000.0014 + + ProgressBar::Timer#elapsed_whole_seconds + + 63
  0.000.000.000.0014/36ProgressBar::Timer#elapsed_seconds64 +
  0.000.000.000.0014/27Float#floor64 +
  0.000.000.000.0011/25ProgressBar::Components::Time#estimated71
  0.000.000.000.0014/25ProgressBar::Components::Time#elapsed83
0.00%0.00%0.000.000.000.0025 + + ProgressBar::Timer#divide_seconds + + 67
  0.000.000.000.0050/50Integer#divmod68 +
  0.000.000.000.0012/25ProgressBar::Components::Time#estimated_seconds_remaining95
  0.000.000.000.0013/25ProgressBar::Components::Bar#to_s26
0.00%0.00%0.000.000.000.0025 + + ProgressBar::Progress#unknown? + + 89
  0.000.000.000.0050/89Kernel#nil?90 +
  0.000.000.000.0025/205ProgressBar::Progress#total90 +
  0.000.000.000.0025/113ProgressBar::Progress#progress90 +
  0.000.000.000.001/2ProgressBar::Format::String#bar_molecules22
  0.000.000.000.001/2ProgressBar::Format::String#non_bar_molecules18
0.00%0.00%0.000.000.000.002 + + ProgressBar::Format::String#molecules + + 25
  0.000.000.000.001/1String#scan29 +
  0.000.000.000.0011/86ProgressBar::Components::Time#estimated71
  0.000.000.000.0033/86ProgressBar::Components::Time#estimated_seconds_remaining95
  0.000.000.000.0042/86ProgressBar::Components::Time#elapsed81
0.00%0.00%0.000.000.000.0086 + + ProgressBar::Components::Time#timer + +
  0.000.000.000.0013/47ProgressBar::Components::Time#estimated_with_elapsed_fallback89
  0.000.000.000.0034/47ProgressBar::Components::Time#estimated_seconds_remaining95
0.00%0.00%0.000.000.000.0047 + + ProgressBar::Components::Time#progress + +
  0.000.000.000.0013/13ProgressBar::Components::Bar#to_s29
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Bar#standard_complete_string + + 77
  0.000.000.000.0013/26ProgressBar::Components::Bar#completed_length78 +
  0.000.000.000.0013/27String#*78 +
  0.000.000.000.0013/13ProgressBar::Components::Bar#progress_mark78 +
  0.000.000.000.0013/39ProgressBar::Components::Bar#to_s26
  0.000.000.000.0026/39ProgressBar::Components::Bar#completed_length92
0.00%0.00%0.000.000.000.0039 + + ProgressBar::Components::Bar#progress + +
  0.000.000.000.0013/13ProgressBar::Components::Bar#to_s29
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Bar#incomplete_string + + 81
  0.000.000.000.0013/26ProgressBar::Components::Bar#completed_length82 +
  0.000.000.000.0013/27String#*82 +
  0.000.000.000.0013/13ProgressBar::Components::Bar#remainder_mark82 +
  0.000.000.000.0013/39ProgressBar::Components::Bar#length82 +
  0.000.000.000.0013/40Integer#-82 +
  0.000.000.000.0026/89ProgressBar::Progress#percentage_completed74
  0.000.000.000.0013/89ProgressBar::Progress#percentage_completed_with_precision99
  0.000.000.000.0050/89ProgressBar::Progress#unknown?90
0.00%0.00%0.000.000.000.0089 + + Kernel#nil? + +
  0.000.000.000.0013/13ProgressBar::Progress#percentage_completed_with_precision101
0.00%0.00%0.000.000.000.0013 + + Integer#to_f + +
  0.000.000.000.0011/89ProgressBar::Components::Time#estimated_seconds_remaining97
  0.000.000.000.0026/89ProgressBar::Progress#percentage_completed82
  0.000.000.000.0026/89ProgressBar::Components::Bar#completed_length92
  0.000.000.000.0026/89ProgressBar::Progress#percentage_completed_with_precision101
0.00%0.00%0.000.000.000.0089 + + Integer#/ + +
  0.000.000.000.0013/27ProgressBar::Progress#percentage_completed_with_precision101
  0.000.000.000.0014/27ProgressBar::Timer#elapsed_whole_seconds64
0.00%0.00%0.000.000.000.0027 + + Float#floor + +
  0.000.000.000.001/1ProgressBar::Format::String#bar_molecule_placeholder_length14
0.00%0.00%0.000.000.000.001 + + Array#size + +
  0.000.000.000.001/2ProgressBar::Format::String#bar_molecules22
  0.000.000.000.001/2ProgressBar::Format::String#non_bar_molecules18
0.00%0.00%0.000.000.000.002 + + Array#select + +
  0.000.000.000.004/4ProgressBar::Format::Molecule#non_bar_molecule? +
  0.000.000.000.004/60ProgressBar::Format::Molecule#bar_molecule? +
  0.000.000.000.001/1ProgressBar::Format::String#molecules29
0.00%0.00%0.000.000.000.001 + + String#scan + +
  0.000.000.000.004/107631Class#new30 +
  0.000.000.000.004/4String#[]30 +
  0.000.000.000.004/592394Array#<<30 +
  0.000.000.000.004/4Array#select
0.00%0.00%0.000.000.000.004 + + ProgressBar::Format::Molecule#non_bar_molecule? + + 42
  0.000.000.000.004/60ProgressBar::Format::Molecule#bar_molecule?43 +
  0.000.000.000.004/28BasicObject#!43 +
  0.000.000.000.0013/13ProgressBar::Components::Bar#incomplete_string82
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Bar#remainder_mark + +
  0.000.000.000.0013/13ProgressBar::Components::Bar#standard_complete_string78
0.00%0.00%0.000.000.000.0013 + + ProgressBar::Components::Bar#progress_mark + +
  0.000.000.000.0013/39ProgressBar::Components::Bar#incomplete_string82
  0.000.000.000.0026/39ProgressBar::Components::Bar#completed_length92
0.00%0.00%0.000.000.000.0039 + + ProgressBar::Components::Bar#length + +
  0.000.000.000.0013/26ProgressBar::Components::Bar#incomplete_string82
  0.000.000.000.0013/26ProgressBar::Components::Bar#standard_complete_string78
0.00%0.00%0.000.000.000.0026 + + ProgressBar::Components::Bar#completed_length + + 91
  0.000.000.000.0026/26ProgressBar::Progress#percentage_completed92 +
  0.000.000.000.0026/39ProgressBar::Components::Bar#length92 +
  0.000.000.000.0026/26Integer#floor92 +
  0.000.000.000.0026/89Integer#/92 +
  0.000.000.000.0026/39ProgressBar::Components::Bar#progress92 +
  0.000.000.000.0026/80Integer#*92 +
  0.000.000.000.0050/50ProgressBar::Timer#divide_seconds68
0.00%0.00%0.000.000.000.0050 + + Integer#divmod + +
  0.000.000.000.004/4String#scan
0.00%0.00%0.000.000.000.004 + + String#[] + +
  0.000.000.000.0026/26ProgressBar::Components::Bar#completed_length92
0.00%0.00%0.000.000.000.0026 + + ProgressBar::Progress#percentage_completed + + 73
  0.000.000.000.0078/205ProgressBar::Progress#total74 +
  0.000.000.000.0026/26Integer#to_i82 +
  0.000.000.000.0026/89Integer#/82 +
  0.000.000.000.0026/80Integer#*82 +
  0.000.000.000.0026/125Integer#==75 +
  0.000.000.000.0026/89Kernel#nil?74 +
  0.000.000.000.0026/113ProgressBar::Progress#progress82 +
  0.000.000.000.0026/26ProgressBar::Components::Bar#completed_length92
0.00%0.00%0.000.000.000.0026 + + Integer#floor + +
  0.000.000.000.0011/11ProgressBar::Components::Time#estimated_seconds_remaining95
0.00%0.00%0.000.000.000.0011 + + ProgressBar::Timer#reset? + + 48
  0.000.000.000.0011/28BasicObject#!49 +
  0.000.000.000.0011/111ProgressBar::Timer#started_at49 +
  0.000.000.000.0012/23ProgressBar::Projectors::SmoothedAverage#none?53
  0.000.000.000.0011/23ProgressBar::Components::Time#estimated_seconds_remaining97
0.00%0.00%0.000.000.000.0023 + + ProgressBar::Projectors::SmoothedAverage#projection + +
  0.000.000.000.0012/12ProgressBar::Components::Time#estimated_seconds_remaining95
0.00%0.00%0.000.000.000.0012 + + ProgressBar::Projectors::SmoothedAverage#none? + + 52
  0.000.000.000.0012/12Float#zero?53 +
  0.000.000.000.0012/23ProgressBar::Projectors::SmoothedAverage#projection53 +
  0.000.000.000.0011/11ProgressBar::Components::Time#estimated_seconds_remaining95
0.00%0.00%0.000.000.000.0011 + + ProgressBar::Progress#none? + + 85
  0.000.000.000.0011/11Integer#zero?86 +
  0.000.000.000.0011/113ProgressBar::Progress#progress86 +
  0.000.000.000.004/4Class#new
0.00%0.00%0.000.000.000.004 + + ProgressBar::Format::Molecule#initialize + + 33
  0.000.000.000.004/4String#to_sym35 +
  0.000.000.000.004/4ProgressBar::Format::Molecule#method_name=35 +
  0.000.000.000.004/4ProgressBar::Format::Molecule#key=34 +
  0.000.000.000.004/21Hash#fetch35 +
  0.000.000.000.004/116ProgressBar::Format::Molecule#key35 +
  0.000.000.000.0023/23ProgressBar::Components::Time#estimated_seconds_remaining95
0.00%0.00%0.000.000.000.0023 + + ProgressBar::Components::Time#projector + +
  0.000.000.000.0026/26ProgressBar::Progress#percentage_completed82
0.00%0.00%0.000.000.000.0026 + + Integer#to_i + + 247
  0.000.000.000.0011/11ProgressBar::Components::Time#estimated_seconds_remaining97
0.00%0.00%0.000.000.000.0011 + + Float#round + +
  0.000.000.000.004/4ProgressBar::Format::Molecule#initialize35
0.00%0.00%0.000.000.000.004 + + String#to_sym + +
  0.000.000.000.004/4ProgressBar::Format::Molecule#initialize35
0.00%0.00%0.000.000.000.004 + + ProgressBar::Format::Molecule#method_name= + +
  0.000.000.000.004/4ProgressBar::Format::Molecule#initialize34
0.00%0.00%0.000.000.000.004 + + ProgressBar::Format::Molecule#key= + +
  0.000.000.000.0011/11ProgressBar::Progress#none?86
0.00%0.00%0.000.000.000.0011 + + Integer#zero? + + 263
  0.000.000.000.0012/12ProgressBar::Projectors::SmoothedAverage#none?53
0.00%0.00%0.000.000.000.0012 + + Float#zero? + + 349
* indicates recursively called methods
+ +
+ + + + diff --git a/task-1-assert-performance.rb b/task-1-assert-performance.rb new file mode 100644 index 00000000..b3985113 --- /dev/null +++ b/task-1-assert-performance.rb @@ -0,0 +1,16 @@ +# rspec task-1-assert-performance.rb + +require 'rspec-benchmark' +require_relative 'task-1' + +RSpec.configure do |config| + config.include RSpec::Benchmark::Matchers +end + +describe 'Performance' do + describe 'task-1#work' do + it 'works with large data under 30 sec' do + expect { work(file_name: "data_large.txt") }.to perform_under(30).sec + end + end +end diff --git a/task-1-ruby-prof-callstack.rb b/task-1-ruby-prof-callstack.rb new file mode 100644 index 00000000..ea0fffae --- /dev/null +++ b/task-1-ruby-prof-callstack.rb @@ -0,0 +1,14 @@ +# head -n data_large.txt > data_prof.txt +# ruby task-1-ruby-prof-callstack.rb + +require 'ruby-prof' +require_relative 'task-1' + +RubyProf.measure_mode = RubyProf::WALL_TIME + +result = RubyProf.profile do + work(file_name: "data_prof.txt") +end + +printer = RubyProf::CallStackPrinter.new(result) +printer.print(File.open('prof_reports/ruby_prof_callstack.html', 'w+')) diff --git a/task-1-ruby-prof-graph.rb b/task-1-ruby-prof-graph.rb new file mode 100644 index 00000000..05987af1 --- /dev/null +++ b/task-1-ruby-prof-graph.rb @@ -0,0 +1,14 @@ +# head -n data_large.txt > data_prof.txt +# ruby task-1-ruby-prof-graph.rb + +require 'ruby-prof' +require_relative 'task-1' + +RubyProf.measure_mode = RubyProf::WALL_TIME + +result = RubyProf.profile do + work(file_name: "data_prof.txt") +end + +printer = RubyProf::GraphHtmlPrinter.new(result) +printer.print(File.open("prof_reports/ruby_prof_graph.html", "w+")) diff --git a/task-1-test.rb b/task-1-test.rb new file mode 100644 index 00000000..3832df2f --- /dev/null +++ b/task-1-test.rb @@ -0,0 +1,37 @@ +# ruby task-1-test.rb + +require 'minitest/autorun' +require_relative 'task-1' + +class TestMe < Minitest::Test + def setup + File.write('result.json', '') + File.write('data.txt', +'user,0,Leida,Cira,0 +session,0,0,Safari 29,87,2016-10-23 +session,0,1,Firefox 12,118,2017-02-27 +session,0,2,Internet Explorer 28,31,2017-03-28 +session,0,3,Internet Explorer 28,109,2016-09-15 +session,0,4,Safari 39,104,2017-09-27 +session,0,5,Internet Explorer 35,6,2016-09-01 +user,1,Palmer,Katrina,65 +session,1,0,Safari 17,12,2016-10-21 +session,1,1,Firefox 32,3,2016-12-20 +session,1,2,Chrome 6,59,2016-11-11 +session,1,3,Internet Explorer 10,28,2017-04-29 +session,1,4,Chrome 13,116,2016-12-28 +user,2,Gregory,Santos,86 +session,2,0,Chrome 35,6,2018-09-21 +session,2,1,Safari 49,85,2017-05-22 +session,2,2,Firefox 47,17,2018-02-02 +session,2,3,Chrome 20,84,2016-11-25 +user,3,Evgeny,Araslanov,38 +') + end + + def test_result + work(file_name: 'data.txt') + expected_result = '{"totalUsers":4,"uniqueBrowsersCount":14,"totalSessions":15,"allBrowsers":"CHROME 13,CHROME 20,CHROME 35,CHROME 6,FIREFOX 12,FIREFOX 32,FIREFOX 47,INTERNET EXPLORER 10,INTERNET EXPLORER 28,INTERNET EXPLORER 35,SAFARI 17,SAFARI 29,SAFARI 39,SAFARI 49","usersStats":{"Leida Cira":{"sessionsCount":6,"totalTime":"455 min.","longestSession":"118 min.","browsers":"FIREFOX 12, INTERNET EXPLORER 28, INTERNET EXPLORER 28, INTERNET EXPLORER 35, SAFARI 29, SAFARI 39","usedIE":true,"alwaysUsedChrome":false,"dates":["2017-09-27","2017-03-28","2017-02-27","2016-10-23","2016-09-15","2016-09-01"]},"Palmer Katrina":{"sessionsCount":5,"totalTime":"218 min.","longestSession":"116 min.","browsers":"CHROME 13, CHROME 6, FIREFOX 32, INTERNET EXPLORER 10, SAFARI 17","usedIE":true,"alwaysUsedChrome":false,"dates":["2017-04-29","2016-12-28","2016-12-20","2016-11-11","2016-10-21"]},"Gregory Santos":{"sessionsCount":4,"totalTime":"192 min.","longestSession":"85 min.","browsers":"CHROME 20, CHROME 35, FIREFOX 47, SAFARI 49","usedIE":false,"alwaysUsedChrome":false,"dates":["2018-09-21","2018-02-02","2017-05-22","2016-11-25"]},"Evgeny Araslanov":{"sessionsCount":0,"totalTime":"0 min.","longestSession":" min.","browsers":"","usedIE":false,"alwaysUsedChrome":true,"dates":[]}}}' + "\n" + assert_equal expected_result, File.read('result.json') + end +end \ No newline at end of file diff --git a/task-1.rb b/task-1.rb index 778672df..b03ce258 100644 --- a/task-1.rb +++ b/task-1.rb @@ -3,7 +3,7 @@ require 'json' require 'pry' require 'date' -require 'minitest/autorun' +require 'ruby-progressbar' class User attr_reader :attributes, :sessions @@ -43,17 +43,32 @@ def collect_stats_from_users(report, users_objects, &block) end end -def work - file_lines = File.read('data.txt').split("\n") +def select_sessions_for_users(sessions) + sessions.each_with_object({}) do |session, result| + result[session['user_id']] ||= [] + result[session['user_id']] << session + end +end + +def work(file_name:) + progressbar = ProgressBar.create( + total: 12, + format: '%a, %J, %E %B', + output: file_name == 'data.txt' ? File.open(File::NULL, 'w') : $stdout # TEST + ) + + file_lines = File.read(file_name).split("\n") + progressbar.increment users = [] sessions = [] file_lines.each do |line| cols = line.split(',') - users = users + [parse_user(line)] if cols[0] == 'user' - sessions = sessions + [parse_session(line)] if cols[0] == 'session' + users.concat([parse_user(line)]) if cols[0] == 'user' + sessions.concat([parse_session(line)]) if cols[0] == 'session' end + progressbar.increment # Отчёт в json # - Сколько всего юзеров + @@ -75,11 +90,12 @@ def work report[:totalUsers] = users.count # Подсчёт количества уникальных браузеров - uniqueBrowsers = [] + uniqueBrowsers = Set.new sessions.each do |session| browser = session['browser'] - uniqueBrowsers += [browser] if uniqueBrowsers.all? { |b| b != browser } + uniqueBrowsers.add(browser) end + progressbar.increment report['uniqueBrowsersCount'] = uniqueBrowsers.count @@ -96,12 +112,15 @@ def work # Статистика по пользователям users_objects = [] + users_sessions = select_sessions_for_users(sessions) + users.each do |user| attributes = user - user_sessions = sessions.select { |session| session['user_id'] == user['id'] } + user_sessions = users_sessions[user['id']] || [] user_object = User.new(attributes: attributes, sessions: user_sessions) - users_objects = users_objects + [user_object] + users_objects.concat([user_object]) end + progressbar.increment report['usersStats'] = {} @@ -109,68 +128,44 @@ def work collect_stats_from_users(report, users_objects) do |user| { 'sessionsCount' => user.sessions.count } end + progressbar.increment # Собираем количество времени по пользователям collect_stats_from_users(report, users_objects) do |user| { 'totalTime' => user.sessions.map {|s| s['time']}.map {|t| t.to_i}.sum.to_s + ' min.' } end + progressbar.increment # Выбираем самую длинную сессию пользователя collect_stats_from_users(report, users_objects) do |user| { 'longestSession' => user.sessions.map {|s| s['time']}.map {|t| t.to_i}.max.to_s + ' min.' } end + progressbar.increment # Браузеры пользователя через запятую collect_stats_from_users(report, users_objects) do |user| { 'browsers' => user.sessions.map {|s| s['browser']}.map {|b| b.upcase}.sort.join(', ') } end + progressbar.increment # Хоть раз использовал IE? collect_stats_from_users(report, users_objects) do |user| { 'usedIE' => user.sessions.map{|s| s['browser']}.any? { |b| b.upcase =~ /INTERNET EXPLORER/ } } end + progressbar.increment # Всегда использовал только Chrome? collect_stats_from_users(report, users_objects) do |user| { 'alwaysUsedChrome' => user.sessions.map{|s| s['browser']}.all? { |b| b.upcase =~ /CHROME/ } } end + progressbar.increment # Даты сессий через запятую в обратном порядке в формате iso8601 collect_stats_from_users(report, users_objects) do |user| { 'dates' => user.sessions.map{|s| s['date']}.map {|d| Date.parse(d)}.sort.reverse.map { |d| d.iso8601 } } end + progressbar.increment File.write('result.json', "#{report.to_json}\n") -end - -class TestMe < Minitest::Test - def setup - File.write('result.json', '') - File.write('data.txt', -'user,0,Leida,Cira,0 -session,0,0,Safari 29,87,2016-10-23 -session,0,1,Firefox 12,118,2017-02-27 -session,0,2,Internet Explorer 28,31,2017-03-28 -session,0,3,Internet Explorer 28,109,2016-09-15 -session,0,4,Safari 39,104,2017-09-27 -session,0,5,Internet Explorer 35,6,2016-09-01 -user,1,Palmer,Katrina,65 -session,1,0,Safari 17,12,2016-10-21 -session,1,1,Firefox 32,3,2016-12-20 -session,1,2,Chrome 6,59,2016-11-11 -session,1,3,Internet Explorer 10,28,2017-04-29 -session,1,4,Chrome 13,116,2016-12-28 -user,2,Gregory,Santos,86 -session,2,0,Chrome 35,6,2018-09-21 -session,2,1,Safari 49,85,2017-05-22 -session,2,2,Firefox 47,17,2018-02-02 -session,2,3,Chrome 20,84,2016-11-25 -') - end - - def test_result - work - expected_result = '{"totalUsers":3,"uniqueBrowsersCount":14,"totalSessions":15,"allBrowsers":"CHROME 13,CHROME 20,CHROME 35,CHROME 6,FIREFOX 12,FIREFOX 32,FIREFOX 47,INTERNET EXPLORER 10,INTERNET EXPLORER 28,INTERNET EXPLORER 35,SAFARI 17,SAFARI 29,SAFARI 39,SAFARI 49","usersStats":{"Leida Cira":{"sessionsCount":6,"totalTime":"455 min.","longestSession":"118 min.","browsers":"FIREFOX 12, INTERNET EXPLORER 28, INTERNET EXPLORER 28, INTERNET EXPLORER 35, SAFARI 29, SAFARI 39","usedIE":true,"alwaysUsedChrome":false,"dates":["2017-09-27","2017-03-28","2017-02-27","2016-10-23","2016-09-15","2016-09-01"]},"Palmer Katrina":{"sessionsCount":5,"totalTime":"218 min.","longestSession":"116 min.","browsers":"CHROME 13, CHROME 6, FIREFOX 32, INTERNET EXPLORER 10, SAFARI 17","usedIE":true,"alwaysUsedChrome":false,"dates":["2017-04-29","2016-12-28","2016-12-20","2016-11-11","2016-10-21"]},"Gregory Santos":{"sessionsCount":4,"totalTime":"192 min.","longestSession":"85 min.","browsers":"CHROME 20, CHROME 35, FIREFOX 47, SAFARI 49","usedIE":false,"alwaysUsedChrome":false,"dates":["2018-09-21","2018-02-02","2017-05-22","2016-11-25"]}}}' + "\n" - assert_equal expected_result, File.read('result.json') - end + progressbar.increment end