From 4e891a8c23a6d3473f294c83c6d054cbb405872c Mon Sep 17 00:00:00 2001 From: Guillaume Alviset Date: Fri, 20 Sep 2024 02:36:05 +0200 Subject: [PATCH] Solved translated keys conflict --- Gemfile | 169 +- Gemfile.lock | 313 +- app/assets/images/icons/slices.svg | 4 + app/assets/javascripts/application.js | 1 - app/assets/javascripts/bp_mappings.js.erb | 145 - app/assets/javascripts/vendor.js | 1 - app/assets/stylesheets/account.scss | 9 + app/assets/stylesheets/agents.scss | 24 + .../stylesheets/application.css.scss.erb | 2 +- app/assets/stylesheets/bioportal.scss | 242 +- .../components/concept_details.scss | 4 + app/assets/stylesheets/components/index.scss | 3 +- .../stylesheets/components/pill_button.scss | 3 + .../stylesheets/components/search_input.scss | 6 + .../stylesheets/components/tree_view.scss | 170 + app/assets/stylesheets/concepts.scss | 8 +- app/assets/stylesheets/fair_assement.scss | 1 + app/assets/stylesheets/home.scss | 74 +- app/assets/stylesheets/login.scss | 2 +- app/assets/stylesheets/mappings.scss | 16 - app/assets/stylesheets/notice.scss | 23 + app/assets/stylesheets/ontologies.scss | 8 +- app/assets/stylesheets/taxonomy.scss | 101 + .../stylesheets/theme-variables.scss.erb | 2 +- .../agent_search_input_component.html.haml | 6 +- app/components/concept_details_component.rb | 2 +- .../concept_details_component.html.haml | 2 +- .../rdf_highlighter_component_controller.js | 5 +- .../display/search_result_component.rb | 2 + .../search_result_component.html.haml | 5 +- .../display/taxonomy_card_component.rb | 10 + .../taxonomy_card_component.html.haml | 29 + app/components/input/text_area_component.rb | 6 +- .../text_area_component.html.haml | 2 +- .../ontology_browse_card_component.html.haml | 4 +- .../ontology_subscribe_button_component.rb | 6 + ...ology_subscribe_button_component.html.haml | 2 +- ...y_subscribe_button_component_controller.js | 8 +- app/components/search_input_component.rb | 7 +- .../search_input_component.html.haml | 5 +- .../search_input_component_controller.js | 23 +- .../submission_status_component.html.haml | 2 +- app/components/tab_item_component.rb | 7 +- app/components/table_component.rb | 6 +- .../table_component/table_component.html.haml | 5 +- .../table_component_controller.js | 9 +- app/components/tree_link_component.rb | 4 +- .../tree_link_component.html.haml | 4 +- app/components/url_resolvability_component.rb | 2 +- .../admin/categories_controller.rb | 3 +- app/controllers/admin/groups_controller.rb | 2 +- app/controllers/agents_controller.rb | 94 +- app/controllers/ajax_proxy_controller.rb | 86 - app/controllers/annotator_controller.rb | 24 +- app/controllers/application_controller.rb | 297 +- app/controllers/collections_controller.rb | 7 +- app/controllers/concepts_controller.rb | 55 +- app/controllers/concerns/ontology_updater.rb | 8 +- app/controllers/concerns/search_aggregator.rb | 36 +- app/controllers/concerns/submission_filter.rb | 4 +- app/controllers/concerns/terms_reuses.rb | 15 + app/controllers/concerns/uri_redirection.rb | 34 +- app/controllers/home_controller.rb | 39 +- app/controllers/instances_controller.rb | 8 +- app/controllers/mappings_controller.rb | 1 + app/controllers/notes_controller.rb | 5 - app/controllers/ontologies_controller.rb | 66 +- .../ontologies_redirection_controller.rb | 84 +- app/controllers/properties_controller.rb | 14 +- app/controllers/schemes_controller.rb | 6 +- app/controllers/search_controller.rb | 8 +- app/controllers/taxonomy_controller.rb | 46 + app/controllers/users_controller.rb | 30 +- app/helpers/agent_helper.rb | 40 +- app/helpers/application_helper.rb | 156 +- app/helpers/check_resolvability_helper.rb | 68 +- app/helpers/collections_helper.rb | 12 +- app/helpers/components_helper.rb | 38 +- app/helpers/concepts_helper.rb | 30 +- app/helpers/fair_score_helper.rb | 14 +- app/helpers/home_helper.rb | 13 +- app/helpers/inputs_helper.rb | 4 +- app/helpers/mappings_helper.rb | 2 +- app/helpers/multi_languages_helper.rb | 7 +- app/helpers/ontologies_helper.rb | 34 +- app/helpers/properties_helper.rb | 11 +- app/helpers/schemes_helper.rb | 6 +- app/helpers/search_helper.rb | 8 +- app/helpers/submission_inputs_helper.rb | 14 +- app/helpers/submissions_helper.rb | 17 +- app/javascript/component_controllers/index.js | 3 +- .../controllers/chosen_controller.js | 68 - .../concepts_json_button_controller.js | 19 + .../controllers/content_finder_controller.js | 105 - .../controllers/history_controller.js | 1 - app/javascript/controllers/index.js | 9 +- .../controllers/label_ajax_controller.js | 40 +- .../mappings_visualization_controller.js | 2 +- .../controllers/simple_tree_controller.js | 21 +- .../skos_collection_colors_controller.js | 22 +- .../controllers/skos_collections_selector.js | 49 + .../controllers/turbo_frame_controller.js | 37 +- app/javascript/mixins/useChosen.js | 8 - app/javascript/mixins/useHistory.js | 6 +- app/models/bpid_resolver.rb | 46 - app/views/admin/categories/_form.html.haml | 5 + app/views/admin/index.html.haml | 6 +- app/views/agents/_agent.html.haml | 2 + app/views/agents/_form.html.haml | 44 +- app/views/agents/index.html.haml | 1 + app/views/annotator/index.html.haml | 1 + app/views/check_resolvability/index.html.haml | 17 +- app/views/collections/_list_view.html.haml | 2 +- app/views/concepts/_list.html.haml | 2 +- app/views/concepts/_show.html.haml | 113 +- app/views/home/cookies.html.haml | 13 + app/views/home/feedback/feedback.html.haml | 3 + app/views/home/index.html.haml | 59 +- app/views/instances/_details.html.haml | 2 +- app/views/layouts/_header.html.erb | 69 +- app/views/layouts/_notices.html.haml | 29 +- app/views/layouts/_topnav.html.haml | 2 + app/views/layouts/appliance.html.haml | 3 +- .../layouts/ontology_viewer/_header.html.haml | 6 +- app/views/login/index.html.haml | 9 +- app/views/mappings/_count.html.haml | 2 +- app/views/mappings/_form.html.haml | 2 +- app/views/mappings/_show_line.html.haml | 4 +- .../ontologies/browser/_ontologies.html.haml | 2 +- app/views/ontologies/browser/browse.html.haml | 6 +- .../_collections_picker.html.haml | 4 +- .../_concepts_tree.html.haml | 2 +- .../_scheme_picker.html.haml | 2 +- .../ontologies/content_serializer.html.haml | 3 +- app/views/ontologies/htaccess.html.haml | 122 +- app/views/ontologies/new.html.haml | 2 +- .../ontologies/sections/_metadata.html.haml | 4 +- .../_ontology_description_section.html.haml | 2 +- app/views/properties/_show.html.haml | 16 +- app/views/recommender/index.html.haml | 2 +- app/views/taxonomy/_taxonomies.html.haml | 10 + app/views/taxonomy/index.html.haml | 24 + app/views/users/_form.html.haml | 4 +- app/views/users/show.html.haml | 42 +- bin/ontoportal | 2 +- bin/run_api | 4 +- config/bioportal_config_env.rb.sample | 9 +- config/bioportal_config_test.rb | 9 +- config/environment.rb | 3 +- config/initializers/cube_reporter.rb | 43 - config/initializers/miniprofiler.rb | 2 - config/locales/en.yml | 56 +- config/locales/fr.yml | 57 +- config/routes.rb | 41 +- docker-compose.yml | 22 +- lib/resolver/acronym_from_virtual.rb | 535 -- lib/resolver/virtual_from_acronym.rb | 533 -- lib/resolver/virtual_from_version.rb | 7144 ----------------- lib/tasks/schema.rake | 14 +- test/application_system_test_case.rb | 25 +- .../controllers/ontologies_controller_test.rb | 65 + test/fixtures/agents.yml | 55 - test/fixtures/annotator.yml | 181 + test/fixtures/ontologies.yml | 84 + test/fixtures/users.yml | 4 + test/helpers/application_test_helpers.rb | 38 +- test/integration/login_flows_test.rb | 2 +- test/system/agent_flows_test.rb | 17 +- test/system/annotator_page_test.rb | 108 + test/system/content_redirection_test.rb | 68 + test/system/login_flows_test.rb | 6 +- test/system/submission_flows_test.rb | 17 +- test/test_helper.rb | 2 + vendor/assets/images/chosen/chosen-sprite.png | Bin 538 -> 0 bytes .../assets/images/chosen/chosen-sprite@2x.png | Bin 738 -> 0 bytes vendor/assets/javascripts/chosen.jquery.js | 1269 --- vendor/assets/stylesheets/chosen.css.scss | 452 -- 177 files changed, 2673 insertions(+), 12213 deletions(-) create mode 100644 app/assets/images/icons/slices.svg delete mode 100644 app/assets/javascripts/bp_mappings.js.erb create mode 100644 app/assets/stylesheets/components/tree_view.scss create mode 100644 app/assets/stylesheets/taxonomy.scss create mode 100644 app/components/display/taxonomy_card_component.rb create mode 100644 app/components/display/taxonomy_card_component/taxonomy_card_component.html.haml delete mode 100644 app/controllers/ajax_proxy_controller.rb create mode 100644 app/controllers/concerns/terms_reuses.rb create mode 100644 app/controllers/taxonomy_controller.rb delete mode 100644 app/javascript/controllers/chosen_controller.js create mode 100644 app/javascript/controllers/concepts_json_button_controller.js delete mode 100644 app/javascript/controllers/content_finder_controller.js create mode 100644 app/javascript/controllers/skos_collections_selector.js delete mode 100644 app/javascript/mixins/useChosen.js delete mode 100644 app/models/bpid_resolver.rb create mode 100644 app/views/home/cookies.html.haml create mode 100644 app/views/taxonomy/_taxonomies.html.haml create mode 100644 app/views/taxonomy/index.html.haml delete mode 100644 config/initializers/cube_reporter.rb delete mode 100644 config/initializers/miniprofiler.rb delete mode 100644 lib/resolver/acronym_from_virtual.rb delete mode 100644 lib/resolver/virtual_from_acronym.rb delete mode 100644 lib/resolver/virtual_from_version.rb create mode 100644 test/fixtures/annotator.yml create mode 100644 test/system/annotator_page_test.rb create mode 100644 test/system/content_redirection_test.rb delete mode 100755 vendor/assets/images/chosen/chosen-sprite.png delete mode 100755 vendor/assets/images/chosen/chosen-sprite@2x.png delete mode 100755 vendor/assets/javascripts/chosen.jquery.js delete mode 100755 vendor/assets/stylesheets/chosen.css.scss diff --git a/Gemfile b/Gemfile index 34aad240b5..c40e3640c5 100644 --- a/Gemfile +++ b/Gemfile @@ -1,93 +1,127 @@ source 'https://rubygems.org' +# Main Rails gem # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '7.0.3' +gem 'rails', '7.0.4' -gem 'chart-js-rails' +# JavaScript bundling for Rails gem 'jsbundling-rails' -gem 'sassc-rails' # sass-rails replacent -gem 'terser' # ugilifer replacent -# See https://github.com/rails/execjs#readme for more supported runtimes -# gem 'therubyracer', platforms: :ruby -# gem 'duktape' +# Chart.js integration for Rails +gem 'chart-js-rails' + +# SassC as a replacement for sass-rails +gem 'sassc-rails' # sass-rails replacement +# Terser JavaScript minifier as a replacement for Uglifier +gem 'terser' # uglifier replacement + +# Bootstrap front-end framework gem 'bootstrap', '~> 4.2.0' + +# jQuery integration for Rails gem 'jquery-rails' + +# jQuery UI integration for Rails gem 'jquery-ui-rails' -# The original asset pipeline for Rails [https://github.com/rails/sprockets-rails] +# The original asset pipeline for Rails +# [https://github.com/rails/sprockets-rails] gem 'sprockets-rails' -# Use the Puma web server [https://github.com/puma/puma] +# Use the Puma web server +# [https://github.com/puma/puma] gem 'puma', '~> 5.0' -# Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails] +# Use JavaScript with ESM import maps +# [https://github.com/rails/importmap-rails] gem 'importmap-rails' -# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev] +# Hotwire's SPA-like page accelerator +# [https://turbo.hotwired.dev] gem 'turbo-rails' -# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev] +# Hotwire's modest JavaScript framework +# [https://stimulus.hotwired.dev] gem 'stimulus-rails' -# Build JSON APIs with ease [https://github.com/rails/jbuilder] -# gem "jbuilder" +# Debugging tool +# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem gem 'pry' +gem 'pry' -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +# Time zone info for Windows platforms gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] -# To use ActiveModel has_secure_password -# gem 'bcrypt-ruby', '~> 3.0.0' - # Reduces boot times through caching; required in config/boot.rb - gem 'bootsnap', require: false -gem 'cube-ruby', require: 'cube' +# Memcached client for Ruby gem 'dalli' -gem 'ffi', '~> 1.16.3' -gem 'flag-icons-rails', '~> 3.4' -gem 'flamegraph' + +# GraphQL client for Ruby gem 'graphql-client' + +# Haml template engine for Ruby on Rails gem 'haml', '~> 5.1' + +# Internationalization (i18n) gem 'i18n' -gem 'iconv' -gem 'inline_svg' -gem 'iso-639', '~> 0.3.6' -gem 'lookbook', '~> 1.5.5' -gem 'multi_json' +gem 'rails-i18n', '~> 7.0.0' + +# MySQL database adapter gem 'mysql2' + +# JSON parsing libraries +gem 'multi_json' gem 'oj' -gem 'ontologies_api_client', git: 'https://github.com/ontoportal-lirmm/ontologies_api_ruby_client.git', - branch: 'development' -gem 'open_uri_redirections' -gem 'pry' -gem 'psych', '< 4' -gem 'rack-mini-profiler' -gem 'rails_autolink' -gem 'rails-i18n', '~> 7.0.0' -gem 'rdoc' + +# Google reCAPTCHA integration gem 'recaptcha', '~> 5.9.0' + +# Simple HTTP and REST client for Ruby gem 'rest-client' -gem 'stackprof', require: false -gem 'thin' -gem 'turnout' + +# View components framework for Rails +gem 'lookbook', '~> 1.5.5' gem 'view_component', '~> 2.72' + +# Pagination library for Rails gem 'will_paginate', '~> 3.0' +# Render SVG files in Rails views +gem 'inline_svg' + +# ISO language codes and flags +gem 'flag-icons-rails', '~> 3.4' +gem 'iso-639', '~> 0.3.6' + +# Custom API client +gem 'ontologies_api_client', git: 'https://github.com/ontoportal-lirmm/ontologies_api_ruby_client.git', branch: 'master' + +# Ruby 2.7.8 pinned gems (to remove when migrating to Ruby >= 3.0) +gem 'ffi', '~> 1.16.3' +gem 'net-ftp', '~> 0.2.0', require: false +gem 'net-http', '~> 0.3.2' + # Multi-Provider Authentication gem 'omniauth' +gem 'omniauth-rails_csrf_protection' gem 'omniauth-github' gem 'omniauth-google-oauth2' gem 'omniauth-keycloak' gem 'omniauth-orcid' -gem 'omniauth-rails_csrf_protection' + +# Used to generate colors randomly +gem "color", "~> 1.8" group :staging, :production, :appliance do - # application monitoring - gem 'newrelic_rpm', '< 9.10.0' - # logs in json format, useful for shipping logs to logstash + # Application performance monitoring + gem 'newrelic_rpm' + + # Error monitoring + gem 'bugsnag', '~> 6.26' + + # Logs in JSON format, useful for shipping logs to logstash # gem 'rackstash', git: 'https://github.com/planio-gmbh/rackstash.git' # gem 'logstash-logger' end @@ -102,40 +136,47 @@ group :development do gem 'capistrano-rails', '~> 1.4', require: false gem 'capistrano-yarn', require: false gem 'ed25519', '>= 1.2', '< 2.0', require: false # https://github.com/miloserdow/capistrano-deploy/issues/42 - gem 'html2haml' - gem 'listen' - # static code analysis + + # Static code analysis gem 'brakeman', require: false gem 'rubocop', require: false - # gem 'i18n-debug' - # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem + + # Haml support for Rails + gem 'haml-rails' + gem 'html2haml' + + # Debugging tools gem 'debug', platforms: %i[mri mingw x64_mingw] - # Use console on exceptions pages [https://github.com/rails/web-console] - gem 'i18n-tasks' - gem 'i18n-tasks-csv', '~> 1.1' + # Use console on exceptions pages + # [https://github.com/rails/web-console] gem 'web-console' + # Internationalization tasks + # gem 'i18n-debug' + gem 'i18n-tasks' + gem 'i18n-tasks-csv', '~> 1.1' gem 'deepl-rb' - gem 'haml-rails' - gem 'letter_opener_web', '~> 2.0' -end -group :test, :development do - gem 'rspec-rails' + # Email preview in the browser + gem 'letter_opener_web', '~> 2.0' end group :test do - # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing] + # System testing + # [https://guides.rubyonrails.org/testing.html#system-testing] gem 'capybara' + + # WebDriver for system testing gem 'selenium-webdriver' + + # Code coverage generation gem 'simplecov', require: false gem 'simplecov-cobertura' # for codecov.io - # gem 'webdrivers' - gem 'webmock' -end -gem 'net-ftp', '~> 0.2.0', require: false -gem 'net-http', '~> 0.3.2' + # Mock HTTP requests in tests + gem 'webmock' -gem 'bugsnag', '~> 6.26' + # Testing framework for Rails + gem 'rspec-rails' +end \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 5c78134fd4..51f97081af 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ GIT remote: https://github.com/ontoportal-lirmm/ontologies_api_ruby_client.git - revision: abea6c217c0ee93bcfd80c47c2af52747365d491 - branch: development + revision: 24fb2549f7b69841e052491439bc8375ed5acfd9 + branch: master specs: ontologies_api_client (2.2.0) activesupport @@ -17,102 +17,100 @@ GIT GEM remote: https://rubygems.org/ specs: - actioncable (7.0.3) - actionpack (= 7.0.3) - activesupport (= 7.0.3) + actioncable (7.0.4) + actionpack (= 7.0.4) + activesupport (= 7.0.4) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (7.0.3) - actionpack (= 7.0.3) - activejob (= 7.0.3) - activerecord (= 7.0.3) - activestorage (= 7.0.3) - activesupport (= 7.0.3) + actionmailbox (7.0.4) + actionpack (= 7.0.4) + activejob (= 7.0.4) + activerecord (= 7.0.4) + activestorage (= 7.0.4) + activesupport (= 7.0.4) mail (>= 2.7.1) net-imap net-pop net-smtp - actionmailer (7.0.3) - actionpack (= 7.0.3) - actionview (= 7.0.3) - activejob (= 7.0.3) - activesupport (= 7.0.3) + actionmailer (7.0.4) + actionpack (= 7.0.4) + actionview (= 7.0.4) + activejob (= 7.0.4) + activesupport (= 7.0.4) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.0) - actionpack (7.0.3) - actionview (= 7.0.3) - activesupport (= 7.0.3) + actionpack (7.0.4) + actionview (= 7.0.4) + activesupport (= 7.0.4) rack (~> 2.0, >= 2.2.0) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (7.0.3) - actionpack (= 7.0.3) - activerecord (= 7.0.3) - activestorage (= 7.0.3) - activesupport (= 7.0.3) + actiontext (7.0.4) + actionpack (= 7.0.4) + activerecord (= 7.0.4) + activestorage (= 7.0.4) + activesupport (= 7.0.4) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.0.3) - activesupport (= 7.0.3) + actionview (7.0.4) + activesupport (= 7.0.4) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (7.0.3) - activesupport (= 7.0.3) + activejob (7.0.4) + activesupport (= 7.0.4) globalid (>= 0.3.6) - activemodel (7.0.3) - activesupport (= 7.0.3) - activerecord (7.0.3) - activemodel (= 7.0.3) - activesupport (= 7.0.3) - activestorage (7.0.3) - actionpack (= 7.0.3) - activejob (= 7.0.3) - activerecord (= 7.0.3) - activesupport (= 7.0.3) + activemodel (7.0.4) + activesupport (= 7.0.4) + activerecord (7.0.4) + activemodel (= 7.0.4) + activesupport (= 7.0.4) + activestorage (7.0.4) + actionpack (= 7.0.4) + activejob (= 7.0.4) + activerecord (= 7.0.4) + activesupport (= 7.0.4) marcel (~> 1.0) mini_mime (>= 1.1.0) - activesupport (7.0.3) + activesupport (7.0.4) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) - addressable (2.8.6) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) aes_key_wrap (1.1.0) - airbrussh (1.5.2) + airbrussh (1.5.3) sshkit (>= 1.6.1, != 1.7.0) ast (2.4.2) - autoprefixer-rails (10.4.16.0) + autoprefixer-rails (10.4.19.0) execjs (~> 2) base64 (0.2.0) bcrypt_pbkdf (1.1.1) - bcrypt_pbkdf (1.1.1-arm64-darwin) - bcrypt_pbkdf (1.1.1-x86_64-darwin) bigdecimal (3.1.8) bindata (2.5.0) bindex (0.8.1) - bootsnap (1.18.3) + bootsnap (1.18.4) msgpack (~> 1.2) bootstrap (4.2.1) autoprefixer-rails (>= 9.1.0) popper_js (>= 1.14.3, < 2) sassc-rails (>= 2.0.0) brakeman (5.4.1) - bugsnag (6.27.0) + bugsnag (6.27.1) concurrent-ruby (~> 1.0) builder (3.3.0) - capistrano (3.18.1) + capistrano (3.19.1) airbrussh (>= 1.0.0) i18n rake (>= 10.0.0) sshkit (>= 1.9.0) - capistrano-bundler (2.1.0) + capistrano-bundler (2.1.1) capistrano (~> 3.1) capistrano-locally (0.3.0) capistrano (~> 3.0) @@ -134,17 +132,17 @@ GEM xpath (~> 3.2) chart-js-rails (0.1.7) railties (> 3.1) - childprocess (5.0.0) + childprocess (5.1.0) + logger (~> 1.5) coderay (1.1.3) - concurrent-ruby (1.3.2) + color (1.8) + concurrent-ruby (1.3.4) crack (1.0.0) bigdecimal rexml crass (1.0.6) css_parser (1.17.1) addressable - cube-ruby (0.0.3) - daemons (1.4.1) dalli (3.2.8) date (3.3.4) debug (1.9.2) @@ -152,13 +150,12 @@ GEM reline (>= 0.3.8) deepl-rb (2.5.3) diff-lcs (1.5.1) - docile (1.4.0) + docile (1.4.1) domain_name (0.6.20240107) ed25519 (1.3.0) - erubi (1.12.0) + erubi (1.13.0) erubis (2.7.0) - eventmachine (1.2.7) - excon (0.110.0) + excon (0.111.0) execjs (2.9.1) faraday (2.0.1) faraday-net_http (~> 2.0) @@ -172,14 +169,15 @@ GEM multipart-post (~> 2) faraday-net_http (2.1.0) ffi (1.16.3) + fiber-storage (1.0.0) flag-icons-rails (3.4.6.1) sass-rails - flamegraph (0.9.5) globalid (1.2.1) activesupport (>= 6.1) - graphql (2.3.4) + graphql (2.3.14) base64 - graphql-client (0.22.0) + fiber-storage + graphql-client (0.23.0) activesupport (>= 3.0) graphql (>= 1.13.0) haml (5.2.2) @@ -190,7 +188,7 @@ GEM activesupport (>= 5.1) haml (>= 4.0.6) railties (>= 5.1) - hashdiff (1.1.0) + hashdiff (1.1.1) hashie (5.0.0) highline (2.1.0) html2haml (2.3.0) @@ -201,7 +199,7 @@ GEM htmlbeautifier (1.4.3) htmlentities (4.3.4) http-accept (1.7.0) - http-cookie (1.0.6) + http-cookie (1.0.7) domain_name (~> 0.5) i18n (1.14.5) concurrent-ruby (~> 1.0) @@ -217,16 +215,15 @@ GEM terminal-table (>= 1.5.1) i18n-tasks-csv (1.1) i18n-tasks (~> 0.9) - iconv (1.0.8) importmap-rails (2.0.1) actionpack (>= 6.0.0) activesupport (>= 6.0.0) railties (>= 6.0.0) - inline_svg (1.9.0) + inline_svg (1.10.0) activesupport (>= 3.0) nokogiri (>= 1.6) io-console (0.7.2) - irb (1.13.1) + irb (1.14.0) rdoc (>= 4.0.0) reline (>= 0.4.2) iso-639 (0.3.6) @@ -236,7 +233,7 @@ GEM thor (>= 0.14, < 2.0) jquery-ui-rails (7.0.0) railties (>= 3.2.16) - jsbundling-rails (1.3.0) + jsbundling-rails (1.3.1) railties (>= 6.0.0) json (2.7.2) json-jwt (1.16.6) @@ -246,7 +243,7 @@ GEM bindata faraday (~> 2.0) faraday-follow_redirects - jwt (2.8.1) + jwt (2.8.2) base64 language_server-protocol (3.17.0.3) launchy (3.0.1) @@ -262,6 +259,7 @@ GEM listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) + logger (1.6.1) loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -289,21 +287,20 @@ GEM method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) - mime-types-data (3.2024.0604) + mime-types-data (3.2024.0903) mini_mime (1.1.5) - minitest (5.23.1) + minitest (5.25.1) msgpack (1.7.2) multi_json (1.15.0) multi_xml (0.6.0) multipart-post (2.4.1) - mutex_m (0.2.0) mysql2 (0.5.6) net-ftp (0.2.1) net-protocol time net-http (0.3.2) uri - net-imap (0.4.12) + net-imap (0.4.16) date net-protocol net-pop (0.1.2) @@ -318,18 +315,8 @@ GEM net-protocol net-ssh (7.2.3) netrc (0.11.0) - newrelic_rpm (9.9.0) + newrelic_rpm (9.13.0) nio4r (2.7.3) - nokogiri (1.15.6-aarch64-linux) - racc (~> 1.4) - nokogiri (1.15.6-arm-linux) - racc (~> 1.4) - nokogiri (1.15.6-arm64-darwin) - racc (~> 1.4) - nokogiri (1.15.6-x86-linux) - racc (~> 1.4) - nokogiri (1.15.6-x86_64-darwin) - racc (~> 1.4) nokogiri (1.15.6-x86_64-linux) racc (~> 1.4) oauth2 (2.0.9) @@ -339,8 +326,9 @@ GEM rack (>= 1.2, < 4) snaky_hash (~> 2.0) version_gem (~> 1.1) - oj (3.16.4) + oj (3.16.5) bigdecimal (>= 3.0) + ostruct (>= 0.2) omniauth (2.1.2) hashie (>= 3.4.6) rack (>= 2.2.3) @@ -348,7 +336,7 @@ GEM omniauth-github (2.0.1) omniauth (~> 2.0) omniauth-oauth2 (~> 1.8) - omniauth-google-oauth2 (1.1.2) + omniauth-google-oauth2 (1.1.3) jwt (>= 2.0) oauth2 (~> 2.0) omniauth (~> 2.0) @@ -367,44 +355,41 @@ GEM omniauth-rails_csrf_protection (1.0.2) actionpack (>= 4.2) omniauth (~> 2.0) - open_uri_redirections (0.2.1) - parallel (1.25.1) - parser (3.3.2.0) + ostruct (0.6.0) + parallel (1.26.3) + parser (3.3.5.0) ast (~> 2.4.1) racc popper_js (1.16.1) pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) - psych (3.3.4) - public_suffix (5.0.5) + psych (5.1.2) + stringio + public_suffix (5.1.1) puma (5.6.8) nio4r (~> 2.0) - racc (1.8.0) + racc (1.8.1) rack (2.2.9) - rack-accept (0.4.5) - rack (>= 0.4) - rack-mini-profiler (3.3.1) - rack (>= 1.2.0) rack-protection (3.2.0) base64 (>= 0.1.0) rack (~> 2.2, >= 2.2.4) rack-test (2.1.0) rack (>= 1.3) - rails (7.0.3) - actioncable (= 7.0.3) - actionmailbox (= 7.0.3) - actionmailer (= 7.0.3) - actionpack (= 7.0.3) - actiontext (= 7.0.3) - actionview (= 7.0.3) - activejob (= 7.0.3) - activemodel (= 7.0.3) - activerecord (= 7.0.3) - activestorage (= 7.0.3) - activesupport (= 7.0.3) + rails (7.0.4) + actioncable (= 7.0.4) + actionmailbox (= 7.0.4) + actionmailer (= 7.0.4) + actionpack (= 7.0.4) + actiontext (= 7.0.4) + actionview (= 7.0.4) + activejob (= 7.0.4) + activemodel (= 7.0.4) + activerecord (= 7.0.4) + activestorage (= 7.0.4) + activesupport (= 7.0.4) bundler (>= 1.15.0) - railties (= 7.0.3) + railties (= 7.0.4) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -415,13 +400,9 @@ GEM rails-i18n (7.0.9) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) - rails_autolink (1.1.8) - actionview (> 3.1) - activesupport (> 3.1) - railties (> 3.1) - railties (7.0.3) - actionpack (= 7.0.3) - activesupport (= 7.0.3) + railties (7.0.4) + actionpack (= 7.0.4) + activesupport (= 7.0.4) method_source rake (>= 12.2) thor (~> 1.0) @@ -431,55 +412,54 @@ GEM rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - rdoc (6.3.4.1) + rdoc (6.7.0) + psych (>= 4.0.0) recaptcha (5.9.0) json redcarpet (3.6.0) regexp_parser (2.9.2) - reline (0.5.8) + reline (0.5.10) io-console (~> 0.5) rest-client (2.1.0) http-accept (>= 1.7.0, < 2.0) http-cookie (>= 1.0.2, < 2.0) mime-types (>= 1.16, < 4.0) netrc (~> 0.8) - rexml (3.2.8) - strscan (>= 3.0.9) - rouge (4.2.1) - rspec-core (3.13.0) + rexml (3.3.7) + rouge (4.3.0) + rspec-core (3.13.1) rspec-support (~> 3.13.0) - rspec-expectations (3.13.0) + rspec-expectations (3.13.3) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) rspec-mocks (3.13.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (6.1.2) - actionpack (>= 6.1) - activesupport (>= 6.1) - railties (>= 6.1) + rspec-rails (7.0.1) + actionpack (>= 7.0) + activesupport (>= 7.0) + railties (>= 7.0) rspec-core (~> 3.13) rspec-expectations (~> 3.13) rspec-mocks (~> 3.13) rspec-support (~> 3.13) rspec-support (3.13.1) - rubocop (1.64.1) + rubocop (1.66.1) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) - rexml (>= 3.2.5, < 4.0) - rubocop-ast (>= 1.31.1, < 2.0) + regexp_parser (>= 2.4, < 3.0) + rubocop-ast (>= 1.32.2, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.31.3) + rubocop-ast (1.32.3) parser (>= 3.3.1.0) ruby-progressbar (1.13.0) ruby2_keywords (0.0.5) ruby_dig (0.0.2) - ruby_parser (3.21.0) + ruby_parser (3.21.1) racc (~> 1.5) sexp_processor (~> 4.16) rubyzip (2.3.2) @@ -497,7 +477,7 @@ GEM rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) - sexp_processor (4.17.1) + sexp_processor (4.17.2) simplecov (0.22.0) docile (~> 1.1) simplecov-html (~> 0.11) @@ -505,7 +485,7 @@ GEM simplecov-cobertura (2.1.0) rexml simplecov (~> 0.19) - simplecov-html (0.12.3) + simplecov-html (0.13.0) simplecov_json_formatter (0.1.4) snaky_hash (2.0.1) hashie @@ -514,47 +494,37 @@ GEM sprockets (4.2.1) concurrent-ruby (~> 1.0) rack (>= 2.2.4, < 4) - sprockets-rails (3.5.1) + sprockets-rails (3.5.2) actionpack (>= 6.1) activesupport (>= 6.1) sprockets (>= 3.0.0) - sshkit (1.22.2) + sshkit (1.23.1) base64 - mutex_m net-scp (>= 1.1.2) net-sftp (>= 2.1.2) net-ssh (>= 2.8.0) - stackprof (0.2.26) - stimulus-rails (1.3.3) + ostruct + stimulus-rails (1.3.4) railties (>= 6.0.0) - strscan (3.1.0) + stringio (3.1.1) temple (0.10.3) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - terser (1.2.2) + terser (1.2.3) execjs (>= 0.3.0, < 3) - thin (1.8.2) - daemons (~> 1.0, >= 1.0.9) - eventmachine (~> 1.0, >= 1.0.4) - rack (>= 1, < 3) - thor (1.3.1) - tilt (2.3.0) - time (0.3.0) + thor (1.3.2) + tilt (2.4.0) + time (0.4.0) date timeout (0.4.1) - turbo-rails (2.0.5) + turbo-rails (2.0.6) actionpack (>= 6.0.0) activejob (>= 6.0.0) railties (>= 6.0.0) - turnout (2.5.0) - i18n (>= 0.7, < 2) - rack (>= 1.3, < 3) - rack-accept (~> 0.4) - tilt (>= 1.4, < 3) tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicode-display_width (2.5.0) - uri (0.13.0) + uri (0.13.1) version_gem (1.1.4) view_component (2.83.0) activesupport (>= 5.2.0, < 8.0) @@ -569,30 +539,18 @@ GEM addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - websocket (1.2.10) + websocket (1.2.11) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) will_paginate (3.3.1) xpath (3.2.0) nokogiri (~> 1.8) - yard (0.9.36) - zeitwerk (2.6.15) + yard (0.9.37) + zeitwerk (2.6.18) PLATFORMS - aarch64-linux - aarch64-linux-gnu - aarch64-linux-musl - arm-linux - arm-linux-gnu - arm-linux-musl - arm64-darwin - x86-linux - x86-linux-gnu - x86-linux-musl - x86_64-darwin x86_64-linux - x86_64-linux-gnu x86_64-linux-musl DEPENDENCIES @@ -609,14 +567,13 @@ DEPENDENCIES capistrano-yarn capybara chart-js-rails - cube-ruby + color (~> 1.8) dalli debug deepl-rb ed25519 (>= 1.2, < 2.0) ffi (~> 1.16.3) flag-icons-rails (~> 3.4) - flamegraph graphql-client haml (~> 5.1) haml-rails @@ -624,7 +581,6 @@ DEPENDENCIES i18n i18n-tasks i18n-tasks-csv (~> 1.1) - iconv importmap-rails inline_svg iso-639 (~> 0.3.6) @@ -632,13 +588,12 @@ DEPENDENCIES jquery-ui-rails jsbundling-rails letter_opener_web (~> 2.0) - listen lookbook (~> 1.5.5) multi_json mysql2 net-ftp (~> 0.2.0) net-http (~> 0.3.2) - newrelic_rpm (< 9.10.0) + newrelic_rpm oj omniauth omniauth-github @@ -647,15 +602,10 @@ DEPENDENCIES omniauth-orcid omniauth-rails_csrf_protection ontologies_api_client! - open_uri_redirections pry - psych (< 4) puma (~> 5.0) - rack-mini-profiler - rails (= 7.0.3) + rails (= 7.0.4) rails-i18n (~> 7.0.0) - rails_autolink - rdoc recaptcha (~> 5.9.0) rest-client rspec-rails @@ -665,12 +615,9 @@ DEPENDENCIES simplecov simplecov-cobertura sprockets-rails - stackprof stimulus-rails terser - thin turbo-rails - turnout tzinfo-data view_component (~> 2.72) web-console diff --git a/app/assets/images/icons/slices.svg b/app/assets/images/icons/slices.svg new file mode 100644 index 0000000000..ce6a9a3d98 --- /dev/null +++ b/app/assets/images/icons/slices.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 3fe97607a4..1a42c65807 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -15,7 +15,6 @@ //= require bp_ajax_controller //= require bp_notes //= require bp_form_complete -//= require bp_mappings //= require bp_admin //= require concepts //= require projects diff --git a/app/assets/javascripts/bp_mappings.js.erb b/app/assets/javascripts/bp_mappings.js.erb deleted file mode 100644 index c47edb29f9..0000000000 --- a/app/assets/javascripts/bp_mappings.js.erb +++ /dev/null @@ -1,145 +0,0 @@ -"use strict"; - -// The count returned may not match the actual number of mappings -// To get around this, we re-calculate based on the mapping table size - -function updateMappingCount() { - // Go through every tr in the concept mappings tables. Add 1 to the count if the tr is not filled with "currently no mappings" - var rows = jQuery("#concept_mappings_table tbody tr"), mappings_count = 0; - rows.each(function() { - if (this.innerHTML.indexOf("currently no") < 0) { - mappings_count++; - } - }); - if (mappings_count === null) { - mappings_count = rows.length; - } - jQuery("#mapping_count").html(mappings_count); -} - -// Also in bp_create_mappings.js -function updateMappingDeletePermissions() { - var mapping_permission_checkbox = jQuery("#delete_mappings_permission"); - if (mapping_permission_checkbox.length === 0){ - //console.error("Failed to select #delete_mappings_permission"); - jQuery("#delete_mappings_button").hide(); - jQuery(".delete_mappings_column").hide(); - jQuery("input[name='delete_mapping_checkbox']").prop('disabled', true); - } else { - // Ensure the permission checkbox is hidden. - mapping_permission_checkbox.hide(); - if (mapping_permission_checkbox.is(':checked')) { - jQuery("#delete_mappings_button").show(); - jQuery(".delete_mappings_column").show(); - jQuery("input[name='delete_mapping_checkbox']").prop('disabled', false); - } else { - jQuery("#delete_mappings_button").hide(); - jQuery(".delete_mappings_column").hide(); - jQuery("input[name='delete_mapping_checkbox']").prop('disabled', true); - } - } - jQuery("input[name='delete_mapping_checkbox']").prop('checked', false); -} - -function loadMappings(value) { - jQuery('#mappingCount').html(""); - jQuery('#mapping_load').show(); - - jQuery('#mappingCount').load('/mappings/count/' + value, function () { - jQuery('#mapping_load').hide(); - let mappings_table_elem = jQuery("#mapping_count_table"); - mappings_table_elem.effect("highlight", {color: "#F5F5F5"}, 500); - mappings_table_elem.dataTable({ - "paging": false, - "info": false, - "searching": false, - "columns": [ - { - "className": "text-left" - }, - { - "type": "num-fmt", - "orderSequence": ["desc", "asc"], - "className": "text-right" - } - ] - }); - }); -} - -jQuery(document).ready(function(){ - updateMappingCount(); - updateMappingDeletePermissions(); - - // Handle visualization changes - jQuery("#display_options input").on("click", function(e, button){ - var selectedOnt = jQuery("#search_ontologies").val(); - if (selectedOnt !== "") { - loadMappings(selectedOnt); - } - }); - - jQuery("#mappings-help").on("click", bpPopWindow); -}); - -jQuery(document).bind("tree_changed", updateMappingCount); - -// deleteMappings() is a callback that is called by "#delete_mappings_button" created in -// /app/views/mappings/_concept_mappings.html.haml -// The appearance of that button is controlled by updateMappingDeletePermissions(), which -// relies on @delete_mapping_permission in /app/views/mappings/_mapping_table.html.haml; which, -// in turn, is set by /app/controllers/application_controller.check_delete_mapping_permission() -function deleteMappings() { - var mappingsToDelete = [], params; - var ontologyId = jQuery(document).data().bp.ont_viewer.ontology_id; - var conceptId = jQuery(document).data().bp.ont_viewer.concept_id; - - jQuery("#delete_mappings_error").html(""); - jQuery("#delete_mappings_spinner").show(); - - jQuery("input[name='delete_mapping_checkbox']:checked").each(function(){ - mappingsToDelete.push(jQuery(this).val()); - }); - - params = { - mappingids: mappingsToDelete.join(","), - _method: "delete", - ontologyid: ontologyId, - conceptid: conceptId - }; - - jQuery("#delete_mappings_error").html(""); - - jQuery.ajax({ - url: "/mappings/mappingids", // routed to mappings_controller::destroy - type: "POST", - data: params, - - success: function(data){ - jQuery("#delete_mappings_spinner").hide(); - - var i, rowId, len = data.success.length; - for (i=0; i div{ + margin-right: 10px; +} + @media only screen and (max-width: 1200px) { .account-page-first-row { width: 47vw; diff --git a/app/assets/stylesheets/agents.scss b/app/assets/stylesheets/agents.scss index d909878949..bed9b6b147 100644 --- a/app/assets/stylesheets/agents.scss +++ b/app/assets/stylesheets/agents.scss @@ -26,4 +26,28 @@ .agent-chip-name{ color: #8C8E8D; font-size: 15px; +} +.agent-edit-icon{ + display: flex !important; + flex-direction: column; + justify-content: center; +} +.agent-input-with-icon{ + padding: 8px; + margin-bottom: 0px; + border-radius: 5px; + width: 100%; + color: #5f6573; + outline: none; + font-size: 15px; + font-weight: 500; + border: 1px solid #d7d7d7; + padding-left: 45px; +} +.agent-input-icon{ + height: 20px; + width: 20px; + position: absolute; + padding: 11px 17px; + box-sizing: unset; } \ No newline at end of file diff --git a/app/assets/stylesheets/application.css.scss.erb b/app/assets/stylesheets/application.css.scss.erb index 7f4793fcf7..ac5160afc2 100755 --- a/app/assets/stylesheets/application.css.scss.erb +++ b/app/assets/stylesheets/application.css.scss.erb @@ -10,7 +10,6 @@ * *= require jquery-ui *= require alertify - *= require chosen *= require jquery-ui-1.8.1.custom *= require jquery.autocomplete *= require trumbowyg @@ -59,6 +58,7 @@ @import "agent_tooltip"; @import "content_finder"; @import "tools"; +@import "taxonomy"; /* Bootstrap and Font Awesome */ @import "bootstrap"; diff --git a/app/assets/stylesheets/bioportal.scss b/app/assets/stylesheets/bioportal.scss index 1252111f8b..49c4eb3496 100644 --- a/app/assets/stylesheets/bioportal.scss +++ b/app/assets/stylesheets/bioportal.scss @@ -637,209 +637,7 @@ li.ac_over > .obsolete_class { font-style: italic; } -/******************** -## TREE VIEW -*********************/ -div.tree_error { - background: none repeat scroll 0 0 lightYellow; - font-weight: 600; - padding: 5px 10px; -} - -.expansion_error { - color: red; - font-size: x-small; - font-style: oblique; - padding: 0 3px; -} - -#bd ul.simpleTree li{ - margin-left: 0px; - padding: 5px 0 0 10px; -} - -#bd ul.simpleTree{ - margin-left:0px; - margin-bottom:0px; -} - -.simpleTree { - margin:0; - padding:0; - /* - overflow:auto; - width: 250px; - height:350px; - overflow:auto; - border: 1px solid #444444; - */ - a.tree-link { - display: inline-block; - padding: 5px; - word-break: break-all; - text-wrap: wrap; - color: var(--primary-color) !important; - } - a.tree-link.active { - cursor: default; - background-color: var(--light-color); - font-weight: bold; - border-radius: 3px; - padding: 7px 5px; - } - - .tree-border-left{ - border-left: 2px dotted #eee; - margin-left: 2px; - } -} -.simpleTree li { - list-style: none; - margin:0; - padding:0 0 0 22px; - line-height: 14px; -} -.simpleTree li span { - display:inline; - clear: left; - white-space: nowrap; -} -.simpleTree ul { - margin:0; - padding:0; -} -.simpleTree .root ul { - margin:0; -} -.simpleTree .root { - margin-left:-16px; - /*background: url(/images/tree/root.gif) no-repeat 16px 0 #ffffff;*/ -} -.simpleTree .line { - margin:0 0 0 -16px; - padding:0; - line-height: 3px; - height:3px; - font-size:3px; - background: image-url('jquery.simple.tree/line_bg.gif') 0 0 no-repeat transparent; -} -.simpleTree .line-last { - margin:0 0 0 -16px; - padding:0; - line-height: 3px; - height:3px; - font-size:3px; - background: image-url('jquery.simple.tree/spacer.gif') 0 0 no-repeat transparent; -} -.simpleTree .line-over { - margin:0 0 0 -16px; - padding:0; - line-height: 3px; - height:3px; - font-size:3px; - background: image-url('jquery.simple.tree/line_bg_over.gif') 0 0 no-repeat transparent; -} -.simpleTree .line-over-last { - margin:0 0 0 -16px; - padding:0; - line-height: 3px; - height:3px; - font-size:3px; - background: image-url('jquery.simple.tree/line_bg_over_last.gif') 0 0 no-repeat transparent; -} -.simpleTree .folder-open { - margin-left:-16px; - background: image-url('jquery.simple.tree/collapsable.gif') 0 -2px no-repeat #fff; -} -.simpleTree .folder-open-last { - margin-left:-16px; - background: image-url('jquery.simple.tree/collapsable-last.gif') 0 -2px no-repeat #fff; -} -.simpleTree .folder-close { - margin-left:-16px; - background: image-url('jquery.simple.tree/expandable.gif') 0 -2px no-repeat #fff; -} -.simpleTree .folder-close-last { - margin-left:-16px; - background: image-url('jquery.simple.tree/expandable-last.gif') 0 -2px no-repeat #fff; -} -.simpleTree .doc { - margin-left:-16px; - background: image-url('jquery.simple.tree/leaf.gif') 0 -1px no-repeat #fff; -} -.simpleTree .doc-last { - margin-left:-16px; - background: image-url('jquery.simple.tree/leaf-last.gif') 0 -1px no-repeat #fff; -} -.simpleTree .ajax { - background: image-url('jquery.simple.tree/spinner.gif') no-repeat 0 0 #ffffff; - height: 16px; - display:none; -} -.simpleTree .ajax li { - display:none; - margin:0; - padding:0; -} -.simpleTree .trigger { - display:inline; - margin-left:-32px; - width: 28px; - height: 11px; - cursor:pointer; -} -.simpleTree .text { - cursor: default; - padding: 0 2px; -} -.simpleTree .active { - cursor: default; - background-color: #B9D5E4; - font-weight: bold; - padding-top: 0px; - padding-right: 2px; - padding-bottom: 0px; - padding-left: 2px; -} -.simpleTree a, .simpleTree a:hover { - text-decoration: none; - color: black; -} -.simpleTree a:hover { - cursor: pointer; -} -#drag_container { - background:#ffffff; - color:#000; - font: normal 11px arial, tahoma, helvetica, sans-serif; - border: 1px dashed #767676; -} -#drag_container ul { - list-style: none; - padding:0; - margin:0; -} -#drag_container li { - list-style: none; - background-color:#ffffff; - line-height:18px; - white-space: nowrap; - padding:1px 1px 0px 16px; - margin:0; -} -#drag_container li span { - padding:0; -} -#drag_container li.doc, #drag_container li.doc-last { - background: image-url('jquery.simple.tree/leaf.gif') no-repeat -17px 0 #ffffff; -} -#drag_container .folder-close, #drag_container .folder-close-last { - background: image-url('jquery.simple.tree/expandable.gif') no-repeat -17px 0 #ffffff; -} -#drag_container .folder-open, #drag_container .folder-open-last { - background: image-url('jquery.simple.tree/collapsable.gif') no-repeat -17px 0 #ffffff; -} .contextMenu { display:none; } @@ -1245,4 +1043,44 @@ turbo-frame[busy] ~ .show-if-loading { .hide{ display:none; +} + +.cookies-modal { + position: fixed; + height: auto; + top: initial; + left: initial; + bottom: 30px; + right: 30px; + transform: initial; + grid-template-rows: minmax(0, 1fr); + z-index: 99999; + background: white; + border-style: solid; + border-color: #f2f2f2; + border-radius: 8px; + border-width: 0; + padding: 15px 20px; + display: grid; + grid-gap: 10px; + box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 8px, rgba(0, 0, 0, 0.1) 0px 2px 4px; + width: 526px; + grid-row-gap: 10px; + + h4{ + justify-self: center; + font-size: 16px; + color: var(--primary-color); + font-weight: 500; + } + p { + word-wrap: break-word; + font-size: 12px; + margin-bottom: 5px; + } + .cookie-privacy-link { + font-size: 12px; + text-align: center; + text-decoration: underline; + } } \ No newline at end of file diff --git a/app/assets/stylesheets/components/concept_details.scss b/app/assets/stylesheets/components/concept_details.scss index 47b0eb326b..c61a0170a8 100644 --- a/app/assets/stylesheets/components/concept_details.scss +++ b/app/assets/stylesheets/components/concept_details.scss @@ -6,4 +6,8 @@ .concept_details_component table th { width: 220px; +} + +.concept_details_component td, .concept_details_component th{ + max-width: 200px; } \ No newline at end of file diff --git a/app/assets/stylesheets/components/index.scss b/app/assets/stylesheets/components/index.scss index c3d57ff51f..62355eb785 100644 --- a/app/assets/stylesheets/components/index.scss +++ b/app/assets/stylesheets/components/index.scss @@ -33,4 +33,5 @@ @import "range_slider"; @import "ontologies_selector"; @import "loader"; -@import "vertical_tabs"; \ No newline at end of file +@import "vertical_tabs"; +@import "tree_view"; \ No newline at end of file diff --git a/app/assets/stylesheets/components/pill_button.scss b/app/assets/stylesheets/components/pill_button.scss index 13a88c1fb8..c47e4ea27b 100644 --- a/app/assets/stylesheets/components/pill_button.scss +++ b/app/assets/stylesheets/components/pill_button.scss @@ -23,6 +23,9 @@ a { color: white !important; } + div { + color: white !important; + } } .pill-button:hover svg path { diff --git a/app/assets/stylesheets/components/search_input.scss b/app/assets/stylesheets/components/search_input.scss index dd721562ae..883899fbc8 100644 --- a/app/assets/stylesheets/components/search_input.scss +++ b/app/assets/stylesheets/components/search_input.scss @@ -9,6 +9,12 @@ position: absolute; } +.search-container.search-container-scroll{ + max-height: 400px; + overflow-y: auto; +} + + .search-content{ display: flex; flex-wrap: wrap; diff --git a/app/assets/stylesheets/components/tree_view.scss b/app/assets/stylesheets/components/tree_view.scss new file mode 100644 index 0000000000..1582b9c3a3 --- /dev/null +++ b/app/assets/stylesheets/components/tree_view.scss @@ -0,0 +1,170 @@ +.tree-view-reuse-icon{ + display: inline; +} +.tree-view-reuse-icon svg{ + width: 13px; +} + +div.tree_error { + background: none repeat scroll 0 0 lightYellow; + font-weight: 600; + padding: 5px 10px; +} + +.expansion_error { + color: red; + font-size: x-small; + font-style: oblique; + padding: 0 3px; +} + +#bd ul.simpleTree li{ + margin-left: 0px; + padding: 5px 0 0 10px; +} + +#bd ul.simpleTree{ +margin-left:0px; +margin-bottom:0px; +} + +.simpleTree { +margin:0; +padding:0; + +a.tree-link { + display: inline-block; + padding: 5px; + word-break: break-all; + text-wrap: wrap; + color: var(--primary-color) !important; +} + +a.tree-link.active { + cursor: default; + background-color: var(--light-color); + font-weight: bold; + border-radius: 3px; + padding: 7px 5px; +} + +.tree-border-left{ + border-left: 2px dotted #eee; + margin-left: 2px; +} +} +.simpleTree li { +list-style: none; +margin:0; +padding:0 0 0 22px; +line-height: 14px; +} +.simpleTree li span { +display:inline; +clear: left; +white-space: nowrap; +} +.simpleTree ul { +margin:0; +padding:0; +} +.simpleTree .root ul { +margin:0; +} +.simpleTree .root { +margin-left:-16px; +/*background: url(/images/tree/root.gif) no-repeat 16px 0 #ffffff;*/ +} +.simpleTree .line { +margin:0 0 0 -16px; +padding:0; +line-height: 3px; +height:3px; +font-size:3px; +background: image-url('jquery.simple.tree/line_bg.gif') 0 0 no-repeat transparent; +} +.simpleTree .line-last { +margin:0 0 0 -16px; +padding:0; +line-height: 3px; +height:3px; +font-size:3px; +background: image-url('jquery.simple.tree/spacer.gif') 0 0 no-repeat transparent; +} +.simpleTree .line-over { +margin:0 0 0 -16px; +padding:0; +line-height: 3px; +height:3px; +font-size:3px; +background: image-url('jquery.simple.tree/line_bg_over.gif') 0 0 no-repeat transparent; +} +.simpleTree .line-over-last { +margin:0 0 0 -16px; +padding:0; +line-height: 3px; +height:3px; +font-size:3px; +background: image-url('jquery.simple.tree/line_bg_over_last.gif') 0 0 no-repeat transparent; +} +.simpleTree .folder-open { +margin-left:-16px; +background: image-url('jquery.simple.tree/collapsable.gif') 0 -2px no-repeat #fff; +} +.simpleTree .folder-open-last { +margin-left:-16px; +background: image-url('jquery.simple.tree/collapsable-last.gif') 0 -2px no-repeat #fff; +} +.simpleTree .folder-close { +margin-left:-16px; +background: image-url('jquery.simple.tree/expandable.gif') 0 -2px no-repeat #fff; +} +.simpleTree .folder-close-last { +margin-left:-16px; +background: image-url('jquery.simple.tree/expandable-last.gif') 0 -2px no-repeat #fff; +} +.simpleTree .doc { +margin-left:-16px; +background: image-url('jquery.simple.tree/leaf.gif') 0 -1px no-repeat #fff; +} +.simpleTree .doc-last { +margin-left:-16px; +background: image-url('jquery.simple.tree/leaf-last.gif') 0 -1px no-repeat #fff; +} +.simpleTree .ajax { +background: image-url('jquery.simple.tree/spinner.gif') no-repeat 0 0 #ffffff; +height: 16px; +display:none; +} +.simpleTree .ajax li { +display:none; +margin:0; +padding:0; +} +.simpleTree .trigger { +display:inline; +margin-left:-32px; +width: 28px; +height: 11px; +cursor:pointer; +} +.simpleTree .text { +cursor: default; +padding: 0 2px; +} +.simpleTree .active { +cursor: default; +background-color: #B9D5E4; +font-weight: bold; +padding-top: 0px; +padding-right: 2px; +padding-bottom: 0px; +padding-left: 2px; +} +.simpleTree a, .simpleTree a:hover { +text-decoration: none; +color: black; +} +.simpleTree a:hover { +cursor: pointer; +} \ No newline at end of file diff --git a/app/assets/stylesheets/concepts.scss b/app/assets/stylesheets/concepts.scss index e466177edc..330d00eb59 100644 --- a/app/assets/stylesheets/concepts.scss +++ b/app/assets/stylesheets/concepts.scss @@ -160,4 +160,10 @@ div.synonym-change-request button { .concepts-mapping-count .d-flex{ display: inline !important; -} \ No newline at end of file +} + +.concepts_json_button{ + margin-right: 5px; + margin-top: -4px; +} + diff --git a/app/assets/stylesheets/fair_assement.scss b/app/assets/stylesheets/fair_assement.scss index ad757bee9c..4d049d521b 100644 --- a/app/assets/stylesheets/fair_assement.scss +++ b/app/assets/stylesheets/fair_assement.scss @@ -35,6 +35,7 @@ $non_applicable_color : rgba(176, 190, 197, 0.4); animation-duration: .75s; animation-timing-function: linear; animation-iteration-count: infinite; + color: var(--primary-color); } .spinner-border-reverse { diff --git a/app/assets/stylesheets/home.scss b/app/assets/stylesheets/home.scss index 327e0ed070..9965d2bfd5 100644 --- a/app/assets/stylesheets/home.scss +++ b/app/assets/stylesheets/home.scss @@ -150,7 +150,59 @@ i.fa.fa-caret-square-o-down { margin-bottom: 5px; font-weight: 700; } - +.home-section-title{ + display: flex; + flex-direction: column; + align-items: start; +} +.home-section-title .text{ + font-size: 20px; + font-weight: 600; + margin-bottom: 0; +} +.home-slice > a{ + display: flex; + align-items: center; +} +.home-slice-icon{ + display: flex; + flex-direction: column; + align-items: center; +} +.home-slice-icon svg{ + width: 40px; + height: 40px; +} +.home-slices-container{ + display: flex; + flex-wrap: wrap; + margin-top: 20px; +} +.home-section-description{ + color: #888888; +} +.home-slice{ + border: 1px solid var(--primary-color); + border-radius: 8px; + padding: 4px 15px; + margin-right: 20px; + margin-bottom: 20px; +} +.home-ontoportal-instances{ + margin-top: 50px; + background: #FBFBFB; + width: 100%; + display: flex; + justify-content: center; +} +.ontoportal-instances-container{ + padding: 0 50px; + width: 1248px; + padding-bottom: 20px; +} +.home-section-title.ontoportal{ + margin-top: 20px; +} .home-section-line{ width: 60px; margin-top: 3px; @@ -169,17 +221,26 @@ i.fa.fa-caret-square-o-down { } .home-statistics-container > div { display: flex; - align-items: center; + align-items: start; + justify-content: center; flex-wrap: wrap; } .home-agroportal-figures{ margin-bottom: 20px; } - +.home-slice-name{ + font-size: 16px; + font-weight: 400; + margin-left: 10px; +} +.home-slice-ontologies{ + font-size: 18px; + font-weight: 500; + margin-bottom: -18px; +} .home-statistics-container > div > p { font-size: 20px; font-weight: 600; - margin-left: 18px; margin-bottom: 0; } .home-statistics-item{ @@ -414,7 +475,6 @@ i.fa.fa-caret-square-o-down { } .home-support-items{ display: flex; - justify-content: center; flex-wrap: wrap; img{ object-fit: scale-down; @@ -429,8 +489,8 @@ i.fa.fa-caret-square-o-down { border-radius: 50%; display: block; } -.home-support-items > *:not(:first-child){ - margin-left: 40px; +.home-support-items > div, .home-support-items > a { + margin-right: 40px; } .home-support-items a{ margin-bottom: 40px; diff --git a/app/assets/stylesheets/login.scss b/app/assets/stylesheets/login.scss index f832c6ed00..f77d8a6b71 100644 --- a/app/assets/stylesheets/login.scss +++ b/app/assets/stylesheets/login.scss @@ -1,5 +1,5 @@ .login-form{ - margin-top: 30px; + margin-top: 10px; padding: 37px 41px; box-shadow: rgba(0, 0, 0, 0.08) 0px 20px 50px; border-radius: 14px; diff --git a/app/assets/stylesheets/mappings.scss b/app/assets/stylesheets/mappings.scss index c0a494fb07..89a7ebffbe 100644 --- a/app/assets/stylesheets/mappings.scss +++ b/app/assets/stylesheets/mappings.scss @@ -284,25 +284,9 @@ p#display_options { vertical-align: middle; } -div#mapping_load { - padding: 1em 1em 0; - margin-bottom: -1em; - display: none; - img { - vertical-align: text-bottom; - } -} -div#mappingCount { - text-align: center; - overflow: hidden; - padding-top: 10px; -} -#mapping_count_table { - width: 100%; -} /* Create New Mapping dialog */ diff --git a/app/assets/stylesheets/notice.scss b/app/assets/stylesheets/notice.scss index c691896538..93dd13e0ef 100644 --- a/app/assets/stylesheets/notice.scss +++ b/app/assets/stylesheets/notice.scss @@ -14,3 +14,26 @@ div#notice_message { } } +.slice-notice-bar-container{ + background-color: var(--warning-color); + display: flex; + justify-content: center; +} +.slice-notice-bar{ + width: var(--container-max-width); + padding: 10px 40px; + display: flex; + justify-content: space-between; + align-items: center; + color: white; +} +.slice-notice-bar>div{ + display: flex; +} +.slice-notice-bar .slice-name{ + margin-left: 5px; + font-weight: 600; +} +.slice-notice-bar .warning-button.primary-button{ + background-color: #efb300 !important; +} diff --git a/app/assets/stylesheets/ontologies.scss b/app/assets/stylesheets/ontologies.scss index afa87ae7c5..ccaf70d314 100644 --- a/app/assets/stylesheets/ontologies.scss +++ b/app/assets/stylesheets/ontologies.scss @@ -195,7 +195,7 @@ $widget-table-border-color: #EFEFEF; #bd_content .sidebar { overflow-x: auto; white-space: nowrap; - min-width: 35%; + min-width: 29%; } #search_box:focus { @@ -293,8 +293,10 @@ $widget-table-border-color: #EFEFEF; } .metadata-exporter .download-btn { position: absolute; - right: 20px; + right: 0; + top: -50px; z-index: 2; + cursor: pointer; .chip_button_container_clickable { opacity: 0.6; &:hover { @@ -303,7 +305,7 @@ $widget-table-border-color: #EFEFEF; } } -.htacess-code-container{ +.htacess-code-container, .nginx-code-container{ margin-top: 20px; margin-bottom: 30px; text-align: left; diff --git a/app/assets/stylesheets/taxonomy.scss b/app/assets/stylesheets/taxonomy.scss new file mode 100644 index 0000000000..6043973aa8 --- /dev/null +++ b/app/assets/stylesheets/taxonomy.scss @@ -0,0 +1,101 @@ +.taxonomy-page-container { + display: flex; + justify-content: center; + } +.taxonomy-page-subcontainer { + width: 1248px; + padding: 20px 50px; +} +.taxonomy-page-title .text{ + font-size: 25px; + font-weight: 700; +} + +.taxonomy-page-title .line{ + height: 2px; + width: 57px; + background-color: var(--primary-color); + border-radius: 10px; +} +.taxonomy-page-decription{ + color: #888888; + margin: 20px 0; +} +.taxonomy-section{ + display: flex; +} +.taxonomy-section .second-row{ + margin-left: 10px; +} +.taxonomy-card{ + border: 1px solid #DFDFDF; + padding: 15px 20px; + width: 569px; + border-radius: 5px; + margin-top: 10px; +} + +.taxonomy-card .title-bar{ + display: flex; + justify-content: space-between; + align-items: center; +} +.taxonomy-card .title{ + color: var(--primary-color); + font-size: 18px; + font-weight: bold; +} + +.taxonomy-card .ontologies{ + display: flex; + align-items: center; + color: var(--primary-color); + margin: 3px 0; +} +.taxonomy-card .ontologies svg{ + width: 15px; + height: 15px; + margin-right: 10px; +} + +.taxonomy-card .ontologies svg path{ + fill: var(--primary-color); +} +.taxonomy-card .description{ + color: #666666; + padding-bottom: 5px; +} +.taxonomy-slice-svg{ + width: 35px; + height: 35px; + margin-bottom: 2px; +} + +.taxonomy-children-reveal{ + display: flex; + align-items: center; + cursor: pointer; + color: var(--primary-color); +} +.taxonomy-children-reveal svg{ + margin-left: 5px; + margin-top: 3px; +} + +.taxonomy-children .taxonomy-card{ + border: none; + padding: 0px 18px; + width: unset; +} + +.taxonomy-children-container{ + display: flex; + margin-top: 10px +} + +.taxonomy-children-line{ + width: 1px; + background-color: var(--primary-color); +} + + diff --git a/app/assets/stylesheets/theme-variables.scss.erb b/app/assets/stylesheets/theme-variables.scss.erb index cca2fc4080..45e0a63c64 100644 --- a/app/assets/stylesheets/theme-variables.scss.erb +++ b/app/assets/stylesheets/theme-variables.scss.erb @@ -46,7 +46,7 @@ // common variables :root{ --error-color: #EB4335; - --warning-color: #e48c11; + --warning-color: #F2BE22; --gray-color: #888888; --success-color: #2DC54E; --admin-color: #145FF4; diff --git a/app/components/agent_search_input_component/agent_search_input_component.html.haml b/app/components/agent_search_input_component/agent_search_input_component.html.haml index 89f0fdd305..9da8101b53 100644 --- a/app/components/agent_search_input_component/agent_search_input_component.html.haml +++ b/app/components/agent_search_input_component/agent_search_input_component.html.haml @@ -1,11 +1,11 @@ = hidden_field_tag "#{@name_prefix}[#{@id}]" -= render SearchInputComponent.new(id: 'agent' + @id, name:'agent' + @id, ajax_url: "/ajax/agents?agent_type=#{@agent_type}&name=", += render SearchInputComponent.new(id: 'agent' + @id, name:'agent' + @id, ajax_url: "/ajax/agents?query=", display_all: true, item_base_url:"/agents/#{@id}?parent_id=#{@parent_id}&edit_on_modal=#{@edit_on_modal}&name_prefix=#{@name_prefix}&deletable=#{@deletable}&agent_id=", id_key: 'id', use_cache: false, actions_links: {create_new_agent: {link: "/agents/new?name=&id=#{@id}&parent_id=#{@parent_id}&type=#{@agent_type}&show_affiliations=#{@show_affiliations}&deletable=#{@deletable}&edit_on_modal=#{@edit_on_modal}&name_prefix=#{@name_prefix}[#{@id}]", target:'_self'}}) do |s| - s.template do %a{href: "LINK", class: "search-content", 'data-turbo-frame': '_self'} %p.search-element.home-searched-ontology - NAME (IDENTIFIERS) + NAME ACRONYM IDENTIFIERS %p.home-result-type - TYPE \ No newline at end of file + TYPE diff --git a/app/components/concept_details_component.rb b/app/components/concept_details_component.rb index 663e7e1887..ff275effba 100644 --- a/app/components/concept_details_component.rb +++ b/app/components/concept_details_component.rb @@ -81,7 +81,7 @@ def filter_properties(top_keys, bottom_keys, exclude_keys, concept_properties) private def link_to_format_modal(format, icon) - link_to_modal(nil, "/ontologies/#{@acronym}/#{escape(@concept_id)}/serialize/#{format}", data: {show_modal_title_value: @concept_id, show_modal_size_value: 'modal-xl'}) do + link_to_modal(nil, "/ontologies/#{@acronym}/#{escape(@concept_id)}/serialize/#{format}",{ id: "resource_content_#{format}", data: {show_modal_title_value: @concept_id, show_modal_size_value: 'modal-xl'}}) do inline_svg("icons/#{icon}.svg", width: '50px', height: '50px') end end diff --git a/app/components/concept_details_component/concept_details_component.html.haml b/app/components/concept_details_component/concept_details_component.html.haml index e42cfa8187..e8c341b8c4 100644 --- a/app/components/concept_details_component/concept_details_component.html.haml +++ b/app/components/concept_details_component/concept_details_component.html.haml @@ -26,7 +26,7 @@ - if @concept_id - t.row do |r| - r.td(colspan: 2) do - %div.d-flex.justify-content-center.p-2 + %div.d-flex.justify-content-center.p-2#content_resource_formats - [["json","json-ld-file"], ["xml","rdf-xml-file"] , ["ntriples","ntriples-file"], ["turtle","turtle-file"]].each do |format, icon| %div.mx-4{data: {controller: "tooltip"}, title: "Export in #{format.upcase}"} = link_to_format_modal(format, icon) \ No newline at end of file diff --git a/app/components/display/rdf_highlighter_component/rdf_highlighter_component_controller.js b/app/components/display/rdf_highlighter_component/rdf_highlighter_component_controller.js index 0737369702..86b8ecd3cc 100644 --- a/app/components/display/rdf_highlighter_component/rdf_highlighter_component_controller.js +++ b/app/components/display/rdf_highlighter_component/rdf_highlighter_component_controller.js @@ -103,12 +103,12 @@ export default class extends Controller { downloadJsonLd () { this.#toJSONLD().then((jsonld) => { - this.#generateDownloadFile(JSON.stringify(jsonld, null, ' '), 'nt') + this.#generateDownloadFile(JSON.stringify(jsonld, null, ' '), 'json') }) } downloadXML () { - this.#generateDownloadFile(this.#toXML(this.formatedData, this.submissionValue['context']), 'rdf') + this.#generateDownloadFile(this.#toXML(this.formatedData, this.contextValue), 'rdf') } downloadCSV () { @@ -211,7 +211,6 @@ export default class extends Controller { // TODO: change MIME type? element.setAttribute('href', 'data:application/rdf+json;charset=utf-8,' + encodeURIComponent(content)) element.setAttribute('download', jQuery(document).data().bp.ontology.acronym + '_metadata.' + fileExtension) - element.style.display = 'none' document.body.appendChild(element) element.click() diff --git a/app/components/display/search_result_component.rb b/app/components/display/search_result_component.rb index 3a2505e87d..18d56a288e 100644 --- a/app/components/display/search_result_component.rb +++ b/app/components/display/search_result_component.rb @@ -1,6 +1,8 @@ class Display::SearchResultComponent < ViewComponent::Base include UrlsHelper include ModalHelper + include MultiLanguagesHelper + renders_many :subresults, Display::SearchResultComponent renders_many :reuses, Display::SearchResultComponent def initialize(number: 0,title: nil, ontology_acronym: nil ,uri: nil, definition: nil, link: nil, is_sub_component: false) diff --git a/app/components/display/search_result_component/search_result_component.html.haml b/app/components/display/search_result_component/search_result_component.html.haml index 376fbf473d..9d4d48bc08 100644 --- a/app/components/display/search_result_component/search_result_component.html.haml +++ b/app/components/display/search_result_component/search_result_component.html.haml @@ -5,9 +5,8 @@ .uri = @uri - if @definition - - @definition.each do |definition| - .definition - = definition + + = display_in_multiple_languages(@definition) .actions = details_button = visualize_button diff --git a/app/components/display/taxonomy_card_component.rb b/app/components/display/taxonomy_card_component.rb new file mode 100644 index 0000000000..df896191b6 --- /dev/null +++ b/app/components/display/taxonomy_card_component.rb @@ -0,0 +1,10 @@ +class Display::TaxonomyCardComponent < ViewComponent::Base + def initialize(taxonomy: , ontologies_names: ) + @taxonomy = taxonomy + @ontologies_names = ontologies_names + end + + def reveal_id + @taxonomy.id + end +end diff --git a/app/components/display/taxonomy_card_component/taxonomy_card_component.html.haml b/app/components/display/taxonomy_card_component/taxonomy_card_component.html.haml new file mode 100644 index 0000000000..ab55aa41de --- /dev/null +++ b/app/components/display/taxonomy_card_component/taxonomy_card_component.html.haml @@ -0,0 +1,29 @@ +.taxonomy-card{'data-controller': 'reveal-component'} + .title-bar + .title + = "#{@taxonomy.name} (#{@taxonomy.acronym})" + %a{href: "https://#{@taxonomy.acronym}.#{$UI_URL.sub("https://", "")}"} + = inline_svg_tag('icons/slices.svg', class: "taxonomy-slice-svg #{@taxonomy.is_slice ? '' : 'd-none'}") + %a.ontologies{href: "/ontologies?#{@taxonomy.id.split('/')[-2]}=#{@taxonomy.acronym}"} + = inline_svg_tag('icons/ontology.svg') + .number-of-ontologies + = "#{@taxonomy.ontologies.length} ontologies" + .description + = render TextAreaFieldComponent.new(value: @taxonomy.description) + .ontologies-cards + - @taxonomy.ontologies.each_with_index do |ontology, index| + - if index>10 + = render ChipButtonComponent.new(url: "/ontologies?#{@taxonomy.id.split('/')[-2]}=#{@taxonomy.acronym}", text: "...", tooltip:"See all ontologies ...", type: "clickable") + - break + = render ChipButtonComponent.new(url: "/ontologies/#{ontology.split('/').last}", text: ontology.split('/').last, tooltip: @ontologies_names[ontology], type: "clickable") + + - if @taxonomy.children + .taxonomy-children-reveal{'data-action': "click->reveal-component#toggle", 'data-id': reveal_id} + .text + = t('taxonomy.show_sub_categories') + = inline_svg_tag 'icons/arrow-down.svg' + .taxonomy-children-container + .taxonomy-children-line + .taxonomy-children.d-none{id: reveal_id} + - @taxonomy.children.each do |child| + = render Display::TaxonomyCardComponent.new(taxonomy: child, ontologies_names: @ontologies_names) \ No newline at end of file diff --git a/app/components/input/text_area_component.rb b/app/components/input/text_area_component.rb index 940a8b9352..04f4533376 100644 --- a/app/components/input/text_area_component.rb +++ b/app/components/input/text_area_component.rb @@ -1,8 +1,12 @@ # frozen_string_literal: true class Input::TextAreaComponent < Input::InputFieldComponent - def initialize(label: '', name:, value: nil, placeholder: '', error_message: '', helper_text: '', rows: "5") + def initialize(label: '', name:, value: nil, placeholder: '', error_message: '', helper_text: '', rows: "5", resize: nil) super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text) @rows = rows + @resize = resize + end + def resize + @resize ? "resize: vertical;" : "" end end diff --git a/app/components/input/text_area_component/text_area_component.html.haml b/app/components/input/text_area_component/text_area_component.html.haml index d2dd1b5d87..f00c4cffbd 100644 --- a/app/components/input/text_area_component/text_area_component.html.haml +++ b/app/components/input/text_area_component/text_area_component.html.haml @@ -1,3 +1,3 @@ = render Input::InputFieldComponent.new(label: @label, name: @name, value: @value, placeholder: @placeholder, error_message: @error_message, helper_text: @helper_text) do - %textarea.input-field-component{name: @name, rows: @rows, placeholder: @placeholder, style: error_style} + %textarea.input-field-component{name: @name, rows: @rows, placeholder: @placeholder, style: "#{error_style} #{resize}"} = @value \ No newline at end of file diff --git a/app/components/ontology_browse_card_component/ontology_browse_card_component.html.haml b/app/components/ontology_browse_card_component/ontology_browse_card_component.html.haml index 61daf0e9cb..aaf97e85fd 100644 --- a/app/components/ontology_browse_card_component/ontology_browse_card_component.html.haml +++ b/app/components/ontology_browse_card_component/ontology_browse_card_component.html.haml @@ -16,7 +16,7 @@ = t('components.show_more') - - unless ontology[:fairScore].nil? || ontology[:acronym] == 'AGROVOC' + - unless ontology[:fairScore].nil? || ontology[:fairScore].zero? || ontology[:acronym] == 'AGROVOC' .browse-fair %p.browse-fair-title = t('components.fair_score') @@ -47,7 +47,7 @@ - if ontology[:contact] %span.mx-1= t('components.by') %span.browse-uploaded-date.text-truncate - = ontology[:contact].humanize + = ontology[:contact].titleize - if ontology[:released] - date = render DateTimeFieldComponent.new(value: ontology[:released]) diff --git a/app/components/ontology_subscribe_button_component.rb b/app/components/ontology_subscribe_button_component.rb index 9faec90aba..24edeb4093 100644 --- a/app/components/ontology_subscribe_button_component.rb +++ b/app/components/ontology_subscribe_button_component.rb @@ -15,6 +15,8 @@ def initialize(id: '', ontology_id:, subscribed:, user_id:, count: 0, link: 'jav 'subscribe-notes-ontology-id-value': ontology_id, 'subscribe-notes-is-subbed-value': subscribed.to_s, 'subscribe-notes-user-id-value': user_id, + 'subscribe-notes-watch-value': t('components.watch'), + 'subscribe-notes-unwatch-value': t('components.unwatch'), action: 'click->subscribe-notes#subscribeToNotes', }, title: title @@ -30,4 +32,8 @@ def title t('components.join_the_count', count: @count) end end + + def data_turbo + @link.include?('/login') ? 'false' : 'true' + end end diff --git a/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component.html.haml b/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component.html.haml index 9ec723388a..bf0b2add63 100644 --- a/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component.html.haml +++ b/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component.html.haml @@ -1,6 +1,6 @@ %div{@controller_params, style: 'margin-left: 10px;', id: @id} = render PillButtonComponent.new do - %a.d-flex.align-items-center{href: @link} + %a.d-flex.align-items-center{href: @link, 'data-turbo': data_turbo} = inline_svg_tag "eye.svg" %div %span{'data-subscribe-notes-target': 'text'} diff --git a/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component_controller.js b/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component_controller.js index 49d67275b9..b425c5155d 100644 --- a/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component_controller.js +++ b/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component_controller.js @@ -6,7 +6,9 @@ export default class extends Controller { static values = { ontologyId: String, isSubbed: Boolean, - userId: String + userId: String, + watch: String, + unwatch: String } static targets = ["error", "loader", "text" ,"count"] @@ -39,10 +41,10 @@ export default class extends Controller { let txt = this.textTarget.innerHTML let count = parseInt(this.countTarget.innerHTML) - let newButtonText = txt.match("UnWatch") ? txt.replace("UnWatch", "Watch") : txt.replace("Watch", "UnWatch"); + let newButtonText = txt.match(this.unwatchValue) ? txt.replace(this.unwatchValue, this.watchValue) : txt.replace(this.watchValue, this.unwatchValue); this.element.setAttribute('title', newButtonText + ' this ontology') this.textTarget.innerHTML = newButtonText - this.countTarget.innerHTML = newButtonText.match("UnWatch") ? (count + 1) : (count - 1) + this.countTarget.innerHTML = newButtonText.match(this.unwatchValue) ? (count + 1) : (count - 1) }, error: () => { this.#hideSpinner() diff --git a/app/components/search_input_component.rb b/app/components/search_input_component.rb index 941b03d2ec..9390797d36 100644 --- a/app/components/search_input_component.rb +++ b/app/components/search_input_component.rb @@ -11,7 +11,8 @@ def initialize(id: '', item_base_url:, id_key:, links_target: '_top', - search_icon_type: nil) + search_icon_type: nil, + display_all: false) @id = id @name = name @placeholder = placeholder @@ -23,6 +24,7 @@ def initialize(id: '', @id_key = id_key @links_target = links_target @search_icon_type = search_icon_type + @display_all = display_all end def action_link_info(value) if value.is_a?(Hash) @@ -34,4 +36,7 @@ def action_link_info(value) def nav_icon_class @search_icon_type.eql?('nav') ? 'search-input-nav-icon' : '' end + def display_all_mode_class + @display_all ? 'search-container-scroll' : '' + end end diff --git a/app/components/search_input_component/search_input_component.html.haml b/app/components/search_input_component/search_input_component.html.haml index fb0d79f289..9d5e193840 100644 --- a/app/components/search_input_component/search_input_component.html.haml +++ b/app/components/search_input_component/search_input_component.html.haml @@ -4,7 +4,8 @@ 'data-search-input-id-key-value': @id_key, 'data-search-input-cache-value': @use_cache.to_s, 'data-search-input-scroll-down-value': @scroll_down.to_s, - 'data-search-input-selected-item-value': 0 + 'data-search-input-selected-item-value': 0, + 'data-search-input-display-all-value': @display_all } - if @search_icon_type @@ -21,7 +22,7 @@ = render Input::InputFieldComponent.new(name: @name, placeholder: @placeholder, data: {'action': 'input->search-input#search blur->search-input#blur keydown.down->search-input#arrow_down keydown.up->search-input#arrow_up keydown.enter->search-input#enter_key', 'search-input-target': 'input'}) - .search-container{'data-search-input-target': 'dropDown', 'data-action': 'mousedown->search-input#prevent'} + %div{class: "search-container #{display_all_mode_class}", 'data-search-input-target': 'dropDown', 'data-action': 'mousedown->search-input#prevent'} - @actions_links.each do |key, value| - link, target = action_link_info(value) %a.search-content#search-content{href: link, 'data-turbo-frame': target, 'data-search-input-target': 'actionLink'} diff --git a/app/components/search_input_component/search_input_component_controller.js b/app/components/search_input_component/search_input_component_controller.js index 5c8d07cad8..957dc6f049 100644 --- a/app/components/search_input_component/search_input_component_controller.js +++ b/app/components/search_input_component/search_input_component_controller.js @@ -12,7 +12,8 @@ export default class extends Controller { idKey: String, cache: {type: Boolean, default: true}, selectedItem: Number, - searchEndpoint: {type: String, default: '/search'} + searchEndpoint: {type: String, default: '/search'}, + displayAll: Boolean } connect() { @@ -114,14 +115,14 @@ export default class extends Controller { this.dropDown.innerHTML = "" let breaker = 0 for (let i = 0; i < this.items.length; i++) { - if (breaker === 4) { + if (!this.displayAllValue && breaker === 4) { break; } // Get the current item from the ontologies array const item = this.items[i]; let text = Object.values(item).reduce((acc, value) => acc + value, "") - + // Check if the item contains the substring if (!this.cacheValue || text.toLowerCase().includes(inputValue.toLowerCase())) { results_list.push(item); @@ -149,18 +150,22 @@ export default class extends Controller { #renderLine(item) { let template = this.templateTarget.content - let newElement = template.firstElementChild - let string = newElement.outerHTML - + let newElement = template.firstElementChild.outerHTML Object.entries(item).forEach( ([key, value]) => { key = key.toString().toUpperCase() if (key === 'TYPE'){ value = value.toString().split('/').slice(-1) } + if (key === 'ACRONYM'){ + value = value ? `(${value.toString()})` : '' + } + if (key === 'IDENTIFIERS'){ + value = value ? `- ${value.toString()}` : '' + } const regex = new RegExp('\\b' + key + '\\b', 'gi'); - string = string.replace(regex, value ? value.toString() : "") + newElement = newElement.replace(regex, value ? value.toString() : "") }) - - return new DOMParser().parseFromString(string, "text/html").body.firstElementChild + + return new DOMParser().parseFromString(newElement, "text/html").body.firstElementChild } } diff --git a/app/components/submission_status_component/submission_status_component.html.haml b/app/components/submission_status_component/submission_status_component.html.haml index c45bec11d8..a3cce62c7c 100644 --- a/app/components/submission_status_component/submission_status_component.html.haml +++ b/app/components/submission_status_component/submission_status_component.html.haml @@ -1,4 +1,4 @@ -#submission-status{style: "display: -webkit-inline-box"} +.submission-status{style: "display: -webkit-inline-box"} - if @submission.version.present? %p= submission_link - else diff --git a/app/components/tab_item_component.rb b/app/components/tab_item_component.rb index 7779939e6a..88f11f890a 100644 --- a/app/components/tab_item_component.rb +++ b/app/components/tab_item_component.rb @@ -4,13 +4,14 @@ class TabItemComponent < ViewComponent::Base include ActionView::Helpers::UrlHelper - def initialize(id: nil, title: nil, path: nil, page_name: '', selected: false) + def initialize(id: nil, title: nil, path: nil, page_name: '', selected: false, json_link: nil) super @id = id @title = title @path = path @page_name = page_name @selected = selected + @json_link = json_link end def selected_item? @@ -44,9 +45,9 @@ def page_name def call if title && !title.empty? - link_to(title, @path, id: "#{item_id}_tab", class: "#{active_class} tab-link") + link_to(title, @path, id: "#{item_id}_tab", class: "#{active_class} tab-link", 'data-json-link': @json_link) else - link_to(@path, id: "#{item_id}_tab", class: "#{active_class} tab-link") do + link_to(@path, id: "#{item_id}_tab", class: "#{active_class} tab-link", 'data-json-link': @json_link) do content end end diff --git a/app/components/table_component.rb b/app/components/table_component.rb index 671048038a..16bf2c0966 100644 --- a/app/components/table_component.rb +++ b/app/components/table_component.rb @@ -5,7 +5,10 @@ class TableComponent < ViewComponent::Base renders_one :header, TableRowComponent renders_many :rows, TableRowComponent - def initialize(id: '', stripped: true, borderless: false, custom_class: '', layout_fixed: false, small_text: false, outline: false, sort_column: nil, paging: false, searching: false, no_init_sort: false) + def initialize(id: '', stripped: true, borderless: false, custom_class: '', layout_fixed: false, + small_text: false, outline: false, sort_column: nil, + paging: false, searching: false, search_placeholder: nil, + no_init_sort: false) super @id = id @stripped = stripped @@ -18,6 +21,7 @@ def initialize(id: '', stripped: true, borderless: false, custom_class: '', layo @paging = paging @no_init_sort = no_init_sort @custom_class =custom_class + @search_placeholder = search_placeholder end def stripped_class diff --git a/app/components/table_component/table_component.html.haml b/app/components/table_component/table_component.html.haml index 274e4a1bdc..3bdb112da4 100644 --- a/app/components/table_component/table_component.html.haml +++ b/app/components/table_component/table_component.html.haml @@ -1,4 +1,7 @@ -%div{'data-controller': 'table-component', 'data-table-component-sortcolumn-value': @sort_column, 'data-table-component-paging-value': @paging, 'data-table-component-searching-value': @searching, 'data-table-component-noinitsort-value': @no_init_sort} +%div{'data-controller': 'table-component', + 'data-table-component-sortcolumn-value': @sort_column, 'data-table-component-paging-value': @paging, + 'data-table-component-searching-value': @searching, 'data-table-component-noinitsort-value': @no_init_sort, + 'data-table-component-search-placeholder-value': @search_placeholder} %table.table-content{id: @id ,class: @custom_class + ' ' + stripped_class + ' ' + borderless_class + ' ' + layout_fixed_class + ' ' + mini_class + ' ' + outline_class} %thead = header diff --git a/app/components/table_component/table_component_controller.js b/app/components/table_component/table_component_controller.js index 1e9f4e0d63..2032bf4499 100644 --- a/app/components/table_component/table_component_controller.js +++ b/app/components/table_component/table_component_controller.js @@ -8,7 +8,8 @@ export default class extends Controller { sortcolumn: String, paging: Boolean, searching: Boolean, - noinitsort: Boolean + noinitsort: Boolean, + searchPlaceholder: {type: String, default: 'Filter records'}, } connect(){ const table_component = this.element.querySelector('table') @@ -20,7 +21,11 @@ export default class extends Controller { info: false, searching: this.searchingValue, autoWidth: true, - order: this.noinitsortValue ? [] : [[default_sort_column, 'desc']] + order: this.noinitsortValue ? [] : [[default_sort_column, 'desc']], + language: { + search: '_INPUT_', + searchPlaceholder: this.searchPlaceholderValue + } }); } } diff --git a/app/components/tree_link_component.rb b/app/components/tree_link_component.rb index 91eb8b0540..73da902f20 100644 --- a/app/components/tree_link_component.rb +++ b/app/components/tree_link_component.rb @@ -2,7 +2,7 @@ class TreeLinkComponent < ViewComponent::Base include MultiLanguagesHelper, ModalHelper, ApplicationHelper - def initialize(child:, href:, children_href: , selected: false , data: {}, muted: false, target_frame: nil, open_in_modal: false) + def initialize(child:, href:, children_href: , selected: false , data: {}, muted: false, target_frame: nil, open_in_modal: false, is_reused: nil) @child = child @active_style = selected ? 'active' : '' #@icons = child.relation_icon(node) @@ -28,6 +28,8 @@ def initialize(child:, href:, children_href: , selected: false , data: {}, muted end @open_in_modal = open_in_modal + + @is_reused = is_reused end diff --git a/app/components/tree_link_component/tree_link_component.html.haml b/app/components/tree_link_component/tree_link_component.html.haml index c66ef71313..7317e28345 100644 --- a/app/components/tree_link_component/tree_link_component.html.haml +++ b/app/components/tree_link_component/tree_link_component.html.haml @@ -6,7 +6,9 @@ %a{id: @child.id, data: @data, title: @tooltip, href: @href, class: "tree-link #{@muted_style} #{@active_style} #{border_left} #{open?}"} = @pref_label_html - + - if @is_reused + .tree-view-reuse-icon + = inline_svg_tag 'icons/reuses.svg' - if @child.hasChildren && !@child.expanded? = render TurboFrameComponent.new(id: "#{child_id}_childs") - elsif @child.expanded? diff --git a/app/components/url_resolvability_component.rb b/app/components/url_resolvability_component.rb index 379fe49c32..adbd7bf5e4 100644 --- a/app/components/url_resolvability_component.rb +++ b/app/components/url_resolvability_component.rb @@ -12,7 +12,7 @@ def initialize(url: '', resolvable: false, supported_formats: [], status: nil) end def call - text = check_resolvability_message(@resolvable, @supported_formats, @status, @url) + text = check_resolvability_message(@resolvable, @supported_formats, @status, url: @url) if @resolvable && @supported_formats.size > 1 icon = status_icons(ok: true) elsif @resolvable diff --git a/app/controllers/admin/categories_controller.rb b/app/controllers/admin/categories_controller.rb index ffe23c076b..f2c0d3ea00 100644 --- a/app/controllers/admin/categories_controller.rb +++ b/app/controllers/admin/categories_controller.rb @@ -15,7 +15,6 @@ def index def new @category = LinkedData::Client::Models::Category.new - respond_to do |format| format.html { render "new", :layout => false } end @@ -24,7 +23,7 @@ def new def edit @category = _category @acronyms = @category.ontologies.map { |url| url.match(/\/([^\/]+)$/)[1] } - @ontologies_category = LinkedData::Client::Models::Ontology.all(include: 'acronym').map {|o|[o.acronym, o.id] } + @ontologies_category = LinkedData::Client::Models::Ontology.all(include: 'name,acronym').map {|x| ["#{x.name} (#{x.acronym})", x.id.to_s]} respond_to do |format| format.html { render "edit", :layout => false } end diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index 3fdbd5ef35..d4ae613520 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -24,7 +24,7 @@ def new def edit @group = LinkedData::Client::Models::Group.find_by_acronym(params[:id]).first @acronyms = @group&.ontologies&.map { |url| url.match(/\/([^\/]+)$/)[1] } - @ontologies_group = LinkedData::Client::Models::Ontology.all(include: 'acronym').map {|o|[o.acronym, o.id] } + @ontologies_group = LinkedData::Client::Models::Ontology.all(include: 'name,acronym').map {|x| ["#{x.name} (#{x.acronym})", x.id.to_s]} respond_to do |format| format.html { render "edit", :layout => false } end diff --git a/app/controllers/agents_controller.rb b/app/controllers/agents_controller.rb index 651c02b102..c058eb130f 100644 --- a/app/controllers/agents_controller.rb +++ b/app/controllers/agents_controller.rb @@ -18,15 +18,15 @@ def show end def ajax_agents - filters = { name: params[:name] } - filters[:agentType] = params[:agent_type] if params[:agent_type] - @agents = LinkedData::Client::Models::Agent.all(filters) - agents_json = @agents.map do |x| + filters = { query: params[:query], qf: "identifiers_texts^20 acronym_text^15 name_text^10 email_text^10"} + @agents = LinkedData::Client::HTTP.get('/search/agents', filters) + agents_json = @agents.collection.map do |x| { - id: x.id, - name: x.name, - type: x.agentType, - identifiers: x.identifiers.map { |i| "#{i.schemaAgency}:#{i.notation}" }.join(', ') + id: x.resource_id, + name: x.name_text, + type: x.agentType_t, + identifiers: x.identifiers_texts&.join(', '), + acronym: x.acronym_text } end @@ -51,7 +51,8 @@ def create alert_id = agent_id_alert_container_id(params[:id], parent_id) deletable = params[:deletable]&.eql?('true') if new_agent.errors - render_turbo_stream alert_error(id: alert_id) { JSON.pretty_generate(response_errors(new_agent)) } + errors = generate_errors(response_errors(new_agent)) + render_turbo_stream alert_error(id: alert_id) { errors.join(', ') } else success_message = t('agents.add_agent') streams = [alert_success(id: alert_id) { success_message }] @@ -95,7 +96,8 @@ def update alert_id = agent_alert_container_id(agent, parent_id) deletable = params[:deletable]&.eql?('true') if response_error?(agent_update) - render_turbo_stream(alert_error(id: alert_id) { JSON.pretty_generate(response_errors(agent_update)) }) + errors = generate_errors(response_errors(agent_update).values.first) + render_turbo_stream alert_error(id: alert_id) { errors.join(', ') } else success_message = t('agents.update_agent') table_line_id = agent_table_line_id(agent_id(agent)) @@ -243,7 +245,7 @@ def update_agent_usages_action(agent, params) end values[attr.to_sym] = current_val.map { |x| x.id } else - values[attr.to_sym] = agent + values[attr.to_sym] = agent.id end end @@ -273,6 +275,17 @@ def agent_params v end end + p[:identifiers] = p[:identifiers].reject{ |key, value| value["notation"].empty? } + identifiers_schemaAgency = params[:agentType].eql?('person') ? 'ORCID' : 'ROR' + p[:identifiers]&.each_value do |identifier| + identifier[:schemaAgency] = identifiers_schemaAgency + if identifier[:schemaAgency].downcase.eql?('orcid') + identifier[:notation] = normalize_orcid(identifier[:notation]) + else + identifier[:notation] = normalize_ror(identifier[:notation]) + end + end + p[:identifiers] = (p[:identifiers] || {}).values p[:affiliations] = (p[:affiliations] || {}).values p[:affiliations].each do |affiliation| @@ -287,4 +300,63 @@ def find_agent_display_all(id = params[:id]) obj.id.to_s.eql?("#{rest_url}/Agents/#{id}") end.first end + + def normalize_orcid(orcid) + case orcid + when /\A\d{16}\z/ + # Case 1: 16 digits, add dashes + orcid = orcid.scan(/.{1,4}/).join('-') + + when /\A\d{4}-\d{4}-\d{4}-\d{4}\z/ + orcid = orcid + + when /\Ahttps:\/\/(www\.)?orcid\.org\/\d{4}-\d{4}-\d{4}-\d{4}\z/ + # Case 3: ORCID URL (with or without "www."), extract the numbers with dashes + orcid = orcid.split('/').last + + when /\Aorcid\.org\/\d{4}-\d{4}-\d{4}-\d{4}\z/ + # Case 4: ORCID without scheme (http/https) + orcid = orcid.split('/').last + + when /\Awww\.orcid\.org\/\d{4}-\d{4}-\d{4}-\d{4}\z/ + # Case 5: ORCID with "www." without scheme + orcid = orcid.split('/').last + end + + return orcid + end + + def normalize_ror(ror) + case ror + when /\A0\w{6}\d{2}\z/ + # Case 1: 9 characters, starting with '0', 6 alphanumeric, ending with 2 digits + ror = ror + + when /\Ahttps:\/\/ror\.org\/(0\w{6}\d{2})\z/ + # Case 2: Full URL with 'https://ror.org/', extract the ROR ID + ror = ror.split('/').last + + when /\Aror\.org\/(0\w{6}\d{2})\z/ + # Case 3: ROR without scheme (http/https), extract the ROR ID + ror = ror.split('/').last + end + + return ror + end + + def generate_errors(response_errors) + errors = [] + response_errors.values.each_with_index do |v, i| + if v[:existence] + errors << "#{response_errors.keys[i].capitalize} #{t('agents.errors.required')}" + elsif v[:unique_identifiers] + errors << t('agents.errors.used_identifier') + elsif v[:no_url] + errors << t('agents.errors.invalid_url') + else + errors << JSON.pretty_generate(response_errors) + end + end + return errors + end end diff --git a/app/controllers/ajax_proxy_controller.rb b/app/controllers/ajax_proxy_controller.rb deleted file mode 100644 index 37de212888..0000000000 --- a/app/controllers/ajax_proxy_controller.rb +++ /dev/null @@ -1,86 +0,0 @@ -require 'open-uri' -require 'net/http' -require 'uri' -require 'cgi' - -class AjaxProxyController < ApplicationController - - - def get - - page = open(params[:url]) - content = page.read - render :text => content - - end - - def jsonp - if params[:apikey].nil? || params[:apikey].empty? - render_json '{ "error": "Must supply apikey" }' - return - end - - if params[:path].nil? || params[:path].empty? - render_json '{ "error": "Must supply path" }' - return - end - - url = URI.parse($LEGACY_REST_URL + params[:path]) - url.port = $REST_PORT.to_i - full_path = (url.query.blank?) ? url.path : "#{url.path}?#{url.query}" - full_path = full_path.include?("?") ? full_path + "&apikey=#{params[:apikey]}&userapikey=#{params[:userapikey]}" : full_path + "?apikey=#{params[:apikey]}&userapikey=#{params[:userapikey]}" - http = Net::HTTP.new(url.host, url.port) - headers = { "Accept" => "application/json" } - res = http.get(full_path, headers) - response = res.code.to_i >= 400 ? { :status => res.code.to_i, :body => res.body }.to_json : res.body - render_json response, {:status => 200} - end - - def json_class - concept_not_found if params[:conceptid].nil? || params[:conceptid].empty? - params[:ontology] ||= params[:ontologyid] - - if params[:ontologyid].to_i > 0 - params_cleanup_new_api() - stop_words = ["controller", "action", "ontologyid"] - redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", :status => :moved_permanently - return - end - - @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first - ontology_not_found(params[:ontology]) if @ontology.nil? - - @concept = @ontology.explore.single_class({}, params[:conceptid]) - concept_not_found(params[:conceptid]) if @concept.nil? - - render_json @concept.to_json - end - - - def json_ontology - @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first - ontology_not_found(params[:ontology]) if @ontology.nil? - simple_ontology = simplify_ontology_model(@ontology) # application_controller (cached) - render_json simple_ontology.to_json - end - - - private - - def render_json(json, options={}) - callback, variable = params[:callback], params[:variable] - response = begin - if callback && variable - "var #{variable} = #{json};\n#{callback}(#{variable});" - elsif variable - "var #{variable} = #{json};" - elsif callback - "#{callback}(#{json});" - else - json - end - end - render({plain: response, content_type: "application/json"}.merge(options)) - end - -end diff --git a/app/controllers/annotator_controller.rb b/app/controllers/annotator_controller.rb index 6f1ec810b8..a1a4011d37 100644 --- a/app/controllers/annotator_controller.rb +++ b/app/controllers/annotator_controller.rb @@ -72,8 +72,23 @@ def annotator_results(uri) else @results_table_header.push(t('annotator.score')) end + + # if we are in a slice, pass the ontologies of this slice in the params + + if at_slice? + slice_ontologies_acronyms = @subdomain_filter[:ontologies].map{ |id| link_last_part(id)} + if api_params[:ontologies] + selected_ontolgies = api_params[:ontologies].split(',') + filtred_ontologies = selected_ontolgies.select{ |ontology| slice_ontologies_acronyms.include?(ontology) } + else + filtred_ontologies = slice_ontologies_acronyms + end + api_params[:ontologies] = filtred_ontologies.join(',') + end + annotations = LinkedData::Client::HTTP.get(uri, api_params) - @ontologies = get_simplified_ontologies_hash + @ontologies = LinkedData::Client::Models::Ontology.all({:include_views => true}).map{ |o| [o.id.to_s, o]}.to_h + @semantic_types = get_semantic_types @results = [] annotations.each do |annotation| @@ -161,14 +176,14 @@ def get_semantic_types end def annotation_class_info(cls) - return { + { text: cls.prefLabel, link: url_to_endpoint(cls.links["self"]) } end def annotation_ontology_info(ontology_url) - return { - text: @ontologies[ontology_url][:name], + { + text: @ontologies[ontology_url].name, link: url_to_endpoint(ontology_url) } end @@ -201,6 +216,7 @@ def empty_advanced_options params[:fast_context].nil? && params[:lemmatize].nil? end + def remove_special_chars(input) regex = /^[a-zA-Z0-9\s]*$/ diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 04215413c9..f75a395b75 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -22,7 +22,7 @@ def self.t(*args) end # Sets the locale based on the locale cookie or the value returned by detect_locale. - def set_locale + def set_locale I18n.locale = cookies[:locale] || detect_locale cookies.permanent[:locale] = I18n.locale if cookies[:locale].nil? logger.debug "* Locale set to '#{I18n.locale}'" @@ -30,7 +30,7 @@ def set_locale end # Returns detedted locale based on the Accept-Language header of the request or the default locale if none is found. - def detect_locale + def detect_locale languages = request.headers['Accept-Language']&.split(',') supported_languages = I18n.available_locales @@ -38,10 +38,10 @@ def detect_locale language_code = language.split(/[-;]/).first.downcase.to_sym return language_code if supported_languages.include?(language_code) end - - return I18n.default_locale + + return I18n.default_locale end - + helper :all # include all helpers, all the time helper_method :bp_config_json, :current_license, :using_captcha? @@ -53,15 +53,6 @@ def detect_locale # Pull configuration parameters for REST connection. REST_URI = $REST_URL API_KEY = $API_KEY - PROXY_URI = $PROXY_URL - REST_URI_BATCH = REST_URI + '/batch' - - # Rails.cache expiration - EXPIRY_RI_STATS = 60 * 60 * 24 # 24:00 hours - EXPIRY_RI_ONTOLOGIES = 60 * 60 * 24 # 24:00 hours - EXPIRY_SEMANTIC_TYPES = 60 * 60 * 24 # 24:00 hours - EXPIRY_RECENT_MAPPINGS = 60 * 60 # 1:00 hours - EXPIRY_ONTOLOGY_SIMPLIFIED = 60 * 1 # 0:01 minute $DATA_CATALOG_VALUES = {"fairsharing.org/" => "FAIRsharing", @@ -90,13 +81,12 @@ def detect_locale # See ActionController::RequestForgeryProtection for details protect_from_forgery - before_action :set_global_thread_values, :domain_ontology_set, :authorize_miniprofiler, :clean_empty_strings_from_params_arrays, :init_trial_license + before_action :set_global_thread_values, :domain_ontology_set, :clean_empty_strings_from_params_arrays, :init_trial_license def invalidate_cache? params[:invalidate_cache] && params[:invalidate_cache].to_s.eql?('true') end - def show_image_modal url = params[:url] render turbo_stream: helpers.prepend('application_modal_content') { helpers.image_tag(url, style:'width: 100%') } @@ -133,14 +123,13 @@ def domain_ontology_set @subdomain_filter[:active] = true @subdomain_filter[:name] = slice.name @subdomain_filter[:acronym] = slice.acronym + @subdomain_filter[:ontologies] = slice.ontologies end end Thread.current[:slice] = @subdomain_filter end - - def ontology_not_found(ontology_acronym) not_found(t('application.ontology_not_found',acronym: ontology_acronym)) end @@ -158,14 +147,6 @@ def not_found(message = '') raise ActiveRecord::RecordNotFound.new(message || t('application.not_found_message')) end - NOTIFICATION_TYPES = { :notes => "CREATE_NOTE_NOTIFICATION", :all => "ALL_NOTIFICATION" } - - def to_param(name) # Paramaterizes URLs without encoding - unless name.nil? - name.to_s.gsub(' ',"_") - end - end - def bp_config_json # For config settings, see # config/bioportal_config.rb @@ -191,37 +172,9 @@ def bp_config_json config.to_json end - def rest_url helpers.rest_url end - - def check_http_file(url) - session = Net::HTTP.new(url.host, url.port) - session.use_ssl = true if url.port == 443 - session.start do |http| - response_valid = http.head(url.request_uri).code.to_i < 400 - return response_valid - end - end - - def check_ftp_file(uri) - ftp = Net::FTP.new(uri.host, uri.user, uri.password) - ftp.login - begin - file_exists = ftp.size(uri.path) > 0 - rescue - # Check using another method - path = uri.path.split("/") - filename = path.pop - path = path.join("/") - ftp.chdir(path) - files = ftp.dir - # Dumb check, just see if the filename is somewhere in the list - files.each { |file| return true if file.include?(filename) } - end - file_exists - end def parse_response_body(response) return nil if response.nil? @@ -285,55 +238,6 @@ def redirect_to_home # Redirect to Home Page redirect_to "/" end - - def redirect_new_api(class_view = false) - # Hack to make ontologyid and conceptid work in addition to id and ontology params - params[:ontology] = params[:ontology].nil? ? params[:ontologyid] : params[:ontology] - # Error checking - if params[:ontology].nil? || params[:id] && params[:ontology].nil? - @error = t('application.provide_ontology_or_concept') - return - end - acronym = BpidResolver.id_to_acronym(params[:ontology]) - ontology_not_found(params[:ontology]) unless acronym - if class_view - @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(acronym).first - concept = get_class(params).first.to_s - redirect_to "/ontologies/#{acronym}?p=classes#{params_string_for_redirect(params, prefix: "&")}", :status => :moved_permanently - else - redirect_to "/ontologies/#{acronym}#{params_string_for_redirect(params)}", :status => :moved_permanently - end - end - - def params_cleanup_new_api - params = @_params - if params[:ontology] && params[:ontology].to_i > 0 - params[:ontology] = BpidResolver.id_to_acronym(params[:ontology]) - end - - params - end - - def params_string_for_redirect(params, options = {}) - prefix = options[:prefix] || "?" - stop_words = options[:stop_words] || ["ontology", "controller", "action", "id", "acronym"] - params_array = [] - params.each do |key,value| - next if stop_words.include?(key.to_s) || value.nil? || value.empty? - params_array << "#{key}=#{CGI.escape(value)}" - end - params_array.empty? ? "" : "#{prefix}#{params_array.join('&')}" - end - - # rack-mini-profiler authorization - def authorize_miniprofiler - if params[:enable_profiler] && params[:enable_profiler].eql?("true") && session[:user] && session[:user].admin? - Rack::MiniProfiler.authorize_request - else - Rack::MiniProfiler.deauthorize_request - end - end - # Verifies if user is logged in def authorize_and_redirect unless session[:user] @@ -341,7 +245,6 @@ def authorize_and_redirect end end - def authorize_admin admin = session[:user] && session[:user].admin? redirect_to_home unless admin @@ -356,7 +259,6 @@ def ontology_restricted?(acronym) restrict_downloads.include? acronym end - def check_delete_mapping_permission(mappings) # ensure mappings is an Array of mappings (some calls may provide only a single mapping instance) mappings = [mappings] if mappings.instance_of? LinkedData::Client::Models::Mapping @@ -465,7 +367,6 @@ def get_class(params) @concept end - def get_ontology_submission_ready(ontology) # Get the latest 'ready' submission submission = ontology.explore.latest_submission({:include_status => 'ready'}) @@ -474,121 +375,6 @@ def get_ontology_submission_ready(ontology) return submission end - def get_simplified_ontologies_hash() - # Note the simplify_ontology_model will cache individual ontology data. - simple_ontologies = {} - begin - ontology_models = LinkedData::Client::Models::Ontology.all({:include_views => true}) - ontology_models.each {|o| simple_ontologies[o.id] = simplify_ontology_model(o) } - rescue Exception => e - LOG.add :error, e.message - return nil - end - return simple_ontologies - end - - - - def simplify_classes(classes) - # Simplify the classes batch service data for the UI - # It takes a list of class objects (hashes or models) and the - # data structure returned is a hash of class hashes, which will - # contain details for the ontology they belong to. For example: - #{ - # "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#C12439" => { - # :id => "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#C12439", - # :ui => "http://ncbo-stg-app-12.stanford.edu/ontologies/NCIT?p=classes&conceptid=http%3A%2F%2Fncicb.nci.nih.gov%2Fxml%2Fowl%2FEVS%2FThesaurus.owl%23C12439", - # :uri => "http://stagedata.bioontology.org/ontologies/NCIT/classes/http%3A%2F%2Fncicb.nci.nih.gov%2Fxml%2Fowl%2FEVS%2FThesaurus.owl%23C12439", - # :prefLabel => "Brain", - # :ontology => { - # :id => "http://stagedata.bioontology.org/ontologies/NCIT", - # :uri => "http://stagedata.bioontology.org/ontologies/NCIT", - # :acronym => "NCIT", - # :name => "National Cancer Institute Thesaurus", - # :ui => "http://ncbo-stg-app-12.stanford.edu/ontologies/NCIT" - # }, - # }, - #} - @ontologies_hash ||= get_simplified_ontologies_hash - classes_hash = {} - classes.each do |cls| - c = simplify_class_model(cls) - c[:ontology] = @ontologies_hash[ c[:ontology] ] - classes_hash[c[:id]] = c - end - return classes_hash - end - - def simplify_class_model(cls_model) - # Simplify the class required required by the UI. - # No modification of the class ontology here, see simplify_classes. - # Default simple class model - cls = { :id => nil, :ontology => nil, :prefLabel => nil, :uri => nil, :ui => nil, :obsolete => false } - begin - if cls_model.instance_of? Hash - cls = { - :id => cls_model['@id'], - :ui => cls_model['links']['ui'], - :uri => cls_model['links']['self'], # different from id - :ontology => cls_model['links']['ontology'] - } - # Try to carry through a prefLabel and the obsolete attribute, if they exist. - cls[:prefLabel] = cls_model['prefLabel'] - cls[:obsolete] = cls_model['obsolete'] || false - else - # try to work with a struct object or a LinkedData::Client::Models::Class - # if not a struct, then: cls_model.instance_of? LinkedData::Client::Models::Class - cls = { - :id => cls_model.id, - :ui => cls_model.links['ui'], - :uri => cls_model.links['self'], # different from id - :ontology => cls_model.links['ontology'], - } - # Try to carry through a prefLabel and the obsolete attribute, if they exist. - cls[:prefLabel] = cls_model.prefLabel if cls_model.respond_to?('prefLabel') - cls[:obsolete] = cls_model.respond_to?('obsolete') && cls_model.obsolete || false - end - rescue Exception => e - LOG.add :error, e.message - LOG.add :error, t('application.error_simplify_class', cls: cls) - end - return cls - end - - def simplify_ontology_model(ont_model) - id = nil - if ont_model.instance_of? Hash - id = ont_model['@id'] - elsif ont_model.instance_of? LinkedData::Client::Models::Ontology - id = ont_model.id - end - ont = Rails.cache.read(id) - return ont unless ont.nil? - # No cache or it has expired - LOG.add :debug, t('application.no_cache', id: id) - ont = {} - ont[:id] = id - ont[:uri] = id - if ont_model.instance_of? Hash - ont[:acronym] = ont_model['acronym'] - ont[:name] = ont_model['name'] - ont[:ui] = ont_model['links']['ui'] - else - # try to work with a struct object or a LinkedData::Client::Models::Ontology - # if not a struct, then: ont_model.instance_of? LinkedData::Client::Models::Ontology - ont[:acronym] = ont_model.acronym - ont[:name] = ont_model.name - ont[:ui] = ont_model.links['ui'] - end - # Only cache a complete representation of a simplified ontology - if ont[:id].nil? || ont[:uri].nil? || ont[:acronym].nil? || ont[:name].nil? || ont[:ui].nil? - raise t('application.incomplete_simple_ontology', id: id, ont: ont) - else - Rails.cache.write(ont[:id], ont, expires_in: EXPIRY_ONTOLOGY_SIMPLIFIED) - end - return ont - end - def get_apikey() apikey = API_KEY if session[:user] @@ -597,72 +383,9 @@ def get_apikey() return apikey end - def parse_json(uri) - uri = URI.parse(uri) - begin - response = open(uri, "Authorization" => "apikey token=#{get_apikey}").read - rescue Exception => error - @retries ||= 0 - if @retries < 1 # retry once only - @retries += 1 - retry - else - raise error - end - end - JSON.parse(response) - end - - - def get_batch_results(params) - begin - response = RestClient.post REST_URI_BATCH, params.to_json, :content_type => :json, :accept => :json, :authorization => "apikey token=#{get_apikey}" - rescue Exception => error - @retries ||= 0 - if @retries < 1 # retry once only - @retries += 1 - retry - else - LOG.add :error, "\nERROR: batch POST, uri: #{REST_URI_BATCH}" - LOG.add :error, "\nERROR: batch POST, params: #{params.to_json}" - LOG.add :error, "\nERROR: batch POST, error response: #{error.response}" - raise error - end - end - response - end - - # Get the latest manual mappings - # All mapping classes are bidirectional. - # Each class in the list maps to all other classes in the list. - def get_recent_mappings - recent_mappings = { - :mappings => [], - :classes => {} - } - begin - recent_url = "#{REST_URI}/mappings/recent/" - cached_mappings_key = recent_url - cached_mappings = Rails.cache.read(cached_mappings_key) - return cached_mappings unless (cached_mappings.nil? || cached_mappings.empty?) - # No cache or it has expired - class_details = {} - mappings = LinkedData::Client::HTTP.get(recent_url, {size: 20, display: "prefLabel"}) - recent_mappings[:mappings] = mappings - unless mappings.nil? || mappings.empty? - # Only cache a successful retrieval - Rails.cache.write(cached_mappings_key, recent_mappings, expires_in: EXPIRY_RECENT_MAPPINGS) - end - rescue Exception => e - LOG.add :error, e.message - # leave recent mappings empty. - end - return recent_mappings - end - def total_mapping_count total_count = 0 - + begin stats = LinkedData::Client::HTTP.get("#{REST_URI}/mappings/statistics/ontologies") unless stats.blank? @@ -674,7 +397,7 @@ def total_mapping_count rescue LOG.add :error, e.message end - + return total_count end @@ -698,7 +421,7 @@ def init_trial_license $trial_license_initialized = true end end - + # Get the submission metadata from the REST API. def submission_metadata @metadata ||= helpers.submission_metadata diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb index 14f6979025..31b5db7786 100644 --- a/app/controllers/collections_controller.rb +++ b/app/controllers/collections_controller.rb @@ -6,8 +6,7 @@ def index acronym = params[:ontology] @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(acronym).first ontology_not_found(acronym) if @ontology.nil? - - + @submission = @ontology.explore.latest_submission(include:'uriRegexPattern,preferredNamespaceUri') collection_id = params[:collectionid] @collection = get_collection(@ontology, collection_id) if collection_id @@ -31,7 +30,8 @@ def index next_page_url: "/ontologies/#{@ontology.acronym}/collections", child_url: "/ontologies/#{@ontology.acronym}/collections/show", child_turbo_frame: 'collection', child_param: :collectionid, - results: results, next_page: next_page, total_count: total_count + results: results, next_page: next_page, + total_count: total_count ) end end @@ -53,6 +53,7 @@ def show_label def show_members @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology_id] || params[:ontology]).first + @submission = @ontology.explore.latest_submission(include:'uriRegexPattern,preferredNamespaceUri') @collection = get_request_collection page = params[:page] || '1' @auto_click = page.to_s.eql?('1') diff --git a/app/controllers/concepts_controller.rb b/app/controllers/concepts_controller.rb index 96a5fd0b70..196a61f97d 100644 --- a/app/controllers/concepts_controller.rb +++ b/app/controllers/concepts_controller.rb @@ -4,6 +4,7 @@ class ConceptsController < ApplicationController include MappingsHelper include ConceptsHelper include TurboHelper + include TermsReuses layout 'ontology' @@ -44,9 +45,7 @@ def index @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first @ob_instructions = helpers.ontolobridge_instructions_template(@ontology) - # Get the latest 'ready' submission, or fallback to any latest submission - # TODO: change the logic here if the fallback will crash the visualization - @submission = get_ontology_submission_ready(@ontology) # application_controller + @submission = @ontology.explore.latest_submission(include: 'all') @concept = @ontology.explore.single_class({full: true}, params[:id]) concept_not_found(params[:id]) if @concept.nil? @@ -57,7 +56,7 @@ def index render turbo_stream: [ replace(helpers.child_id(@concept) + '_open_link') { TreeLinkComponent.tree_close_icon }, replace(helpers.child_id(@concept) + '_childs') do - helpers.concepts_tree_component(@concept, @concept, @ontology.acronym, Array(@schemes), request_lang, sub_tree: true) + helpers.concepts_tree_component(@concept, @concept, @ontology.acronym, Array(@schemes), request_lang, sub_tree: true, submission: @submission) end ] end @@ -66,41 +65,24 @@ def show_label cls_id = params[:concept] || params[:id] # cls_id should be a full URI ont_id = params[:ontology] # ont_id could be a full URI or an acronym - if ont_id.to_i > 0 - params_cleanup_new_api() - stop_words = ["controller", "action"] - redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", :status => :moved_permanently - return - end - render LabelLinkComponent.inline(cls_id, helpers.main_language_label(concept_label(ont_id, cls_id))) end def show_definition - if params[:ontology].to_i > 0 - params_cleanup_new_api() - stop_words = ["controller", "action"] - redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", :status => :moved_permanently - return - end + @ontology = LinkedData::Client::Models::Ontology.find(params[:ontology]) cls = @ontology.explore.single_class(params[:concept]) render :text => cls.definition end def show_tree - if params[:ontology].to_i > 0 - params_cleanup_new_api() - stop_words = ["controller", "action"] - redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", :status => :moved_permanently - return - end @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first + @submission = @ontology.explore.latest_submission(include:'uriRegexPattern,preferredNamespaceUri') if @ontology.nil? || @ontology.errors ontology_not_found(params[:ontology]) else get_class(params) #application_controller - + not_found(t('concepts.missing_roots')) if @root.nil? render inline: helpers.concepts_tree_component(@root, @concept, @@ -114,6 +96,7 @@ def show_date_sorted_list if @ontology.nil? ontology_not_found(params[:ontology]) else + @submission = @ontology.explore.latest_submission(include: 'uriRegexPattern,preferredNamespaceUri') page = params[:page] @last_date = params[:last_date] auto_click = page.to_s.eql?('1') @@ -139,12 +122,6 @@ def show_date_sorted_list end def property_tree - if params[:ontology].to_i > 0 - params_cleanup_new_api() - stop_words = ["controller", "action"] - redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", :status => :moved_permanently - return - end @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first ontology_not_found(params[:ontology]) if @ontology.nil? @root = @ontology.property_tree @@ -153,15 +130,7 @@ def property_tree # Renders a details pane for a given ontology/concept def details - concept_not_found('') if params[:conceptid].nil? || params[:conceptid].empty? - - if params[:ontology].to_i > 0 - orig_id = params[:ontology] - params_cleanup_new_api() - options = {stop_words: ["controller", "action", "id"]} - redirect_to "#{request.path.sub(orig_id, params[:ontology])}#{params_string_for_redirect(params, options)}", :status => :moved_permanently - return - end + concept_not_found(params[:conceptid]) if params[:conceptid].blank? @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first ontology_not_found(params[:ontology]) if @ontology.nil? @@ -169,12 +138,8 @@ def details @concept = @ontology.explore.single_class({full: true}, CGI.unescape(params[:conceptid])) concept_not_found(CGI.unescape(params[:conceptid])) if @concept.nil? || @concept.errors @container_id = params[:modal] ? 'application_modal_content' : 'concept_details' - - if params[:styled].eql?("true") - render :partial => "details", :layout => "partial" - else - render :partial => "details" - end + + render :partial => "details" end diff --git a/app/controllers/concerns/ontology_updater.rb b/app/controllers/concerns/ontology_updater.rb index 71672178cc..e0e9585d59 100644 --- a/app/controllers/concerns/ontology_updater.rb +++ b/app/controllers/concerns/ontology_updater.rb @@ -47,7 +47,8 @@ def show_new_errors(object, redirection = 'ontologies/new') @selected_attributes = (Array(errors_attributes) + Array(params[:submission]&.keys)).uniq @ontology = ontology_from_params if @ontology.nil? - @submission = submission_from_params(params[:submission]) if params[:submission] && @submission.nil? + @submission = submission_from_params(params[:submission]) if params[:submission] && (@submission.nil? || @submission.errors) + reset_agent_attributes if redirection.is_a?(Hash) && redirection[:id] render_turbo_stream replace(redirection[:id], partial: redirection[:partial]) @@ -86,7 +87,10 @@ def update_submission_hash(acronym) def reset_agent_attributes helpers.agent_attributes.each do |attr| current_val = @submission[attr] - new_values = Array(current_val).map { |x| LinkedData::Client::Models::Agent.find(x.split('/').last) } + new_values = Array(current_val).map do |x| + next x if x.is_a?(LinkedData::Client::Models::Agent) + LinkedData::Client::Models::Agent.find(x.split('/').last) + end new_values = new_values.first unless current_val.is_a?(Array) diff --git a/app/controllers/concerns/search_aggregator.rb b/app/controllers/concerns/search_aggregator.rb index c18e70ce45..d50d369a8f 100644 --- a/app/controllers/concerns/search_aggregator.rb +++ b/app/controllers/concerns/search_aggregator.rb @@ -1,5 +1,5 @@ module SearchAggregator - include UrlsHelper + include UrlsHelper, MultiLanguagesHelper extend ActiveSupport::Concern BLACKLIST_FIX_STR = [ "https://", @@ -50,33 +50,35 @@ def format_search_result(result, ontologies) private + def search_concept_label(label) + label = language_hash(label) + + if label.is_a?(Hash) + label = label.values.flatten + label = label.select do |pref_lab| + pref_lab.downcase.include?(@search_query.downcase) || @search_query.downcase.include?(pref_lab.downcase) + end.first || label.first + end + + label + end def search_result_elem(class_object, ontology_acronym, title) - label = concept_label(class_object.prefLabel) + + label = search_concept_label(class_object.prefLabel) + { uri: class_object.id.to_s, - title: title.empty? ? label : "#{label} - #{title}", + title: title.nil? || title.empty? ? "#{label} - #{ontology_acronym}" : "#{label} - #{title}", ontology_acronym: ontology_acronym, link: "/ontologies/#{ontology_acronym}?p=classes&conceptid=#{escape(class_object.id)}#{helpers.request_lang&.eql?("ALL") ? '' : "&language="+helpers.request_lang.to_s}", - definition: Array(class_object.definition) + definition: class_object.definition } end - def concept_label(pref_labels_list, obsolete = false, max_length = 60) - # select closest to query - selected = pref_labels_list.select do |pref_lab| - pref_lab.downcase.include?(@search_query.downcase) || @search_query.downcase.include?(pref_lab.downcase) - end.first - - selected ||= (pref_labels_list&.first || '') - - selected = selected[0..max_length] if selected.size > max_length - selected = "#{selected}".html_safe if obsolete - selected - end def ontology_name_acronym(ontologies, selected_acronym) ontology = ontologies.select { |x| x.acronym.eql?(selected_acronym.split('/').last) }.first - "#{ontology.name} (#{ontology.acronym})" + "#{ontology.name} (#{ontology.acronym})" if ontology end def aggregate_by_ontology(results) diff --git a/app/controllers/concerns/submission_filter.rb b/app/controllers/concerns/submission_filter.rb index 44d4f6e52f..45746e36e2 100644 --- a/app/controllers/concerns/submission_filter.rb +++ b/app/controllers/concerns/submission_filter.rb @@ -61,8 +61,8 @@ def submissions_paginate_filter(params) [@page.collection, @page.totalCount, count, filter_params] end - def ontologies_filter_url(filters, page: 1, count: false) - helpers.ontologies_filter_url(filters, page: page, count: count) + def ontologies_with_filters_url(filters, page: 1, count: false) + helpers.ontologies_with_filters_url(filters, page: page, count: count) end private diff --git a/app/controllers/concerns/terms_reuses.rb b/app/controllers/concerns/terms_reuses.rb new file mode 100644 index 0000000000..82eef51c9d --- /dev/null +++ b/app/controllers/concerns/terms_reuses.rb @@ -0,0 +1,15 @@ +module TermsReuses + extend ActiveSupport::Concern + + def concept_reused?(submission: nil, concept_id: nil) + uri_regex_pattern?(submission, concept_id) || preffered_namespace_uri?(submission, concept_id) + end + + private + def uri_regex_pattern?(submission, concept_id) + !(concept_id =~ Regexp.new(submission&.uriRegexPattern || '')) + end + def preffered_namespace_uri?(submission, concept_id) + !(concept_id.include?(submission&.preferredNamespaceUri || '')) + end +end diff --git a/app/controllers/concerns/uri_redirection.rb b/app/controllers/concerns/uri_redirection.rb index 9ef86fcd4d..f250e5c720 100644 --- a/app/controllers/concerns/uri_redirection.rb +++ b/app/controllers/concerns/uri_redirection.rb @@ -21,11 +21,29 @@ def redirect_to_file? end def redirect_to_file - # when dont have the specified format in the accept header - return not_acceptable("Invalid requested format, valid format are: JSON, XML, HTML and CSV\nto download the original file you can get it from: #{rest_url}/ontologies/#{params[:id]}/download\n") if accept_header.nil? + # check for hasOntologySyntax field for turtle format + ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:id]).first + ontology_syntax = ontology.explore.latest_submission(include: 'hasOntologySyntax').hasOntologySyntax + return not_acceptable("Invalid requested format, valid format are: HTML, JSON, XML, CSV.\nNTriples and Turtle format is available for some resources\nYou can download the original file you can get it from: #{rest_url}/ontologies/#{params[:id]}/download\n") if accept_header.nil? || (ontology_syntax != "http://www.w3.org/ns/formats/Turtle" && accept_header== "text/turtle") || (ontology_syntax != "http://www.w3.org/ns/formats/N-Triples" && accept_header== "application/ntriples") + # when the format is different than text/html - redirect_to_download_file if (accept_header != "text/html" && params[:p].nil?) + download_ontology(acronym: params[:id], format: accept_header) if (accept_header != "text/html" && params[:p].nil?) + end + + def download_ontology(params) + redirect_url = "#{rest_url}/ontologies/#{params[:acronym]}" + download_url = "#{redirect_url}/download?apikey=#{get_apikey}" + case params[:format] + when 'text/csv', 'csv' + fetch_and_forward_data("#{download_url}&download_format=csv") + when 'text/xml', 'text/rdf+xml', 'application/rdf+xml', 'application/xml', 'xml' + fetch_and_forward_data("#{download_url}&download_format=rdf") + when 'application/json', 'application/ld+json', 'application/*', 'json' + fetch_and_forward_data("#{redirect_url}?apikey=#{get_apikey}") + else + fetch_and_forward_data(download_url) + end end private @@ -56,8 +74,10 @@ def not_acceptable(message = nil) render plain: message, status: 406 end - def redirect_to_download_file - redirect_to("/ontologies/#{params[:id]}/download?format=#{helpers.escape(accept_header)}", allow_other_host: true) + def fetch_and_forward_data(url) + uri = URI.parse(url) + response = Net::HTTP.get_response(uri) + send_data response.body, type: response.content_type, status: response.code.to_i end @@ -86,8 +106,12 @@ def find_content_type_for_media_range(media_range) 'application/ld+json' when 'text/xml', 'text/rdf+xml', 'application/rdf+xml', 'application/xml' 'application/rdf+xml' + when 'application/ntriples', 'application/n-triples' + 'application/ntriples' when 'text/csv' 'text/csv' + when 'text/turtle' + 'text/turtle' else nil end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 87f9e6e2c3..3f75bdd3f6 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -7,13 +7,20 @@ class HomeController < ApplicationController include FairScoreHelper def index - @analytics = helpers.ontologies_analytics + @analytics = helpers.ontologies_analytics # Calculate BioPortal summary statistics - @ont_count = @analytics.keys.size + + @ont_count = if @analytics.empty? + LinkedData::Client::Models::Ontology.all.size + else + @analytics.keys.size + end + metrics = LinkedData::Client::Models::Metrics.all metrics = metrics.each_with_object(Hash.new(0)) do |h, sum| h.to_hash.slice(:classes, :properties, :individuals).each { |k, v| sum[k] += v } end + @slices = LinkedData::Client::Models::Slice.all @cls_count = metrics[:classes] @individuals_count = metrics[:individuals] @@ -39,6 +46,11 @@ def index end + def set_cookies + cookies.permanent[:cookies_accepted] = params[:cookies] if params[:cookies] + render 'cookies', layout: nil + end + def tools @tools = { search: { @@ -135,32 +147,11 @@ def site_config render json: bp_config_json end - def account - @title = t('home.account_title') - if session[:user].nil? - redirect_to controller: 'login', action: 'index', redirect: '/account' - return - end - - @user = LinkedData::Client::Models::User.get(session[:user].id, include: 'all') - - @user_ontologies = @user.customOntology - @user_ontologies ||= [] - - onts = LinkedData::Client::Models::Ontology.all(include_views: true); - @admin_ontologies = onts.select { |o| o.administeredBy.include? @user.id } - - projects = LinkedData::Client::Models::Project.all - @user_projects = projects.select { |p| p.creator.include? @user.id } - - render 'users/show' - end - def feedback_complete; end def annotator_recommender_form if params[:submit_button] == "annotator" - redirect_to "/annotator?text=#{helpers.escape(params[:text])}" + redirect_to "/annotator?text=#{helpers.escape(params[:input])}" elsif params[:submit_button] == "recommender" redirect_to "/recommender?input=#{helpers.escape(params[:input])}" end diff --git a/app/controllers/instances_controller.rb b/app/controllers/instances_controller.rb index a980ccc614..70db773446 100644 --- a/app/controllers/instances_controller.rb +++ b/app/controllers/instances_controller.rb @@ -1,5 +1,5 @@ class InstancesController < ApplicationController - include InstancesHelper, SearchContent + include InstancesHelper, SearchContent, TermsReuses def index if params[:type].blank? @@ -10,7 +10,7 @@ def index end get_ontology(params) - + @submission = @ontology.explore.latest_submission(include:'uriRegexPattern,preferredNamespaceUri') query, page, page_size = helpers.search_content_params results, _, next_page, total_count = search_ontologies_content(query: query, @@ -25,7 +25,7 @@ def index child_turbo_frame: 'instance_show', child_param: :instanceid, show_count: is_concept_instance, - auto_click: params[:instanceid].blank? && page.eql?(1), + auto_click: false, results: results, next_page: next_page, total_count: total_count) if is_concept_instance && page.eql?(1) @@ -50,4 +50,4 @@ def get_ontology(params) @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology] || params[:acronym] || params[:ontology_id]).first ontology_not_found(params[:ontology]) if @ontology.nil? end -end \ No newline at end of file +end diff --git a/app/controllers/mappings_controller.rb b/app/controllers/mappings_controller.rb index e6c9fabd4b..b1bcfc8c32 100644 --- a/app/controllers/mappings_controller.rb +++ b/app/controllers/mappings_controller.rb @@ -40,6 +40,7 @@ def index end @options[select_text] = ontology_acronym end + @options = @options.sort @options.unshift([]) diff --git a/app/controllers/notes_controller.rb b/app/controllers/notes_controller.rb index e088363927..04cca1e7a1 100644 --- a/app/controllers/notes_controller.rb +++ b/app/controllers/notes_controller.rb @@ -160,11 +160,6 @@ def archive end end - def show_concept_list - params[:p] = "classes" - params[:t] = "notes" - redirect_new_api - end private diff --git a/app/controllers/ontologies_controller.rb b/app/controllers/ontologies_controller.rb index caec35f99e..a8c744fe4a 100644 --- a/app/controllers/ontologies_controller.rb +++ b/app/controllers/ontologies_controller.rb @@ -14,6 +14,7 @@ class OntologiesController < ApplicationController include SubmissionFilter include OntologyContentSerializer include UriRedirection + include PropertiesHelper require 'multi_json' require 'cgi' @@ -97,11 +98,12 @@ def classes def properties @acronym = @ontology.acronym @properties = LinkedData::Client::HTTP.get("/ontologies/#{@acronym}/properties/roots", { lang: request_lang }) + @property = get_property(params[:propertyid] || @properties.first.id, @acronym, include: 'all') unless @property || @properties.empty? if request.xhr? - return render 'ontologies/sections/properties', layout: false + render 'ontologies/sections/properties', layout: false else - return render 'ontologies/sections/properties', layout: 'ontology_viewer' + render 'ontologies/sections/properties', layout: 'ontology_viewer' end end @@ -152,6 +154,8 @@ def new @ontology.viewOf = params.dig(:ontology, :viewOf) @submission = LinkedData::Client::Models::OntologySubmission.new @submission.hasOntologyLanguage = 'OWL' + @submission.released = Date.today.to_s + @submission.status = 'production' @ontologies = LinkedData::Client::Models::Ontology.all(include: 'acronym', include_views: true, display_links: false, display_context: false) @categories = LinkedData::Client::Models::Category.all @groups = LinkedData::Client::Models::Group.all @@ -174,6 +178,8 @@ def notes def instances + params[:instanceid] = params[:instanceid] || search_first_instance_id + if params[:instanceid] @instance = helpers.get_instance_details_json(@ontology.acronym, params[:instanceid], {include: 'all'}) end @@ -232,22 +238,21 @@ def show else params[:conceptid] = params.delete(:purl_conceptid) end - redirect_to "/ontologies/#{params[:acronym]}?p=classes#{params_string_for_redirect(params, prefix: "&")}", status: :moved_permanently + redirect_to "/ontologies/#{params[:acronym]}?p=classes&conceptid=#{params[:conceptid]}", status: :moved_permanently return end - if params[:ontology].to_i > 0 - acronym = BPIDResolver.id_to_acronym(params[:ontology]) - if acronym - redirect_new_api + @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first + + if @ontology.nil? || @ontology.errors + if ontology_access_denied? + redirect_to "/login?redirect=/ontologies/#{params[:ontology]}", alert: t('login.private_ontology') return + else + ontology_not_found(params[:ontology]) end end - # Note: find_by_acronym includes ontology views - @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first - ontology_not_found(params[:ontology]) if @ontology.nil? || @ontology.errors - # Handle the case where an ontology is converted to summary only. # See: https://github.com/ncbo/bioportal_web_ui/issues/133. data_pages = KNOWN_PAGES - %w[summary notes] @@ -279,9 +284,6 @@ def show # This action is now a router using the 'p' parameter as the page to show case params[:p] - when 'terms' - params[:p] = 'classes' - redirect_to "/ontologies/#{params[:ontology]}#{params_string_for_redirect(params)}", status: :moved_permanently when 'classes' self.classes # rescue self.summary when 'mappings' @@ -328,13 +330,15 @@ def summary @views = get_views(@ontology) @view_decorators = @views.map { |view| ViewDecorator.new(view, view_context) } @ontology_relations_data = ontology_relations_data - - category_attributes = submission_metadata.group_by { |x| x['category'] }.transform_values { |x| x.map { |attr| attr['attribute'] } } @relations_array_display = @relations_array.map do |relation| attr = relation.split(':').last ["#{helpers.attr_label(attr, attr_metadata: helpers.attr_metadata(attr), show_tooltip: false)}(#{relation})", relation] end + @relations_array_display.unshift(['View of (bpm:viewOf)', 'bpm:viewOf']) + + category_attributes = submission_metadata.group_by { |x| x['category'] }.transform_values { |x| x.map { |attr| attr['attribute'] } } + @config_properties = properties_hash_values(category_attributes["object description properties"]) @methodology_properties = properties_hash_values(category_attributes["methodology"]) @agents_properties = properties_hash_values(category_attributes["persons and organizations"]) @@ -344,7 +348,7 @@ def summary @community_properties = properties_hash_values(category_attributes["community"] + [:notes]) @identifiers = properties_hash_values([:URI, :versionIRI, :identifier]) @identifiers["ontology_portal_uri"] = ["#{$UI_URL}/ontologies/#{@ontology.acronym}", "#{portal_name} URI"] - @projects_properties = properties_hash_values(category_attributes["usage"]) + @projects_properties = properties_hash_values(category_attributes["usage"] - ["hasDomain"]) @ontology_icon_links = [%w[summary/download dataDump], %w[summary/homepage homepage], %w[summary/documentation documentation], @@ -370,7 +374,7 @@ def subscriptions ontology_acronym = ontology_id.split('/').last if session[:user].nil? - link = "/login?redirect=#{request.url}" + link = "/login?redirect=/ontologies/#{ontology_acronym}" subscribed = false user_id = nil else @@ -379,21 +383,12 @@ def subscriptions link = "javascript:void(0);" user_id = user.id end - count = helpers.count_subscriptions(params[:ontology_id]) render inline: helpers.turbo_frame_tag('subscribe_button') { render_to_string(OntologySubscribeButtonComponent.new(id: '', ontology_id: ontology_id, subscribed: subscribed, user_id: user_id, count: count, link: link), layout: nil) } end - def virtual - redirect_new_api - end - - def visualize - redirect_new_api(true) - end - def widgets if request.xhr? render partial: 'ontologies/sections/widgets', layout: false @@ -503,7 +498,7 @@ def get_views(ontology) def ontology_relations_data(sub = @submission_latest) ontology_relations_array = [] - @relations_array = ["omv:useImports", "door:isAlignedTo", "door:ontologyRelatedTo", "omv:isBackwardCompatibleWith", "omv:isIncompatibleWith", "door:comesFromTheSameDomain", "door:similarTo", + @relations_array = ["bpm:viewOf", "omv:useImports", "door:isAlignedTo", "door:ontologyRelatedTo", "omv:isBackwardCompatibleWith", "omv:isIncompatibleWith", "door:comesFromTheSameDomain", "door:similarTo", "door:explanationEvolution", "voaf:generalizes", "door:hasDisparateModelling", "dct:hasPart", "voaf:usedBy", "schema:workTranslation", "schema:translationOfWork"] return if sub.nil? @@ -538,6 +533,11 @@ def ontology_relations_data(sub = @submission_latest) end end + if ont.viewOf + target_ont = LinkedData::Client::Models::Ontology.find(ont.viewOf) + ontology_relations_array.push({ source: ont.acronym, target: target_ont.acronym, relation: "bpm:viewOf", targetInPortal: true }) + end + ontology_relations_array end @@ -557,5 +557,15 @@ def determine_layout end end + def search_first_instance_id + query, page, page_size = helpers.search_content_params + results, _, _, _ = search_ontologies_content(query: query, + page: page, + page_size: page_size, + filter_by_ontologies: [@ontology.acronym], + filter_by_types: ["NamedIndividual"]) + results.shift # Remove the ontology entry + return !results.blank? ? results.first[:name] : nil + end end diff --git a/app/controllers/ontologies_redirection_controller.rb b/app/controllers/ontologies_redirection_controller.rb index 43269e7884..582817a908 100644 --- a/app/controllers/ontologies_redirection_controller.rb +++ b/app/controllers/ontologies_redirection_controller.rb @@ -30,64 +30,76 @@ def redirect # GET /ontologies/:acronym/htaccess def generate_htaccess ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:acronym]).first - ontology_uri = ontology.explore.latest_submission(include: 'URI').URI + subminssions_params = ontology.explore.latest_submission(include: 'URI,preferredNamespaceUri') + ontology_uri = subminssions_params.URI + preferred_name_space_uri = subminssions_params.preferredNamespaceUri ontology_portal_url = "#{$UI_URL}/ontologies/#{params[:acronym]}" - @htaccess_content = generate_htaccess_content(ontology_portal_url, ontology_uri) - @nginx_content = generate_nginx_content(ontology_portal_url, ontology_uri) + @htaccess_content = generate_htaccess_content(ontology_portal_url, ontology_uri, preferred_name_space_uri) + @nginx_content = generate_nginx_content(ontology_portal_url, ontology_uri, preferred_name_space_uri) render 'ontologies/htaccess', layout: nil end - + # GET /ontologies/ACRONYM/download?format=FORMAT def redirect_ontology - redirect_url = "#{rest_url}/ontologies/#{params[:acronym]}" - download_url = "#{redirect_url}/download?apikey=#{get_apikey}" - case params[:format] - when 'text/csv', 'csv' - redirect_to("#{download_url}&download_format=csv", allow_other_host: true) - when 'text/xml', 'text/rdf+xml', 'application/rdf+xml', 'application/xml', 'xml' - redirect_to("#{download_url}&download_format=rdf", allow_other_host: true) - when 'application/json', 'application/ld+json', 'application/*', 'json' - # redirect to the api - redirect_to("#{redirect_url}?apikey=#{get_apikey}", allow_other_host: true) - else - # redirect to download the original file - redirect_to("#{download_url}", allow_other_host: true) - end + download_ontology(params) end private - def generate_htaccess_content(ontology_portal_url, ontology_uri) - ontology_rule = nil - if ontology_uri - ontology_uri += '/' unless ontology_uri.end_with?('/') - ontology_rule = "RewriteRule ^#{URI.parse(ontology_uri).path[1..-1]}?$ #{ontology_portal_url} [R=301,L]" - end - + def generate_htaccess_content(ontology_portal_url, ontology_uri, preferred_name_space_uri) + preferred_name_space_path = get_path(preferred_name_space_uri) + ontology_uri_path = get_path(ontology_uri) + + rewrite_condition = if preferred_name_space_path + "RewriteCond %{REQUEST_URI} ^.*#{preferred_name_space_path}.*$" + elsif ontology_uri_path + "RewriteCond %{REQUEST_URI} ^.*#{ontology_uri_path}.*$" + end + + ontology_rule = if ontology_uri_path + ontology_uri_path += '/' unless ontology_uri_path.end_with?('/') + "RewriteRule ^#{ontology_uri_path}?$ #{ontology_portal_url} [R=301,L]" + end + <<-HTACCESS.strip_heredoc - RewriteEngine On - #{ontology_rule if ontology_rule} - RewriteRule ^.*/([^/#]+)$ #{ontology_portal_url}/$1 [R=301,L] + RewriteEngine On + #{ontology_rule if ontology_rule} + #{rewrite_condition if rewrite_condition} + RewriteRule ^.*/([^/#]+)/?$ #{ontology_portal_url}/$1 [R=301,L] HTACCESS end - def generate_nginx_content(ontology_portal_url, ontology_uri) - ontology_rule = nil - if ontology_uri - ontology_uri += '/' unless ontology_uri.end_with?('/') - ontology_rule = "rewrite ^#{URI.parse(ontology_uri).path[1..-1]}?$ #{ontology_portal_url} permanent" - end + def generate_nginx_content(ontology_portal_url, ontology_uri, preferred_name_space_uri) + preferred_name_space_path = get_path(preferred_name_space_uri) + ontology_uri_path = get_path(ontology_uri) + + rewrite_condition = preferred_name_space_path || ontology_uri_path + + ontology_rule = if ontology_uri_path + ontology_uri_path += '/' unless ontology_uri_path.end_with?('/') + ontology_rule = "rewrite ^/#{ontology_uri_path}?$ #{ontology_portal_url} permanent;" + end <<-NGINX.strip_heredoc location / { #{ontology_rule if ontology_rule} - if ($request_uri ~ ^.*/([^/]+)$){ - return 301 #{ontology_portal_url}/$1; + if ($request_uri ~* #{rewrite_condition} ){ + rewrite ^.*/([^/]+)/?$ #{ontology_portal_url}/$1 permanent; } } NGINX end + + def get_path(uri) + begin + parsed_uri = URI.parse(uri) + parsed_uri.path[1..-1] + rescue URI::InvalidURIError + nil + end + end + end \ No newline at end of file diff --git a/app/controllers/properties_controller.rb b/app/controllers/properties_controller.rb index 0ff2a31678..7679a7889f 100644 --- a/app/controllers/properties_controller.rb +++ b/app/controllers/properties_controller.rb @@ -1,9 +1,11 @@ class PropertiesController < ApplicationController - include TurboHelper, SearchContent + include TurboHelper, SearchContent, TermsReuses, PropertiesHelper def index acronym = params[:ontology] @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(acronym).first + @submission = @ontology.explore.latest_submission(include:'uriRegexPattern,preferredNamespaceUri') + ontology_not_found(acronym) if @ontology.nil? if params[:search].blank? @@ -44,19 +46,20 @@ def show_children @property = get_property(id, acronym) @property.children = property_children(id, acronym) + @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(acronym).first + @submission = @ontology.explore.latest_submission({include: 'uriRegexPattern,preferredNamespaceUri'}) + + render turbo_stream: [ replace(helpers.child_id(@property) + '_open_link') { TreeLinkComponent.tree_close_icon }, replace(helpers.child_id(@property) + '_childs') do - helpers.property_tree_component(@property, @property, acronym, request_lang, sub_tree: true) + helpers.property_tree_component(@property, @property, acronym, request_lang, sub_tree: true, submission: @submission) end ] end private - def get_property(id, acronym = params[:acronym], lang = request_lang, include: nil) - LinkedData::Client::HTTP.get("/ontologies/#{acronym}/properties/#{helpers.encode_param(id)}", { lang: lang , include: include}) - end def property_tree(id, acronym = params[:acronym], lang = request_lang) LinkedData::Client::HTTP.get("/ontologies/#{acronym}/properties/#{helpers.encode_param(id)}/tree", { lang: lang }) @@ -85,7 +88,6 @@ def index_tree(container_id) @property ||= @root.children.first end - render inline: helpers.property_tree_component(@root, @property, @ontology.acronym, request_lang, id: container_id, auto_click: true) diff --git a/app/controllers/schemes_controller.rb b/app/controllers/schemes_controller.rb index bea96a89d4..7fbbcc973e 100644 --- a/app/controllers/schemes_controller.rb +++ b/app/controllers/schemes_controller.rb @@ -6,9 +6,9 @@ def index acronym = params[:ontology] @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(acronym).first ontology_not_found(acronym) if @ontology.nil? + @submission_latest = @submission = @ontology.explore.latest_submission(include: 'all') if params[:search].blank? - @submission_latest = @ontology.explore.latest_submission(include: 'all', invalidate_cache: invalidate_cache?) rescue @ontology.explore.latest_submission(include: '') @schemes = get_schemes(@ontology) render partial: 'schemes/tree_view' @@ -26,8 +26,8 @@ def index next_page_url: "/ontologies/#{@ontology.acronym}/schemes", child_url: "/ontologies/#{@ontology.acronym}/schemes/show", child_turbo_frame: 'scheme', child_param: :schemeid, - results: results, next_page: next_page, total_count: total_count - ) + results: results, next_page: next_page, total_count: total_count) + end end diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index eeb510ca33..841f0f948a 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -47,11 +47,12 @@ def json_search # record_type = format_record_type(result[:recordType], result[:obsolete]) record_type = "" - target_value = result.prefLabel.select{|x| x.include?( params[:q].delete('*'))}.first || result.prefLabel.first + label = search_concept_label(result.prefLabel) + target_value = label case params[:target] when "name" - target_value = result.prefLabel + target_value = label when "shortid" target_value = result.id when "uri" @@ -132,9 +133,6 @@ def check_params_ontologies(params) else params[:ontologies] = [params[:ontologies]] end - if params[:ontologies].first.to_i > 0 - params[:ontologies].map! {|o| BpidResolver.id_to_acronym(o)} - end params[:ontologies] = params[:ontologies].join(",") end end diff --git a/app/controllers/taxonomy_controller.rb b/app/controllers/taxonomy_controller.rb new file mode 100644 index 0000000000..06832abe8b --- /dev/null +++ b/app/controllers/taxonomy_controller.rb @@ -0,0 +1,46 @@ +class TaxonomyController < ApplicationController + + layout :determine_layout + + def index + initialize_taxonomy + @category_section_active = request.path.eql?('/categories') + end + + private + + def initialize_taxonomy + @groups = LinkedData::Client::Models::Group.all + slices = LinkedData::Client::Models::Slice.all + slices_acronyms = slices.map { |slice| slice.acronym.downcase } + @groups.each do |group| + if slices_acronyms.include?(group.acronym.downcase) + group[:is_slice] = true + end + end + @categories = LinkedData::Client::Models::Category.all(display: 'name,acronym,description,ontologies,parentCategory') + @categories = nest_categories_children(@categories) + ontologies = LinkedData::Client::Models::Ontology.all + @ontologies_names = {} + ontologies.each do |o| + @ontologies_names[o.id] = o.name + end + end + + def nest_categories_children(categories) + category_index = {} + categories.each do |category| + category_index[category[:id]] = category + end + categories.each do |category| + if category.parentCategory + parent = category_index[category.parentCategory] + parent[:children] ||= [] + parent[:children] << category + end + end + categories.reject! { |category| category.parentCategory } + categories + end + +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index da3a017535..a3749d4631 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -23,19 +23,23 @@ def index # GET /users/1 # GET /users/1.xml def show + @title = t('home.account_title') + if session[:user].nil? + redirect_to controller: 'login', action: 'index', redirect: '/account' + return + end @user = if session[:user].admin? && params.has_key?(:id) find_user(params[:id]) else find_user(session[:user].id) end - - @all_ontologies = LinkedData::Client::Models::Ontology.all(ignore_custom_ontologies: true) + @ontologies = LinkedData::Client::Models::Ontology.all(ignore_custom_ontologies: true); + @all_ontologies_for_select = @ontologies.map {|x| ["#{x.name} (#{x.acronym})", x.acronym]} @user_ontologies = @user.customOntology + @user_ontologies ||= [] - ## Copied from home controller , account action - onts = LinkedData::Client::Models::Ontology.all; - @admin_ontologies = onts.select {|o| o.administeredBy.include? @user.id } + @admin_ontologies = @ontologies.select {|o| o.administeredBy.include? @user.id } projects = LinkedData::Client::Models::Project.all; @user_projects = projects.select {|p| p.creator.include? @user.id } @@ -148,18 +152,15 @@ def destroy def custom_ontologies @user = find_user + custom_ontologies = params[:ontologies] || [] - custom_ontologies = params[:ontology] ? params[:ontology][:ontologyId] : [] - custom_ontologies.reject!(&:blank?) @user.update_from_params(customOntology: custom_ontologies) error_response = !@user.update - if error_response flash[:notice] = t('users.error_saving_custom_ontologies') else - updated_user = LinkedData::Client::Models::User.find(@user.id) - session[:user].update_from_params(customOntology: updated_user.customOntology) - flash[:notice] = if updated_user.customOntology.empty? + session[:user].update_from_params(customOntology: @user.customOntology) + flash[:notice] = if @user.customOntology.empty? t('users.custom_ontologies_cleared') else t('users.custom_ontologies_saved') @@ -168,7 +169,7 @@ def custom_ontologies redirect_to user_path(@user.username) end - + def subscribe @user = find_user deliver "subscribe", SubscribeMailer.register_for_announce_list(@user.email,@user.firstName,@user.lastName) @@ -180,13 +181,12 @@ def un_subscribe deliver "unsubscribe", SubscribeMailer.unregister_for_announce_list(@email) end - + private def find_user(id = params[:id]) id = helpers.unescape(id) - @user = LinkedData::Client::Models::User.find(helpers.escape(id), include: 'all') - @user ||= LinkedData::Client::Models::User.find_by_username(helpers.escape(id), include: 'all').first + @user = LinkedData::Client::Models::User.find(id.split('/').last, {include: 'all'}) not_found("User with id #{id} not found") if @user.nil? diff --git a/app/helpers/agent_helper.rb b/app/helpers/agent_helper.rb index f1a5240e23..c8212752b7 100644 --- a/app/helpers/agent_helper.rb +++ b/app/helpers/agent_helper.rb @@ -47,7 +47,7 @@ def link_to_agent_edit_modal(agent, parent_id = nil) end def link_to_agent_edit(agent, parent_id, name_prefix, deletable: false, show_affiliations: true) - link_to(edit_agent_path(agent_id(agent), name_prefix: name_prefix, deletable: deletable, parent_id: parent_id, show_affiliations: show_affiliations), class: 'btn btn-sm btn-light') do + link_to(edit_agent_path(agent_id(agent), name_prefix: name_prefix, deletable: deletable, parent_id: parent_id, show_affiliations: show_affiliations), class: 'btn btn-sm btn-light agent-edit-icon') do content_tag(:i, '', class: 'far fa-edit') end end @@ -69,7 +69,7 @@ def agent_search_input(id, agent_type, parent_id: , name_prefix:, deletable: fal end - def affiliation?(agent) + def is_organization?(agent) agent.agentType.eql?('organization') end @@ -82,6 +82,24 @@ def identifier_link(link, link_to: true) end + + def agent_identifier_input(index, name_prefix, value = '', is_organization: true) + + content_tag :div, id: index, class: 'd-flex' do + content_tag(:div, class: 'w-100') do + + concat hidden_field_tag(agent_identifier_name(index , :creator, name_prefix), session[:user].id) + if is_organization + concat inline_svg_tag 'icons/ror.svg', class: 'agent-input-icon' + else + concat inline_svg_tag('orcid.svg', class: 'agent-input-icon') + end + concat text_field_tag(agent_identifier_name(index, :notation, name_prefix), value, class: 'agent-input-with-icon') + end + end + end + + def display_identifiers(identifiers, link: true) schemes_urls = { ORCID: 'https://orcid.org/', ISNI: 'https://isni.org/', ROR: 'https://ror.org/', GRID: 'https://www.grid.ac/' } Array(identifiers).map do |i| @@ -162,8 +180,8 @@ def display_agent(agent, link: true) def agent_tooltip(agent) name = agent.name - email = agent.email - type = agent.agentType + email = agent.email unless agent.class.eql?(LinkedData::Client::Models::Agent) + type = agent.agentType identifiers = display_identifiers(agent.identifiers, link: false) identifiers = orcid_number(identifiers) if agent.affiliations && agent.affiliations != [] @@ -203,7 +221,7 @@ def generate_agent_tooltip(agent_icon, name, email = nil, identifiers = nil, aff end end end - + def agent_chip_component(agent) person_icon = inline_svg_tag 'icons/person.svg' , class: 'agent-type-icon' @@ -214,21 +232,21 @@ def agent_chip_component(agent) name = agent title = nil else - name = agent.name + name = agent.agentType.eql?("organization") ? (agent.acronym || agent.name) : agent.name agent_icon = agent.agentType.eql?("organization") ? organization_icon : person_icon title = agent_tooltip(agent) end render_chip_component(title, agent_icon, name) - end + end def render_chip_component(title,agent_icon,name) - render ChipButtonComponent.new(type: "static",'data-controller':' tooltip', title: title , class: 'text-truncate', style: 'max-width: 280px; display:block; line-height: unset') do + render ChipButtonComponent.new(type: "static",'data-controller':' tooltip', title: title , class: 'text-truncate', style: 'max-width: 280px; display:block; line-height: unset') do content_tag(:div, class: 'agent-chip') do content_tag(:div, agent_icon, class: 'agent-chip-circle') + content_tag(:div, name, class: 'agent-chip-name text-truncate') - end - end + end + end end def orcid_number(orcid) @@ -236,5 +254,5 @@ def orcid_number(orcid) end - + end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e768f3b952..c9fb873758 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -37,9 +37,14 @@ def search_json_link(link = @json_url, style: '') def resolve_namespaces RESOLVE_NAMESPACE end + def ontologies_analytics - data = LinkedData::Client::Analytics.last_month.onts - data.map{|x| [x[:ont].to_s, x[:views]]}.to_h + begin + data = LinkedData::Client::Analytics.last_month.onts + data.map{|x| [x[:ont].to_s, x[:views]]}.to_h + rescue StandardError + {} + end end def get_apikey @@ -75,43 +80,10 @@ def omniauth_token_provider(strategy) omniauth_provider_info(strategy.to_sym).keys.first end - def isOwner?(id) - unless session[:user].nil? - if session[:user].admin? - return true - elsif session[:user].id.eql?(id) - return true - else - return false - end - end - end - - - def encode_param(string) CGI.escape(string) end - def clean(string) - string = string.gsub("\"",'\'') - return string.gsub("\n",'') - end - - def clean_id(string) - new_string = string.gsub(":","").gsub("-","_").gsub(".","_") - return new_string - end - - def to_param(string) - "#{encode_param(string.gsub(" ","_"))}" - end - - def get_username(user_id) - user = LinkedData::Client::Models::User.find(user_id) - username = user.nil? ? user_id : user.username - username - end def current_user session[:user] @@ -126,27 +98,7 @@ def child_id(child) child.id.to_s.split('/').last end - def loading_spinner(padding = false, include_text = true) - loading_text = include_text ? t('application.loading') : "" - if padding - raw('
' + image_tag("spinners/spinner_000000_16px.gif", style: "vertical-align: text-bottom;") + loading_text + '
') - else - raw(image_tag("spinners/spinner_000000_16px.gif", style: "vertical-align: text-bottom;") + loading_text) - end - end - - - def help_icon(link, html_attribs = {}) - html_attribs["title"] ||= "Help" - attribs = [] - html_attribs.each {|k,v| attribs << "#{k.to_s}='#{v}'"} - return <<-BLOCK - - - - BLOCK - end # Create a popup button with a ? inside to display help when hovered def help_tooltip(content, html_attribs = {}, icon = 'fas fa-question-circle', css_class = nil, text = nil) @@ -199,74 +151,11 @@ def link_last_part(url) end end - def get_categories_data(categories = nil) - @categories_for_select = [] - @categories_map = {} - categories ||= LinkedData::Client::Models::Category.all(include: "name,ontologies") - categories.each do |c| - @categories_for_select << [ c.name, c.id ] - @categories_map[c.id] = ontologies_to_acronyms(c.ontologies) # c.ontologies is a list of URIs - end - @categories_for_select.sort! { |a,b| a[0].downcase <=> b[0].downcase } - @categories_for_js = @categories_map.to_json - end - - def get_groups_data(groups = nil) - @groups_map = {} - @groups_for_select = [] - groups ||= LinkedData::Client::Models::Group.all(include: "acronym,name,ontologies") - groups.each do |g| - next if ( g.acronym.nil? or g.acronym.empty? ) - @groups_for_select << [ g.name + " (#{g.acronym})", g.acronym ] - @groups_map[g.acronym] = ontologies_to_acronyms(g.ontologies) # g.ontologies is a list of URIs - end - @groups_for_select.sort! { |a,b| a[0].downcase <=> b[0].downcase } - @groups_for_js = @groups_map.to_json - end - - - - - def ontologies_to_acronyms(ontologyIDs) - acronyms = [] - ontologyIDs.each do |id| - acronyms << @onts_uri2acronym_map[id] # hash generated in get_ontologies_data - end - return acronyms.compact # remove nil values from any failures to convert ontology URI to acronym - end - def at_slice? !@subdomain_filter.nil? && !@subdomain_filter[:active].nil? && @subdomain_filter[:active] == true end - # TODO this helper is not used but can be usefully - def truncate_with_more(text, options = {}) - length ||= options[:length] ||= 30 - trailing_text ||= options[:trailing_text] ||= " ... " - link_more ||= options[:link_more] ||= "[more]" - link_less ||= options[:link_less] ||= "[less]" - more_text = " #{link_more}#{text} #{link_less}" - more = text.length > length ? more_text : "" - output = "#{truncate(text, :length => length, :omission => trailing_text)}" + more + "" - end - - def chips_component(id: , name: , label: , value: , checked: false , tooltip: nil, &block) - content_tag(:div, data: { controller: 'tooltip' }, title: tooltip) do - check_input(id: id, name: name, value: value, label: label, checked: checked, &block) - end - end - - def group_chip_component(id: nil, name: , object: , checked: , value: nil, title: nil, &block) - title ||= object["name"] - value ||= (object["value"] || object["acronym"] || object["id"]) - - chips_component(id: id || value, name: name, label: object["acronym"], - checked: checked, - value: value, tooltip: title, &block) - end - alias :category_chip_component :group_chip_component - def add_comment_button(parent_id, parent_type) if session[:user].nil? link_to t('application.add_comment'), login_index_path(redirect: request.url), class: "secondary-button regular-button slim" @@ -284,7 +173,6 @@ def add_reply_button(parent_id) end end - def add_proposal_button(parent_id, parent_type) if session[:user].nil? link_to t('application.add_proposal'), login_index_path(redirect: request.url), class: "secondary-button regular-button slim" @@ -293,7 +181,7 @@ def add_proposal_button(parent_id, parent_type) class: "secondary-button regular-button slim", data: { show_modal_title_value: t('application.add_new_proposal')} end end - + def link?(str) # Regular expression to match strings starting with "http://" or "https://" @@ -324,10 +212,8 @@ def admin_block(ontology: @ontology, user: session[:user], class_css: "admin-bor end end - def subscribed_to_ontology?(ontology_acronym, user) - user.bring(:subscription) if user.subscription.nil? - # user.subscription is an array of subscriptions like {ontology: ontology_id, notification_type: "NOTES"} + user = LinkedData::Client::Models::User.find(user.username, {include: 'subscription'}) if user.subscription.nil? return false if user.subscription.nil? or user.subscription.empty? user.subscription.each do |sub| #sub = {ontology: ontology_acronym, notification_type: "NOTES"} @@ -375,8 +261,6 @@ def notification_type(flash_key) bootstrap_alert_class[flash_key] end - ###BEGIN ruby equivalent of JS code in bp_ajax_controller. - ###Note: this code is used in concepts/_details partial. def bp_ont_link(ont_acronym) return "/ontologies/#{ont_acronym}" end @@ -428,7 +312,7 @@ def get_link_for_cls_ajax(cls_id, ont_acronym, target = nil) cls_url = "/ontologies/#{ont_acronym}?p=classes&conceptid=#{CGI.escape(cls_id)}" label_ajax_link(link, cls_id, ont_acronym, ajax_url , cls_url ,target) else - content_tag(:div, auto_link(cls_id, :all, target: '_blank')) + content_tag(:div, cls_id) end end @@ -453,7 +337,6 @@ def get_link_for_collection_ajax(collection, ont_acronym, target = '_blank') label_ajax_link(link, collection, ont_acronym, ajax_url, collection_url, target) end - def get_link_for_label_xl_ajax(label_xl, ont_acronym, cls_id, modal: true) link = label_xl ajax_uri = "/ajax/label_xl/label?cls_id=#{CGI.escape(cls_id)}" @@ -469,10 +352,10 @@ def get_link_for_label_xl_ajax(label_xl, ont_acronym, cls_id, modal: true) end - ###END ruby equivalent of JS code in bp_ajax_controller. def ontology_viewer_page_name(ontology_name, concept_label, page) ontology_name + " | " + " #{page.capitalize}" end + def help_path(anchor: nil) "#{Rails.configuration.settings.links[:help]}##{anchor}" end @@ -539,7 +422,6 @@ def navitems ["/landscape", t("layout.header.landscape")]] end - def beta_badge(text = t('application.beta_badge_text'), tooltip: t('application.beta_badge_tooltip')) return unless text content_tag(:span, text, data: { controller: 'tooltip' }, title: tooltip, class: 'badge badge-pill bg-secondary text-white') @@ -581,7 +463,6 @@ def rest_url "#{protocol}://#{cleaned_path}" end - def prefix_property_url(key_string, key = nil) namespace_key, _ = RESOLVE_NAMESPACE.find { |_, value| key_string.include?(value) } @@ -629,10 +510,9 @@ def empty_state(text) end end - - def ontologies_selector(id:, label: nil, name: nil, selected: nil, placeholder: nil, multiple: true) + def ontologies_selector(id:, label: nil, name: nil, selected: nil, placeholder: nil, multiple: true, ontologies: onts_for_select) content_tag(:div) do - render(Input::SelectComponent.new(id: id, label: label, name: name, value: onts_for_select, multiple: multiple, selected: selected, placeholder: placeholder)) + + render(Input::SelectComponent.new(id: id, label: label, name: name, value: ontologies, multiple: multiple, selected: selected, placeholder: placeholder)) + content_tag(:div, class: 'ontologies-selector-button', 'data-controller': 'ontologies-selector', 'data-ontologies-selector-id-value': id) do content_tag(:div, t('ontologies_selector.clear_selection'), class: 'clear-selection', 'data-action': 'click->ontologies-selector#clear') + link_to_modal(t('ontologies_selector.ontologies_advanced_selection'), "/ontologies_selector?id=#{id}", data: { show_modal_title_value: t('ontologies_selector.ontologies_advanced_selection')}) @@ -640,6 +520,10 @@ def ontologies_selector(id:, label: nil, name: nil, selected: nil, placeholder: end end + def link_button_component(href: , value: , id:, size: nil, variant: 'primary') + render Buttons::RegularButtonComponent.new(id:id, value: value, variant: variant, type: 'link', href: href, size: size) + end + def save_button_component(class_name: nil, id: , value:, data: nil, size: nil, type: nil) content_tag(:div, data: data, class: class_name) do render Buttons::RegularButtonComponent.new(id:id, value: value, variant: "primary", state: 'regular', size: size, type: type) do |btn| @@ -659,7 +543,9 @@ def cancel_button_component(class_name: nil, id: , value:, data: nil) end end end - - + def categories_select(id: nil, name: nil, selected: 'None') + categories_for_select = LinkedData::Client::Models::Category.all.map{|x| ["#{x.name} (#{x.acronym})", x.id]}.unshift(["None", '']) + render Input::SelectComponent.new(id: id, name: name, value: categories_for_select, selected: selected) + end end diff --git a/app/helpers/check_resolvability_helper.rb b/app/helpers/check_resolvability_helper.rb index 5775766200..40d74ea2e5 100644 --- a/app/helpers/check_resolvability_helper.rb +++ b/app/helpers/check_resolvability_helper.rb @@ -3,9 +3,9 @@ module CheckResolvabilityHelper def formats_equivalents(format = nil) all = { 'application/json' => ['application/ld+json'], - 'application/rdf+xml' => %w[application/xml application/rdf+xml text/xml application/octet-stream], - 'text/turtle' => ['application/turtle'], - 'text/n3' => ['application/n-triples'], + 'application/rdf+xml' => %w[application/xml text/xml text/rdf+xml application/octet-stream], + 'text/turtle' => %w[application/turtle application/octet-stream], + 'text/n3' => %w[text/rdf+n3 application/rdf+n3 application/n3 application/n-triples text/n-triples application/ntriples text/ntriples], 'text/html' => [] } @@ -26,7 +26,7 @@ def resolvability_max_redirections 10 end - def resolvability_status(status, allowed_format, redirections, result: nil) + def resolvability_status(status, allowed_format, redirections, result: nil, response_time:0) supported_format = Array(allowed_format) unless result @@ -39,7 +39,7 @@ def resolvability_status(status, allowed_format, redirections, result: nil) end end - { result: result, status: status, allowed_format: supported_format, redirections: redirections } + { result: result, status: status, allowed_format: supported_format, response_time: response_time, redirections: redirections } end def follow_redirection(url, format, timeout_seconds, redirect_limit = resolvability_max_redirections) @@ -49,35 +49,37 @@ def follow_redirection(url, format, timeout_seconds, redirect_limit = resolvabil redirect_count = 0 redirections = [uri] - until (!response.nil? && !response.is_a?(Net::HTTPRedirection)) || redirect_count >= redirect_limit - http = Net::HTTP.new(uri.host, uri.port) - http.use_ssl = (uri.scheme == 'https') - http.open_timeout = timeout_seconds - begin - response = Timeout.timeout(timeout_seconds) { http.request_head(uri, 'Accept' => format) } - rescue Timeout::Error, Net::OpenTimeout - return resolvability_status('Timeout', [], redirections, result: 0) - end + total_time = Benchmark.measure do + until (!response.nil? && !response.is_a?(Net::HTTPRedirection)) || redirect_count >= redirect_limit + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = (uri.scheme == 'https') + http.open_timeout = timeout_seconds + begin + response = Timeout.timeout(timeout_seconds) { http.request_head(uri, 'Accept' => format) } + rescue Timeout::Error, Net::OpenTimeout + return resolvability_status('Timeout', [], redirections, result: 0, response_time: timeout_seconds) + end - if response.is_a?(Net::HTTPRedirection) && response['location'] - if !uri.to_s.start_with?(response['location']) && uri.to_s.include?(response['location'].chomp('/')) - uri = URI.parse(uri.scheme + '://' + uri.host + '/' + response['location']) - else - uri = URI.parse(response['location']) + if response.is_a?(Net::HTTPRedirection) && response['location'] + uri = URI.join(uri, response['location']) + redirections << uri + redirect_count += 1 end - redirections << uri - redirect_count += 1 end end - if response&.code.to_s.eql?('200') && (response&.content_type.to_s.include?(format) || formats_equivalents(format)&.include?(response&.content_type.to_s)) - result = 2 - elsif response&.code.to_s.eql?('200') - result = 1 + if redirect_count >= redirect_limit + resolvability_status('Too Many Redirections', [], redirections, result: 0, response_time: total_time.real.round(3)) else - result = 0 + if response&.code.to_s.eql?('200') && (response&.content_type.to_s.include?(format) || formats_equivalents(format)&.include?(response&.content_type.to_s)) + result = 2 + elsif response&.code.to_s.eql?('200') + result = 1 + else + result = 0 + end + resolvability_status(response&.code, [response&.content_type], redirections, result: result, response_time: total_time.real.round(3)) end - resolvability_status(response&.code, [response&.content_type], redirections, result: result) end def check_resolvability_helper(url, negotiation_formats = resolvability_formats, timeout_seconds = resolvability_timeout) @@ -85,7 +87,7 @@ def check_resolvability_helper(url, negotiation_formats = resolvability_formats, supported_format = negotiation_formats.find_all do |format| begin redirections[format] = follow_redirection(url, format, timeout_seconds) - redirections[:result].eql?(2) + redirections[format][:result].eql?(2) rescue StandardError => e redirections[format] = resolvability_status(e.message, [], [], result: 0) false @@ -93,13 +95,14 @@ def check_resolvability_helper(url, negotiation_formats = resolvability_formats, end status = redirections.values.map { |v| v[:status] }.uniq.join(', ') + average_response_time = redirections.values.sum { |v| v[:response_time] }.fdiv(redirections.size).round(3) if supported_format.size > 1 - { result: 2, status: status, allowed_format: supported_format, redirections: redirections } + { result: 2, status: status, allowed_format: supported_format, average_response_time: average_response_time, redirections: redirections } elsif status.include?('200') returned_format = redirections.map { |k, v| !v[:result].eql?(0) ? v[:allowed_format] : nil }.flatten.compact.uniq - { result: 1, status: status, allowed_format: returned_format, redirections: redirections } + { result: 1, status: status, allowed_format: returned_format, average_response_time: average_response_time, redirections: redirections } else - { result: 0, status: status, allowed_format: [], redirections: redirections } + { result: 0, status: status, allowed_format: [], average_response_time: average_response_time, redirections: redirections } end end @@ -116,7 +119,7 @@ def check_resolvability_success(result) url_resolvable?(result) || url_content_negotiable?(result) end - def check_resolvability_message(resolvable, allowed_formats, status, url = nil) + def check_resolvability_message(resolvable, allowed_formats, status, url: nil, response_time: nil) supported_format = Array(allowed_formats).compact supported_format = allowed_formats.empty? ? 'Format not specified' : supported_format.join(', ') @@ -130,6 +133,7 @@ def check_resolvability_message(resolvable, allowed_formats, status, url = nil) text = text + link_to(', click to see details', check_resolvability_path(url: url), target: '_blank') if url + text += " (Average response time: #{response_time}s)" if response_time text end end diff --git a/app/helpers/collections_helper.rb b/app/helpers/collections_helper.rb index 595cddabf3..bb81e39cef 100644 --- a/app/helpers/collections_helper.rb +++ b/app/helpers/collections_helper.rb @@ -75,9 +75,19 @@ def link_to_collection(collection, selected_collection_id) private + require 'color' + + def random_color + hue = rand(0..360) + saturation = rand(50..100) # Higher saturation for more vibrant colors + lightness = rand(30..70) # Middle lightness to avoid extremes + + Color::HSL.new(hue, saturation, lightness).html + end + def generate_collections_colors(collections) collections.each do |c| - c.color = format('#%06x', (rand * 0xffffff)) + c.color = random_color end end end diff --git a/app/helpers/components_helper.rb b/app/helpers/components_helper.rb index 03eef072cd..210e4ab57c 100644 --- a/app/helpers/components_helper.rb +++ b/app/helpers/components_helper.rb @@ -1,4 +1,22 @@ module ComponentsHelper + include TermsReuses + + def chips_component(id: , name: , label: , value: , checked: false , tooltip: nil, &block) + content_tag(:div, data: { controller: 'tooltip' }, title: tooltip) do + check_input(id: id, name: name, value: value, label: label, checked: checked, &block) + end + end + + def group_chip_component(id: nil, name: , object: , checked: , value: nil, title: nil, &block) + title ||= object["name"] + value ||= (object["value"] || object["acronym"] || object["id"]) + + chips_component(id: id || value, name: name, label: object["acronym"], + checked: checked, + value: value, tooltip: title, &block) + end + alias :category_chip_component :group_chip_component + def rdf_highlighter_container(format, content) render Display::RdfHighlighterComponent.new(format: format, text: content) @@ -29,7 +47,7 @@ def search_page_input_component(name:, value: nil, placeholder: , button_icon: ' end end - def paginated_list_component(id:, results:, next_page_url:, child_url:, child_turbo_frame:, child_param:, open_in_modal: false , selected: nil, auto_click: false) + def paginated_list_component(id:, results:, next_page_url:, child_url:, child_turbo_frame:, child_param:, open_in_modal: false , selected: nil, auto_click: false, submission: nil) render(TreeInfiniteScrollComponent.new( id: id, collection: results.collection, @@ -45,7 +63,7 @@ def paginated_list_component(id:, results:, next_page_url:, child_url:, child_tu end end) end - + concepts = c.collection if concepts && !concepts.empty? concepts.each do |concept| @@ -59,7 +77,8 @@ def paginated_list_component(id:, results:, next_page_url:, child_url:, child_tu selected: selected.blank? ? false : concept.id.eql?(selected) , target_frame: child_turbo_frame, data: data, - open_in_modal: open_in_modal + open_in_modal: open_in_modal, + is_reused: concept_reused?(submission: submission, concept_id: concept.id) ))) end end @@ -87,7 +106,7 @@ def copy_link_to_clipboard(url, show_content: false) def generated_link_to_clipboard(url, acronym) url = "#{$UI_URL}/ontologies/#{acronym}/#{link_last_part(url)}" - content_tag(:span, style: 'display: inline-block;') do + content_tag(:span, id: "generate_portal_link", style: 'display: inline-block;') do render ClipboardComponent.new(icon: 'icons/copy_link.svg', title: "#{t("components.copy_portal_uri", portal_name: portal_name)} #{link_to(url)}", message: url, show_content: false) end end @@ -115,13 +134,13 @@ def link_to_with_actions(link_to_tag, acronym: nil, url: nil, copy: true, check_ tag.html_safe end - def tree_component(root, selected, target_frame:, sub_tree: false, id: nil, auto_click: false, &child_data_generator) + def tree_component(root, selected, target_frame:, sub_tree: false, id: nil, auto_click: false, submission: nil, &child_data_generator) root.children.sort! { |a, b| (a.prefLabel || a.id).downcase <=> (b.prefLabel || b.id).downcase } - + render TreeViewComponent.new(id: id, sub_tree: sub_tree, auto_click: auto_click) do |tree_child| root.children.each do |child| children_link, data, href = child_data_generator.call(child) - + if children_link.nil? || data.nil? || href.nil? raise ArgumentError, t('components.error_block') end @@ -130,9 +149,9 @@ def tree_component(root, selected, target_frame:, sub_tree: false, id: nil, auto children_href: children_link, selected: child.id.eql?(selected&.id), muted: child.isInActiveScheme&.empty?, target_frame: target_frame, - data: data) do + data: data, is_reused: concept_reused?(submission: submission, concept_id: child.id)) do tree_component(child, selected, target_frame: target_frame, sub_tree: true, - id: id, auto_click: auto_click, &child_data_generator) + id: id, auto_click: auto_click, submission: submission, &child_data_generator) end end end @@ -260,4 +279,5 @@ def form_cancel_button end end + end diff --git a/app/helpers/concepts_helper.rb b/app/helpers/concepts_helper.rb index 06949543e8..3cec8ade6b 100644 --- a/app/helpers/concepts_helper.rb +++ b/app/helpers/concepts_helper.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true module ConceptsHelper - + include TermsReuses def concept_link(acronym, child, language) child.id.eql?('bp_fake_root') ? '#' : "/ontologies/#{acronym}/concepts/show?id=#{CGI.escape(child.id)}&language=#{language}" end @@ -20,8 +20,11 @@ def concept_tree_data(acronym, child, language, concept_schemes) } [children_link, data, href] end - def concepts_tree_component(root, selected_concept, acronym, concept_schemes, language, sub_tree: false, id: nil, auto_click: false) - tree_component(root, selected_concept, target_frame: 'concept_show', sub_tree: sub_tree, id: id, auto_click: auto_click) do |child| + + def concepts_tree_component(root, selected_concept, acronym, concept_schemes, language, sub_tree: false, id: nil, + auto_click: false, submission: @submission) + tree_component(root, selected_concept, target_frame: 'concept_show', sub_tree: sub_tree, id: id, + auto_click: auto_click, submission: submission) do |child| concept_tree_data(acronym, child, language, concept_schemes) end end @@ -105,25 +108,26 @@ def same_period?(year, month, date) year.eql?(date.year) && month.eql?(date.strftime('%B')) end - def concepts_li_list(concepts, auto_click: false) + def concepts_li_list(concepts, auto_click: false, selected_id: nil, submission: nil) out = '' concepts.each do |concept| children_link, data, href = concept_tree_data(@ontology.acronym, concept, request_lang, []) + out += render TreeLinkComponent.new(child: concept, href: href, - children_href: '#', selected: concept.id.eql?(concepts.first.id) && auto_click, - target_frame: 'concept_show', data: data) + children_href: '#', selected: concept.id.eql?(selected_id) && auto_click, + target_frame: 'concept_show', data: data, is_reused: concept_reused?(submission: submission, concept_id: concept.id)) end out end - def render_concepts_by_dates(auto_click: false) + def render_concepts_by_dates(auto_click: false, submission: @submission) return if @concepts_year_month.empty? first_year, first_month_concepts = @concepts_year_month.shift first_month, first_concepts = first_month_concepts.shift out = '' if same_period?(first_year, first_month, @last_date) - out += "
    #{concepts_li_list(first_concepts, auto_click: auto_click)}
" + out += "
    #{concepts_li_list(first_concepts, auto_click: auto_click, submission: submission)}
" else tmp = {} tmp[first_month] = first_concepts @@ -132,15 +136,15 @@ def render_concepts_by_dates(auto_click: false) tmp = {} tmp[first_year] = first_month_concepts @concepts_year_month = tmp.merge(@concepts_year_month) - + selected_id = @concepts.first.id if @page.page.eql?(1) @concepts_year_month.each do |year, month_concepts| month_concepts.each do |month, concepts| out += "
    #{month + ' ' + year.to_s}" - out += concepts_li_list(concepts, auto_click: auto_click) - out += "
" + out += concepts_li_list(concepts, auto_click: auto_click, selected_id: selected_id, + submission: submission) + out += '' end end - raw out end @@ -199,4 +203,4 @@ def synonym_qualifier_select(form) def concept_redirect_path ontology_path(@ontology.acronym, p: 'classes', conceptid: @concept.id) end -end \ No newline at end of file +end diff --git a/app/helpers/fair_score_helper.rb b/app/helpers/fair_score_helper.rb index 7abb76eb66..ef5b81e2df 100644 --- a/app/helpers/fair_score_helper.rb +++ b/app/helpers/fair_score_helper.rb @@ -16,18 +16,22 @@ def get_fairness_json(ontologies_acronyms, apikey = user_apikey) if Rails.cache.exist?("fairness-#{ontologies_acronyms.gsub(',', '-')}-#{apikey}") out = read_large_data("fairness-#{ontologies_acronyms.gsub(',', '-')}-#{apikey}") else - out = "{}" + out = '{}' begin time = Benchmark.realtime do conn = Faraday.new do |conn| conn.options.timeout = 30 end response = conn.get(get_fairness_service_url(apikey) + "&ontologies=#{ontologies_acronyms}&combined") - out = response.body.force_encoding('ISO-8859-1').encode('UTF-8') - cache_large_data("fairness-#{ontologies_acronyms.gsub(',', '-')}-#{apikey}", out) + if response.status.eql?(200) + out = response.body.force_encoding('ISO-8859-1').encode('UTF-8') + unless out.empty? || out.strip.eql?('{}') + cache_large_data("fairness-#{ontologies_acronyms.gsub(',', '-')}-#{apikey}", out) + end + end end puts "Call fairness service for: #{ontologies_acronyms} (#{time}s)" - rescue + rescue StandardError Rails.logger.warn t('fair_score.fairness_unreachable_warning') end end @@ -140,7 +144,7 @@ def print_score(score) def fairness_link(style: '', ontology: nil) custom_style = "font-size: 50px; line-height: 0.5; margin-left: 6px; #{style}".strip ontology = ontology || 'all' - render IconWithTooltipComponent.new(icon: "json.svg",link: "#{get_fairness_service_url}&ontologies=#{ontology}&combined=true", target: '_blank', title: t('fair_score.go_to_api'), size:'small', style: custom_style) + render IconWithTooltipComponent.new(icon: 'json.svg',link: "#{get_fairness_service_url}&ontologies=#{ontology}&combined=true", target: '_blank', title: t('fair_score.go_to_api'), size:'small', style: custom_style) end private diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb index fe4f084495..5df6609674 100644 --- a/app/helpers/home_helper.rb +++ b/app/helpers/home_helper.rb @@ -1,5 +1,4 @@ require 'open-uri' -require 'open_uri_redirections' require 'nokogiri' module HomeHelper @@ -8,7 +7,7 @@ def render_footer_link(options = {}) link_content = options[:text][I18n.locale] || options[:text][:en] if options[:text] link_content ||= image_tag(options[:img_src]) if options[:img_src] link_content ||= content_tag(:i, '', class: options[:icon]) if options[:icon] - + link_to(link_content, options[:url], target: options[:target], class: options[:css_class].to_s, style: options[:text].blank? ? 'text-decoration: none' : '').html_safe if link_content end @@ -21,7 +20,7 @@ def format_number_abbreviated(number) else number.to_s end - end + end def discover_ontologies_button render Buttons::RegularButtonComponent.new(id: 'discover-ontologies-button', value: t('home.discover_ontologies_button'), variant: "secondary", state: "regular", href: "/ontologies") do |btn| @@ -31,4 +30,10 @@ def discover_ontologies_button end end -end \ No newline at end of file + def home_ontoportal_description + ontoportal_link = link_to("(#{$ONTOPORTAL_WEBSITE_LINK})", $ONTOPORTAL_WEBSITE_LINK, target: '_blank') + github_link = link_to("(#{$ONTOPORTAL_GITHUB_REPO})", $ONTOPORTAL_GITHUB_REPO, target: '_blank') + content_tag(:div, t('home.ontoportal_description', ontoportal_link: ontoportal_link, github_link: github_link).html_safe, style: "margin-bottom: 20px") + end + +end diff --git a/app/helpers/inputs_helper.rb b/app/helpers/inputs_helper.rb index a844ce0d2d..cd4782b6f3 100644 --- a/app/helpers/inputs_helper.rb +++ b/app/helpers/inputs_helper.rb @@ -46,10 +46,10 @@ def url_input(name:, value:, label: nil, help: nil) helper_text: help) end - def text_area_input(name:, value:, label: nil, help: nil) + def text_area_input(name:, value:, label: nil, help: nil, resize: nil) render Input::TextAreaComponent.new(label: input_label(label, name), name: name, value: value, error_message: input_error_message(name), - helper_text: help) + helper_text: help, resize: resize) end def date_input(name:, value:, label: nil, help: nil, max_date: nil) diff --git a/app/helpers/mappings_helper.rb b/app/helpers/mappings_helper.rb index 352b42a20d..afc85907a8 100644 --- a/app/helpers/mappings_helper.rb +++ b/app/helpers/mappings_helper.rb @@ -52,7 +52,7 @@ def ajax_to_inter_portal_cls(cls) def ajax_to_internal_cls(cls) link_to("#{cls.id}".html_safe, - ontology_path(cls.explore.ontology.acronym, p: 'classes', conceptid: cls.id)) + ontology_path(cls.explore.ontology.acronym, p: 'classes', conceptid: cls.id), target: "_blank") end # to get the apikey from the interportal instance of the interportal class. diff --git a/app/helpers/multi_languages_helper.rb b/app/helpers/multi_languages_helper.rb index 17a96bd6b4..d21d41a302 100644 --- a/app/helpers/multi_languages_helper.rb +++ b/app/helpers/multi_languages_helper.rb @@ -72,6 +72,9 @@ def search_language_selector(id: 'search_language', name: 'search_language', sel def content_languages(submission = @submission || @submission_latest) current_lang = request_lang.downcase submission_lang = submission_languages(submission) + + submission_lang = [current_lang.to_s] if submission_lang.empty? + # Transform each language into a select option submission_lang = submission_lang.map do |lang| lang = lang.split('/').last.upcase @@ -96,7 +99,7 @@ def content_language_selector(id: 'content_language', name: 'content_language') languages, selected = content_languages render Input::LanguageSelectorComponent.new(id: id, name: name, enable_all: true, languages: languages, - selected: selected || 'all', + selected: selected || request_lang, 'data-tooltip-interactive-value': true, 'data-select-input-searchable-value': false, title: content_language_help_text) @@ -163,7 +166,7 @@ def display_in_multiple_languages(label) content_tag(:div) do raw(label.map do |key, value| Array(value).map do |v| - content_tag(:div) do + content_tag(:div, class: 'definition') do concat content_tag(:span, v) concat content_tag(:span, key.upcase, class: 'badge badge-secondary ml-1') unless key.to_s.upcase.eql?('NONE') || key.to_s.upcase.eql?('@NONE') end diff --git a/app/helpers/ontologies_helper.rb b/app/helpers/ontologies_helper.rb index 46c5d3a4fb..33adc9efd5 100644 --- a/app/helpers/ontologies_helper.rb +++ b/app/helpers/ontologies_helper.rb @@ -5,6 +5,10 @@ module OntologiesHelper API_KEY = $API_KEY LANGUAGE_FILTERABLE_SECTIONS = %w[classes schemes collections instances properties].freeze + def ontology_access_denied? + @ontology&.errors&.include?('Access denied for this resource') + end + def concept_search_input(placeholder) content_tag(:div, class: 'search-inputs p-1') do text_input(placeholder: placeholder, label: '', name: "search", value: '', data: { action: "input->browse-filters#dispatchInputEvent" }) @@ -100,8 +104,8 @@ def ontologies_browse_skeleton(pagesize = 5) end end - def ontologies_filter_url(filters, page: 1, count: false) - url = 'ontologies_filter?' + def ontologies_with_filters_url(filters, page: 1, count: false) + url = '/ontologies_filter?' url += "page=#{page}" if page url += "count=#{page}" if count if filters @@ -320,11 +324,22 @@ def visibility_link(ontology) "#{link_name}" end - def show_category_name(domain) - return domain unless link?(domain) + def category_name_chip_component(domain) + text = domain.split('/').last.titleize + + + return render(ChipButtonComponent.new(text: text, tooltip: domain, type: "static")) unless link?(domain) + + acronym = domain.split('/').last.upcase.strip category = LinkedData::Client::Models::Category.find(acronym) - category.name ? category.name : acronym.titleize + + if category.name + render ChipButtonComponent.new(text: text, tooltip: category.name, type: "static") + else + render ChipButtonComponent.new(text: text, tooltip: domain, url: domain, type: "clickable", target: '_blank') + end + end @@ -416,7 +431,7 @@ def lazy_load_section(section_title, &block) block.call else render TurboFrameComponent.new(id: section_title, src: "/ontologies/#{@ontology.acronym}?p=#{section_title}", - loading: Rails.env.development? ? "lazy" : "eager", + loading: Rails.env.development? ? "lazy" : "eager", target: '_top', data: { "turbo-frame-target": "frame" }) end end @@ -765,5 +780,12 @@ def id_to_acronym(id) id.split('/').last end + def browse_taxonomy_tooltip(texonomy) + content_tag(:div, class: 'd-flex') do + content_tag(:div, "See more information about #{texonomy} in ", class: 'mr-1') + + content_tag(:a, 'here', href: "/#{texonomy}", target: '_blank') + end + end + end diff --git a/app/helpers/properties_helper.rb b/app/helpers/properties_helper.rb index a485e79e29..9d8b2fdce3 100644 --- a/app/helpers/properties_helper.rb +++ b/app/helpers/properties_helper.rb @@ -17,8 +17,9 @@ def property_tree_data(acronym, child, language) } [children_link, data, href] end - def property_tree_component(root, selected_concept, acronym, language, sub_tree: false, id: nil, auto_click: false) - tree_component(root, selected_concept, target_frame: 'property_show', sub_tree: sub_tree, id: id, auto_click: auto_click) do |child| + + def property_tree_component(root, selected_concept, acronym, language, sub_tree: false, id: nil, auto_click: false, submission: @submission) + tree_component(root, selected_concept, target_frame: 'property_show', sub_tree: sub_tree, id: id, auto_click: false, submission: submission) do |child| property_tree_data(acronym, child, language) end end @@ -32,4 +33,8 @@ def no_properties_alert t('properties.no_properties_alert', acronym: @ontology.acronym) end end -end \ No newline at end of file + + def get_property(id, acronym = params[:acronym], lang = request_lang, include: nil) + LinkedData::Client::HTTP.get("/ontologies/#{acronym}/properties/#{helpers.encode_param(id)}", { lang: lang , include: include}) + end +end diff --git a/app/helpers/schemes_helper.rb b/app/helpers/schemes_helper.rb index 39bc77a73e..9d3019cd36 100644 --- a/app/helpers/schemes_helper.rb +++ b/app/helpers/schemes_helper.rb @@ -77,7 +77,7 @@ def schemes_data [schemes_labels, main_scheme, selected_scheme] end - def schemes_tree(schemes_labels, main_scheme_label, selected_scheme_id) + def schemes_tree(schemes_labels, main_scheme_label, selected_scheme_id, submission: @submission_latest) selected_scheme = nil schemes = sorted_labels(schemes_labels).map do |s| next nil unless main_scheme_label.nil? || s['prefLabel'] != main_scheme_label['prefLabel'] @@ -104,9 +104,7 @@ def schemes_tree(schemes_labels, main_scheme_label, selected_scheme_id) root = OpenStruct.new root.children = children selected_scheme = selected_scheme || main_scheme || root.children.first - - - tree_component(root, selected_scheme, target_frame: 'scheme', auto_click: false) do |child| + tree_component(root, selected_scheme, target_frame: 'scheme', auto_click: false, submission: submission) do |child| href = scheme_path(child['@id'], request_lang) rescue '' data = { schemeid: (child['@id'] rescue '')} ["#", data, href] diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index 524cd521ef..ef0a80f654 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -8,7 +8,7 @@ def search_content_params def render_search_paginated_list(container_id:, next_page_url:, child_url:, child_turbo_frame:, child_param:, show_count: nil, lang: request_lang, - auto_click: false, results: , next_page: ,total_count: ) + auto_click: false, results: , next_page: ,total_count:, submission: @submission ) query, page, _ = search_content_params @results = OpenStruct.new @@ -34,7 +34,7 @@ def render_search_paginated_list(container_id:, next_page_url:, child_url:, chil child_param: child_param, child_turbo_frame: child_turbo_frame, open_in_modal: show_count, - selected: selected)) + selected: selected, submission: submission)) ] else render inline: paginated_list_component(id: container_id, @@ -45,7 +45,7 @@ def render_search_paginated_list(container_id:, next_page_url:, child_url:, chil child_turbo_frame: child_turbo_frame, open_in_modal: show_count, selected: selected, - auto_click: auto_click) + auto_click: auto_click, submission: submission) end end -end \ No newline at end of file +end diff --git a/app/helpers/submission_inputs_helper.rb b/app/helpers/submission_inputs_helper.rb index e79060bf47..06ecee5b39 100644 --- a/app/helpers/submission_inputs_helper.rb +++ b/app/helpers/submission_inputs_helper.rb @@ -35,6 +35,8 @@ def help_text end def label + return attr_key unless @attr_metadata + @label || @attr_metadata['label'] || @attr_metadata['attribute'].humanize end @@ -97,7 +99,7 @@ def attribute_input(attr_key, long_text: false, label: nil, show_tooltip: true, url_input(name: name, label: label, value: @submission.URI) elsif long_text text_area_input(name: name, label: label, - value: attr.values) + value: attr.values, resize: true) else text_input(name: name, label: label, value: attr.values, help: help) @@ -233,7 +235,7 @@ def ontology_view_of_input(ontology = @ontology) end c.container do content_tag(:div) do - render SelectInputComponent.new(id: 'viewOfSelect', values: onts_for_select, name: 'ontology[viewOf]', selected: ontology.viewOf) + render SelectInputComponent.new(id: 'viewOfSelect', values: onts_for_select, name: 'ontology[viewOf]', selected: ontology.viewOf&.split('/')&.last) end end end @@ -420,13 +422,15 @@ def generate_url_input(attr, helper_text: nil) end end - def generate_ontology_select_input(name, label, selected, multiple) + def generate_ontology_select_input(name, label, selected, multiple, reject_ontology: @ontology) unless @ontology_acronyms @ontology_acronyms = LinkedData::Client::Models::Ontology.all(include: 'acronym,name', display_links: false, display_context: false, include_views: true) .map { |x| ["#{x.name} (#{x.acronym})", x.id.to_s] } @ontology_acronyms << ['', ''] end + @ontology_acronyms = @ontology_acronyms.reject { |acronym, id| id == reject_ontology.id } + input = '' input = hidden_field_tag("#{name}[]") if multiple @@ -444,7 +448,7 @@ def generate_list_text_input(attr, helper_text: nil, long_text: false) generate_list_field_input(attr, name, label, values, helper_text: helper_text) do |value, row_name, id| if long_text - text_area_tag(row_name, value, class: 'input-field-component', label: '') + text_area_tag(row_name, value, class: 'input-field-component', label: '', style: 'resize: vertical;') else text_input(label: '', name: row_name, value: value) end @@ -527,4 +531,4 @@ def attribute_help_text(attr) help_text end end -end \ No newline at end of file +end diff --git a/app/helpers/submissions_helper.rb b/app/helpers/submissions_helper.rb index 8610dda0ec..917ce5bc20 100644 --- a/app/helpers/submissions_helper.rb +++ b/app/helpers/submissions_helper.rb @@ -194,16 +194,25 @@ def submission_properties out end + def ontology_properties + ['acronym', 'name', [t('submission_inputs.visibility'), :viewingRestriction], 'viewOf', 'groups', 'categories', + [t('submission_inputs.administrators'), 'administeredBy']] + end def submission_editable_properties - properties = submission_properties - properties.map do |x| + properties = submission_properties.map do |x| if x.is_a? Array - [x[0].to_s.underscore.humanize, x[0]] + [attr_label(x[0], show_tooltip: false), x[0]] else - [x.to_s.underscore.humanize, x] + [attr_label(x, show_tooltip: false), x] end end + + properties += ontology_properties.map do |x| + x.is_a?(Array) ? x : [x.to_s.underscore.humanize, x] + end + + properties end def attribute_infos(attr_label) diff --git a/app/javascript/component_controllers/index.js b/app/javascript/component_controllers/index.js index eaf1728f09..c0d3bcd20f 100644 --- a/app/javascript/component_controllers/index.js +++ b/app/javascript/component_controllers/index.js @@ -26,7 +26,6 @@ import clipboard_component_controller from '../../components/clipboard_component import range_slider_component_controller from '../../components/input/range_slider_component/range_slider_component_controller' import RDFHighlighter from '../../components/display/rdf_highlighter_component/rdf_highlighter_component_controller' - application.register("rdf-highlighter", RDFHighlighter) application.register('turbo-modal', TurboModalController) application.register('file-input', FileInputLoaderController) @@ -42,4 +41,4 @@ application.register('progress-pages', Progress_pages_component_controller) application.register('reveal-component', Reveal_component_controller) application.register('table-component', Table_component_controller) application.register('clipboard', clipboard_component_controller) -application.register('range-slider', range_slider_component_controller) +application.register('range-slider', range_slider_component_controller) \ No newline at end of file diff --git a/app/javascript/controllers/chosen_controller.js b/app/javascript/controllers/chosen_controller.js deleted file mode 100644 index 2115f93e45..0000000000 --- a/app/javascript/controllers/chosen_controller.js +++ /dev/null @@ -1,68 +0,0 @@ -import {Controller} from "@hotwired/stimulus" -import {useChosen} from "../mixins/useChosen"; - -// Connects to data-controller="chosen" -export default class extends Controller { - // TODO to update to use TomSelect - static values = { - name: String, - enableColors: {type: Boolean, default: false} - } - - connect() { - useChosen(this.element, {width: '100%', allow_single_deselect: true}, this.#onChange.bind(this)) - } - - #onChange(event) { - const selected = Array.from(event.currentTarget.selectedOptions) - - if(this.enableColorsValue){ - this.#setColors(selected) - } - - const key = this.hasNameValue ? this.nameValue : event.currentTarget.name - const newData = { - [key]: selected.map(x => x.value) - } - this.element.dispatchEvent(new CustomEvent('changed', { - detail: { - data: newData - } - })) - } - - #setColors(selected){ - const snakeCase = string => { - return string.replace(/\W+/g, " ") - .split(/ |\B(?=[A-Z])/) - .map(word => word.toLowerCase()) - .join('_'); - } - const allChosenSelected = Array.from(document.querySelectorAll(`#${snakeCase(this.element.id +'_chosen')} .search-choice`)) - selected.forEach((s) => { - let color = s.dataset.color - if (color) { - const chosenSelected = allChosenSelected.filter(x => x.firstElementChild.textContent === s.text).pop() - const chosenText = chosenSelected.firstElementChild - const chosenClose = chosenSelected.lastElementChild - - chosenSelected.style.display = "flex" - chosenSelected.style.padding = "1px" - chosenSelected.style.paddingTop = "2px" - chosenSelected.style.paddingBottom = "2px" - - - chosenText.style.backgroundColor = color - chosenText.style.display = "inline-block" - chosenText.style.padding = "5px" - chosenText.style.borderRadius = "5px" - chosenText.style.color = "#fff" - chosenText.style.marginLeft = "2px" - chosenText.style.marginRight = "2px" - - chosenClose.style.position = "unset" - chosenClose.style.margin = "auto" - } - }) - } -} diff --git a/app/javascript/controllers/concepts_json_button_controller.js b/app/javascript/controllers/concepts_json_button_controller.js new file mode 100644 index 0000000000..01de7199b9 --- /dev/null +++ b/app/javascript/controllers/concepts_json_button_controller.js @@ -0,0 +1,19 @@ +import {Controller} from "@hotwired/stimulus" + +export default class extends Controller { + static targets = ['button'] + + update(){ + setTimeout(() => { + const tabsList = this.element.querySelectorAll('.nav-item'); + const jsonLink = Array.from(tabsList).find(tab => tab.classList.contains('active'))?.querySelector('a').getAttribute('data-json-link'); + const conceptsJsonLink = this.buttonTarget.querySelector('a'); + if (jsonLink) { + conceptsJsonLink.href = jsonLink; + conceptsJsonLink.style.display = 'flex' + } else { + conceptsJsonLink.style.display = 'none' + } + }, 1); + } +} \ No newline at end of file diff --git a/app/javascript/controllers/content_finder_controller.js b/app/javascript/controllers/content_finder_controller.js deleted file mode 100644 index 177b7d0709..0000000000 --- a/app/javascript/controllers/content_finder_controller.js +++ /dev/null @@ -1,105 +0,0 @@ -import { Controller } from '@hotwired/stimulus' -import * as jsonld from 'jsonld' -import hljs from 'highlight.js/lib/core' -import xml from 'highlight.js/lib/languages/xml' -import json from 'highlight.js/lib/languages/json' - -export default class extends Controller { - static targets = ["content"] - static values = { - format: String - } - connect() { - switch (this.formatValue) { - case 'json': - hljs.registerLanguage('json', json) - this.showJSON() - break - case 'xml': - hljs.registerLanguage('xml', xml) - this.showXML() - break - case 'ntriples': - hljs.registerLanguage('ntriples', function (hljs) { - var URL_PATTERN = /<[^>]+>/; // Regex pattern for matching URLs in angle brackets - return { - case_insensitive: true, - contains: [ - { - className: 'subject', - begin: /^<[^>]+>/, - }, - { - className: 'predicate', - begin: /<[^>]+>/, - }, - { - className: 'object', - begin: /\s([^\s]+)\s\./, - }, - hljs.COMMENT('^#', '$') - ] - }; - }); - this.showNTriples() - break - case 'turtle': - hljs.registerLanguage('turtle', function (hljs) { - var URL_PATTERN = /(?:<[^>]*>)|(?:https?:\/\/[^\s]+)/; - - return { - case_insensitive: true, - contains: [ - { - className: 'custom-prefixes', - begin: '@prefix', - relevance: 10 - }, - { - className: 'meta', - begin: /@base/, - end: /[\r\n]|$/, - relevance: 10 - }, - { - className: 'variable', - begin: /\?[\w\d]+/ - }, - { - className: 'custom-symbol', - begin: /@?[A-Za-z_][A-Za-z0-9_]*(?= *:)/, - relevance: 10 - }, - { - className: 'custom-concepts', - begin: /:\s*(\w+)/, - relevance: 10 - }, - { - className: 'string', - begin: URL_PATTERN - } - ] - }; - }); - this.showTURTLE() - break - } - } - - showJSON() { - this.contentTarget.innerHTML = hljs.highlight(JSON.stringify(JSON.parse(this.contentTarget.textContent), null, " "), { language: 'json' }).value - } - - showXML() { - this.contentTarget.innerHTML = hljs.highlight(this.contentTarget.textContent, { language: 'xml' }).value - } - - showNTriples() { - this.contentTarget.innerHTML = hljs.highlight(this.contentTarget.textContent, { language: 'ntriples' }).value - } - - showTURTLE() { - this.contentTarget.innerHTML = hljs.highlight(this.contentTarget.textContent, { language: 'turtle' }).value - } -} diff --git a/app/javascript/controllers/history_controller.js b/app/javascript/controllers/history_controller.js index 62e3c7c69c..48518c64ac 100644 --- a/app/javascript/controllers/history_controller.js +++ b/app/javascript/controllers/history_controller.js @@ -4,7 +4,6 @@ import { HistoryService } from "../mixins/useHistory"; // Connects to data-controller="history" export default class extends Controller { connect() { - console.log('hello world') this.history = new HistoryService() } updateURL(event) { diff --git a/app/javascript/controllers/index.js b/app/javascript/controllers/index.js index e490eb3a17..24f39bf453 100644 --- a/app/javascript/controllers/index.js +++ b/app/javascript/controllers/index.js @@ -7,8 +7,8 @@ import { application } from "./application" import BrowseFiltersController from "./browse_filters_controller" application.register("browse-filters", BrowseFiltersController) -import ChosenController from "./chosen_controller" -application.register("chosen", ChosenController) +import Skos_collections_selector from "./skos_collections_selector" +application.register("skos-collections-selector", Skos_collections_selector) import ClassSearchAutoCompleteController from "./class_search_auto_complete_controller" application.register("class-search-auto-complete", ClassSearchAutoCompleteController) @@ -102,4 +102,7 @@ application.register("ontologies-selector", OntologiesSelector) import MappingsController from "./mappings_visualization_controller" -application.register('mappings', MappingsController) \ No newline at end of file +application.register('mappings', MappingsController) + +import ConceptsJsonButtonController from "./concepts_json_button_controller.js" +application.register('concepts-json', ConceptsJsonButtonController) \ No newline at end of file diff --git a/app/javascript/controllers/label_ajax_controller.js b/app/javascript/controllers/label_ajax_controller.js index cebf898b38..d3cbcfff46 100644 --- a/app/javascript/controllers/label_ajax_controller.js +++ b/app/javascript/controllers/label_ajax_controller.js @@ -11,27 +11,29 @@ export default class extends Controller { } connect() { - this.linkA = jQuery(this.element); - - if (this.linkA.hasClass('ajax-modified-cls')) { - return true - } - - this.cls_id = this.clsIdValue; - this.ont_acronym = this.ontologyAcronymValue; - - let ajax_uri = new URL(this.ajaxUrlValue, document.location.origin) - - ajax_uri.searchParams.set('ontology', this.ont_acronym) - ajax_uri.searchParams.set('id', this.cls_id) + setTimeout(() => { + this.linkA = jQuery(this.element); + if (this.linkA.hasClass('ajax-modified-cls')) { + return true + } - this.request = useAjax({ - url: ajax_uri.pathname + ajax_uri.search, - timeout: ajax_process_timeout * 1000, - success: this.#ajaxSuccess.bind(this), - error: this.#ajaxError.bind(this) - }); + this.cls_id = this.clsIdValue; + this.ont_acronym = this.ontologyAcronymValue; + + let ajax_uri = new URL(this.ajaxUrlValue, document.location.origin) + + ajax_uri.searchParams.set('ontology', this.ont_acronym) + ajax_uri.searchParams.set('id', this.cls_id) + + + this.request = useAjax({ + url: ajax_uri.pathname + ajax_uri.search, + timeout: ajax_process_timeout * 1000, + success: this.#ajaxSuccess.bind(this), + error: this.#ajaxError.bind(this) + }); + },1) } abort() { diff --git a/app/javascript/controllers/mappings_visualization_controller.js b/app/javascript/controllers/mappings_visualization_controller.js index e75813d368..58d74cc601 100644 --- a/app/javascript/controllers/mappings_visualization_controller.js +++ b/app/javascript/controllers/mappings_visualization_controller.js @@ -26,7 +26,7 @@ export default class extends Controller { ontology_name: key.split('/').pop(), ontology_mappings: value, })) - + this.bubblesTarget.innerHTML = '' useMappingsDrawBubbles(data, width, height, margin, this.bubblesTarget, normalization_ratio, logScaleFactor) this.#centerScroll(this.frameTarget) diff --git a/app/javascript/controllers/simple_tree_controller.js b/app/javascript/controllers/simple_tree_controller.js index 2333fe9069..858bfde2c8 100644 --- a/app/javascript/controllers/simple_tree_controller.js +++ b/app/javascript/controllers/simple_tree_controller.js @@ -7,18 +7,17 @@ export default class extends Controller { } connect () { - let activeElem = this.element.querySelector('a.active') - if (activeElem) { - this.element.scrollTo({ - top: activeElem.offsetTop, - behavior: 'smooth' - }); - - if (this.autoClickValue) { - activeElem.click() + setTimeout(() => { + let activeElem = this.element.querySelector('.tree-link.active'); + if (activeElem) { + activeElem.scrollIntoView({ block: 'center' }); + window.scrollTo({top: 0,}); + if (this.autoClickValue) { + activeElem.click(); + } } - } - this.#onClickTooManyChildrenInit() + this.#onClickTooManyChildrenInit(); + }, 0); } select (event) { diff --git a/app/javascript/controllers/skos_collection_colors_controller.js b/app/javascript/controllers/skos_collection_colors_controller.js index 58baddf4d2..833b49205c 100644 --- a/app/javascript/controllers/skos_collection_colors_controller.js +++ b/app/javascript/controllers/skos_collection_colors_controller.js @@ -25,7 +25,7 @@ export default class extends Controller { let activeCollections = this.#getMatchedCollections(collectionElem, collections, this.selected) this.#removeColors(collectionElem) - this.#addColorsTags(collectionElem, this.#getCollectionColors(activeCollections)) + this.#addColorsTags(collectionElem, this.#getCollections(activeCollections)) } collectionTargetConnected (collectionElem) { @@ -48,7 +48,10 @@ export default class extends Controller { if (options) { Array.from(options.options).forEach(s => { if (s.value !== '') { - out[s.value] = s.dataset.color + out[s.value] = { + color: s.dataset.color, + title: s.textContent + } } }) } @@ -60,10 +63,12 @@ export default class extends Controller { return selected.filter(c => collections.includes(c)) } - #getCollectionColors (collectionsIds) { - return Object.entries(this.allCollections).filter(([key]) => collectionsIds.includes(key)).map(x => x[1]) + #getCollections(collectionsIds) { + return Object.entries(this.allCollections).filter(([key]) => collectionsIds.includes(key)) } + + #getElemCollections (elem) { return JSON.parse(elem.dataset.collectionsValue) } @@ -72,20 +77,23 @@ export default class extends Controller { return JSON.parse(elem.dataset.activeCollectionsValue) } - #addColorsTags (elem, colors) { + #addColorsTags (elem, collections) { const colorsContainer = document.createElement('span') - colors.forEach(c => this.#elemAddColorTag(colorsContainer, c)) + collections.forEach(c => this.#elemAddColorTag(colorsContainer, c[1].title, c[1].color)) elem.appendChild(colorsContainer) } - #elemAddColorTag (elem, color) { + #elemAddColorTag (elem, title, color) { const span = document.createElement('span') + span.dataset.controller = 'tooltip' + span.title = title span.style.backgroundColor = color span.style.height = '10px' span.style.width = '10px' span.style.borderRadius = '50%' span.style.display = 'inline-block' span.className += 'mx-1' + elem.appendChild(span) } } diff --git a/app/javascript/controllers/skos_collections_selector.js b/app/javascript/controllers/skos_collections_selector.js new file mode 100644 index 0000000000..f005e7b2d7 --- /dev/null +++ b/app/javascript/controllers/skos_collections_selector.js @@ -0,0 +1,49 @@ +import {Controller} from "@hotwired/stimulus" +import {useTomSelect} from "../mixins/useTomSelect"; + +// Connects to data-controller="skos-collection-selector" +export default class extends Controller { + // TODO to update to use TomSelect + static values = { + name: String, + enableColors: {type: Boolean, default: false} + } + + connect() { + this.select = useTomSelect(this.element, { + width: '100%', + plugins: ['remove_button'], + render: { + item: (data, escape) => { + if(this.enableColorsValue){ + const bgColor = data.color || '#ccc'; + return '
' + escape(data.text) + '
'; + }else { + return '
' + escape(data.text) + '
' + } + + } + } + }, + this.#onChange.bind(this)) + } + + #onChange(event) { + const selected = this.#getSelectedOptions() + const key = this.hasNameValue ? this.nameValue : event.currentTarget.name + const newData = { + [key]: selected.map(x => x.value) + } + this.element.dispatchEvent(new CustomEvent('changed', { + detail: { + data: newData + }, + bubbles: true, + cancelable: true, + })) + } + + #getSelectedOptions() { + return this.select.items.map(item => this.select.options[item]) + } +} diff --git a/app/javascript/controllers/turbo_frame_controller.js b/app/javascript/controllers/turbo_frame_controller.js index 41c67dd5d9..6520acb64a 100644 --- a/app/javascript/controllers/turbo_frame_controller.js +++ b/app/javascript/controllers/turbo_frame_controller.js @@ -24,8 +24,41 @@ export default class extends Controller { this.frame.innerHTML = this.placeHolderValue } else { this.frame.innerHTML = "" - this.urlValue = new HistoryService().getUpdatedURL(this.urlValue, data) - this.frame.src = this.urlValue + + if(this.#isCurrentPage()){ + this.urlValue = this.#currentPageUrl() + } + + this.urlValue = this.#updatedPageUrl(data) + + this.frame.src = this.urlValue + + } + } + + #isCurrentPage(){ + + let currentDisplayedUrl = new URL(this.#currentPageUrl(), document.location.origin) + + let initUrl = new URL(this.urlValue, document.location.origin) + + if (currentDisplayedUrl.toString().includes(this.urlValue)){ + return true + } else if (currentDisplayedUrl.searchParams.get('p') === initUrl.searchParams.get('p')){ + // this is a custom fix for only the ontology viewer page, + // that use the parameter ?p=section to tell which section is displayed + return true } + + return false + } + + + #currentPageUrl(){ + return document.location.pathname + document.location.search + } + + #updatedPageUrl(newUrlParams){ + return new HistoryService().getUpdatedURL(this.urlValue, newUrlParams) } } diff --git a/app/javascript/mixins/useChosen.js b/app/javascript/mixins/useChosen.js deleted file mode 100644 index 5f2c6c5412..0000000000 --- a/app/javascript/mixins/useChosen.js +++ /dev/null @@ -1,8 +0,0 @@ -export function useChosen(element, params, onChange = null) { - const chosen = $(element).chosen(params) - if(onChange){ - chosen.change(onChange) - } - - return chosen; -} \ No newline at end of file diff --git a/app/javascript/mixins/useHistory.js b/app/javascript/mixins/useHistory.js index ce895f1a64..e34b3c908e 100644 --- a/app/javascript/mixins/useHistory.js +++ b/app/javascript/mixins/useHistory.js @@ -59,9 +59,9 @@ export class HistoryService { return newState } - #updateURLFromState(urlParams, state) { - Object.entries(state).forEach(([key, val]) => { - if (key !== 'p'){ + #updateURLFromState(urlParams, oldState) { + Object.entries(oldState).forEach(([key, val]) => { + if (key !== 'p' && !urlParams.has(key)) { urlParams.set(key, val) } }) diff --git a/app/models/bpid_resolver.rb b/app/models/bpid_resolver.rb deleted file mode 100644 index 3f345b39f1..0000000000 --- a/app/models/bpid_resolver.rb +++ /dev/null @@ -1,46 +0,0 @@ -require 'cgi' -require 'ostruct' -require 'json' -require 'open-uri' - -class BpidResolver - require Rails.root + 'lib/resolver/acronym_from_virtual' - require Rails.root + 'lib/resolver/virtual_from_acronym' - require Rails.root + 'lib/resolver/virtual_from_version' - - def self.id_to_acronym(id) - acronym = self.acronym_from_virtual_id(id) - acronym = self.acronym_from_version_id(id) unless acronym - acronym - end - - def self.acronym_to_virtual_id(acronym) - self.virtual_id_from_acronym(acronym) - end - - private - - def self.acronym_from_id(id) - acronym = self.acronym_from_virtual_id(id) - acronym = self.acronym_from_version_id(id) unless acronym - acronym - end - - def self.acronym_from_virtual_id(virtual_id) - ACRONYM_FROM_VIRTUAL["old:acronym_from_virtual:#{virtual_id}"] - end - - def self.acronym_from_version_id(version_id) - virtual = virtual_id_from_version_id(version_id) - acronym_from_virtual_id(virtual) - end - - def self.virtual_id_from_version_id(version_id) - VIRTUAL_FROM_VERSION["old:virtual_from_version:#{version_id}"] - end - - def self.virtual_id_from_acronym(acronym) - VIRTUAL_FROM_ACRONYM["old:virtual_from_acronym:#{acronym}"] - end - -end \ No newline at end of file diff --git a/app/views/admin/categories/_form.html.haml b/app/views/admin/categories/_form.html.haml index a1abde7419..75974b5a3a 100644 --- a/app/views/admin/categories/_form.html.haml +++ b/app/views/admin/categories/_form.html.haml @@ -30,6 +30,11 @@ = t('admin.categories.form.description') %td.top = f.text_area :description, class: "form-control" + %tr + %th + = t('admin.categories.form.parent_category') + %td.top + = categories_select(id: 'category_parent_select', name: 'category[parentCategory]', selected: @category&.parentCategory) - unless new_record %tr %th diff --git a/app/views/admin/index.html.haml b/app/views/admin/index.html.haml index 9891c88f02..da8f0cbdee 100644 --- a/app/views/admin/index.html.haml +++ b/app/views/admin/index.html.haml @@ -15,7 +15,11 @@ - selected = params[:section] || sections.first.downcase = render Layout::VerticalTabsComponent.new(header: t('admin.index.administration_console'), titles: sections, selected: selected, url_parameter: 'section') do |t| - t.item_content do - = render 'analytics' + - if @ontology_visits[:visits].empty? + %div.d-flex.justify-content-center + Google analytics not enabled + - else + = render 'analytics' - t.item_content do = render 'main' - t.item_content do diff --git a/app/views/agents/_agent.html.haml b/app/views/agents/_agent.html.haml index f6c04ce75d..0f55ca7168 100644 --- a/app/views/agents/_agent.html.haml +++ b/app/views/agents/_agent.html.haml @@ -3,6 +3,8 @@ %div{style: 'width: 250px'} %div.text-truncate{title: agent.name} = agent.name + %td + = agent.acronym %td = raw display_identifiers(agent.identifiers) %td diff --git a/app/views/agents/_form.html.haml b/app/views/agents/_form.html.haml index 60b02f33ee..3a688a6caa 100644 --- a/app/views/agents/_form.html.haml +++ b/app/views/agents/_form.html.haml @@ -9,7 +9,7 @@ = hidden_field_tag :deletable, deletable if deletable = hidden_field_tag agent_field_name(:id, name_prefix), agent.id if agent.id - - if affiliation?(agent) && params[:parent_id] + - if params[:show_affiliations].eql?('false') = hidden_field_tag agent_field_name(:agentType, name_prefix), agent.agentType - else %tr @@ -30,19 +30,19 @@ %span.asterik * %td.top = text_field_tag agent_field_name(:name, name_prefix), agent.name, class: "form-control" - %tr{'data-form-options-display-target':"option1", class: affiliation?(agent) && 'd-none'} + %tr{'data-form-options-display-target':"option1", class: is_organization?(agent) && 'd-none'} %th = t("agents.form.email") %span.asterik %td.top = email_field_tag agent_field_name(:email, name_prefix), agent.email, class: "form-control" - %tr{'data-form-options-display-target':"option2", class: !affiliation?(agent) && 'd-none'} + %tr{'data-form-options-display-target':"option2", class: !is_organization?(agent) && 'd-none'} %th = t("agents.form.acronym") %span.asterik %td.top = text_field_tag agent_field_name(:acronym, name_prefix), agent.acronym,class: "form-control" - %tr{'data-form-options-display-target':"option2", class: !affiliation?(agent) && 'd-none'} + %tr{'data-form-options-display-target':"option2", class: !is_organization?(agent) && 'd-none'} %th = t("agents.form.homepage") %td.top @@ -55,30 +55,22 @@ %tr %th = t("agents.form.identifiers") + - identifier = agent&.identifiers&.first %td.top - %div.agents-identifiers - = render NestedFormInputsComponent.new do |c| - - c.template do - %div.d-flex{id: 'NEW_RECORD'} - %div.w-100 - = hidden_field_tag agent_identifier_name('NEW_RECORD' , :creator, name_prefix), session[:user].id - = text_field_tag agent_identifier_name('NEW_RECORD' , :notation, name_prefix), '', class: "form-control" - %div{style:'width: 15%'} - - values = %w[ORCID ROR ISNI GRID] - = render SelectInputComponent.new(id: "agent_identifiers_schemaAgency_NEW_RECORD", name: agent_identifier_name('NEW_RECORD', :schemaAgency, name_prefix), values: values, selected: 'ORCID') - - c.empty_state do - = hidden_field_tag agent_field_name('', name_prefix+"[#{Array(agent.identifiers).size}]") - - Array(agent.identifiers).each_with_index do |identifier, i| - - c.row do - %div.d-flex{id: identifier.id} - %div.w-100 - = hidden_field_tag agent_identifier_name(i.to_s.upcase, :creator, name_prefix), session[:user].id - = text_field_tag agent_identifier_name(i.to_s.upcase, :notation, name_prefix), identifier.notation, class: "form-control" - %div{style:'width: 15%'} - - values = %w[ORCID ROR ISNI GRID] - = render SelectInputComponent.new(id: "#{name_prefix}_identifiers_schemaAgency_#{i.to_s.upcase}", name: agent_identifier_name(i.to_s.upcase, :schemaAgency, name_prefix), values: values, selected: identifier.schemaAgency) + %div.agents-identifiers{'data-form-options-display-target':"option2", class: !is_organization?(agent) && 'd-none'} + - if identifier&.schemaAgency&.eql?('ROR') + = agent_identifier_input('0', name_prefix, identifier.notation) + - else + = agent_identifier_input('0', name_prefix) + + %div.agents-identifiers{'data-form-options-display-target':"option1", class: is_organization?(agent) && 'd-none'} + - if identifier&.schemaAgency&.eql?('ORCID') + = agent_identifier_input('1', name_prefix, identifier.notation, is_organization: false) + - else + = agent_identifier_input('1', name_prefix, is_organization: false) + - if show_affiliations - %tr + %tr{'data-form-options-display-target':"option1", class: is_organization?(agent) && 'd-none'} %th = t("agents.form.affiliations") %td.top.agents-affiliations.agents-inputs diff --git a/app/views/agents/index.html.haml b/app/views/agents/index.html.haml index 8a038c93a7..8864fe749f 100644 --- a/app/views/agents/index.html.haml +++ b/app/views/agents/index.html.haml @@ -13,6 +13,7 @@ = render TableComponent.new(id: 'admin_agents', custom_class: 'border rounded p-1') do |t| - t.header do |h| - h.th {t("agents.index.first_name")} + - h.th {t("agents.index.acronym")} - h.th {t("agents.form.identifiers")} - h.th {t("agents.form.affiliations")} - h.th {t("agents.form.type")} diff --git a/app/views/annotator/index.html.haml b/app/views/annotator/index.html.haml index 4d5636ed6c..8b83bab08c 100644 --- a/app/views/annotator/index.html.haml +++ b/app/views/annotator/index.html.haml @@ -37,6 +37,7 @@ = render Input::SelectComponent.new(label: t('annotator.include_ancestors'), id: 'ancestors_level', name: 'class_hierarchy_max_level', value: @ancestors_levels, selected: params[:class_hierarchy_max_level]) .filters_line - include_score_helper = 'Score annotations following previous NCBO 2009 measure (old) or Score annotations following C-Value measure (cvalue) or Score annotations following C-Value measure with hierarchy expansion (cvalueh).' + = render Input::SelectComponent.new(label: t('annotator.include_score'), id: 'include_score', name: 'score', value: @include_score, tooltip: include_score_helper, selected: params[:score]) = render Input::NumberComponent.new(label: t('annotator.score_threshold'), name: "score_threshold", value: params[:score_threshold] || 0, tooltip: 'Specify minimum score value for annotations.') = render Input::NumberComponent.new(label: t('annotator.confidence_threshold'), name: 'confidence_threshold', value: params[:confidence_threshold] || 0, tooltip: 'Specify the minimum position in the score distribution (between 1 and 100).') diff --git a/app/views/check_resolvability/index.html.haml b/app/views/check_resolvability/index.html.haml index 2a190c022d..fc5c9bfd9a 100644 --- a/app/views/check_resolvability/index.html.haml +++ b/app/views/check_resolvability/index.html.haml @@ -35,7 +35,7 @@ - if @results %div.bg-white.mt-3.border.rounded %div.p-1 - - text = check_resolvability_message(url_resolvable?(@results), @results[:allowed_format], @results[:status]) + - text = check_resolvability_message(url_resolvable?(@results), @results[:allowed_format], @results[:status], response_time: @results[:average_response_time]) - if url_content_negotiable?(@results) = render Display::AlertComponent.new(type:'success') do = text @@ -45,6 +45,7 @@ - else = render Display::AlertComponent.new(type:'danger') do = text + %div.p-1 - count = 0 - @results[:redirections].each do |format, result| @@ -63,16 +64,8 @@ - else - status = result[:status] - color = status.eql?('200') ? '' : 'bg-danger-light text-danger' - - format_badge = render ChipButtonComponent.new(class: "mx-1", text: result[:allowed_format].first.blank? ? t("check_resolvability.format_not_specified"): result[:allowed_format].first) + - format_badge = render ChipButtonComponent.new(class: "mx-1", type: 'clickable', text: result[:allowed_format].first.blank? ? t("check_resolvability.format_not_specified"): result[:allowed_format].first) = render ChipButtonComponent.new(class: "mx-1 #{color}", type: 'clickable', text: status) = format_badge - - - - - - - - - - + - if index.eql?(result[:redirections].length - 1) + = render ChipButtonComponent.new(class: "mx-1", type: 'clickable', text: "Response time: #{result[:response_time]} s") \ No newline at end of file diff --git a/app/views/collections/_list_view.html.haml b/app/views/collections/_list_view.html.haml index f05ee71946..a50abe0ce2 100644 --- a/app/views/collections/_list_view.html.haml +++ b/app/views/collections/_list_view.html.haml @@ -13,4 +13,4 @@ - scheme.id = scheme['@id'] - tree_child.child(child: scheme, href: collection_path(collection['@id'], request_lang), children_href: '#', selected: scheme.id.eql?(selected_collection_id), - target_frame: 'collection', data: {collectionid: collection['@id']}) + target_frame: 'collection', data: {collectionid: collection['@id']}, is_reused: concept_reused?(submission: @submission, concept_id: scheme.id)) diff --git a/app/views/concepts/_list.html.haml b/app/views/concepts/_list.html.haml index e00c5966e7..9c9a28a848 100644 --- a/app/views/concepts/_list.html.haml +++ b/app/views/concepts/_list.html.haml @@ -9,7 +9,7 @@ - children_link, data, href = concept_tree_data(@ontology.acronym, concept, request_lang, []) = render TreeLinkComponent.new(child: concept, href: href, children_href: '#', selected: concept.id.eql?(concepts.first.id) && c.auto_click?, - target_frame: 'concept_show', data: data) + target_frame: 'concept_show', data: data, is_reused: concept_reused?(submission: @submission, concept_id: concept.id)) - c.error do = t('concepts.list_error') diff --git a/app/views/concepts/_show.html.haml b/app/views/concepts/_show.html.haml index fecb7bea9b..a30f061fdf 100644 --- a/app/views/concepts/_show.html.haml +++ b/app/views/concepts/_show.html.haml @@ -3,72 +3,73 @@ = render Display::AlertComponent.new do = t('concepts.use_jump_to') - else - = render TabsContainerComponent.new(type:'outline') do |c| + %div{'data-controller': 'concepts-json', 'data-action': 'click->concepts-json#update'} + = render TabsContainerComponent.new(type:'outline') do |c| + - c.pinned_right do + - if $PURL_ENABLED + %div.mx-1 + = link_to("#classPermalinkModal", class: "class-permalink nav-link", title: t('concepts.permanent_link_class'), aria: {label: t('concepts.permanent_link_class')}, data: {toggle: "modal", current_purl: "#{@current_purl}"}) do + %i{class: "fas fa-link", aria: {hidden: "true"}} + %div{'data-concepts-json-target': 'button'} + .concepts_json_button + = render RoundedButtonComponent.new(link: "#{@ontology.id}/classes/#{escape(@concept.id)}?display=all&apikey=#{get_apikey}", target:'_blank') + - apikey = "apikey=#{get_apikey}" + - baseClassUrl = "#{@ontology.id}/classes/#{escape(@concept.id)}" + - c.item(title: t('concepts.details'), path: '#details', selected: true, json_link: "#{baseClassUrl}?#{apikey}&display=all") - - c.pinned_right do - - if $PURL_ENABLED - %div.mx-1 - = link_to("#classPermalinkModal", class: "class-permalink nav-link", title: t('concepts.permanent_link_class'), aria: {label: t('concepts.permanent_link_class')}, data: {toggle: "modal", current_purl: "#{@current_purl}"}) do - %i{class: "fas fa-link", aria: {hidden: "true"}} - %div - = render RoundedButtonComponent.new(link: "#{@ontology.id}/classes/#{escape(@concept.id)}?display=all&apikey=#{get_apikey}", target:'_blank') + - unless skos? + - c.item(id: 'instances', path: '#instances', json_link: "#{baseClassUrl}/instances?#{apikey}") do + = t('concepts.instances') + ( + %span#concept_instances_sorted_list_count + ) - - c.item(title: t('concepts.details'), path: '#details', selected: true) + - c.item(title: t('concepts.visualization'), path: '#visualization') - - unless skos? - - c.item(id: 'instances', path: '#instances') do - = t('concepts.instances') - ( - %span#concept_instances_sorted_list_count - ) + - c.item(id: 'notes', path: '#notes', json_link: "#{baseClassUrl}/notes?#{apikey}") do + = t('concepts.notes') + %span#note_count_wrapper + ( + %span#note_count= @notes.length + ) + - c.item(id: 'mappings', path: '#mappings', json_link: "#{baseClassUrl}/mappings?#{apikey}") do + .d-flex + #{t('concepts.mappings')} + ( + = concept_mappings_loader(ontology_acronym: @ontology.acronym, concept_id: @concept.id) + ) - - c.item(title: t('concepts.visualization'), path: '#visualization') + - if @enable_ontolobridge + - c.item(title: t('concepts.new_term_requests'), path: '#request_term') - - c.item(id: 'notes', path: '#notes') do - = t('concepts.notes') - %span#note_count_wrapper - ( - %span#note_count= @notes.length - ) - - c.item(id: 'mappings', path: '#mappings') do - .d-flex - #{t('concepts.mappings')} - ( - = concept_mappings_loader(ontology_acronym: @ontology.acronym, concept_id: @concept.id) - ) - - - if @enable_ontolobridge - - c.item(title: t('concepts.new_term_requests'), path: '#request_term') - - - c.item_content do - = render :partial =>'/concepts/details' - - - unless skos? - c.item_content do - = render :partial =>'instances/instances' , locals: {id: "class-instances-data-table"} - - c.item_content do - = render :partial =>'/concepts/biomixer' + = render :partial =>'/concepts/details' - - c.item_content do - = render :partial =>'/notes/list' + - unless skos? + - c.item_content do + = render :partial =>'instances/instances' , locals: {id: "class-instances-data-table"} + - c.item_content do + = render :partial =>'/concepts/biomixer' - - c.item_content do - = render TurboFrameComponent.new(id:'concept_mappings', - src:"/ajax/mappings/get_concept_table?ontologyid=#{@ontology.acronym}&conceptid=#{CGI.escape(@concept.id)}") + - c.item_content do + = render :partial =>'/notes/list' - - if @enable_ontolobridge - c.item_content do - = render :partial =>'/concepts/request_term' + = render TurboFrameComponent.new(id:'concept_mappings', + src:"/ajax/mappings/get_concept_table?ontologyid=#{@ontology.acronym}&conceptid=#{CGI.escape(@concept.id)}") - :javascript - jQuery(document).ready(function(){ + - if @enable_ontolobridge + - c.item_content do + = render :partial =>'/concepts/request_term' - jQuery("#classPermalinkModal").on("shown.bs.modal", function (e) { - var currentPurl = jQuery("a.class-permalink").data("current-purl"); - jQuery("#purl_input").val(currentPurl); - }) + :javascript + jQuery(document).ready(function(){ + jQuery("#classPermalinkModal").on("shown.bs.modal", function (e) { + var currentPurl = jQuery("a.class-permalink").data("current-purl"); + jQuery("#purl_input").val(currentPurl); + }) - jQuery("#purl_input").on("click", function () { - jQuery(this).select(); - }); - }); + jQuery("#purl_input").on("click", function () { + jQuery(this).select(); + }); + }); diff --git a/app/views/home/cookies.html.haml b/app/views/home/cookies.html.haml new file mode 100644 index 0000000000..d02f687a9b --- /dev/null +++ b/app/views/home/cookies.html.haml @@ -0,0 +1,13 @@ += turbo_frame_tag :cookies_modal do + - if cookies[:cookies_accepted].nil? # don't re-render if a true/false selected + %section.cookies-modal + %h4 + = t('cookies_modal.title') + %p + = t('cookies_modal.paragraph1', portal: portal_name) + %p + = t('cookies_modal.paragraph2', portal: portal_name) + %div + = link_button_component(id:'accept-cookie-selector', value: t('cookies_modal.accept_button'), href: cookies_path(cookies: true), size: "slim", variant: 'primary') + %div.cookie-privacy-link + = link_to t('cookies_modal.privacy_link'), $FOOTER_LINKS.dig(:sections, :agreements, :privacy_policy) diff --git a/app/views/home/feedback/feedback.html.haml b/app/views/home/feedback/feedback.html.haml index 7d54a536b3..e23b01fdec 100644 --- a/app/views/home/feedback/feedback.html.haml +++ b/app/views/home/feedback/feedback.html.haml @@ -25,6 +25,9 @@ %p.feedback-email = t("home.feedback.feedback_info_text") %a{:href => "mailto: #{$SUPPORT_EMAIL}"}= $SUPPORT_EMAIL + = t("home.feedback.feedback_info_text_rest") + %a{:href => $GITHUB_ISSUES} + Github issues - if session[:user].nil? %p.feedback-input-title = t("home.feedback.email") diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml index 7a010b73da..83fc781581 100644 --- a/app/views/home/index.html.haml +++ b/app/views/home/index.html.haml @@ -173,24 +173,44 @@ %h4 = format_number_abbreviated(@users_count) %p= t("home.users") - .home-statistics-link.justify-content-end + .home-statistics-link.justify-content-end{style: @analytics.empty? && "visibility: hidden"} = link_to t("home.see_details"),'/statistics', target: "_blank" - .home-section - .home-statistics-container - .home-support-title - %p= t('home.support_and_collaborations') + - if @slices + .home-section + .home-section-title + .text + = "#{portal_name} slices" %hr.home-section-line/ - .home-support-items - - $HOME_PAGE_LOGOS&.each do |logo| - %a{href:logo[:url], target: "_blanc"} - %img{src: asset_path(logo[:img_src])} - - .home-section - .home-statistics-container - .home-support-title - %p= t('home.ontoportal_instances') + .home-section-description + .div + = t('home.slices_description') + .home-slices-container + - @slices.each do |slice, index| + - slice_link = "https://#{slice.acronym}.#{$UI_URL.sub("https://", "")}" + .home-slice{'data-controller': 'tooltip', title: content_tag(:div, slice.description, style: 'max-width: 200px')} + = link_to slice_link do + .home-slice-icon + .home-slice-ontologies + = slice.ontologies.length + = inline_svg 'icons/slices.svg', width: "70", height: "70" + + .home-slice-name + = "#{slice.name} (#{slice.acronym})" + = render Buttons::RegularButtonComponent.new(id:'regular-button', value: t('home.suggest_slice'), variant: "secondary", state: "regular", href: '/feedback') do |btn| + - btn.icon_right do + = inline_svg_tag "icons/plus.svg" + + .home-ontoportal-instances + .ontoportal-instances-container + .home-section-title.ontoportal + .text.mr-2 + = t('home.ontoportal_instances') %hr.home-section-line/ + + .home-section-description + .div + = home_ontoportal_description .home-support-items - $PORTALS_INSTANCES&.each do |portal| %div.text-center @@ -198,7 +218,16 @@ = inline_svg 'logo-white.svg', width: "35", height: "26" %p{style: "color: #{portal[:color]}"} = portal[:portal] - + + .home-section + .home-section-title + .text + = t('home.support_and_collaborations') + %hr.home-section-line/ + .home-support-items + - $HOME_PAGE_LOGOS&.each do |logo| + %a{href:logo[:url], target: "_blanc"} + %img{src: asset_path(logo[:img_src])} :javascript function submitAnnotator(){ diff --git a/app/views/instances/_details.html.haml b/app/views/instances/_details.html.haml index f1ddcb015a..146dcd9464 100644 --- a/app/views/instances/_details.html.haml +++ b/app/views/instances/_details.html.haml @@ -6,7 +6,7 @@ = render ConceptDetailsComponent.new(id:'instance-details', acronym: ontology_acronym, concept_id: @instance["@id"]) do |c| - c.header(stripped: true) do |t| - - t.add_row({th: t("instances.id")}, {td: link_to_with_actions(@instance["@id"]) }) + - t.add_row({th: t("instances.id")}, {td: link_to_with_actions(@instance["@id"], acronym: @ontology.acronym) }) - label = @instance['label'] || @instance['prefLabel'] - unless label.blank? diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index fcf060a9eb..1340bdbb26 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -1,25 +1,28 @@ - lang="<%=I18n.locale%>"> + lang="<%= I18n.locale %>"> - <%= render partial: 'ga_tracking' %> - + <%= render partial: 'ga_tracking' %> + - - + + - <% unless Rails.env.appliance? %> + <% unless Rails.env.appliance? %> - + <% end %> - - <%= csrf_meta_tag %> + + <%= csrf_meta_tag %> - <%if @title.nil?%><%=$ORG_SITE%><%else%><%="#{@title} | #{$ORG_SITE}"%><%end%> + + <% if @title.nil? %><%= $ORG_SITE %> + <% else %><%= "#{@title} | #{$ORG_SITE}" %> + <% end %> - - - - + + + + <%= stylesheet_link_tag "https://use.fontawesome.com/releases/v5.2.0/css/all.css", integrity: "sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ", crossorigin: "anonymous" %> <%= stylesheet_link_tag "application" %> @@ -27,18 +30,34 @@ <%= javascript_include_tag "vendor" %> - + - <%=render partial: 'layouts/topnav'%> - -
- <%=render partial: 'layouts/notices'%> \ No newline at end of file +<%= render partial: 'layouts/topnav' %> +<%= turbo_frame_tag :cookies_modal, src: cookies_path if cookies[:cookies_accepted].nil? && !(Rails.env.development? || Rails.env.test?) %> + +
+<%= render partial: 'layouts/notices' %> \ No newline at end of file diff --git a/app/views/layouts/_notices.html.haml b/app/views/layouts/_notices.html.haml index 7d99b276eb..3700404d4f 100644 --- a/app/views/layouts/_notices.html.haml +++ b/app/views/layouts/_notices.html.haml @@ -1,4 +1,4 @@ -- if Rails.env.appliance? +- if session[:user]&.admin? && Rails.env.appliance? = license_notification(current_license()) - flash.each do |key, message| @@ -6,21 +6,18 @@ - do_not_display_subdomain_info_here = Set.new(["homeall_resources"]) - if at_slice? && !do_not_display_subdomain_info_here.include?("#{controller.controller_name}#{controller.action_name}") - .subdomain_info{:style => "margin: 13px; padding: 5px; border: 1px solid gray; font-size:14px; background-color: #ffffcc;"} - %p{:style => "text-align: left; margin-bottom: 0;"} - - query_string = request.query_string.empty? ? "" : "?#{request.query_string}" - You are viewing the - %b= @subdomain_filter[:name] - %a.pop_window{:href => "help?pop=true#slice_definition", :target => "_blank"} - = $SITE - = t('layout.notices.slice') - = t('layout.notices.at') - = succeed "." do - %b= request.host - = $SITE - = succeed "." do - %a{:href => "#{$UI_URL}#{request.path}#{query_string}"} - = t('layout.notices.visit_the_site') + .slice-notice-bar-container + .slice-notice-bar + %div + .title + = t('home.viewing_slice') + .slice-name + = @subdomain_filter[:name] + .view-full-site-button + - query_string = request.query_string.empty? ? "" : "?#{request.query_string}" + = render Buttons::RegularButtonComponent.new(id:'slices-view-full-site', value: t('home.view_full_site'), variant: "primary", href: "#{$UI_URL}#{request.path}#{query_string}", color: 'warning', size: "slim") do |btn| + = btn.icon_right do + = inline_svg_tag "arrow-right.svg" #site-notice - message_name = "" - unless $SITE_NOTICE.nil? || $SITE_NOTICE.empty? diff --git a/app/views/layouts/_topnav.html.haml b/app/views/layouts/_topnav.html.haml index 4d0a013748..c73008dfeb 100644 --- a/app/views/layouts/_topnav.html.haml +++ b/app/views/layouts/_topnav.html.haml @@ -60,4 +60,6 @@ = link_to(t('layout.header.cite_us'), $FOOTER_LINKS[:sections][:about][:cite_us], target: "_blank") - s.item do = link_to(t('layout.header.release_notes'), $FOOTER_LINKS[:sections][:products][:release_notes], target: "_blank") + - s.item do + = link_to(t('taxonomy.groups_and_categories'), '/groups') diff --git a/app/views/layouts/appliance.html.haml b/app/views/layouts/appliance.html.haml index 817bd30265..3e306068c0 100644 --- a/app/views/layouts/appliance.html.haml +++ b/app/views/layouts/appliance.html.haml @@ -26,7 +26,8 @@ %body{:class => "#{controller_name} #{action_name}"} = render partial: "layouts/topnav" - + = turbo_frame_tag :cookies_modal, src: cookies_path if cookies[:cookies_accepted].nil? + %div.flex-grow-1 = render partial: "layouts/notices" = modal_frame_container diff --git a/app/views/layouts/ontology_viewer/_header.html.haml b/app/views/layouts/ontology_viewer/_header.html.haml index 877e8c4083..291df004d7 100644 --- a/app/views/layouts/ontology_viewer/_header.html.haml +++ b/app/views/layouts/ontology_viewer/_header.html.haml @@ -4,11 +4,13 @@ -# A header of sorts to display ontology name and subset of details. .ontology-details-header-container .ontology-details-path - %a{href: "/ontologies"} ontologies + %a{href: "/ontologies"} Ontologies - if @ontology.viewOf = inline_svg_tag 'arrow-right-outlined.svg' %div - = @ontology.viewOf.split('/').last + - viewOfAcronym = @ontology.viewOf.split('/').last + %a{href: "/ontologies/#{viewOfAcronym}"} + = viewOfAcronym = inline_svg_tag 'arrow-right-outlined.svg' %div = @ontology.acronym diff --git a/app/views/login/index.html.haml b/app/views/login/index.html.haml index 2ab02ae262..0d39f910b2 100644 --- a/app/views/login/index.html.haml +++ b/app/views/login/index.html.haml @@ -1,10 +1,9 @@ - @title = t('login.title') -- unless @errors.nil? - %div{:style => "color:red;"} - = t('login.invalid_login') - %ul +.d-flex.justify-content-center.mt-4 + - unless @errors.nil? + = render Display::AlertComponent.new(type: "danger", closable: false) do - for error in @errors - %li= error + %div=error .d-flex.justify-content-center .login-form = form_for(:user, :url => {:controller => 'login',:action=>'create'}) do |f| diff --git a/app/views/mappings/_count.html.haml b/app/views/mappings/_count.html.haml index e3cd5f9336..987837b6a3 100644 --- a/app/views/mappings/_count.html.haml +++ b/app/views/mappings/_count.html.haml @@ -1,7 +1,7 @@ = turbo_frame_tag "mappings_table" do .summary-mappings-tab .summary-mappings-tab-table - = render TableComponent.new(id: 'summary-mappings-table', borderless: true, outline: true, searching: true, sort_column: '0', no_init_sort: true) do |t| + = render TableComponent.new(id: 'summary-mappings-table', borderless: true, outline: true, searching: true, sort_column: '0', no_init_sort: true, search_placeholder: "Filter by semantic resources") do |t| - t.header do |h| - h.th {t("mappings.count.ontology")} - h.th {t("mappings.count.mappings")} diff --git a/app/views/mappings/_form.html.haml b/app/views/mappings/_form.html.haml index 264b680e70..edbedd7422 100644 --- a/app/views/mappings/_form.html.haml +++ b/app/views/mappings/_form.html.haml @@ -3,7 +3,7 @@ %div %span#create_mapping_spinner.card.p-3.text-center - = loading_spinner + = loader_component = render_alerts_container diff --git a/app/views/mappings/_show_line.html.haml b/app/views/mappings/_show_line.html.haml index c741b3b497..bbfab2b78e 100644 --- a/app/views/mappings/_show_line.html.haml +++ b/app/views/mappings/_show_line.html.haml @@ -14,11 +14,11 @@ - begin - ont = target_concept.explore.ontology - ont_name = ont.acronym - - ont_link = link_to ont_name, ontology_path(ont_name) + - ont_link = link_to ont_name, ontology_path(ont_name), 'data-turbo-frame':'_top' - rescue - ont_name = target_concept.links['ontology'] || target_concept.id - ont_link = ont_name - - cls_link = raw(get_link_for_cls_ajax(target_concept.id, ont_name)) + - cls_link = raw(get_link_for_cls_ajax(target_concept.id, ont_name, '_top')) - type = 'Internal' - else - cls_label = get_label_for_external_cls(target_concept.links["self"]) diff --git a/app/views/ontologies/browser/_ontologies.html.haml b/app/views/ontologies/browser/_ontologies.html.haml index 8e3d8bd304..bd3aed0cf5 100644 --- a/app/views/ontologies/browser/_ontologies.html.haml +++ b/app/views/ontologies/browser/_ontologies.html.haml @@ -1,6 +1,6 @@ = render InfiniteScrollComponent.new(id: 'ontologies_list', collection: @ontologies, - next_url: ontologies_filter_url(@request_params, page: @page.nextPage), + next_url: ontologies_with_filters_url(@request_params, page: @page.nextPage), current_page: @page.page, next_page: @page.nextPage) do |c| - if @page.page.eql?(1) diff --git a/app/views/ontologies/browser/browse.html.haml b/app/views/ontologies/browser/browse.html.haml index 83da56b6c5..d1979fd359 100644 --- a/app/views/ontologies/browser/browse.html.haml +++ b/app/views/ontologies/browser/browse.html.haml @@ -56,7 +56,11 @@ = browse_filter_section_label(key) %span.badge.badge-primary{"data-show-filter-count-target":"countSpan", style: "#{values[2] && values[2].positive? ? '' : 'display: none;'}"} = values[2] - = inline_svg_tag 'arrow-down.svg' + .d-flex.align-items-center + - if key.eql?(:categories) || key.eql?(:groups) + .mr-2 + = render Display::InfoTooltipComponent.new(text: browse_taxonomy_tooltip(key.to_s)) + = inline_svg_tag 'arrow-down.svg' .collapse{id: "browse-#{key}-filter", class: "#{values[2].positive? ? 'show': ''}"} .browse-filter-checks-container - values.first.each do |object| diff --git a/app/views/ontologies/concepts_browsers/_collections_picker.html.haml b/app/views/ontologies/concepts_browsers/_collections_picker.html.haml index 1191df3ac7..638bc9758b 100644 --- a/app/views/ontologies/concepts_browsers/_collections_picker.html.haml +++ b/app/views/ontologies/concepts_browsers/_collections_picker.html.haml @@ -8,5 +8,5 @@ %label{:for => id} Collections %div = select_tag(:collections,options_for_select(collections_labels.map{|s| [s["prefLabel"].last, s["@id"], {'data-color': s['color']}]}, selected_collection.map{|x| x["@id"]}), - { multiple: multiple, id: id, class:"form-control", include_blank: true, - data:{controller:'chosen', 'chosen-name-value': :collectionid}.merge(data)}) \ No newline at end of file + { multiple: multiple, id: id, + data:{controller:'skos-collections-selector', 'skos-collections-selector-name-value': :collectionid}.merge(data)}) \ No newline at end of file diff --git a/app/views/ontologies/concepts_browsers/_concepts_tree.html.haml b/app/views/ontologies/concepts_browsers/_concepts_tree.html.haml index d4affe93f9..1160a7d29f 100644 --- a/app/views/ontologies/concepts_browsers/_concepts_tree.html.haml +++ b/app/views/ontologies/concepts_browsers/_concepts_tree.html.haml @@ -13,7 +13,7 @@ = render partial: 'ontologies/concepts_browsers/collections_picker', locals: {multiple: true, id: 'collection-color-filter', data: {action: 'changed->skos-collection-colors#updateCollectionTags' , - 'chosen-enable-colors-value': 'true'}} + 'skos-collection-colors-enable-colors-value': 'true'}} -# Class tree %div#sd_content.px-1{style: 'overflow-y: scroll; height: 60vh;'} - if skos? && @roots&.empty? diff --git a/app/views/ontologies/concepts_browsers/_scheme_picker.html.haml b/app/views/ontologies/concepts_browsers/_scheme_picker.html.haml index 958807977a..97046b62ca 100644 --- a/app/views/ontologies/concepts_browsers/_scheme_picker.html.haml +++ b/app/views/ontologies/concepts_browsers/_scheme_picker.html.haml @@ -12,6 +12,6 @@ = select_tag(:concept_schemes, options_for_select(schemes_labels.map{|s| [s["prefLabel"].last, s["@id"]]}, selected_scheme.compact.map{|x| x["@id"]} ), {multiple: true, id: "schemes_select", - data:{controller:'chosen', 'chosen-name-value': :concept_schemes, + data:{controller:'skos-collections-selector', 'skos-collections-selector-name-value': :concept_schemes, action: 'changed->history#updateURL changed->turbo-frame#updateFrame'}}) diff --git a/app/views/ontologies/content_serializer.html.haml b/app/views/ontologies/content_serializer.html.haml index beda316957..34045b7b93 100644 --- a/app/views/ontologies/content_serializer.html.haml +++ b/app/views/ontologies/content_serializer.html.haml @@ -1,2 +1,3 @@ = render_in_modal do - = rdf_highlighter_container(@format, @result) if @result + #resource_content_modal + = rdf_highlighter_container(@format, @result) if @result diff --git a/app/views/ontologies/htaccess.html.haml b/app/views/ontologies/htaccess.html.haml index bd59fcbe1b..a48615550d 100644 --- a/app/views/ontologies/htaccess.html.haml +++ b/app/views/ontologies/htaccess.html.haml @@ -1,68 +1,70 @@ = render_in_modal do - %p - = t("ontologies.htaccess_redirection_description") + #redirection_rules_modal + %p + = t("ontologies.htaccess_redirection_description") - %h5 - %strong - = t("ontologies.instructions_servers", server: "Apache") - %ol - %li + %h5 %strong - = t("ontologies.htaccess_redirection.instruction_1") - = t("ontologies.htaccess_redirection.instruction_1_content") - %li - %strong - = t("ontologies.htaccess_redirection.instruction_2") - = t("ontologies.htaccess_redirection.instruction_2_content") - %li - %strong - = t("ontologies.htaccess_redirection.instruction_3") - = t("ontologies.htaccess_redirection.instruction_3_content") - - .htacess-code-container - .clipboard-component-resource-content{style: 'position: absolute; right: 2%; top: 8%;'} - = render ClipboardComponent.new(message: @htaccess_content, show_content: false) - %pre.mb-0 - %code.d-block{style: 'text-wrap: pretty; word-break: break-all; color: white;'} - = @htaccess_content + = t("ontologies.instructions_servers", server: "Apache") + %ol + %li + %strong + = t("ontologies.htaccess_redirection.instruction_1") + = t("ontologies.htaccess_redirection.instruction_1_content") + %li + %strong + = t("ontologies.htaccess_redirection.instruction_2") + = t("ontologies.htaccess_redirection.instruction_2_content") + %li + %strong + = t("ontologies.htaccess_redirection.instruction_3") + = t("ontologies.htaccess_redirection.instruction_3_content") + + .htacess-code-container + .clipboard-component-resource-content{style: 'position: absolute; right: 2%; top: 8%;'} + = render ClipboardComponent.new(message: @htaccess_content, show_content: false) + %pre.mb-0 + %code.d-block{style: 'text-wrap: pretty; word-break: break-all; color: white;'} + = @htaccess_content - %hr + %hr - %h5 - %strong - = t("ontologies.instructions_servers", server: "Nginx") - %ol - %li - %strong - = t("ontologies.nginx_redirection.instruction_1") - = t("ontologies.nginx_redirection.instruction_1_content") - %li - %strong - = t("ontologies.nginx_redirection.instruction_2") - = t("ontologies.nginx_redirection.instruction_2_content") - %li - %strong - = t("ontologies.nginx_redirection.instruction_3") - = t("ontologies.nginx_redirection.instruction_3_content") - %li - %strong - = t("ontologies.nginx_redirection.instruction_4") - = t("ontologies.nginx_redirection.instruction_4_content") - %li + %h5 %strong - = t("ontologies.nginx_redirection.instruction_5") - = t("ontologies.nginx_redirection.instruction_5_content") + = t("ontologies.instructions_servers", server: "Nginx") + %ol + %li + %strong + = t("ontologies.nginx_redirection.instruction_1") + = t("ontologies.nginx_redirection.instruction_1_content") + %li + %strong + = t("ontologies.nginx_redirection.instruction_2") + = t("ontologies.nginx_redirection.instruction_2_content") + %li + %strong + = t("ontologies.nginx_redirection.instruction_3") + = t("ontologies.nginx_redirection.instruction_3_content") + %li + %strong + = t("ontologies.nginx_redirection.instruction_4") + = t("ontologies.nginx_redirection.instruction_4_content") + %li + %strong + = t("ontologies.nginx_redirection.instruction_5") + = t("ontologies.nginx_redirection.instruction_5_content") - .htacess-code-container - .clipboard-component-resource-content{style: 'position: absolute; right: 2%; top: 8%;'} - = render ClipboardComponent.new(message: @nginx_content, show_content: false) - %pre.mb-0 - %code.d-block{style: 'text-wrap: pretty; word-break: break-all; color: white;'} - = @nginx_content - - %h5 - %strong Note - = render Display::AlertComponent.new(message: t("ontologies.redirection_note"), closable: false, type: "warning") + .nginx-code-container + .clipboard-component-resource-content{style: 'position: absolute; right: 2%; top: 8%;'} + = render ClipboardComponent.new(message: @nginx_content, show_content: false) + %pre.mb-0 + %code.d-block{style: 'text-wrap: pretty; word-break: break-all; color: white;'} + = @nginx_content + + #redirection_note + %h5 + %strong Note + = render Display::AlertComponent.new(message: t("ontologies.redirection_note"), closable: false, type: "warning") - .contact-support{style: "width: 100%; display: flex; justify-content: end;"} - = render Buttons::RegularButtonComponent.new(id:'regular-button', value: t("ontologies.contact_support"), variant: "primary", href: "/feedback", target: "_blank", state: "regular") \ No newline at end of file + .contact-support{style: "width: 100%; display: flex; justify-content: end;"} + = render Buttons::RegularButtonComponent.new(id:'regular-button', value: t("ontologies.contact_support"), variant: "primary", href: "/feedback", target: "_blank", state: "regular") diff --git a/app/views/ontologies/new.html.haml b/app/views/ontologies/new.html.haml index 92f88fc21a..67a9163866 100644 --- a/app/views/ontologies/new.html.haml +++ b/app/views/ontologies/new.html.haml @@ -1,7 +1,7 @@ - @title = t("ontologies.submit_new_ontology") %div{:style => "margin:10px;"} - = form_for :ontology, url: {action: "create"}, html: {id: "ontologyForm", multipart: true} do + = form_for :ontology, url: {action: "create"}, html: {id: "ontologyForm", multipart: true, novalidate: true} do .upload-ontology-container %div{style: 'width: 589px'} = error_message_alert diff --git a/app/views/ontologies/sections/_metadata.html.haml b/app/views/ontologies/sections/_metadata.html.haml index 9dd1a07df7..69aadbc570 100755 --- a/app/views/ontologies/sections/_metadata.html.haml +++ b/app/views/ontologies/sections/_metadata.html.haml @@ -36,7 +36,7 @@ document.querySelector("[data-target='#projects_section']")?.click() } = properties_dropdown('methodology',t("ontologies.sections.methodology_and_provenance"), t("ontologies.sections.info_tooltip_properties_dropdown"), @methodology_properties) - = properties_dropdown('community',t("ontologies.sections.community"), t("ontologies.sections.info_tooltip_properties_dropdown"), nil ) do |c| + = properties_dropdown('community',t("ontologies.sections.community"), t("ontologies.sections.info_tooltip_community_dropdown", site: portal_name), nil ) do |c| - properties_list_component(c, @community_properties, truncate: false) - unless Array(@ontology.group).empty? - c.row do @@ -44,7 +44,7 @@ = horizontal_list_container(@ontology.group) do |v| = render ChipButtonComponent.new(text: show_group_name(v), type: "static", tooltip: show_group_name(v)) - = properties_dropdown('content',t("ontologies.sections.content"), t("ontologies.sections.info_tooltip_properties_dropdown"), nil) do |c| + = properties_dropdown('content',t("ontologies.sections.content"), t("ontologies.sections.info_tooltip_properties_dropdown", site: portal_name), nil) do |c| - properties_list_component(c, @content_properties.reject{|k, v| %w[keyClasses metadataVoc].include?(k.to_s)}) - c.row do = render FieldContainerComponent.new(label: attr_label('metadataVoc', attr_metadata: attr_metadata("metadataVoc"), show_tooltip: false)) do diff --git a/app/views/ontologies/sections/metadata/_ontology_description_section.html.haml b/app/views/ontologies/sections/metadata/_ontology_description_section.html.haml index dc0c5221f8..db7525d510 100644 --- a/app/views/ontologies/sections/metadata/_ontology_description_section.html.haml +++ b/app/views/ontologies/sections/metadata/_ontology_description_section.html.haml @@ -54,7 +54,7 @@ - l.row do = render FieldContainerComponent.new(label: t("ontologies.sections.metadata.categories_and_subjects")) do = horizontal_list_container(show_ontology_domains(domains).uniq) do |v| - = render ChipButtonComponent.new(text: show_category_name(v), type: "static") + = category_name_chip_component(v) - if @submission_latest&.pullLocation - l.row do diff --git a/app/views/properties/_show.html.haml b/app/views/properties/_show.html.haml index c034301496..f74964f85e 100644 --- a/app/views/properties/_show.html.haml +++ b/app/views/properties/_show.html.haml @@ -3,14 +3,16 @@ - if @property.errors = render Display::AlertComponent.new(type:'info', message: @property.errors.join) - else + - properties = LinkedData::Client::Models::Property.properties_to_hash(@property).first = render ConceptDetailsComponent.new(id:'property-details', acronym: @acronym, concept_id: @property.id, - properties: OpenStruct.new(LinkedData::Client::Models::Property.properties_to_hash(@property).first), + properties: @property.properties, top_keys: [], - bottom_keys: [], + bottom_keys: properties.keys.map(&:to_s), exclude_keys: []) do |c| - c.header(stripped: true) do |t| - - t.add_row({th: t('properties.id')}, {td: link_to_with_actions(c.concept_properties[:id][:values], acronym: @acronym)}) if c.concept_properties[:id][:values].present? - - t.add_row({th: t('properties.type')}, {td: c.concept_properties[:type][:values] }) if c.concept_properties[:id][:values].present? - - t.add_row({th: t('properties.preferred_name')}, {td: display_in_multiple_languages(c.concept_properties[:label][:values])}) if c.concept_properties[:label][:values].present? - - t.add_row({th: t('properties.definitions')}, {td: display_in_multiple_languages(c.concept_properties[:definition][:values])}) if c.concept_properties[:definition][:values].present? - - t.add_row({th: t('properties.parent')}, {td: display_in_multiple_languages(c.concept_properties[:parents][:values])}) if c.concept_properties[:parents][:values].present? \ No newline at end of file + - t.add_row({th: t('properties.id')}, {td: link_to_with_actions(@property.id, acronym: @acronym)}) + - t.add_row({th: t('properties.type')}, {td: @property.type }) + - t.add_row({th: t('properties.preferred_name')}, {td: display_in_multiple_languages(@property.label)}) unless @property.label.blank? + - t.add_row({th: t('properties.definitions')}, {td: display_in_multiple_languages(@property.definition)}) unless @property.definition.blank? + - t.add_row({th: t('properties.domain')}, {td: get_link_for_cls_ajax(@property.domain, @acronym, '_top')}) unless @property.domain.blank? + - t.add_row({th: t('properties.range')}, {td: get_link_for_cls_ajax(@property.range, @acronym, '_top')}) unless @property.range.blank? diff --git a/app/views/recommender/index.html.haml b/app/views/recommender/index.html.haml index 10a5c83331..5ac33ba53c 100644 --- a/app/views/recommender/index.html.haml +++ b/app/views/recommender/index.html.haml @@ -51,7 +51,7 @@ .title = t('recommender.weights_configuration') .inputs-container - -#binding.pry + .ninput = render Input::RangeSliderComponent.new(label: t('recommender.coverage'), name: "wc", value: params[:wc] || 0.55, min: '0', max: '1', step: '0.01') .ninput diff --git a/app/views/taxonomy/_taxonomies.html.haml b/app/views/taxonomy/_taxonomies.html.haml new file mode 100644 index 0000000000..0dd56f6876 --- /dev/null +++ b/app/views/taxonomy/_taxonomies.html.haml @@ -0,0 +1,10 @@ +.taxonomy-section + - pairs, impairs = taxonomies.each_with_index.partition { |_, index| index.even? } + - taxonomies_first_row = pairs.map(&:first) + - taxonomies_second_row = impairs.map(&:first) + .first-row + - taxonomies_first_row.each do |taxonomy| + = render Display::TaxonomyCardComponent.new(taxonomy: taxonomy, ontologies_names: @ontologies_names) + .second-row + - taxonomies_second_row.each do |taxonomy| + = render Display::TaxonomyCardComponent.new(taxonomy: taxonomy, ontologies_names: @ontologies_names) \ No newline at end of file diff --git a/app/views/taxonomy/index.html.haml b/app/views/taxonomy/index.html.haml new file mode 100644 index 0000000000..967f63d330 --- /dev/null +++ b/app/views/taxonomy/index.html.haml @@ -0,0 +1,24 @@ +.taxonomy-page-container + .taxonomy-page-subcontainer + .taxonomy-page-title + .text + = t('taxonomy.groups_and_categories') + .line + .taxonomy-page-decription + = t('taxonomy.description') + + = render TabsContainerComponent.new do |c| + - c.item(title: 'Groups', selected: !@category_section_active) + - c.item_content do + = render partial: '/taxonomy/taxonomies', locals: { taxonomies: @groups } + + - c.item(title: 'Categories', selected: @category_section_active) + - c.item_content do + = render partial: '/taxonomy/taxonomies', locals: { taxonomies: @categories } +:javascript + document.getElementById('categories_tab').addEventListener('click', function(event) { + window.history.pushState({ path: '/categories' }, '', '/categories'); + }) + document.getElementById('groups_tab').addEventListener('click', function(event) { + window.history.pushState({ path: '/groups' }, '', '/groups'); + }) \ No newline at end of file diff --git a/app/views/users/_form.html.haml b/app/views/users/_form.html.haml index 3a2f38b52c..02fde4988d 100644 --- a/app/views/users/_form.html.haml +++ b/app/views/users/_form.html.haml @@ -27,13 +27,13 @@ ORCID ID %font.register-optional = t('register.optional') - %img.register-input-icon{:src => "#{asset_path("orcid.svg")}"}/ + = inline_svg_tag 'orcid.svg', class: 'register-input-icon' = text_field :user, :orcidId, value: @user.orcidId, class: "register-input-long register-input-with-icon" %p.register-input-title Github ID %font.register-optional = t('register.optional') - %img.register-input-icon{:src => "#{asset_path("github-icon.svg")}"}/ + = inline_svg_tag 'github-icon.svg', class: 'register-input-icon' = text_field :user, :githubId, value: @user.githubId, class: "register-input-long register-input-with-icon" %p.register-input-title = t('register.email') diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index 3c4f285974..cb69ab11a5 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -57,10 +57,10 @@ %a{href: "#{$REST_URL}/documentation", target: "_blank"} = t('users.show.api_documentation') = render partial: "shared/svgs/external_link_icon" - .account-page-card + .account-page-card{'data-controller': 'reveal-component'} %h4.account-page-card-title = t('users.show.custom_semantic_resource') - #custom_ontologies.enable-lists + #custom_ontologies.enable-lists{'data-reveal-component-target': "item"} - if at_slice? %p{style: "padding-left: 7px; font-size: 10pt; margin: -3px 0 7px;"} = t('users.show.please') @@ -70,21 +70,20 @@ = t('users.show.customize_portal_display', portal: portal_name) %p %span{style: "font-weight: normal; font-size: 9pt; padding-left: 7px;"} - %a#edit_custom_ontologies{href: "javascript:void(0);"}= t('users.show.select_semantic_resources') - - if @user_ontologies && !@user_ontologies.empty? - %ul - - @user_ontologies.each do |ont| - - ont = LinkedData::Client::Models::Ontology.get(ont) - %li - #{ont.name} (#{ont.acronym}) - - else - %p{style: "padding-left: 7px;"}= t('users.show.no_semantic_resources') + %a#edit_custom_ontologies{'data-action': "click->reveal-component#toggle", 'data-reveal-component-target': "item", style: 'cursor: pointer;'}= t('users.show.select_semantic_resources') + + .account-page-custom-ontologies + - @user_ontologies.each do |ont| + - ont = @ontologies.select{ |o| o.id.eql?(ont) }.first + = render ChipButtonComponent.new(url: "/ontologies/#{ont.acronym}", text: ont.acronym , type: "clickable", tooltip: ont.name) + %p.account-page-card-desc= t('users.show.note_feature_logged_in') - #custom_ontologies_picker{style: "left: -9999px; position: absolute;"} + #custom_ontologies_picker.d-none{'data-reveal-component-target': "item"} = form_tag custom_ontologies_path(url_encode(@user.username)) do - - selected = @user.customOntology.map {|o| LinkedData::Client::Models::Ontology.get(o).acronym} - = ontologies_selector(id:'account_page_ontologies_selector' ,name: 'ontologies', selected: selected) - = submit_tag t('users.show.save_custom_semantic_resources'), class: "link_button" + - selected = @user.customOntology.map {|o| o.split('/').last } + = ontologies_selector(id:'account_page_ontologies_selector' ,name: 'ontologies', selected: selected, ontologies: @all_ontologies_for_select) + .mt-3 + = render Buttons::RegularButtonComponent.new(id: 'submit_custom_set', variant: "secondary", size: "slim", type: 'submit', value: t('users.show.save_custom_semantic_resources')) .account-page-second-row .account-page-card %h4.account-page-card-title= t('users.show.subscriptions') @@ -128,15 +127,4 @@ - else - @user_projects.each do |project| .account-page-submitted-ontology - %a{href: "/projects/#{project.acronym}"}= project.name - -:javascript - jQuery(document).ready(function(){ - jQuery("#edit_custom_ontologies").click(editCustomOntologies); - }); - - - function editCustomOntologies() { - jQuery("#custom_ontologies_picker").css("left", "").css("position", ""); - jQuery("#custom_ontologies").hide(); - } + %a{href: "/projects/#{project.acronym}"}= project.name \ No newline at end of file diff --git a/bin/ontoportal b/bin/ontoportal index a2c030b23a..3fa5d29391 100755 --- a/bin/ontoportal +++ b/bin/ontoportal @@ -135,7 +135,7 @@ dev() { bash_cmd+=" (bundle config unset local.ontologies_api_client) &&" fi done - bash_cmd+=" (bundle check || bundle install) && bin/rails db:prepare && bundle exec rails s -b 0.0.0.0 -p 3000" + bash_cmd+=" (bundle check || bundle install) && bin/rails secret && EDITOR='nano' bin/rails credentials:edit && bin/rails db:prepare && bundle exec rails s -b 0.0.0.0 -p 3000" docker_run_cmd+=" --service-ports dev bash -c \"$bash_cmd\"" echo "$docker_run_cmd" echo "Run: bundle exec rails s -b 0.0.0.0 -p 3000" diff --git a/bin/run_api b/bin/run_api index 8ed4d11dc0..5d1634b2f8 100755 --- a/bin/run_api +++ b/bin/run_api @@ -52,7 +52,7 @@ image_tag="${image_tag:-$API_IMAGE_TAG}" starter_ontology="${starter_ontology:-$STARTER_ONTOLOGY}" remote_api_url="${remote_api_url:-$OP_API_URL}" -if curl -sSf http://localhost:9393 > /dev/null 2>&1; then +if curl -sSf http://localhost:9393 > /dev/null 2>&1; then echo "API is already running in http://localhost:9393" exit 0 fi @@ -62,7 +62,7 @@ docker compose ls -a --filter "name=ontoportal_docker" | grep -q "ontoportal_doc ( cd tmp/ontoportal_docker || exit 1 command="./run -k $api_key -r $image_repository -t $image_tag -s $starter_ontology -u $remote_api_url" - [ "$no_provision" = true ] && command="$command --no-provision" + [ "$no_provision" = true ] && command="$command" echo "Run: $command" eval "$command" ) diff --git a/config/bioportal_config_env.rb.sample b/config/bioportal_config_env.rb.sample index bf07df798f..277b972015 100644 --- a/config/bioportal_config_env.rb.sample +++ b/config/bioportal_config_env.rb.sample @@ -258,7 +258,10 @@ $PORTALS_INSTANCES = [ link: 'https://biodivportal.gfbio.org/' } ] +$ONTOPORTAL_WEBSITE_LINK = "https://ontoportal.org/" +$ONTOPORTAL_GITHUB_REPO = "https://github.com/ontoportal" +$GITHUB_ISSUES = "https://github.com/agroportal/project-management/issues" $FOOTER_LINKS = { social: [ { logo: "social/people.svg", link: "https://github.com/orgs/agroportal/people" }, @@ -274,12 +277,13 @@ $FOOTER_LINKS = { api: "https://data.agroportal.lirmm.fr/", tools: "/tools", sparql: "https://sparql.agroportal.lirmm.fr/test/", - ontoportal: "https://ontoportal.org/" + ontoportal: $ONTOPORTAL_WEBSITE_LINK }, support: { contact_us: "https://#{$SITE}.lirmm.fr/feedback", documentation: "https://ontoportal.github.io/documentation/", - agro_documentation: "https://doc.jonquetlab.lirmm.fr/share/e6158eda-c109-4385-852c-51a42de9a412/doc/public-documentation-QMpsC9aVBb" + agro_documentation: "https://doc.jonquetlab.lirmm.fr/share/e6158eda-c109-4385-852c-51a42de9a412/doc/public-documentation-QMpsC9aVBb", + issues_and_requests: $GITHUB_ISSUES }, agreements: { terms: $TERMS_AND_CONDITIONS_LINK, @@ -307,3 +311,4 @@ if $HOSTNAME require_relative "bioportal_config_development_#{$HOSTNAME}" end end + diff --git a/config/bioportal_config_test.rb b/config/bioportal_config_test.rb index 44169096be..91ed16b4df 100644 --- a/config/bioportal_config_test.rb +++ b/config/bioportal_config_test.rb @@ -8,7 +8,7 @@ $API_KEY = ENV['API_KEY'] $REST_URL = ENV['API_URL'] $BIOMIXER_URL = ENV['BIOMIXER_URL'] -$ANNOTATOR_URL = $PROXY_URL = ENV['ANNOTATOR_URL'] +$ANNOTATOR_URL = $PROXY_URL = ENV['ANNOTATOR_URL'].blank? ? "https://services.tesportal.lirmm.fr/annotator" : ENV['ANNOTATOR_URL'] $FAIRNESS_URL = ENV['FAIRNESS_URL'] # Resource term @@ -58,8 +58,6 @@ $ENABLE_SLICES = false $ONTOLOGY_SLICES = {} -# Cube metrics reporting -$ENABLE_CUBE = false $NOT_DOWNLOADABLE = {} # Enable client request caching @@ -218,7 +216,4 @@ } ] -$UI_THEME = :stageportal -if File.exist?('config/bioportal_config_development_testportal.lirmm.fr.rb') - require_relative 'bioportal_config_development_testportal.lirmm.fr' # local credentials -end \ No newline at end of file +$UI_THEME = :stageportal \ No newline at end of file diff --git a/config/environment.rb b/config/environment.rb index 99be33ce5c..0c158d03b5 100755 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,5 +1,6 @@ # Load the Rails application. -require_relative "application" +require_relative 'application' + # Remove this after migrating to Rails 7.1 (https://github.com/rails/rails/issues/32947#issuecomment-1356391185) class Rails::Application diff --git a/config/initializers/cube_reporter.rb b/config/initializers/cube_reporter.rb deleted file mode 100644 index 136f509dd5..0000000000 --- a/config/initializers/cube_reporter.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'cube' - -## -# This enables collection of request statistics for anaylsis via cube. -# A cube server is required. See http://square.github.io/cube/ for more info. -module Rack - class CubeReporter - - def initialize(app = nil, options = {}) - host = options[:cube_host] || "localhost" - port = options[:cube_port] || 1180 - @app = app - @cube = ::Cube::Client.new(host, port) - end - - def call(env) - start = Time.now - data = @app.call(env) - finish = Time.now - user = env["rack.session"] ? env["rack.session"][:user] : nil - apikey = user.apikey if user - username = user.username if user - req_data = { - duration_ms: ((finish - start)*1000).ceil, - path: env["REQUEST_PATH"], - status: data[0], - user: { - apikey: apikey, - username: username, - ip: env["REMOTE_ADDR"], - user_agent: env["HTTP_USER_AGENT"] - } - } - @cube.send "ui_request", DateTime.now, req_data - data - end - - end -end - -if global_variables.include?(:$ENABLE_CUBE) && $ENABLE_CUBE == true - Rails.configuration.middleware.use(::Rack::CubeReporter, {cube_host: $CUBE_HOST, cube_port: $CUBE_PORT}) -end \ No newline at end of file diff --git a/config/initializers/miniprofiler.rb b/config/initializers/miniprofiler.rb deleted file mode 100644 index 05194cebbe..0000000000 --- a/config/initializers/miniprofiler.rb +++ /dev/null @@ -1,2 +0,0 @@ -Rack::MiniProfiler.config.authorization_mode = :allow_authorized -Rack::MiniProfiler.config.position = 'right' diff --git a/config/locales/en.yml b/config/locales/en.yml index e937ed62de..20d3bea716 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -203,6 +203,7 @@ en: description: Description created: Created ontologies: Ontologies + parent_category: Parent category edit: edit_category: Edit category save: Save @@ -390,7 +391,8 @@ en: error_on_form: Errors On Form leave_your_feedback: Leave your feedback feedback_hi_text: Hi - feedback_info_text: you can use the form below or email us directly at + feedback_info_text: You can use the form below, email us directly at + feedback_info_text_rest: or leave us a github issue here email: Email name: Name proposition_url_page: Error/Proposition page URL @@ -405,6 +407,11 @@ en: feedback_complete: title: Feedback sent successfully message: Thank you for taking the time to share your feedback with us. Our support team will review your message and get back to you as soon as possible with a response. We value your opinion and appreciate your help in improving our services. Thank you for your support! + suggest_slice: Suggest a new group/slice + slices_description: Slices allow users to interact (both via API or UI) only with a subset of ontologies in AgroPortal. If browsing the slice, all the portal features will be restricted to the chosen subset, enabling users to focus on their specific use cases. On AgroPortal, slices and groups are synchronized, so every group has a corresponding slice displaying only the ontologies from that group. + ontoportal_description: "The OntoPortal Alliance %{ontoportal_link} is a consortium of research and infrastructure teams dedicated to promoting the development of ontology repositories and semantic artefact catalogues based on the open, collaboratively developed OntoPortal software %{github_link}. Hereafter are the current public and open repositories built with the technology maintained by the Alliance." + viewing_slice: "Viewing the slice:" + view_full_site: View full website landscape: #select_ontologies: Start typing to select ontologies or leave blank to use them all classes: Number of classes @@ -505,6 +512,7 @@ en: wiki: Wiki documentation: Documentation agro_documentation: "%{site} documentation" + issues_and_requests: Issues and Requests agreements: Legal terms: Terms and Conditions privacy_policy: Privacy Policy @@ -533,7 +541,7 @@ en: enter_email: Enter your username enter_password: Enter your password forgot_password: Forgot password? - invalid_login: Errors on the form + private_ontology: This ontology is private. Please login. no_account: Do not have an account? password: Password register: Register @@ -642,6 +650,10 @@ en: actions: Actions see_other_properties: See other properties agents: + errors: + required: is required and cannot be empty + used_identifier: This identifier is already used by another agent + invalid_url: The identifier must be a valid ORCID/ROR URL not_found_agent: Agent with id %{id} add_agent: New Agent added successfully update_agent: Agent successfully updated @@ -670,6 +682,7 @@ en: index: create_new_agent: Create New Agent first_name: First name + acronym: Acronym usages: Usages actions: Actions no_agents: There are currently no agents. @@ -935,7 +948,7 @@ en: synonym: Synonym definition: Definition parent: Parent - save: save + save: Save note_line: alert_text: "Are you sure you want to delete the note ''%{subject}'' created by %{creator}?
This action CAN NOT be undone!!!" delete: Delete @@ -946,8 +959,8 @@ en: reply: about_note_decorator: about %{note_decorator} comment: Comment - save: save - cancel: cancel + save: Save + cancel: Cancel ontolobridge: problem_of_creating_new_term: "Problem creating a new term %{endpoint}: %{class} - %{message}" new_term_instructions_saved: New term request instructions for %{acronym} saved @@ -1073,21 +1086,21 @@ en: close: Close submit: Submit check_resolvability: - check_resolvability_message_1: "The URL is resolvable and support the following formats: %{supported_format}" - check_resolvability_message_2: "The URL resolvable but is not content negotiable, support only: %{supported_format}" - check_resolvability_message_3: The URL is not resolvable and not content negotiable (returns %{status}). + check_resolvability_message_1: "The URI is resolvable and support the following formats: %{supported_format}" + check_resolvability_message_2: "The URI resolvable but is not content negotiable, support only: %{supported_format}" + check_resolvability_message_3: The URI is not resolvable and not content negotiable (returns %{status}). uri_placeholder: Type a URI to test its resolvability show_help: Show help format_not_specified: Format not specified how_it_works: title: How it works content_1: | - The check resolvability tool allows you to test if a given URL is resolvable. It is based on the HTTP HEAD method. - We check the resolvability of a URL by sending a HEAD request to the URL and checking if the response status code is 200 (OK) and + The check resolvability tool allows you to test if a given URI is resolvable. It is based on the HTTP HEAD method. + We check the resolvability of a URI by sending a HEAD request to the URI and checking if the response status code is 200 (OK) and the returned content type is equal to one of the following %{resolvability_formats}. content_2: | - We have a timeout set to %{resolvability_timeout} seconds, so if the URL is not resolvable within that time, the check will fail. - And a max redirections set to %{resolvability_max_redirections}, so if the URL is not resolvable within that number of redirections, the check will fail. + We have a timeout set to %{resolvability_timeout} seconds, so if the URI is not resolvable within that time, the check will fail. + And a max redirections set to %{resolvability_max_redirections}, so if the URI is not resolvable within that number of redirections, the check will fail. resolving_uri: title: Resolving a URI content: | @@ -1260,6 +1273,7 @@ en: community: Community content: Content info_tooltip_properties_dropdown: Metadata properties primarily encompass the design, methods, and actions to create the ontology. This includes elements such as the tools and software employed by the creator of the ontology during its configuration. + info_tooltip_community_dropdown: Metadata properties related to community information such as the code repository and issue tracker, the mailing list or the target audience. This includes also the Groups in %{site}. See more information about Groups and Categories. visits: Visits views: Views of %{acronym} create_new_view: Create new view @@ -1373,7 +1387,7 @@ en: instruction_4_content: "Run the following command to test the redirection configuration `sudo nginx -t`" instruction_5: "Reload Nginx to apply the changes:" instruction_5_content: "Restart the nginx server to apply the redirection using this command `sudo systemctl reload nginx`" - + components: check_resolvability: checking resolvability... error_block: child_data_generator block did not provide all the child arguements @@ -1405,7 +1419,7 @@ en: view: View debug: Debug loading: Loading - unwatch: UnWatch + unwatch: Unwatch watch: Watch resource: "%{sub_text} this resource" notified_of_all_updates: Be the first to watch this resource and be notified of all its updates @@ -1421,6 +1435,8 @@ en: preferred_name: Preferred name definitions: Definitions parent: Parent + domain: Domain + range: Range no_properties_alert: "%{acronym} does not contain properties" visits: ontology_visits: Ontology visits @@ -1467,4 +1483,14 @@ en: email: "Email: %{email}" location: "Location: %{location}" tags: Tags - feedback: Feedback \ No newline at end of file + feedback: Feedback + cookies_modal: + title: "Manage Cookie Consent" + paragraph1: "%{portal} uses cookies to help you navigate efficiently and for audience measurement. You will find detailed information about all cookies in the \"Privacy policy\" link" + paragraph2: "The cookies are functional and non-optional. By staying on %{portal}, you acknowledge the information was delivered to you." + accept_button: "Accept" + privacy_link: "Privacy policy" + taxonomy: + groups_and_categories: Groups and Categories + description: In AgroPortal, ontologies are organized in groups and tagged with categories. Typically, groups associate ontologies from the same project or organization for better identification of the provenance. Whereas categories are about subjects/topics and enable to classify ontologies. As of 2016, AgroPortal's categories were established in cooperation with FAO AIMS. In 2024, we moved to UNESCO nomenclature for fields of science and technology. Groups and categories, along with other metadata, can be used on the “Browse” page of AgroPortal to filter out the list of ontologies. + show_sub_categories: Show sub categories \ No newline at end of file diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 994644fde5..165eecd62d 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -209,6 +209,7 @@ fr: description: Description created: Créé ontologies: Ontologies + parent_category: Catégorie parent edit: edit_category: Modifier la catégorie save: Sauvegarder @@ -301,9 +302,9 @@ fr: total_results: Résultats totaux insert_sample_text: Insérer un texte d'exemple sample_text: Il y a eu de nombreuses études récentes sur l'utilisation d'antagonistes microbiens pour contrôler les maladies causées par des bactéries phytopathogènes telluriques - et aériennes, dans le but de remplacer les méthodes actuelles de contrôle chimique et d'éviter l'utilisation extensive de fongicides, qui conduisent souvent à une résistance chez les pathogènes des plantes. - En agriculture, les microorganismes promoteurs de croissance des plantes et de biocontrôle ont émergé comme des alternatives sûres aux pesticides chimiques. Les espèces de Streptomyces et leurs - métabolites peuvent avoir un grand potentiel en tant qu'agents excellents pour contrôler divers phytopathogènes fongiques et bactériens. + et aériennes, dans le but de remplacer les méthodes actuelles de contrôle chimique et d'éviter l'utilisation extensive de fongicides, qui conduisent souvent à une résistance chez les pathogènes des plantes. + En agriculture, les microorganismes promoteurs de croissance des plantes et de biocontrôle ont émergé comme des alternatives sûres aux pesticides chimiques. Les espèces de Streptomyces et leurs + métabolites peuvent avoir un grand potentiel en tant qu'agents excellents pour contrôler divers phytopathogènes fongiques et bactériens. concepts: error_valid_concept: "Erreur : Vous devez fournir un identifiant de concept valide" @@ -397,7 +398,8 @@ fr: error_on_form: Erreurs sur le formulaire leave_your_feedback: Laissez votre retour feedback_hi_text: Salut - feedback_info_text: vous pouvez utiliser le formulaire ci-dessous ou nous envoyer un email directement à + feedback_info_text: Vous pouvez utiliser le formulaire ci-dessous, nous envoyer un email directement à + feedback_info_text_rest: ou nous laisser une github issue ici email: Email name: Nom proposition_url_page: URL de la page Erreur/Proposition @@ -412,6 +414,11 @@ fr: feedback_complete: title: Retour envoyé avec succès message: Merci d'avoir pris le temps de partager votre retour avec nous. Notre équipe de support examinera votre message et vous répondra dès que possible. Nous apprécions votre opinion et sommes reconnaissants de votre aide pour améliorer nos services. Merci de votre soutien ! + suggest_slice: Proposer un nouveau groupe/slice + slices_description: Les "slices" permettent aux utilisateurs d'interagir (à la fois via l'API ou l'interface utilisateur) uniquement avec un sous-ensemble d'ontologies dans AgroPortal. Si vous parcourez une slice, toutes les fonctionnalités du portail seront limitées au sous-ensemble choisi; cela permet aux utilisateurs de se concentrer sur leurs cas d'utilisation spécifiques. Sur AgroPortal, les slices et les groupes sont synchronisés, de sorte que chaque groupe a une slice correspondante affichant uniquement les ontologies de ce groupe. + ontoportal_description: "L'OntoPortal Alliance %{ontoportal_link} est un consortium d'équipes de recherche et d'infrastructure dédiées à promouvoir le développement de portails d'ontologies et de catalogues d'artefacts sémantiques basés sur le logiciel OntoPortal %{github_link} ouvert et collaboratif. Ci-dessous se trouvent les portails publics et ouverts actuels construits avec la technologie maintenue par l'Alliance." + viewing_slice: "Affichage de la slice:" + view_full_site: Voir le site complet landscape: #select_ontologies: Commencez à taper pour sélectionner des ontologies ou laissez vide pour les utiliser toutes @@ -514,6 +521,7 @@ fr: wiki: Wiki documentation: Documentation agro_documentation: Documentation d'%{site} + issues_and_requests: Problèmes et demandes agreements: Légal terms: Termes et conditions privacy_policy: Politique de confidentialité @@ -543,7 +551,7 @@ fr: enter_email: Entrez votre nom d'utilisateur enter_password: Entrez votre mot de passe forgot_password: Mot de passe oublié ? - invalid_login: Erreurs sur le formulaire + private_ontology: Cette ontologie est privée. Veuillez vous connecter. no_account: Vous n'avez pas de compte ? password: Mot de passe register: S'inscrire @@ -656,6 +664,10 @@ fr: agents: + errors: + required: est requis et ne peut pas être vide + used_identifier: Cet identifiant est déjà utilisé par un autre agent + invalid_url: L'identifiant doit être une URL ORCID/ROR valide not_found_agent: Agent avec id %{id} add_agent: Nouvel agent ajouté avec succès update_agent: Agent mis à jour avec succès @@ -684,6 +696,7 @@ fr: index: create_new_agent: Créer un nouvel agent first_name: Prénom + acronym: Acronyme usages: Utilisations actions: Actions no_agents: Il n'y a actuellement aucun agent. @@ -956,7 +969,7 @@ fr: synonym: Synonyme definition: Définition parent: Parent - save: sauvegarder + save: Sauvegarder note_line: alert_text: "Êtes-vous sûr de vouloir supprimer la note ''%{subject}'' créée par %{creator}?
Cette action NE PEUT PAS être annulée !!!" delete: Supprimer @@ -967,8 +980,8 @@ fr: reply: about_note_decorator: à propos de %{note_decorator} comment: Commentaire - save: sauvegarder - cancel: annuler + save: Sauvegarder + cancel: Annuler ontolobridge: problem_of_creating_new_term: "Problème de création d'un nouveau terme %{endpoint} : %{class} - %{message}" @@ -1098,21 +1111,21 @@ fr: submit: Soumettre check_resolvability: - check_resolvability_message_1: "L'URL est résolvable et supporte les formats suivants : %{supported_format}" - check_resolvability_message_2: "L'URL est résolvable mais n'est pas négociable en contenu, supporte uniquement : %{supported_format}" - check_resolvability_message_3: L'URL n'est pas résolvable et n'est pas négociable en contenu (retourne %{status}). + check_resolvability_message_1: "L'URI est résolvable et supporte les formats suivants : %{supported_format}" + check_resolvability_message_2: "L'URI est résolvable mais n'est pas négociable en contenu, supporte uniquement : %{supported_format}" + check_resolvability_message_3: L'URI n'est pas résolvable et n'est pas négociable en contenu (retourne %{status}). uri_placeholder: Tapez une URI pour tester sa résolvabilité show_help: Afficher l'aide format_not_specified: Format non spécifié how_it_works: title: Comment ça fonctionne content_1: | - L'outil de vérification de la résolvabilité vous permet de tester si une URL donnée est résolvable. Il est basé sur la méthode HTTP HEAD. - Nous vérifions la résolvabilité d'une URL en envoyant une requête HEAD à l'URL et en vérifiant si le code de statut de la réponse est 200 (OK) et + L'outil de vérification de la résolvabilité vous permet de tester si une URI donnée est résolvable. Il est basé sur la méthode HTTP HEAD. + Nous vérifions la résolvabilité d'une URI en envoyant une requête HEAD à l'URI et en vérifiant si le code de statut de la réponse est 200 (OK) et si le type de contenu retourné est égal à l'un des %{resolvability_formats} suivants. content_2: | - Nous avons un délai d'attente fixé à %{resolvability_timeout} secondes, donc si l'URL n'est pas résolvable dans ce délai, la vérification échouera. - Et un nombre maximal de redirections fixé à %{resolvability_max_redirections}, donc si l'URL n'est pas résolvable dans ce nombre de redirections, la vérification échouera. + Nous avons un délai d'attente fixé à %{resolvability_timeout} secondes, donc si l'URI n'est pas résolvable dans ce délai, la vérification échouera. + Et un nombre maximal de redirections fixé à %{resolvability_max_redirections}, donc si l'URI n'est pas résolvable dans ce nombre de redirections, la vérification échouera. resolving_uri: title: Résolution d'une URI content: | @@ -1289,6 +1302,7 @@ fr: community: Communauté content: Contenu info_tooltip_properties_dropdown: Propriétés de métadonnées englobant principalement la conception, les méthodes et les actions pour créer l'ontologie. Cela inclut des éléments tels que les outils et logiciels utilisés par le créateur de l'ontologie lors de sa configuration. + info_tooltip_community_dropdown: Propriétés des métadonnées liées aux informations communautaires telles que le dépôt de code et le suivi des problèmes, la liste de diffusion ou le public cible. Cela inclut également les Groupes dans %{site}. Voir plus d'informations sur les Groupes et les Catégories. visits: Visites views: Vues de %{acronym} create_new_view: Créer une nouvelle vue @@ -1456,6 +1470,8 @@ fr: preferred_name: Nom préféré definitions: Définitions parent: Parent + domain: Domaine + range: Étendue no_properties_alert: "%{acronym} ne contient pas de propriétés" visits: @@ -1509,3 +1525,14 @@ fr: location: "Emplacement: %{location}" tags: Tags feedback: Feedback + + cookies_modal: + title: "Gérer le consentement des cookies" + paragraph1: "%{portal} utilise des cookies pour vous aider à naviguer efficacement et pour mesurer l'audience. Vous trouverez des informations détaillées sur tous les cookies dans le lien \"Vie privé\"" + paragraph2: "Les cookies sont fonctionnels et non facultatifs. En restant sur %{portal}, vous reconnaissez que les informations vous ont été transmises." + accept_button: "Accepter" + privacy_link: "Vie privé" + taxonomy: + groups_and_categories: Groupes et Catégories + description: Dans AgroPortal, les ontologies sont organisées en groupes et étiquetées avec des catégories. Typiquement, les groupes associent des ontologies provenant du même projet ou de la même organisation pour une meilleure identification de la provenance. Tandis que les catégories concernent des sujets/thématiques et permettent de classifier les ontologies. En 2016, les catégories d'AgroPortal ont été établies en coopération avec FAO AIMS. En 2024, nous sommes passés à la nomenclature de l'UNESCO pour les domaines des sciences et des technologies. Les groupes et les catégories, ainsi que d'autres métadonnées, peuvent être utilisés sur la page “Parcourir” d'AgroPortal pour filtrer la liste des ontologies. + show_sub_categories: Afficher les sous-catégories \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index de09142b5e..f31620d09a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,5 @@ Rails.application.routes.draw do + match 'cookies', to: 'home#set_cookies', via: [:post, :get] root to: 'home#index' mount LetterOpenerWeb::Engine, at: "/letter_opener" if Rails.env.development? @@ -134,7 +135,7 @@ # Top-level pages match '/feedback', to: 'home#feedback', via: [:get, :post] - get '/account' => 'home#account' + get '/account' => 'users#show' get '/site_config' => 'home#site_config' post '/annotator_recommender_form' => 'home#annotator_recommender_form' match '/visits', to: 'visits#index', via: :get @@ -154,7 +155,6 @@ get '/ontologies/:acronym/:id/serialize/:output_format' => 'ontologies#content_serializer', :id => /.+/ get '/ontologies/:acronym/htaccess' => 'ontologies_redirection#generate_htaccess' - get '/ontologies/virtual/:ontology' => 'ontologies#virtual', :as => :ontology_virtual get '/ontologies/success/:id' => 'ontologies#submit_success' match '/ontologies/:acronym' => 'ontologies#update', via: [:get, :post] match '/ontologies/:acronym/submissions/:id' => 'submissions#update', via: [:get, :post] @@ -162,29 +162,23 @@ match '/ontologies/:ontology_id/submissions' => 'submissions#create', :ontology_id => /.+/, via: [:post] match '/ontologies/:ontology_id/submissions' => 'submissions#index', :ontology_id => /.+/, via: [:get] get '/ontologies/:acronym/classes/:purl_conceptid', to: 'ontologies#show', constraints: { purl_conceptid: /[^\/]+/ } - get '/ontologies/:acronym/: f', to: 'ontologies#show', constraints: { purl_conceptid: /[^\/]+/ } match '/ontologies/:acronym/submissions/:id/edit_metadata' => 'submissions#edit_metadata', via: [:get, :post] get '/ontologies_filter', to: 'ontologies#ontologies_filter' get 'ontologies_selector', to: 'ontologies#ontologies_selector' get 'ontologies_selector/results', to: 'ontologies#ontologies_selector_results' + # Notes get 'ontologies/:ontology/notes/:noteid', to: 'notes#virtual_show', as: :note_virtual, noteid: /.+/ get 'ontologies/:ontology/notes', to: 'notes#virtual_show' get '/ontologies/:acronym/:id' => 'ontologies_redirection#redirect', :id => /.+/ - # Ajax - get '/ajax/' => 'ajax_proxy#get', :as => :ajax get '/ajax/class_details' => 'concepts#details' get '/ajax/mappings/get_concept_table' => 'mappings#get_concept_table' - get '/ajax/json_ontology' => 'ajax_proxy#json_ontology' - get '/ajax/json_class' => 'ajax_proxy#json_class' - get '/ajax/jsonp' => 'ajax_proxy#jsonp' get '/ajax/notes/delete' => 'notes#destroy' - get '/ajax/notes/concept_list' => 'notes#show_concept_list' get '/ajax/classes/label' => 'concepts#show_label' get '/ajax/classes/definition' => 'concepts#show_definition' get '/ajax/classes/treeview' => 'concepts#show_tree' @@ -203,6 +197,7 @@ get '/ajax/ontologies', to: "ontologies#ajax_ontologies" get '/ajax/agents', to: "agents#ajax_agents" get '/ajax/images/show' => 'application#show_image_modal' + # User get '/logout' => 'login#destroy', :as => :logout get '/lost_pass' => 'login#lost_password' @@ -212,6 +207,9 @@ get '/login_as/:login_as' => 'login#login_as', constraints: { login_as: /[\d\w\.\-\%\+ ]+/ } post '/login/send_pass', to: 'login#send_pass' + get '/groups' => 'taxonomy#index' + get '/categories' => 'taxonomy#index' + # Search get 'search', to: 'search#index' get 'ajax/search/ontologies/content', to: 'search#json_ontology_content_search' @@ -219,33 +217,8 @@ get 'check_resolvability' => 'check_resolvability#index' get 'check_url_resolvability' => 'check_resolvability#check_resolvability' - ########################################################################################################### # Install the default route as the lowest priority. get '/:controller(/:action(/:id))' - ########################################################################################################### - - ##### - ## OLD ROUTES - ## All of these should redirect to new addresses in the controller method or using the redirect controller - ##### - - # Redirects from old URL locations - get '/annotate' => 'redirect#index', :url => '/annotator' - get '/visconcepts/:ontology/' => 'redirect#index', :url => '/visualize/' - get '/ajax/terms/label' => 'redirect#index', :url => '/ajax/classes/label' - get '/ajax/terms/definition' => 'redirect#index', :url => '/ajax/classes/definition' - get '/ajax/terms/treeview' => 'redirect#index', :url => '/ajax/classes/treeview' - get '/ajax/term_details/:ontology' => 'redirect#index', :url => '/ajax/class_details' - get '/ajax/json_term' => 'redirect#index', :url => '/ajax/json_class' - - # Visualize - get '/visualize/:ontology' => 'ontologies#visualize', :as => :visualize, :constraints => { ontology: /[^\/?]+/ } - get '/visualize/:ontology/:conceptid' => 'ontologies#visualize', :as => :uri, :constraints => { ontology: /[^\/?]+/, conceptid: /[^\/?]+/ } - get '/visualize' => 'ontologies#visualize', :as => :visualize_concept, :constraints => { ontology: /[^\/?]+/, id: /[^\/?]+/, ontologyid: /[^\/?]+/, conceptid: /[^\/?]+/ } - - get '/exhibit/:ontology/:id' => 'concepts#exhibit' - mount Lookbook::Engine, at: "/lookbook" - end diff --git a/docker-compose.yml b/docker-compose.yml index 644e1ca6ed..3c70bbe887 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,16 +17,11 @@ x-app: &default-app condition: service_started node: condition: service_started - links: - - db - - cache environment: &env BUNDLE_WITHOUT: "" BUNDLE_PATH: /srv/ontoportal/bundle DB_HOST: db CACHE_HOST: cache - ports: - - "3000:3000" tmpfs: - /tmp - /app/tmp/pids @@ -64,6 +59,11 @@ services: dev: <<: *default-app + ports: + - "3000:3000" + links: + - db + - cache production: <<: *default-app @@ -77,6 +77,11 @@ services: #RAILS_MASTER_KEY: TODO BIOPORTAL_WEB_UI_DATABASE_PASSWORD: root MEMCACHE_SERVERS: "cache:11211" + ports: + - "3000:3000" + links: + - db + - cache depends_on: db: condition: service_healthy @@ -103,9 +108,10 @@ services: chrome-server: image: selenium/standalone-chrome:112.0-chromedriver-112.0-grid-4.9.0-20230421 shm_size: 2g - ports: - - "4444:4444" - - "7900:7900" + network_mode: 'host' +# ports: +# - "4444:4444" +# - "7900:7900" volumes: mysql-data: diff --git a/lib/resolver/acronym_from_virtual.rb b/lib/resolver/acronym_from_virtual.rb deleted file mode 100644 index 5e753e84e3..0000000000 --- a/lib/resolver/acronym_from_virtual.rb +++ /dev/null @@ -1,535 +0,0 @@ -BpidResolver::ACRONYM_FROM_VIRTUAL = { - "old:acronym_from_virtual:3013" => "DIAGONT", - "old:acronym_from_virtual:3245" => "SuicidO", - "old:acronym_from_virtual:1247" => "GEOSPECIES", - "old:acronym_from_virtual:1054" => "AMINO-ACID", - "old:acronym_from_virtual:2012" => "goslim_pir", - "old:acronym_from_virtual:3015" => "PMR", - "old:acronym_from_virtual:3212" => "GLYCOPROT", - "old:acronym_from_virtual:3271" => "BSAO", - "old:acronym_from_virtual:2099" => "GWAS_EFO_SKOS", - "old:acronym_from_virtual:1062" => "PR", - "old:acronym_from_virtual:3004" => "NATPRO", - "old:acronym_from_virtual:1584" => "MMO", - "old:acronym_from_virtual:1046" => "SBO", - "old:acronym_from_virtual:1545" => "CO-WHEAT", - "old:acronym_from_virtual:1016" => "FB-DV", - "old:acronym_from_virtual:1059" => "CPRO", - "old:acronym_from_virtual:3238" => "PDO", - "old:acronym_from_virtual:1576" => "FDA-MEDDEVICE", - "old:acronym_from_virtual:1114" => "BILA", - "old:acronym_from_virtual:1055" => "GALEN", - "old:acronym_from_virtual:1158" => "CBO", - "old:acronym_from_virtual:3151" => "GEXO", - "old:acronym_from_virtual:2109" => "ooevv-vaccine", - "old:acronym_from_virtual:1488" => "JERM", - "old:acronym_from_virtual:3234" => "BOF", - "old:acronym_from_virtual:3047" => "DEMOGRAPH", - "old:acronym_from_virtual:1613" => "BDO", - "old:acronym_from_virtual:1142" => "EP", - "old:acronym_from_virtual:3127" => "IMMDIS", - "old:acronym_from_virtual:1461" => "TMO", - "old:acronym_from_virtual:3146" => "CMS", - "old:acronym_from_virtual:1125" => "HP", - "old:acronym_from_virtual:2033" => "iceci-instrument_object_substance", - "old:acronym_from_virtual:1033" => "NMR", - "old:acronym_from_virtual:1666" => "MFOEM", - "old:acronym_from_virtual:1615" => "CHEMBIO", - "old:acronym_from_virtual:3184" => "ZIP3", - "old:acronym_from_virtual:3150" => "BRIDG", - "old:acronym_from_virtual:2054" => "NCBI_NMOsp_1_0_0", - "old:acronym_from_virtual:1370" => "ATO", - "old:acronym_from_virtual:3268" => "ERNO", - "old:acronym_from_virtual:3261" => "STNFRDRXDEMO", - "old:acronym_from_virtual:2032" => "iceci-details_for_place_of_occurrence", - "old:acronym_from_virtual:1402" => "NIFCELL", - "old:acronym_from_virtual:1427" => "RCD", - "old:acronym_from_virtual:1565" => "OMRSE", - "old:acronym_from_virtual:1517" => "EHDAA2", - "old:acronym_from_virtual:1347" => "MEDLINEPLUS", - "old:acronym_from_virtual:3243" => "NHSQI2009", - "old:acronym_from_virtual:1640" => "PEDTERM", - "old:acronym_from_virtual:1354" => "WHO-ART", - "old:acronym_from_virtual:1095" => "XAO", - "old:acronym_from_virtual:1661" => "UCSFXPLANT", - "old:acronym_from_virtual:3174" => "IDODEN", - "old:acronym_from_virtual:1146" => "ECG", - "old:acronym_from_virtual:1065" => "TADS", - "old:acronym_from_virtual:3028" => "SOY", - "old:acronym_from_virtual:1100" => "OGI", - "old:acronym_from_virtual:2086" => "SMD_NPLSM_BRST", - "old:acronym_from_virtual:1136" => "EFO", - "old:acronym_from_virtual:1050" => "ZEA", - "old:acronym_from_virtual:3124" => "VSO", - "old:acronym_from_virtual:2085" => "SMD_NPLSM", - "old:acronym_from_virtual:1047" => "GRO-CPD", - "old:acronym_from_virtual:1540" => "DDI", - "old:acronym_from_virtual:2007" => "goslim_generic_1_770", - "old:acronym_from_virtual:3155" => "ONTOKBCF", - "old:acronym_from_virtual:2045" => "ICF-d5", - "old:acronym_from_virtual:1350" => "LOINC", - "old:acronym_from_virtual:1099" => "ATMO", - "old:acronym_from_virtual:3231" => "GLYCANONT", - "old:acronym_from_virtual:3131" => "PROVO", - "old:acronym_from_virtual:1123" => "OBI", - "old:acronym_from_virtual:2035" => "iceci-mechanism", - "old:acronym_from_virtual:1420" => "MSHSPA_1", - "old:acronym_from_virtual:1304" => "BCGO", - "old:acronym_from_virtual:1042" => "OBOREL", - "old:acronym_from_virtual:1049" => "WB-LS", - "old:acronym_from_virtual:1328" => "HOM", - "old:acronym_from_virtual:1575" => "EXO", - "old:acronym_from_virtual:3077" => "ONTODM-KDD", - "old:acronym_from_virtual:2108" => "ooevv-tractTrace", - "old:acronym_from_virtual:3191" => "MPO", - "old:acronym_from_virtual:1349" => "PDQ", - "old:acronym_from_virtual:3239" => "CSSO", - "old:acronym_from_virtual:2038" => "iceci-details_for_activity", - "old:acronym_from_virtual:1522" => "BP", - "old:acronym_from_virtual:1587" => "PO", - "old:acronym_from_virtual:1116" => "BHO", - "old:acronym_from_virtual:3038" => "HOM-TEST", - "old:acronym_from_virtual:1001" => "GRO-CPGA", - "old:acronym_from_virtual:2025" => "NIF-RTH", - "old:acronym_from_virtual:1537" => "IDOBRU", - "old:acronym_from_virtual:1009" => "DOID", - "old:acronym_from_virtual:3178" => "CANONT", - "old:acronym_from_virtual:2036" => "iceci-place_of_occurrence", - "old:acronym_from_virtual:1112" => "UO", - "old:acronym_from_virtual:3153" => "NTDO", - "old:acronym_from_virtual:1010" => "EMAP", - "old:acronym_from_virtual:1541" => "MCCL", - "old:acronym_from_virtual:1067" => "WB-PHENOTYPE", - "old:acronym_from_virtual:1560" => "COGPO", - "old:acronym_from_virtual:1697" => "UCSFORTHO", - "old:acronym_from_virtual:1260" => "RID", - "old:acronym_from_virtual:1091" => "SPD", - "old:acronym_from_virtual:2103" => "ICPCFRE", - "old:acronym_from_virtual:1069" => "ENVO", - "old:acronym_from_virtual:1686" => "NEOMARK4", - "old:acronym_from_virtual:1527" => "VANDF", - "old:acronym_from_virtual:1057" => "RADLEX", - "old:acronym_from_virtual:3258" => "OBR-Scolio", - "old:acronym_from_virtual:1500" => "RNAO", - "old:acronym_from_virtual:3042" => "TEO", - "old:acronym_from_virtual:2114" => "citation", - "old:acronym_from_virtual:2003" => "BiositemapIM", - "old:acronym_from_virtual:2029" => "iceci-countermeasures", - "old:acronym_from_virtual:3264" => "WH", - "old:acronym_from_virtual:1144" => "DC-CL", - "old:acronym_from_virtual:1418" => "TOK", - "old:acronym_from_virtual:1497" => "PMA", - "old:acronym_from_virtual:2093" => "OBI_IEDB_view", - "old:acronym_from_virtual:3252" => "SSE", - "old:acronym_from_virtual:1183" => "LIPRO", - "old:acronym_from_virtual:1423" => "RXNORM", - "old:acronym_from_virtual:1026" => "MAO", - "old:acronym_from_virtual:1555" => "VSAO", - "old:acronym_from_virtual:3031" => "QUDT", - "old:acronym_from_virtual:3223" => "GCO", - "old:acronym_from_virtual:1172" => "VO", - "old:acronym_from_virtual:1068" => "SAO", - "old:acronym_from_virtual:1410" => "KISAO", - "old:acronym_from_virtual:1520" => "LSM", - "old:acronym_from_virtual:2050" => "ICF-d810-d839", - "old:acronym_from_virtual:3021" => "ATC", - "old:acronym_from_virtual:1063" => "CARO", - "old:acronym_from_virtual:1530" => "ADW", - "old:acronym_from_virtual:2120" => "provenance", - "old:acronym_from_virtual:3017" => "GCC", - "old:acronym_from_virtual:2056" => "NCBI_NMOsp_1_2_2", - "old:acronym_from_virtual:3206" => "HCPCS-HIMC", - "old:acronym_from_virtual:1104" => "BRO", - "old:acronym_from_virtual:1092" => "IDO", - "old:acronym_from_virtual:1413" => "SWO", - "old:acronym_from_virtual:3032" => "EPICMEDS", - "old:acronym_from_virtual:1456" => "MSHFRE", - "old:acronym_from_virtual:1077" => "MIRO", - "old:acronym_from_virtual:1051" => "ZFA", - "old:acronym_from_virtual:2055" => "NCBI_NMOsp_1_2_1", - "old:acronym_from_virtual:3090" => "ONTOMA", - "old:acronym_from_virtual:3104" => "USSOC", - "old:acronym_from_virtual:1573" => "TM-MER", - "old:acronym_from_virtual:3092" => "CLINIC", - "old:acronym_from_virtual:1616" => "PHYLONT", - "old:acronym_from_virtual:2023" => "NCBITaxonOWL", - "old:acronym_from_virtual:1656" => "PHENOMEBLAST", - "old:acronym_from_virtual:3219" => "MSTDE", - "old:acronym_from_virtual:1025" => "MP", - "old:acronym_from_virtual:1670" => "ICDO3", - "old:acronym_from_virtual:1089" => "BIRNLEX", - "old:acronym_from_virtual:3215" => "MIXS", - "old:acronym_from_virtual:1532" => "SIO", - "old:acronym_from_virtual:2105" => "SNMD_BDY", - "old:acronym_from_virtual:3022" => "BIOMODELS", - "old:acronym_from_virtual:2053" => "ICF-d840-d859%2Fd860-d879", - "old:acronym_from_virtual:3262" => "BCTEO", - "old:acronym_from_virtual:1168" => "Amino_Acid-zh_CN", - "old:acronym_from_virtual:1550" => "PHARE", - "old:acronym_from_virtual:1398" => "LDA", - "old:acronym_from_virtual:1428" => "NIC", - "old:acronym_from_virtual:1567" => "PVONTO", - "old:acronym_from_virtual:3211" => "TEST-PROD", - "old:acronym_from_virtual:2124" => "ICD9CM-PROC", - "old:acronym_from_virtual:3255" => "CHMO", - "old:acronym_from_virtual:3204" => "PORO", - "old:acronym_from_virtual:1043" => "REX", - "old:acronym_from_virtual:1689" => "FYPO", - "old:acronym_from_virtual:3008" => "CARELEX", - "old:acronym_from_virtual:1570" => "TM-CONST", - "old:acronym_from_virtual:2070" => "obi-fged", - "old:acronym_from_virtual:2002" => "BRO-AreaOfResearch", - "old:acronym_from_virtual:2020" => "SNOMEDCT-ANAT", - "old:acronym_from_virtual:2092" => "envo_153", - "old:acronym_from_virtual:3045" => "ICD9CM-KM", - "old:acronym_from_virtual:3108" => "CCONT", - "old:acronym_from_virtual:1438" => "MCBCC", - "old:acronym_from_virtual:1348" => "OMIM", - "old:acronym_from_virtual:1515" => "INO", - "old:acronym_from_virtual:3176" => "XEO", - "old:acronym_from_virtual:2009" => "goslim_plant", - "old:acronym_from_virtual:2078" => "H1_NMOABA", - "old:acronym_from_virtual:3183" => "IFAR", - "old:acronym_from_virtual:2046" => "ICF-d6", - "old:acronym_from_virtual:3186" => "I2B2-LOINC", - "old:acronym_from_virtual:3265" => "BNO", - "old:acronym_from_virtual:2110" => "DTVPrecision", - "old:acronym_from_virtual:1581" => "HLTHINDCTRS", - "old:acronym_from_virtual:3220" => "MSTDE-FRE", - "old:acronym_from_virtual:3009" => "MEO", - "old:acronym_from_virtual:1694" => "CPT-KM", - "old:acronym_from_virtual:1052" => "PRO-ONT", - "old:acronym_from_virtual:1290" => "ABA-AMB", - "old:acronym_from_virtual:3000" => "MIXSCV", - "old:acronym_from_virtual:1038" => "PSDS", - "old:acronym_from_virtual:1023" => "FBbi", - "old:acronym_from_virtual:1060" => "CTONT", - "old:acronym_from_virtual:1249" => "SBRO", - "old:acronym_from_virtual:1152" => "MAT", - "old:acronym_from_virtual:2101" => "test1", - "old:acronym_from_virtual:1083" => "NPO", - "old:acronym_from_virtual:1013" => "EVOC", - "old:acronym_from_virtual:1407" => "TEDDY", - "old:acronym_from_virtual:2113" => "bibliographic", - "old:acronym_from_virtual:2030" => "iceci-descriptor_for_intent", - "old:acronym_from_virtual:2084" => "OGMD_OWL", - "old:acronym_from_virtual:1053" => "FMA", - "old:acronym_from_virtual:1422" => "MEDDRA", - "old:acronym_from_virtual:2010" => "goslim_candida", - "old:acronym_from_virtual:3273" => "HRDO", - "old:acronym_from_virtual:3152" => "REXO", - "old:acronym_from_virtual:3222" => "RSA", - "old:acronym_from_virtual:3207" => "ATOL", - "old:acronym_from_virtual:1498" => "EDAM", - "old:acronym_from_virtual:1109" => "SO", - "old:acronym_from_virtual:1224" => "SYMP", - "old:acronym_from_virtual:3253" => "OntoVIP", - "old:acronym_from_virtual:1237" => "SITBAC", - "old:acronym_from_virtual:2042" => "ICF-d2", - "old:acronym_from_virtual:3263" => "OntoBioUSP", - "old:acronym_from_virtual:1649" => "OSHPD", - "old:acronym_from_virtual:3247" => "EDDA", - "old:acronym_from_virtual:1671" => "QIBO", - "old:acronym_from_virtual:1585" => "XCO", - "old:acronym_from_virtual:1006" => "CL", - "old:acronym_from_virtual:1424" => "NDDF", - "old:acronym_from_virtual:3114" => "RPO", - "old:acronym_from_virtual:1426" => "MDDB", - "old:acronym_from_virtual:3169" => "GLYCO", - "old:acronym_from_virtual:2065" => "obi-device", - "old:acronym_from_virtual:1192" => "CPTAC", - "old:acronym_from_virtual:1032" => "NCIT", - "old:acronym_from_virtual:2067" => "RCJI", - "old:acronym_from_virtual:1017" => "FB-CV", - "old:acronym_from_virtual:2014" => "goslim_yeast", - "old:acronym_from_virtual:3251" => "ADO", - "old:acronym_from_virtual:1081" => "TTO", - "old:acronym_from_virtual:3162" => "RETO", - "old:acronym_from_virtual:1362" => "HAO", - "old:acronym_from_virtual:3240" => "RNPRIO", - "old:acronym_from_virtual:3272" => "CARD", - "old:acronym_from_virtual:3217" => "CABRO", - "old:acronym_from_virtual:2069" => "H1_NMOABA_1_0", - "old:acronym_from_virtual:3208" => "IDQA", - "old:acronym_from_virtual:3228" => "ELIG", - "old:acronym_from_virtual:1651" => "SDO", - "old:acronym_from_virtual:3126" => "NIFSUBCELL", - "old:acronym_from_virtual:3157" => "GENETRIAL", - "old:acronym_from_virtual:1070" => "GO", - "old:acronym_from_virtual:2088" => "SNMD_BC", - "old:acronym_from_virtual:1414" => "OGMS", - "old:acronym_from_virtual:1516" => "ICD10", - "old:acronym_from_virtual:1429" => "ICPC2P", - "old:acronym_from_virtual:3241" => "UDEF", - "old:acronym_from_virtual:2034" => "iceci-intent", - "old:acronym_from_virtual:2074" => "H1_NMOABA_2_0", - "old:acronym_from_virtual:1024" => "LHN", - "old:acronym_from_virtual:3003" => "CNO", - "old:acronym_from_virtual:2083" => "H1_NMOABA_4_1", - "old:acronym_from_virtual:1039" => "PROPREO", - "old:acronym_from_virtual:1638" => "ONTODM-CORE", - "old:acronym_from_virtual:2008" => "goslim_goa", - "old:acronym_from_virtual:3250" => "ONL-MR-DA", - "old:acronym_from_virtual:3136" => "NHDS", - "old:acronym_from_virtual:1393" => "IAO", - "old:acronym_from_virtual:1332" => "BFO", - "old:acronym_from_virtual:3203" => "HINO", - "old:acronym_from_virtual:2122" => "SciRes", - "old:acronym_from_virtual:2013" => "goslim_pombe", - "old:acronym_from_virtual:1627" => "HOMERUN", - "old:acronym_from_virtual:2117" => "event", - "old:acronym_from_virtual:1190" => "OPL", - "old:acronym_from_virtual:3002" => "MF", - "old:acronym_from_virtual:1417" => "FLU", - "old:acronym_from_virtual:1314" => "CLO", - "old:acronym_from_virtual:1101" => "ICD9CM", - "old:acronym_from_virtual:3029" => "SPTO", - "old:acronym_from_virtual:1381" => "NIFDYS", - "old:acronym_from_virtual:1440" => "GFO-BIO", - "old:acronym_from_virtual:1344" => "ICPC", - "old:acronym_from_virtual:1351" => "MESH", - "old:acronym_from_virtual:1094" => "PTRANS", - "old:acronym_from_virtual:1115" => "YPO", - "old:acronym_from_virtual:2126" => "CPT-mod", - "old:acronym_from_virtual:1621" => "NBO", - "old:acronym_from_virtual:3007" => "UCSFICU", - "old:acronym_from_virtual:2041" => "ICF-d1", - "old:acronym_from_virtual:2080" => "H1_NMOABA_4_0", - "old:acronym_from_virtual:1501" => "NEOMARK3", - "old:acronym_from_virtual:3158" => "SWEET", - "old:acronym_from_virtual:1335" => "PEO", - "old:acronym_from_virtual:1571" => "TM-OTHER-FACTORS", - "old:acronym_from_virtual:1061" => "SOPHARM", - "old:acronym_from_virtual:1411" => "ICF", - "old:acronym_from_virtual:1394" => "SSO", - "old:acronym_from_virtual:2018" => "SNOMEDCT-CF", - "old:acronym_from_virtual:1676" => "RCTONT", - "old:acronym_from_virtual:1086" => "OGDI", - "old:acronym_from_virtual:1699" => "VIVO", - "old:acronym_from_virtual:2079" => "ECGT", - "old:acronym_from_virtual:2082" => "H3_HIPSeptotemporalAxis", - "old:acronym_from_virtual:1321" => "NEMO", - "old:acronym_from_virtual:3267" => "DCO", - "old:acronym_from_virtual:2001" => "BRO-Activity", - "old:acronym_from_virtual:2072" => "NCBI_NMOsp_1_4_0", - "old:acronym_from_virtual:1343" => "HL7", - "old:acronym_from_virtual:1630" => "UCSFEPIC", - "old:acronym_from_virtual:2119" => "foaf", - "old:acronym_from_virtual:3094" => "DWC-TEST", - "old:acronym_from_virtual:3201" => "BCO", - "old:acronym_from_virtual:1105" => "MS", - "old:acronym_from_virtual:3199" => "UCSFICD910CM", - "old:acronym_from_virtual:1085" => "OGMD", - "old:acronym_from_virtual:1494" => "TMA", - "old:acronym_from_virtual:1484" => "ICECI", - "old:acronym_from_virtual:3259" => "InterNano", - "old:acronym_from_virtual:1444" => "CHEMINF", - "old:acronym_from_virtual:2048" => "ICF-d8", - "old:acronym_from_virtual:2051" => "ICF-d840-d859", - "old:acronym_from_virtual:3226" => "SBOL", - "old:acronym_from_virtual:2063" => "UCare_Demographics", - "old:acronym_from_virtual:1134" => "BT", - "old:acronym_from_virtual:1430" => "AI-RHEUM", - "old:acronym_from_virtual:1528" => "HUGO", - "old:acronym_from_virtual:3025" => "CTX", - "old:acronym_from_virtual:1131" => "MO", - "old:acronym_from_virtual:1404" => "UBERON", - "old:acronym_from_virtual:3194" => "PHENOSCAPE-EXT", - "old:acronym_from_virtual:1526" => "CRISP", - "old:acronym_from_virtual:2116" => "dcterms", - "old:acronym_from_virtual:3233" => "CHD", - "old:acronym_from_virtual:2058" => "SNOMEDCT-MAS", - "old:acronym_from_virtual:3270" => "suicideo", - "old:acronym_from_virtual:1037" => "PTO", - "old:acronym_from_virtual:3269" => "BICSO", - "old:acronym_from_virtual:1110" => "TAO", - "old:acronym_from_virtual:1011" => "IEV", - "old:acronym_from_virtual:1341" => "COSTART", - "old:acronym_from_virtual:2019" => "SNOMEDCT-TF", - "old:acronym_from_virtual:3043" => "MEDABBS", - "old:acronym_from_virtual:2091" => "NDF-RT", - "old:acronym_from_virtual:1583" => "CMO", - "old:acronym_from_virtual:1539" => "NIGO", - "old:acronym_from_virtual:3016" => "ERO", - "old:acronym_from_virtual:2031" => "iceci-details_for_mechanism", - "old:acronym_from_virtual:1507" => "CCO", - "old:acronym_from_virtual:1076" => "OCRE", - "old:acronym_from_virtual:1078" => "BSPO", - "old:acronym_from_virtual:3218" => "TRON", - "old:acronym_from_virtual:1135" => "pseudo", - "old:acronym_from_virtual:1544" => "CO", - "old:acronym_from_virtual:3246" => "ONL-MSA", - "old:acronym_from_virtual:2017" => "BRO-Chinese", - "old:acronym_from_virtual:1439" => "GFO", - "old:acronym_from_virtual:1015" => "FB-BT", - "old:acronym_from_virtual:1041" => "PSIMOD", - "old:acronym_from_virtual:3232" => "SNMI", - "old:acronym_from_virtual:1064" => "FB-SP", - "old:acronym_from_virtual:1655" => "PHARMGKB", - "old:acronym_from_virtual:2111" => "documentStatus", - "old:acronym_from_virtual:1014" => "FIX", - "old:acronym_from_virtual:1521" => "NEUMORE", - "old:acronym_from_virtual:3181" => "ONTOPNEUMO", - "old:acronym_from_virtual:2040" => "SNOMEDCT-CORE", - "old:acronym_from_virtual:1632" => "WSIO", - "old:acronym_from_virtual:2127" => "NIAID-GSC-BRC", - "old:acronym_from_virtual:1639" => "EPILONT", - "old:acronym_from_virtual:3205" => "ICD0", - "old:acronym_from_virtual:3236" => "VTO", - "old:acronym_from_virtual:2047" => "ICF-d7", - "old:acronym_from_virtual:1489" => "OAE", - "old:acronym_from_virtual:2115" => "dcelements", - "old:acronym_from_virtual:1588" => "ONTODT", - "old:acronym_from_virtual:3242" => "NHSQI", - "old:acronym_from_virtual:3197" => "HIMC-CPT", - "old:acronym_from_virtual:1027" => "MFO", - "old:acronym_from_virtual:1311" => "IDOMAL", - "old:acronym_from_virtual:3224" => "UCSFI9I10CMPCS", - "old:acronym_from_virtual:1149" => "DERMLEX", - "old:acronym_from_virtual:1012" => "ECO", - "old:acronym_from_virtual:2026" => "NCIt-Activity", - "old:acronym_from_virtual:1035" => "PW", - "old:acronym_from_virtual:1108" => "PAE", - "old:acronym_from_virtual:2138" => "Radlex3.9.1", - "old:acronym_from_virtual:2136" => "DILIo", - "old:acronym_from_virtual:1572" => "TM-SIGNS-AND-SYMPTS", - "old:acronym_from_virtual:3230" => "EPSO", - "old:acronym_from_virtual:1510" => "CPTH", - "old:acronym_from_virtual:2052" => "ICF-d860-d879", - "old:acronym_from_virtual:1107" => "PATO", - "old:acronym_from_virtual:1005" => "BTO", - "old:acronym_from_virtual:1580" => "AERO", - "old:acronym_from_virtual:3159" => "VARIO", - "old:acronym_from_virtual:2062" => "HOM-UCSF_UCareDispostion", - "old:acronym_from_virtual:1574" => "VHOG", - "old:acronym_from_virtual:1031" => "MPATH", - "old:acronym_from_virtual:1529" => "HCPCS", - "old:acronym_from_virtual:3058" => "DWC", - "old:acronym_from_virtual:1569" => "HPIO", - "old:acronym_from_virtual:2100" => "HSDB_OCRe", - "old:acronym_from_virtual:1491" => "IMGT-ONTOLOGY", - "old:acronym_from_virtual:2125" => "HCPCS-mod", - "old:acronym_from_virtual:3120" => "PCO", - "old:acronym_from_virtual:1019" => "FAO", - "old:acronym_from_virtual:2043" => "ICF-d3", - "old:acronym_from_virtual:2049" => "ICF-d9", - "old:acronym_from_virtual:3139" => "MIRNAO", - "old:acronym_from_virtual:1352" => "NDFRT", - "old:acronym_from_virtual:1044" => "SEP", - "old:acronym_from_virtual:1130" => "ACGT-MO", - "old:acronym_from_virtual:3214" => "OGSF", - "old:acronym_from_virtual:3179" => "GENE-CDS", - "old:acronym_from_virtual:1425" => "ICD10PCS", - "old:acronym_from_virtual:1090" => "AAO", - "old:acronym_from_virtual:1030" => "TGMA", - "old:acronym_from_virtual:1007" => "CHEBI", - "old:acronym_from_virtual:1087" => "OGR", - "old:acronym_from_virtual:3019" => "RH-MESH", - "old:acronym_from_virtual:2037" => "iceci-substance_use", - "old:acronym_from_virtual:3137" => "ONSTR", - "old:acronym_from_virtual:3216" => "BAO-GPCR", - "old:acronym_from_virtual:2064" => "LOINC", - "old:acronym_from_virtual:3198" => "SEMPHYSKB-HUMAN", - "old:acronym_from_virtual:1586" => "OntoOrpha", - "old:acronym_from_virtual:3192" => "MCCV", - "old:acronym_from_virtual:2104" => "MDRFRE", - "old:acronym_from_virtual:3078" => "PHENX", - "old:acronym_from_virtual:3020" => "CPO", - "old:acronym_from_virtual:1148" => "BP-METADATA", - "old:acronym_from_virtual:1021" => "EHDAA", - "old:acronym_from_virtual:3221" => "DERMO", - "old:acronym_from_virtual:3012" => "NONRCTO", - "old:acronym_from_virtual:1222" => "APO", - "old:acronym_from_virtual:1126" => "FHHO", - "old:acronym_from_virtual:1552" => "REPO", - "old:acronym_from_virtual:2066" => "RXNORM", - "old:acronym_from_virtual:3200" => "ZIP5", - "old:acronym_from_virtual:3249" => "ONL-DP", - "old:acronym_from_virtual:3190" => "PATHLEX", - "old:acronym_from_virtual:1672" => "DIKB", - "old:acronym_from_virtual:3210" => "TRAK", - "old:acronym_from_virtual:3266" => "OBI_BCGO", - "old:acronym_from_virtual:3244" => "SEDI", - "old:acronym_from_virtual:1369" => "PHYFIELD", - "old:acronym_from_virtual:3189" => "TOP-MENELAS", - "old:acronym_from_virtual:2106" => "ICF-NoCodeLabel", - "old:acronym_from_virtual:2112" => "geopolitical", - "old:acronym_from_virtual:2121" => "skos", - "old:acronym_from_virtual:1257" => "MEGO", - "old:acronym_from_virtual:1397" => "GAZ", - "old:acronym_from_virtual:3062" => "I2B2-PATVISDIM", - "old:acronym_from_virtual:1568" => "AEO", - "old:acronym_from_virtual:2022" => "BRO-Resource", - "old:acronym_from_virtual:1650" => "UNITSONT", - "old:acronym_from_virtual:3119" => "OBIWS", - "old:acronym_from_virtual:1578" => "ELIXHAUSER", - "old:acronym_from_virtual:1082" => "GRO", - "old:acronym_from_virtual:1490" => "PLATSTG", - "old:acronym_from_virtual:2006" => "FMA-SUBSET", - "old:acronym_from_virtual:1122" => "SPO", - "old:acronym_from_virtual:1504" => "CPT", - "old:acronym_from_virtual:1128" => "CDAO", - "old:acronym_from_virtual:1533" => "BAO", - "old:acronym_from_virtual:3237" => "VBCV", - "old:acronym_from_virtual:3209" => "OPE", - "old:acronym_from_virtual:1000" => "MA", - "old:acronym_from_virtual:2015" => "SOFA", - "old:acronym_from_virtual:2000" => "BRO-Core", - "old:acronym_from_virtual:1416" => "SCTSPA", - "old:acronym_from_virtual:2073" => "ECGF", - "old:acronym_from_virtual:2021" => "SNOMEDCT-ORG", - "old:acronym_from_virtual:1506" => "GO-EXT", - "old:acronym_from_virtual:1401" => "ICNP", - "old:acronym_from_virtual:2059" => "HOM-ICD9", - "old:acronym_from_virtual:1696" => "SYN", - "old:acronym_from_virtual:1058" => "SNPO", - "old:acronym_from_virtual:3195" => "ICD09", - "old:acronym_from_virtual:2027" => "3.0_OWL", - "old:acronym_from_virtual:1582" => "CAO", - "old:acronym_from_virtual:1048" => "WB-BT", - "old:acronym_from_virtual:1415" => "CTCAE", - "old:acronym_from_virtual:1523" => "OBOE-SBC", - "old:acronym_from_virtual:3185" => "GPI", - "old:acronym_from_virtual:2004" => "NeuroFMA", - "old:acronym_from_virtual:1022" => "EHDA", - "old:acronym_from_virtual:1419" => "TAXRANK", - "old:acronym_from_virtual:2024" => "RadLex_OWL", - "old:acronym_from_virtual:2139" => "PROV", - "old:acronym_from_virtual:3274" => "MSV", - "old:acronym_from_virtual:1509" => "ICPS", - "old:acronym_from_virtual:1626" => "EMO", - "old:acronym_from_virtual:1036" => "PECO", - "old:acronym_from_virtual:1614" => "IXNO", - "old:acronym_from_virtual:3030" => "CANCO", - "old:acronym_from_virtual:2118" => "FaBiO", - "old:acronym_from_virtual:1487" => "ICD11-BODYSYSTEM", - "old:acronym_from_virtual:1665" => "SHR", - "old:acronym_from_virtual:1084" => "NIFSTD", - "old:acronym_from_virtual:2057" => "SNOMED-Ethnic-Group", - "old:acronym_from_virtual:1141" => "OPB", - "old:acronym_from_virtual:3227" => "OVAE", - "old:acronym_from_virtual:1029" => "IMR", - "old:acronym_from_virtual:1353" => "SNOMEDCT", - "old:acronym_from_virtual:2102" => "WHOFRE", - "old:acronym_from_virtual:1132" => "NCBITAXON", - "old:acronym_from_virtual:2028" => "iceci-activity", - "old:acronym_from_virtual:1538" => "ROLEO", - "old:acronym_from_virtual:2044" => "ICF-d4", - "old:acronym_from_virtual:1088" => "MHC", - "old:acronym_from_virtual:3167" => "GLOB", - "old:acronym_from_virtual:2081" => "H2_HIPClassicRegions", - "old:acronym_from_virtual:3147" => "CLIN-EVAL", - "old:acronym_from_virtual:3006" => "OOEVV", - "old:acronym_from_virtual:3180" => "MEDO", - "old:acronym_from_virtual:1505" => "OMIT", - "old:acronym_from_virtual:1553" => "ICD10CM", - "old:acronym_from_virtual:2107" => "BIOA3v", - "old:acronym_from_virtual:3046" => "MDCDRG", - "old:acronym_from_virtual:1633" => "COGAT", - "old:acronym_from_virtual:1659" => "VT", - "old:acronym_from_virtual:1040" => "PPIO", - "old:acronym_from_virtual:3129" => "CONSENT-ONT", - "old:acronym_from_virtual:1008" => "DDANAT", - "old:acronym_from_virtual:1020" => "HC", - "old:acronym_from_virtual:1150" => "RS" -} \ No newline at end of file diff --git a/lib/resolver/virtual_from_acronym.rb b/lib/resolver/virtual_from_acronym.rb deleted file mode 100644 index fed4f1607d..0000000000 --- a/lib/resolver/virtual_from_acronym.rb +++ /dev/null @@ -1,533 +0,0 @@ -BpidResolver::VIRTUAL_FROM_ACRONYM = { - "JERM" => 1488, - "OGSF" => 3214, - "NATPRO" => 3004, - "citation" => 2114, - "ATC" => 3021, - "SNMD_BC" => 2088, - "WHO-ART" => 1354, - "ICD9CM-PROC" => 2124, - "OGR" => 1087, - "BAO" => 1533, - "ATMO" => 1099, - "goslim_candida" => 2010, - "CHEBI" => 1007, - "SNPO" => 1058, - "provenance" => 2120, - "WHOFRE" => 2102, - "EMAP" => 1010, - "CPT-mod" => 2126, - "CTONT" => 1060, - "BICSO" => 3269, - "NMR" => 1033, - "NPO" => 1083, - "NEOMARK4" => 1686, - "BRO" => 1104, - "TMA" => 1494, - "GLYCANONT" => 3231, - "ICF-d5" => 2045, - "GLOB" => 3167, - "SNOMED-Ethnic-Group" => 2057, - "SBRO" => 1249, - "YPO" => 1115, - "PO" => 1587, - "CPT" => 1504, - "EXO" => 1575, - "geopolitical" => 2112, - "NIC" => 1428, - "CCONT" => 3108, - "CLIN-EVAL" => 3147, - "MMO" => 1584, - "AMINO-ACID" => 1054, - "OBOREL" => 1042, - "IDOBRU" => 1537, - "ICF-d860-d879" => 2052, - "BP-METADATA" => 1148, - "QUDT" => 3031, - "HOM-UCSF_UCareDispostion" => 2062, - "MSTDE-FRE" => 3220, - "SNOMEDCT-ORG" => 2021, - "NCBI_NMOsp_1_4_0" => 2072, - "HP" => 1125, - "BTO" => 1005, - "UO" => 1112, - "SWEET" => 3158, - "OGMD" => 1085, - "VSAO" => 1555, - "ICF-d6" => 2046, - "RPO" => 3114, - "ECO" => 1012, - "HCPCS" => 1529, - "MIRO" => 1077, - "BSAO" => 3271, - "BiositemapIM" => 2003, - "ooevv-vaccine" => 2109, - "COGPO" => 1560, - "CMS" => 3146, - "CCO" => 1507, - "NHDS" => 3136, - "pseudo" => 1135, - "TGMA" => 1030, - "RID" => 1260, - "TM-SIGNS-AND-SYMPTS" => 1572, - "HAO" => 1362, - "VIVO" => 1699, - "EPSO" => 3230, - "OntoBioUSP" => 3263, - "suicideo" => 3270, - "SDO" => 1651, - "ABA-AMB" => 1290, - "HPIO" => 1569, - "AAO" => 1090, - "MCCL" => 1541, - "HOM-TEST" => 3038, - "HIMC-CPT" => 3197, - "ACGT-MO" => 1130, - "REX" => 1043, - "TM-MER" => 1573, - "PHENOSCAPE-EXT" => 3194, - "IEV" => 1011, - "EHDA" => 1022, - "FBbi" => 1023, - "CHEMBIO" => 1615, - "ICD10" => 1516, - "ROLEO" => 1538, - "GFO" => 1439, - "MF" => 3002, - "IMMDIS" => 3127, - "dcelements" => 2115, - "ADW" => 1530, - "BOF" => 3234, - "iceci-countermeasures" => 2029, - "GALEN" => 1055, - "PAE" => 1108, - "OBI" => 1123, - "HOM" => 1328, - "HOMERUN" => 1627, - "CABRO" => 3217, - "ICD9CM" => 1101, - "SNOMEDCT-MAS" => 2058, - "ICF" => 1411, - "WH" => 3264, - "CHMO" => 3255, - "H1_NMOABA_1_0" => 2069, - "BSPO" => 1078, - "MDRFRE" => 2104, - "ICF-NoCodeLabel" => 2106, - "GRO" => 1082, - "NCIT" => 1032, - "UCSFICD910CM" => 3199, - "ADO" => 3251, - "BDO" => 1613, - "NeuroFMA" => 2004, - "MCBCC" => 1438, - "ICD09" => 3195, - "ICF-d840-d859%2Fd860-d879" => 2053, - "RCTONT" => 1676, - "ERNO" => 3268, - "ONTODM-KDD" => 3077, - "IXNO" => 1614, - "ICNP" => 1401, - "KISAO" => 1410, - "EDDA" => 3247, - "GFO-BIO" => 1440, - "FaBiO" => 2118, - "UCare_Demographics" => 2063, - "OGMS" => 1414, - "Radlex3.9.1" => 2138, - "MEO" => 3009, - "SPTO" => 3029, - "CHEMINF" => 1444, - "CANONT" => 3178, - "HC" => 1020, - "PPIO" => 1040, - "H1_NMOABA" => 2078, - "EHDAA" => 1021, - "VSO" => 3124, - "NIGO" => 1539, - "SPO" => 1122, - "VTO" => 3236, - "MP" => 1025, - "GCC" => 3017, - "BILA" => 1114, - "iceci-descriptor_for_intent" => 2030, - "obi-device" => 2065, - "CL" => 1006, - "RH-MESH" => 3019, - "ICD10CM" => 1553, - "BRIDG" => 3150, - "UCSFI9I10CMPCS" => 3224, - "MIXS" => 3215, - "SNOMEDCT-CF" => 2018, - "FMA-SUBSET" => 2006, - "PTO" => 1037, - "CMO" => 1583, - "FB-SP" => 1064, - "EP" => 1142, - "SIO" => 1532, - "InterNano" => 3259, - "ICF-d1" => 2041, - "REPO" => 1552, - "PHARE" => 1550, - "UNITSONT" => 1650, - "REXO" => 3152, - "DOID" => 1009, - "ICDO3" => 1670, - "DIAGONT" => 3013, - "I2B2-PATVISDIM" => 3062, - "NCBI_NMOsp_1_2_1" => 2055, - "MDDB" => 1426, - "PROV" => 2139, - "ICF-d810-d839" => 2050, - "FLU" => 1417, - "DC-CL" => 1144, - "LIPRO" => 1183, - "UCSFICU" => 3007, - "SNOMEDCT-CORE" => 2040, - "NCIt-Activity" => 2026, - "CARO" => 1063, - "CPT-KM" => 1694, - "MFO" => 1027, - "GRO-CPGA" => 1001, - "RETO" => 3162, - "PATHLEX" => 3190, - "GEOSPECIES" => 1247, - "OAE" => 1489, - "EMO" => 1626, - "MPO" => 3191, - "OMIM" => 1348, - "CTX" => 3025, - "FAO" => 1019, - "goslim_plant" => 2009, - "NIFSTD" => 1084, - "iceci-substance_use" => 2037, - "BIOA3v" => 2107, - "QIBO" => 1671, - "iceci-details_for_activity" => 2038, - "BCTEO" => 3262, - "CANCO" => 3030, - "PDQ" => 1349, - "NDDF" => 1424, - "VO" => 1172, - "H1_NMOABA_4_1" => 2083, - "iceci-intent" => 2034, - "IAO" => 1393, - "RS" => 1150, - "ONL-DP" => 3249, - "SciRes" => 2122, - "CARD" => 3272, - "goslim_generic_1_770" => 2007, - "EVOC" => 1013, - "MSHSPA_1" => 1420, - "SNOMEDCT-TF" => 2019, - "MAT" => 1152, - "GRO-CPD" => 1047, - "GLYCO" => 3169, - "UCSFORTHO" => 1697, - "PCO" => 3120, - "CRISP" => 1526, - "IDODEN" => 3174, - "iceci-details_for_place_of_occurrence" => 2032, - "ICD0" => 3205, - "PVONTO" => 1567, - "GEXO" => 3151, - "DIKB" => 1672, - "FB-CV" => 1017, - "SBO" => 1046, - "PEO" => 1335, - "Amino_Acid-zh_CN" => 1168, - "RNAO" => 1500, - "PHYLONT" => 1616, - "GO-EXT" => 1506, - "ICF-d9" => 2049, - "ONL-MSA" => 3246, - "NIFSUBCELL" => 3126, - "PR" => 1062, - "CAO" => 1582, - "VBCV" => 3237, - "ICD9CM-KM" => 3045, - "FIX" => 1014, - "ICECI" => 1484, - "NEUMORE" => 1521, - "WSIO" => 1632, - "goslim_goa" => 2008, - "ICF-d3" => 2043, - "MDCDRG" => 3046, - "DWC-TEST" => 3094, - "BT" => 1134, - "H3_HIPSeptotemporalAxis" => 2082, - "MSV" => 3274, - "DILIo" => 2136, - "ICF-d840-d859" => 2051, - "MCCV" => 3192, - "HL7" => 1343, - "XCO" => 1585, - "ICF-d7" => 2047, - "ZIP5" => 3200, - "SSO" => 1394, - "RXNORM" => 2066, - "DERMO" => 3221, - "obi-fged" => 2070, - "RadLex_OWL" => 2024, - "H1_NMOABA_2_0" => 2074, - "MEDDRA" => 1422, - "BRO-Resource" => 2022, - "TMO" => 1461, - "LHN" => 1024, - "PROPREO" => 1039, - "CO-WHEAT" => 1545, - "CARELEX" => 3008, - "NDFRT" => 1352, - "iceci-instrument_object_substance" => 2033, - "PRO-ONT" => 1052, - "TADS" => 1065, - "HLTHINDCTRS" => 1581, - "WB-PHENOTYPE" => 1067, - "OGDI" => 1086, - "TEO" => 3042, - "PHYFIELD" => 1369, - "NEMO" => 1321, - "CBO" => 1158, - "CPO" => 3020, - "SNOMEDCT" => 1353, - "DWC" => 3058, - "foaf" => 2119, - "LDA" => 1398, - "HUGO" => 1528, - "AI-RHEUM" => 1430, - "MHC" => 1088, - "XAO" => 1095, - "UDEF" => 3241, - "ICF-d8" => 2048, - "H1_NMOABA_4_0" => 2080, - "test1" => 2101, - "TM-CONST" => 1570, - "FB-DV" => 1016, - "PORO" => 3204, - "TTO" => 1081, - "ECGF" => 2073, - "EHDAA2" => 1517, - "BCGO" => 1304, - "DERMLEX" => 1149, - "CO" => 1544, - "ICPCFRE" => 2103, - "TOP-MENELAS" => 3189, - "SMD_NPLSM_BRST" => 2086, - "OntoOrpha" => 1586, - "GAZ" => 1397, - "ELIXHAUSER" => 1578, - "CPTAC" => 1192, - "ONTOKBCF" => 3155, - "TAO" => 1110, - "UCSFXPLANT" => 1661, - "OBI_BCGO" => 3266, - "MEGO" => 1257, - "VARIO" => 3159, - "VT" => 1659, - "SYMP" => 1224, - "BRO-Activity" => 2001, - "SOY" => 3028, - "FHHO" => 1126, - "OPL" => 1190, - "iceci-mechanism" => 2035, - "IFAR" => 3183, - "NHSQI" => 3242, - "LOINC" => 2064, - "IDO" => 1092, - "OBIWS" => 3119, - "EFO" => 1136, - "ONTODT" => 1588, - "ONTOMA" => 3090, - "ICD10PCS" => 1425, - "SEDI" => 3244, - "RSA" => 3222, - "GENETRIAL" => 3157, - "SCTSPA" => 1416, - "iceci-details_for_mechanism" => 2031, - "SAO" => 1068, - "NIFDYS" => 1381, - "ENVO" => 1069, - "INO" => 1515, - "MA" => 1000, - "MFOEM" => 1666, - "BRO-Chinese" => 2017, - "NCBITAXON" => 1132, - "HCPCS-mod" => 2125, - "dcterms" => 2116, - "I2B2-LOINC" => 3186, - "EPICMEDS" => 3032, - "BRO-Core" => 2000, - "CDAO" => 1128, - "ICF-d4" => 2044, - "TEST-PROD" => 3211, - "BAO-GPCR" => 3216, - "ooevv-tractTrace" => 2108, - "PATO" => 1107, - "OBOE-SBC" => 1523, - "BP" => 1522, - "OCRE" => 1076, - "skos" => 2121, - "MIXSCV" => 3000, - "SPD" => 1091, - "BHO" => 1116, - "STNFRDRXDEMO" => 3261, - "FB-BT" => 1015, - "NCBI_NMOsp_1_2_2" => 2056, - "WB-LS" => 1049, - "SNOMEDCT-ANAT" => 2020, - "TRAK" => 3210, - "IDOMAL" => 1311, - "SMD_NPLSM" => 2085, - "goslim_pombe" => 2013, - "SSE" => 3252, - "CONSENT-ONT" => 3129, - "BCO" => 3201, - "RCD" => 1427, - "AEO" => 1568, - "TAXRANK" => 1419, - "PHENX" => 3078, - "goslim_pir" => 2012, - "MO" => 1131, - "PSDS" => 1038, - "ONTODM-CORE" => 1638, - "CHD" => 3233, - "PHARMGKB" => 1655, - "NIF-RTH" => 2025, - "OPB" => 1141, - "MSHFRE" => 1456, - "ZEA" => 1050, - "MEDLINEPLUS" => 1347, - "SO" => 1109, - "OBI_IEDB_view" => 2093, - "PSIMOD" => 1041, - "GPI" => 3185, - "IMGT-ONTOLOGY" => 1491, - "ONL-MR-DA" => 3250, - "SHR" => 1665, - "NHSQI2009" => 3243, - "FDA-MEDDEVICE" => 1576, - "OVAE" => 3227, - "NDF-RT" => 2091, - "CPRO" => 1059, - "CSSO" => 3239, - "event" => 2117, - "CLO" => 1314, - "ECG" => 1146, - "PMR" => 3015, - "IDQA" => 3208, - "OntoVIP" => 3253, - "ZFA" => 1051, - "HCPCS-HIMC" => 3206, - "OSHPD" => 1649, - "ICF-d2" => 2042, - "BIOMODELS" => 3022, - "PHENOMEBLAST" => 1656, - "OMIT" => 1505, - "SITBAC" => 1237, - "NIAID-GSC-BRC" => 2127, - "SNMI" => 3232, - "SOPHARM" => 1061, - "BNO" => 3265, - "DTVPrecision" => 2110, - "VANDF" => 1527, - "OOEVV" => 3006, - "HSDB_OCRe" => 2100, - "LSM" => 1520, - "BRO-AreaOfResearch" => 2002, - "WB-BT" => 1048, - "H2_HIPClassicRegions" => 2081, - "ERO" => 3016, - "EDAM" => 1498, - "HRDO" => 3273, - "OPE" => 3209, - "IMR" => 1029, - "SYN" => 1696, - "NONRCTO" => 3012, - "GCO" => 3223, - "RCJI" => 2067, - "GO" => 1070, - "OMRSE" => 1565, - "ONSTR" => 3137, - "SNMD_BDY" => 2105, - "BIRNLEX" => 1089, - "APO" => 1222, - "DDANAT" => 1008, - "ONTOPNEUMO" => 3181, - "NIFCELL" => 1402, - "SOFA" => 2015, - "ATO" => 1370, - "CLINIC" => 3092, - "PROVO" => 3131, - "NTDO" => 3153, - "RADLEX" => 1057, - "FYPO" => 1689, - "MAO" => 1026, - "MS" => 1105, - "VHOG" => 1574, - "PDO" => 3238, - "DDI" => 1540, - "PECO" => 1036, - "MESH" => 1351, - "COGAT" => 1633, - "CPTH" => 1510, - "MIRNAO" => 3139, - "goslim_yeast" => 2014, - "iceci-place_of_occurrence" => 2036, - "DCO" => 3267, - "FMA" => 1053, - "MPATH" => 1031, - "PTRANS" => 1094, - "ECGT" => 2079, - "bibliographic" => 2113, - "ATOL" => 3207, - "ELIG" => 3228, - "OGI" => 1100, - "USSOC" => 3104, - "GLYCOPROT" => 3212, - "AERO" => 1580, - "TEDDY" => 1407, - "HINO" => 3203, - "GENE-CDS" => 3179, - "TRON" => 3218, - "OBR-Scolio" => 3258, - "ZIP3" => 3184, - "OGMD_OWL" => 2084, - "ICPC2P" => 1429, - "SEP" => 1044, - "PW" => 1035, - "SBOL" => 3226, - "envo_153" => 2092, - "TOK" => 1418, - "COSTART" => 1341, - "ICPS" => 1509, - "UBERON" => 1404, - "NCBI_NMOsp_1_0_0" => 2054, - "PMA" => 1497, - "MEDABBS" => 3043, - "EPILONT" => 1639, - "NCBITaxonOWL" => 2023, - "BFO" => 1332, - "SEMPHYSKB-HUMAN" => 3198, - "ICD11-BODYSYSTEM" => 1487, - "MEDO" => 3180, - "CTCAE" => 1415, - "XEO" => 3176, - "NEOMARK3" => 1501, - "SWO" => 1413, - "SuicidO" => 3245, - "GWAS_EFO_SKOS" => 2099, - "documentStatus" => 2111, - "ICPC" => 1344, - "PEDTERM" => 1640, - "HOM-ICD9" => 2059, - "iceci-activity" => 2028, - "UCSFEPIC" => 1630, - "CNO" => 3003, - "PLATSTG" => 1490, - "3.0_OWL" => 2027, - "DEMOGRAPH" => 3047, - "TM-OTHER-FACTORS" => 1571, - "RNPRIO" => 3240, - "MSTDE" => 3219, - "NBO" => 1621 -} \ No newline at end of file diff --git a/lib/resolver/virtual_from_version.rb b/lib/resolver/virtual_from_version.rb deleted file mode 100644 index 9e40cad015..0000000000 --- a/lib/resolver/virtual_from_version.rb +++ /dev/null @@ -1,7144 +0,0 @@ -BpidResolver::VIRTUAL_FROM_VERSION = { - "old:virtual_from_version:40876" => 1048, - "old:virtual_from_version:44059" => 1125, - "old:virtual_from_version:46266" => 1172, - "old:virtual_from_version:44870" => 1077, - "old:virtual_from_version:40446" => 1009, - "old:virtual_from_version:42230" => 1083, - "old:virtual_from_version:44261" => 1070, - "old:virtual_from_version:44863" => 1009, - "old:virtual_from_version:44231" => 1107, - "old:virtual_from_version:47370" => 1077, - "old:virtual_from_version:49429" => 1580, - "old:virtual_from_version:42156" => 1037, - "old:virtual_from_version:44222" => 1009, - "old:virtual_from_version:42381" => 1070, - "old:virtual_from_version:50050" => 3131, - "old:virtual_from_version:47704" => 1689, - "old:virtual_from_version:40625" => 1070, - "old:virtual_from_version:40934" => 1070, - "old:virtual_from_version:43002" => 2018, - "old:virtual_from_version:40941" => 1070, - "old:virtual_from_version:39314" => 1125, - "old:virtual_from_version:46950" => 1070, - "old:virtual_from_version:46093" => 1649, - "old:virtual_from_version:49425" => 1025, - "old:virtual_from_version:42731" => 1077, - "old:virtual_from_version:47095" => 1077, - "old:virtual_from_version:49684" => 1125, - "old:virtual_from_version:49229" => 1689, - "old:virtual_from_version:47012" => 3016, - "old:virtual_from_version:45228" => 1414, - "old:virtual_from_version:45287" => 1517, - "old:virtual_from_version:45569" => 1136, - "old:virtual_from_version:42525" => 1017, - "old:virtual_from_version:38363" => 1081, - "old:virtual_from_version:40404" => 1354, - "old:virtual_from_version:47677" => 1689, - "old:virtual_from_version:47916" => 1081, - "old:virtual_from_version:42239" => 1077, - "old:virtual_from_version:46908" => 1070, - "old:virtual_from_version:50341" => 3131, - "old:virtual_from_version:44232" => 1070, - "old:virtual_from_version:44622" => 1009, - "old:virtual_from_version:40556" => 1067, - "old:virtual_from_version:46102" => 1070, - "old:virtual_from_version:49057" => 1077, - "old:virtual_from_version:45091" => 1025, - "old:virtual_from_version:44599" => 1141, - "old:virtual_from_version:39208" => 1148, - "old:virtual_from_version:44055" => 1077, - "old:virtual_from_version:39055" => 1110, - "old:virtual_from_version:44779" => 1545, - "old:virtual_from_version:43073" => 2072, - "old:virtual_from_version:45955" => 1105, - "old:virtual_from_version:46215" => 1070, - "old:virtual_from_version:46917" => 1109, - "old:virtual_from_version:50608" => 1136, - "old:virtual_from_version:29952" => 1078, - "old:virtual_from_version:42084" => 1070, - "old:virtual_from_version:45919" => 1035, - "old:virtual_from_version:40589" => 1077, - "old:virtual_from_version:44604" => 1009, - "old:virtual_from_version:50267" => 3131, - "old:virtual_from_version:50174" => 1172, - "old:virtual_from_version:40681" => 1081, - "old:virtual_from_version:44915" => 1077, - "old:virtual_from_version:42810" => 1500, - "old:virtual_from_version:46938" => 3009, - "old:virtual_from_version:42177" => 1172, - "old:virtual_from_version:40398" => 1348, - "old:virtual_from_version:49002" => 1070, - "old:virtual_from_version:45570" => 1070, - "old:virtual_from_version:42980" => 1009, - "old:virtual_from_version:42557" => 1037, - "old:virtual_from_version:42070" => 1107, - "old:virtual_from_version:40634" => 1070, - "old:virtual_from_version:40441" => 1083, - "old:virtual_from_version:39905" => 1081, - "old:virtual_from_version:45020" => 1070, - "old:virtual_from_version:47294" => 1077, - "old:virtual_from_version:44738" => 1070, - "old:virtual_from_version:49659" => 3155, - "old:virtual_from_version:44158" => 1107, - "old:virtual_from_version:44939" => 1125, - "old:virtual_from_version:47658" => 1070, - "old:virtual_from_version:38751" => 1112, - "old:virtual_from_version:50316" => 1311, - "old:virtual_from_version:45554" => 1172, - "old:virtual_from_version:46320" => 1115, - "old:virtual_from_version:46790" => 1077, - "old:virtual_from_version:45799" => 1067, - "old:virtual_from_version:49263" => 1532, - "old:virtual_from_version:45033" => 1016, - "old:virtual_from_version:45005" => 1006, - "old:virtual_from_version:47430" => 1077, - "old:virtual_from_version:42607" => 1070, - "old:virtual_from_version:44878" => 1125, - "old:virtual_from_version:46763" => 1062, - "old:virtual_from_version:44050" => 1125, - "old:virtual_from_version:50616" => 1025, - "old:virtual_from_version:50308" => 1224, - "old:virtual_from_version:45330" => 1588, - "old:virtual_from_version:45783" => 1007, - "old:virtual_from_version:42948" => 1148, - "old:virtual_from_version:42159" => 1077, - "old:virtual_from_version:39932" => 1110, - "old:virtual_from_version:42828" => 1078, - "old:virtual_from_version:39175" => 1146, - "old:virtual_from_version:47474" => 1070, - "old:virtual_from_version:44796" => 1077, - "old:virtual_from_version:45353" => 1107, - "old:virtual_from_version:42081" => 1009, - "old:virtual_from_version:45491" => 1009, - "old:virtual_from_version:44302" => 1013, - "old:virtual_from_version:40848" => 1407, - "old:virtual_from_version:45954" => 1070, - "old:virtual_from_version:50612" => 1689, - "old:virtual_from_version:38407" => 1104, - "old:virtual_from_version:48010" => 2110, - "old:virtual_from_version:39483" => 1007, - "old:virtual_from_version:41000" => 2012, - "old:virtual_from_version:46948" => 1659, - "old:virtual_from_version:44362" => 1063, - "old:virtual_from_version:45446" => 1125, - "old:virtual_from_version:42256" => 1009, - "old:virtual_from_version:47113" => 3020, - "old:virtual_from_version:42442" => 1009, - "old:virtual_from_version:46735" => 1689, - "old:virtual_from_version:43021" => 2046, - "old:virtual_from_version:49586" => 1067, - "old:virtual_from_version:44579" => 1070, - "old:virtual_from_version:40892" => 1108, - "old:virtual_from_version:44692" => 1109, - "old:virtual_from_version:50607" => 1070, - "old:virtual_from_version:50177" => 1070, - "old:virtual_from_version:38801" => 1131, - "old:virtual_from_version:39897" => 1183, - "old:virtual_from_version:45015" => 1125, - "old:virtual_from_version:47406" => 1125, - "old:virtual_from_version:46305" => 1070, - "old:virtual_from_version:45506" => 1584, - "old:virtual_from_version:39737" => 1025, - "old:virtual_from_version:47427" => 1136, - "old:virtual_from_version:43086" => 2083, - "old:virtual_from_version:42914" => 1009, - "old:virtual_from_version:45928" => 1070, - "old:virtual_from_version:44656" => 1025, - "old:virtual_from_version:44637" => 1070, - "old:virtual_from_version:49610" => 1659, - "old:virtual_from_version:50200" => 1311, - "old:virtual_from_version:47516" => 1070, - "old:virtual_from_version:49208" => 1404, - "old:virtual_from_version:50668" => 3208, - "old:virtual_from_version:42598" => 1070, - "old:virtual_from_version:49324" => 1070, - "old:virtual_from_version:47473" => 1616, - "old:virtual_from_version:49225" => 1125, - "old:virtual_from_version:50763" => 1417, - "old:virtual_from_version:45121" => 1077, - "old:virtual_from_version:49776" => 3194, - "old:virtual_from_version:49217" => 1070, - "old:virtual_from_version:46356" => 1670, - "old:virtual_from_version:50726" => 3266, - "old:virtual_from_version:46452" => 1105, - "old:virtual_from_version:49589" => 1077, - "old:virtual_from_version:45476" => 1105, - "old:virtual_from_version:49352" => 1136, - "old:virtual_from_version:40828" => 1006, - "old:virtual_from_version:40651" => 1397, - "old:virtual_from_version:38793" => 1062, - "old:virtual_from_version:46893" => 1070, - "old:virtual_from_version:50209" => 1070, - "old:virtual_from_version:40645" => 1128, - "old:virtual_from_version:42563" => 1109, - "old:virtual_from_version:49413" => 1070, - "old:virtual_from_version:42408" => 1311, - "old:virtual_from_version:45296" => 1062, - "old:virtual_from_version:46543" => 1125, - "old:virtual_from_version:41017" => 2026, - "old:virtual_from_version:47043" => 1077, - "old:virtual_from_version:50353" => 1125, - "old:virtual_from_version:50721" => 1150, - "old:virtual_from_version:44922" => 1555, - "old:virtual_from_version:44822" => 1550, - "old:virtual_from_version:46901" => 1077, - "old:virtual_from_version:49205" => 1070, - "old:virtual_from_version:45289" => 1110, - "old:virtual_from_version:49676" => 1404, - "old:virtual_from_version:47640" => 1125, - "old:virtual_from_version:49390" => 1070, - "old:virtual_from_version:50534" => 1314, - "old:virtual_from_version:45730" => 1048, - "old:virtual_from_version:46420" => 1136, - "old:virtual_from_version:40902" => 1048, - "old:virtual_from_version:44030" => 1077, - "old:virtual_from_version:49732" => 1489, - "old:virtual_from_version:46240" => 1070, - "old:virtual_from_version:50700" => 3259, - "old:virtual_from_version:42470" => 1404, - "old:virtual_from_version:47364" => 1077, - "old:virtual_from_version:46495" => 1580, - "old:virtual_from_version:47445" => 1381, - "old:virtual_from_version:46823" => 3000, - "old:virtual_from_version:40512" => 1077, - "old:virtual_from_version:49158" => 1077, - "old:virtual_from_version:49930" => 1632, - "old:virtual_from_version:40552" => 1091, - "old:virtual_from_version:43036" => 2035, - "old:virtual_from_version:50499" => 3259, - "old:virtual_from_version:40778" => 1107, - "old:virtual_from_version:49503" => 1107, - "old:virtual_from_version:45553" => 1348, - "old:virtual_from_version:42806" => 1009, - "old:virtual_from_version:45109" => 1489, - "old:virtual_from_version:44247" => 1070, - "old:virtual_from_version:45377" => 1362, - "old:virtual_from_version:47983" => 3126, - "old:virtual_from_version:49979" => 1062, - "old:virtual_from_version:47162" => 3030, - "old:virtual_from_version:44217" => 1224, - "old:virtual_from_version:45925" => 1025, - "old:virtual_from_version:46708" => 1070, - "old:virtual_from_version:47490" => 1070, - "old:virtual_from_version:42876" => 1070, - "old:virtual_from_version:49178" => 1077, - "old:virtual_from_version:39149" => 1123, - "old:virtual_from_version:44564" => 1037, - "old:virtual_from_version:42252" => 1077, - "old:virtual_from_version:49696" => 1158, - "old:virtual_from_version:40797" => 1051, - "old:virtual_from_version:40811" => 1077, - "old:virtual_from_version:47730" => 1077, - "old:virtual_from_version:42231" => 1172, - "old:virtual_from_version:49064" => 1689, - "old:virtual_from_version:42493" => 1025, - "old:virtual_from_version:47153" => 1125, - "old:virtual_from_version:49233" => 1077, - "old:virtual_from_version:44129" => 1070, - "old:virtual_from_version:48039" => 2136, - "old:virtual_from_version:44101" => 1077, - "old:virtual_from_version:49504" => 1105, - "old:virtual_from_version:44725" => 1070, - "old:virtual_from_version:49102" => 1649, - "old:virtual_from_version:49138" => 1070, - "old:virtual_from_version:44140" => 1077, - "old:virtual_from_version:40745" => 1081, - "old:virtual_from_version:46622" => 1136, - "old:virtual_from_version:46415" => 1070, - "old:virtual_from_version:50290" => 3223, - "old:virtual_from_version:45423" => 1136, - "old:virtual_from_version:40576" => 1070, - "old:virtual_from_version:49455" => 3008, - "old:virtual_from_version:45272" => 1069, - "old:virtual_from_version:45866" => 1125, - "old:virtual_from_version:49024" => 1125, - "old:virtual_from_version:44190" => 1077, - "old:virtual_from_version:39281" => 1105, - "old:virtual_from_version:47997" => 1077, - "old:virtual_from_version:40244" => 1311, - "old:virtual_from_version:44403" => 1009, - "old:virtual_from_version:47733" => 1070, - "old:virtual_from_version:47817" => 3094, - "old:virtual_from_version:49682" => 1651, - "old:virtual_from_version:49897" => 1070, - "old:virtual_from_version:45686" => 1027, - "old:virtual_from_version:50084" => 1070, - "old:virtual_from_version:39995" => 2010, - "old:virtual_from_version:48018" => 2118, - "old:virtual_from_version:42385" => 1037, - "old:virtual_from_version:50070" => 1172, - "old:virtual_from_version:44770" => 1544, - "old:virtual_from_version:50310" => 1009, - "old:virtual_from_version:40733" => 1009, - "old:virtual_from_version:42743" => 1321, - "old:virtual_from_version:46092" => 1649, - "old:virtual_from_version:43044" => 2001, - "old:virtual_from_version:50478" => 3234, - "old:virtual_from_version:44888" => 1025, - "old:virtual_from_version:40995" => 1125, - "old:virtual_from_version:39517" => 1125, - "old:virtual_from_version:42313" => 1025, - "old:virtual_from_version:45694" => 1070, - "old:virtual_from_version:40843" => 1109, - "old:virtual_from_version:49219" => 1128, - "old:virtual_from_version:42701" => 1009, - "old:virtual_from_version:42002" => 1007, - "old:virtual_from_version:47863" => 1583, - "old:virtual_from_version:50681" => 1584, - "old:virtual_from_version:49818" => 3200, - "old:virtual_from_version:42512" => 1081, - "old:virtual_from_version:42486" => 1077, - "old:virtual_from_version:50244" => 1067, - "old:virtual_from_version:42832" => 1037, - "old:virtual_from_version:42953" => 1037, - "old:virtual_from_version:40717" => 1070, - "old:virtual_from_version:50219" => 1065, - "old:virtual_from_version:49957" => 1489, - "old:virtual_from_version:45404" => 1011, - "old:virtual_from_version:44969" => 1063, - "old:virtual_from_version:42383" => 1025, - "old:virtual_from_version:44108" => 1517, - "old:virtual_from_version:44987" => 1027, - "old:virtual_from_version:45574" => 1136, - "old:virtual_from_version:40216" => 1094, - "old:virtual_from_version:47914" => 1125, - "old:virtual_from_version:46211" => 1661, - "old:virtual_from_version:44768" => 1077, - "old:virtual_from_version:40919" => 1009, - "old:virtual_from_version:45131" => 1125, - "old:virtual_from_version:50128" => 3131, - "old:virtual_from_version:42448" => 1125, - "old:virtual_from_version:42608" => 1009, - "old:virtual_from_version:46720" => 1070, - "old:virtual_from_version:42986" => 1009, - "old:virtual_from_version:47312" => 1109, - "old:virtual_from_version:49920" => 3186, - "old:virtual_from_version:47475" => 1037, - "old:virtual_from_version:38675" => 1006, - "old:virtual_from_version:50482" => 1491, - "old:virtual_from_version:42922" => 1025, - "old:virtual_from_version:47962" => 1067, - "old:virtual_from_version:49131" => 3002, - "old:virtual_from_version:49541" => 1532, - "old:virtual_from_version:47915" => 1037, - "old:virtual_from_version:49551" => 1689, - "old:virtual_from_version:42250" => 1009, - "old:virtual_from_version:45542" => 1532, - "old:virtual_from_version:50451" => 1172, - "old:virtual_from_version:42368" => 1070, - "old:virtual_from_version:46428" => 1070, - "old:virtual_from_version:49445" => 1105, - "old:virtual_from_version:44355" => 1172, - "old:virtual_from_version:45896" => 1125, - "old:virtual_from_version:44543" => 1037, - "old:virtual_from_version:42372" => 1404, - "old:virtual_from_version:44616" => 1077, - "old:virtual_from_version:49270" => 1077, - "old:virtual_from_version:47858" => 1037, - "old:virtual_from_version:44531" => 1533, - "old:virtual_from_version:42080" => 1070, - "old:virtual_from_version:46889" => 1125, - "old:virtual_from_version:49243" => 3158, - "old:virtual_from_version:50638" => 1105, - "old:virtual_from_version:45243" => 1078, - "old:virtual_from_version:44525" => 1070, - "old:virtual_from_version:49966" => 1070, - "old:virtual_from_version:42319" => 1077, - "old:virtual_from_version:40984" => 1415, - "old:virtual_from_version:42482" => 1067, - "old:virtual_from_version:44694" => 1538, - "old:virtual_from_version:47671" => 1077, - "old:virtual_from_version:47865" => 1585, - "old:virtual_from_version:47675" => 1077, - "old:virtual_from_version:46492" => 1686, - "old:virtual_from_version:46218" => 1070, - "old:virtual_from_version:44483" => 1037, - "old:virtual_from_version:49045" => 1404, - "old:virtual_from_version:49244" => 1070, - "old:virtual_from_version:45036" => 1019, - "old:virtual_from_version:42693" => 1032, - "old:virtual_from_version:49958" => 3131, - "old:virtual_from_version:46097" => 1077, - "old:virtual_from_version:37419" => 1038, - "old:virtual_from_version:49709" => 1086, - "old:virtual_from_version:42386" => 1404, - "old:virtual_from_version:47690" => 1070, - "old:virtual_from_version:40740" => 1222, - "old:virtual_from_version:46986" => 3008, - "old:virtual_from_version:47001" => 1125, - "old:virtual_from_version:38955" => 1006, - "old:virtual_from_version:46660" => 1070, - "old:virtual_from_version:42676" => 1037, - "old:virtual_from_version:44618" => 1109, - "old:virtual_from_version:39242" => 1035, - "old:virtual_from_version:47297" => 1616, - "old:virtual_from_version:46832" => 1048, - "old:virtual_from_version:44764" => 1009, - "old:virtual_from_version:40259" => 1067, - "old:virtual_from_version:42169" => 1037, - "old:virtual_from_version:42686" => 1070, - "old:virtual_from_version:46268" => 1517, - "old:virtual_from_version:45899" => 1125, - "old:virtual_from_version:46592" => 1070, - "old:virtual_from_version:50075" => 1172, - "old:virtual_from_version:40973" => 1070, - "old:virtual_from_version:38378" => 1009, - "old:virtual_from_version:42012" => 1077, - "old:virtual_from_version:50049" => 1689, - "old:virtual_from_version:47752" => 1077, - "old:virtual_from_version:50637" => 1128, - "old:virtual_from_version:40617" => 1070, - "old:virtual_from_version:49810" => 1006, - "old:virtual_from_version:38662" => 1404, - "old:virtual_from_version:49394" => 1070, - "old:virtual_from_version:40719" => 1081, - "old:virtual_from_version:42920" => 1048, - "old:virtual_from_version:40542" => 1077, - "old:virtual_from_version:49234" => 1532, - "old:virtual_from_version:45216" => 1571, - "old:virtual_from_version:45478" => 1077, - "old:virtual_from_version:47044" => 3017, - "old:virtual_from_version:49347" => 1404, - "old:virtual_from_version:42006" => 1037, - "old:virtual_from_version:47959" => 1649, - "old:virtual_from_version:39103" => 1144, - "old:virtual_from_version:42234" => 1077, - "old:virtual_from_version:46537" => 1070, - "old:virtual_from_version:50424" => 3131, - "old:virtual_from_version:49670" => 1689, - "old:virtual_from_version:44665" => 1037, - "old:virtual_from_version:49189" => 1404, - "old:virtual_from_version:42650" => 1484, - "old:virtual_from_version:40718" => 1077, - "old:virtual_from_version:47953" => 1107, - "old:virtual_from_version:40430" => 1009, - "old:virtual_from_version:49076" => 1083, - "old:virtual_from_version:50373" => 1032, - "old:virtual_from_version:50379" => 1689, - "old:virtual_from_version:45401" => 1136, - "old:virtual_from_version:42933" => 1070, - "old:virtual_from_version:49129" => 1585, - "old:virtual_from_version:44001" => 1070, - "old:virtual_from_version:50446" => 3189, - "old:virtual_from_version:45486" => 1136, - "old:virtual_from_version:45763" => 1077, - "old:virtual_from_version:40702" => 1081, - "old:virtual_from_version:40613" => 1109, - "old:virtual_from_version:50030" => 3131, - "old:virtual_from_version:46243" => 1009, - "old:virtual_from_version:38918" => 1077, - "old:virtual_from_version:13305" => 1063, - "old:virtual_from_version:49044" => 1077, - "old:virtual_from_version:46970" => 1077, - "old:virtual_from_version:39902" => 1125, - "old:virtual_from_version:46923" => 1109, - "old:virtual_from_version:49701" => 1037, - "old:virtual_from_version:46338" => 1110, - "old:virtual_from_version:42136" => 1070, - "old:virtual_from_version:45242" => 1065, - "old:virtual_from_version:39604" => 1109, - "old:virtual_from_version:45677" => 1125, - "old:virtual_from_version:47778" => 1037, - "old:virtual_from_version:46733" => 1077, - "old:virtual_from_version:47564" => 1537, - "old:virtual_from_version:44379" => 1022, - "old:virtual_from_version:49943" => 1150, - "old:virtual_from_version:44021" => 1037, - "old:virtual_from_version:49015" => 1070, - "old:virtual_from_version:47694" => 1070, - "old:virtual_from_version:47091" => 1070, - "old:virtual_from_version:13426" => 1067, - "old:virtual_from_version:47439" => 1621, - "old:virtual_from_version:46784" => 1070, - "old:virtual_from_version:44631" => 1136, - "old:virtual_from_version:46801" => 1659, - "old:virtual_from_version:44477" => 1070, - "old:virtual_from_version:50551" => 1125, - "old:virtual_from_version:45425" => 1070, - "old:virtual_from_version:40305" => 1112, - "old:virtual_from_version:45770" => 1012, - "old:virtual_from_version:40734" => 1016, - "old:virtual_from_version:47017" => 1112, - "old:virtual_from_version:50352" => 1070, - "old:virtual_from_version:44313" => 1037, - "old:virtual_from_version:42338" => 1404, - "old:virtual_from_version:42017" => 1009, - "old:virtual_from_version:49878" => 1314, - "old:virtual_from_version:50083" => 3222, - "old:virtual_from_version:50508" => 1035, - "old:virtual_from_version:49644" => 3186, - "old:virtual_from_version:44451" => 1530, - "old:virtual_from_version:40706" => 1077, - "old:virtual_from_version:45010" => 1150, - "old:virtual_from_version:44457" => 1107, - "old:virtual_from_version:46905" => 1070, - "old:virtual_from_version:47785" => 1070, - "old:virtual_from_version:46321" => 1077, - "old:virtual_from_version:44852" => 1048, - "old:virtual_from_version:44508" => 1321, - "old:virtual_from_version:45055" => 1065, - "old:virtual_from_version:39997" => 1035, - "old:virtual_from_version:42029" => 1222, - "old:virtual_from_version:42663" => 1009, - "old:virtual_from_version:46657" => 1077, - "old:virtual_from_version:46896" => 1353, - "old:virtual_from_version:42507" => 1077, - "old:virtual_from_version:45259" => 1048, - "old:virtual_from_version:42188" => 1172, - "old:virtual_from_version:48019" => 2119, - "old:virtual_from_version:42209" => 1025, - "old:virtual_from_version:46880" => 1397, - "old:virtual_from_version:50465" => 1070, - "old:virtual_from_version:49739" => 1583, - "old:virtual_from_version:45371" => 1314, - "old:virtual_from_version:46171" => 1537, - "old:virtual_from_version:46810" => 1067, - "old:virtual_from_version:45059" => 1067, - "old:virtual_from_version:50217" => 3227, - "old:virtual_from_version:39354" => 1115, - "old:virtual_from_version:49157" => 1070, - "old:virtual_from_version:44322" => 1125, - "old:virtual_from_version:42746" => 1077, - "old:virtual_from_version:45687" => 1615, - "old:virtual_from_version:50597" => 1070, - "old:virtual_from_version:42479" => 1025, - "old:virtual_from_version:49339" => 3136, - "old:virtual_from_version:46926" => 1070, - "old:virtual_from_version:42605" => 1484, - "old:virtual_from_version:42105" => 1077, - "old:virtual_from_version:49476" => 1070, - "old:virtual_from_version:40692" => 1016, - "old:virtual_from_version:49496" => 1507, - "old:virtual_from_version:47003" => 1077, - "old:virtual_from_version:45792" => 1023, - "old:virtual_from_version:50453" => 1150, - "old:virtual_from_version:44890" => 1000, - "old:virtual_from_version:47232" => 1109, - "old:virtual_from_version:46702" => 1009, - "old:virtual_from_version:44378" => 1517, - "old:virtual_from_version:42582" => 1172, - "old:virtual_from_version:46247" => 1077, - "old:virtual_from_version:45161" => 1009, - "old:virtual_from_version:42262" => 1077, - "old:virtual_from_version:44521" => 1067, - "old:virtual_from_version:44338" => 1070, - "old:virtual_from_version:49802" => 3191, - "old:virtual_from_version:47624" => 1084, - "old:virtual_from_version:42423" => 1070, - "old:virtual_from_version:46511" => 1125, - "old:virtual_from_version:46817" => 1070, - "old:virtual_from_version:44284" => 1067, - "old:virtual_from_version:30037" => 1036, - "old:virtual_from_version:50325" => 3237, - "old:virtual_from_version:47149" => 3022, - "old:virtual_from_version:47900" => 1583, - "old:virtual_from_version:46573" => 1077, - "old:virtual_from_version:50411" => 3131, - "old:virtual_from_version:46419" => 1070, - "old:virtual_from_version:38247" => 1025, - "old:virtual_from_version:44690" => 1077, - "old:virtual_from_version:42644" => 1062, - "old:virtual_from_version:38625" => 1125, - "old:virtual_from_version:46666" => 1077, - "old:virtual_from_version:40397" => 1347, - "old:virtual_from_version:39628" => 1012, - "old:virtual_from_version:46331" => 1107, - "old:virtual_from_version:40963" => 1077, - "old:virtual_from_version:46809" => 1070, - "old:virtual_from_version:44106" => 1070, - "old:virtual_from_version:42186" => 1062, - "old:virtual_from_version:49856" => 3131, - "old:virtual_from_version:47556" => 3062, - "old:virtual_from_version:45382" => 1404, - "old:virtual_from_version:46890" => 1067, - "old:virtual_from_version:45818" => 1009, - "old:virtual_from_version:50045" => 3131, - "old:virtual_from_version:50016" => 1100, - "old:virtual_from_version:45003" => 1012, - "old:virtual_from_version:43053" => 2055, - "old:virtual_from_version:45459" => 1109, - "old:virtual_from_version:42689" => 1037, - "old:virtual_from_version:49478" => 1580, - "old:virtual_from_version:42476" => 1070, - "old:virtual_from_version:45717" => 1070, - "old:virtual_from_version:42211" => 1037, - "old:virtual_from_version:44840" => 1009, - "old:virtual_from_version:50601" => 1417, - "old:virtual_from_version:45468" => 1009, - "old:virtual_from_version:42473" => 1105, - "old:virtual_from_version:46330" => 1070, - "old:virtual_from_version:47960" => 1070, - "old:virtual_from_version:38682" => 1404, - "old:virtual_from_version:49560" => 1025, - "old:virtual_from_version:46582" => 1125, - "old:virtual_from_version:42101" => 1070, - "old:virtual_from_version:46508" => 1583, - "old:virtual_from_version:46610" => 1172, - "old:virtual_from_version:50553" => 1070, - "old:virtual_from_version:47056" => 1077, - "old:virtual_from_version:46687" => 1172, - "old:virtual_from_version:47258" => 1587, - "old:virtual_from_version:50617" => 1417, - "old:virtual_from_version:47701" => 1125, - "old:virtual_from_version:40096" => 1067, - "old:virtual_from_version:46861" => 1070, - "old:virtual_from_version:42391" => 1025, - "old:virtual_from_version:44186" => 1107, - "old:virtual_from_version:49218" => 1077, - "old:virtual_from_version:40624" => 1067, - "old:virtual_from_version:42114" => 1070, - "old:virtual_from_version:47530" => 1404, - "old:virtual_from_version:49835" => 3131, - "old:virtual_from_version:47094" => 1009, - "old:virtual_from_version:40877" => 1070, - "old:virtual_from_version:45934" => 1077, - "old:virtual_from_version:44926" => 1067, - "old:virtual_from_version:45884" => 1077, - "old:virtual_from_version:38833" => 1109, - "old:virtual_from_version:49462" => 1580, - "old:virtual_from_version:42016" => 1070, - "old:virtual_from_version:46153" => 1404, - "old:virtual_from_version:40608" => 1381, - "old:virtual_from_version:49882" => 1069, - "old:virtual_from_version:44212" => 1026, - "old:virtual_from_version:40110" => 1009, - "old:virtual_from_version:40910" => 1037, - "old:virtual_from_version:49798" => 1100, - "old:virtual_from_version:42634" => 1037, - "old:virtual_from_version:45477" => 1025, - "old:virtual_from_version:49238" => 1615, - "old:virtual_from_version:49924" => 3186, - "old:virtual_from_version:44275" => 1110, - "old:virtual_from_version:42167" => 1417, - "old:virtual_from_version:49515" => 1105, - "old:virtual_from_version:47662" => 1077, - "old:virtual_from_version:50581" => 1031, - "old:virtual_from_version:40855" => 1070, - "old:virtual_from_version:44965" => 1007, - "old:virtual_from_version:42138" => 1009, - "old:virtual_from_version:43005" => 2030, - "old:virtual_from_version:45342" => 1172, - "old:virtual_from_version:49003" => 1077, - "old:virtual_from_version:50733" => 1006, - "old:virtual_from_version:42751" => 1009, - "old:virtual_from_version:46607" => 1537, - "old:virtual_from_version:44929" => 1070, - "old:virtual_from_version:49228" => 1404, - "old:virtual_from_version:44805" => 1172, - "old:virtual_from_version:44781" => 1077, - "old:virtual_from_version:50350" => 3131, - "old:virtual_from_version:49785" => 1689, - "old:virtual_from_version:42584" => 1008, - "old:virtual_from_version:38347" => 1013, - "old:virtual_from_version:46738" => 1025, - "old:virtual_from_version:41009" => 2020, - "old:virtual_from_version:45082" => 1528, - "old:virtual_from_version:50154" => 1070, - "old:virtual_from_version:50409" => 1585, - "old:virtual_from_version:45754" => 1125, - "old:virtual_from_version:45605" => 1110, - "old:virtual_from_version:49414" => 1109, - "old:virtual_from_version:47100" => 1689, - "old:virtual_from_version:49460" => 1172, - "old:virtual_from_version:44760" => 1009, - "old:virtual_from_version:49576" => 1533, - "old:virtual_from_version:50735" => 1417, - "old:virtual_from_version:44062" => 1077, - "old:virtual_from_version:40403" => 1353, - "old:virtual_from_version:45031" => 1012, - "old:virtual_from_version:47695" => 1109, - "old:virtual_from_version:47329" => 1077, - "old:virtual_from_version:47799" => 1321, - "old:virtual_from_version:40978" => 1048, - "old:virtual_from_version:40386" => 1110, - "old:virtual_from_version:46445" => 1105, - "old:virtual_from_version:49566" => 1381, - "old:virtual_from_version:44024" => 1077, - "old:virtual_from_version:49174" => 1404, - "old:virtual_from_version:42202" => 1077, - "old:virtual_from_version:42278" => 1077, - "old:virtual_from_version:49935" => 1070, - "old:virtual_from_version:46041" => 1488, - "old:virtual_from_version:45482" => 1125, - "old:virtual_from_version:46822" => 1509, - "old:virtual_from_version:43016" => 2041, - "old:virtual_from_version:42179" => 1107, - "old:virtual_from_version:44800" => 1321, - "old:virtual_from_version:42912" => 1035, - "old:virtual_from_version:42567" => 1025, - "old:virtual_from_version:45237" => 1172, - "old:virtual_from_version:50415" => 1037, - "old:virtual_from_version:50166" => 1404, - "old:virtual_from_version:50280" => 1107, - "old:virtual_from_version:45539" => 1025, - "old:virtual_from_version:49232" => 1105, - "old:virtual_from_version:47961" => 1109, - "old:virtual_from_version:46426" => 1077, - "old:virtual_from_version:40942" => 1077, - "old:virtual_from_version:47731" => 1565, - "old:virtual_from_version:46634" => 1070, - "old:virtual_from_version:49603" => 1172, - "old:virtual_from_version:50535" => 1084, - "old:virtual_from_version:46804" => 1125, - "old:virtual_from_version:42759" => 1070, - "old:virtual_from_version:45057" => 1048, - "old:virtual_from_version:3905 " => 1052, - "old:virtual_from_version:44082" => 1070, - "old:virtual_from_version:38434" => 1114, - "old:virtual_from_version:46551" => 1172, - "old:virtual_from_version:40688" => 1076, - "old:virtual_from_version:45789" => 1070, - "old:virtual_from_version:46773" => 1077, - "old:virtual_from_version:43023" => 2048, - "old:virtual_from_version:44375" => 1019, - "old:virtual_from_version:46176" => 1537, - "old:virtual_from_version:45391" => 1051, - "old:virtual_from_version:42481" => 1037, - "old:virtual_from_version:47405" => 1070, - "old:virtual_from_version:50289" => 3222, - "old:virtual_from_version:45854" => 1517, - "old:virtual_from_version:45640" => 1136, - "old:virtual_from_version:49470" => 1136, - "old:virtual_from_version:44224" => 1037, - "old:virtual_from_version:44973" => 1030, - "old:virtual_from_version:50755" => 1070, - "old:virtual_from_version:44242" => 1037, - "old:virtual_from_version:46196" => 1070, - "old:virtual_from_version:44941" => 1005, - "old:virtual_from_version:47075" => 3008, - "old:virtual_from_version:45218" => 1573, - "old:virtual_from_version:50116" => 3191, - "old:virtual_from_version:46170" => 1077, - "old:virtual_from_version:47692" => 1025, - "old:virtual_from_version:46450" => 1048, - "old:virtual_from_version:50444" => 3245, - "old:virtual_from_version:40722" => 1009, - "old:virtual_from_version:50518" => 1311, - "old:virtual_from_version:49472" => 1009, - "old:virtual_from_version:49142" => 1077, - "old:virtual_from_version:46337" => 1070, - "old:virtual_from_version:44426" => 1065, - "old:virtual_from_version:49139" => 1077, - "old:virtual_from_version:45784" => 1029, - "old:virtual_from_version:50662" => 1407, - "old:virtual_from_version:45873" => 1009, - "old:virtual_from_version:49572" => 1158, - "old:virtual_from_version:47869" => 1141, - "old:virtual_from_version:50357" => 1125, - "old:virtual_from_version:49172" => 1172, - "old:virtual_from_version:47644" => 1584, - "old:virtual_from_version:50108" => 1158, - "old:virtual_from_version:42436" => 1025, - "old:virtual_from_version:46267" => 1077, - "old:virtual_from_version:31197" => 1037, - "old:virtual_from_version:46587" => 1006, - "old:virtual_from_version:49712" => 1107, - "old:virtual_from_version:42387" => 1172, - "old:virtual_from_version:42596" => 1067, - "old:virtual_from_version:45828" => 1125, - "old:virtual_from_version:44111" => 1037, - "old:virtual_from_version:40492" => 1037, - "old:virtual_from_version:42534" => 1109, - "old:virtual_from_version:42875" => 1146, - "old:virtual_from_version:47319" => 1659, - "old:virtual_from_version:42166" => 1009, - "old:virtual_from_version:43091" => 2070, - "old:virtual_from_version:50031" => 1007, - "old:virtual_from_version:44134" => 1107, - "old:virtual_from_version:46824" => 1070, - "old:virtual_from_version:40761" => 1077, - "old:virtual_from_version:46269" => 1574, - "old:virtual_from_version:46919" => 1009, - "old:virtual_from_version:46844" => 1172, - "old:virtual_from_version:49180" => 1584, - "old:virtual_from_version:49288" => 3151, - "old:virtual_from_version:47396" => 1037, - "old:virtual_from_version:46997" => 1626, - "old:virtual_from_version:42641" => 1025, - "old:virtual_from_version:45217" => 1572, - "old:virtual_from_version:47722" => 1077, - "old:virtual_from_version:50368" => 1689, - "old:virtual_from_version:50486" => 3234, - "old:virtual_from_version:40575" => 1109, - "old:virtual_from_version:46847" => 1125, - "old:virtual_from_version:47586" => 1125, - "old:virtual_from_version:42182" => 1125, - "old:virtual_from_version:46981" => 1077, - "old:virtual_from_version:42355" => 1051, - "old:virtual_from_version:49893" => 3131, - "old:virtual_from_version:49341" => 1070, - "old:virtual_from_version:42903" => 1077, - "old:virtual_from_version:42991" => 1037, - "old:virtual_from_version:45573" => 1172, - "old:virtual_from_version:50591" => 1070, - "old:virtual_from_version:42977" => 1109, - "old:virtual_from_version:42817" => 1037, - "old:virtual_from_version:42158" => 1070, - "old:virtual_from_version:45450" => 1009, - "old:virtual_from_version:44643" => 1070, - "old:virtual_from_version:50429" => 1076, - "old:virtual_from_version:38535" => 1070, - "old:virtual_from_version:47888" => 1070, - "old:virtual_from_version:38885" => 1136, - "old:virtual_from_version:50195" => 1070, - "old:virtual_from_version:46185" => 1070, - "old:virtual_from_version:45872" => 1067, - "old:virtual_from_version:46026" => 1077, - "old:virtual_from_version:50635" => 3269, - "old:virtual_from_version:49824" => 3120, - "old:virtual_from_version:42329" => 1051, - "old:virtual_from_version:47081" => 1585, - "old:virtual_from_version:45705" => 1077, - "old:virtual_from_version:47456" => 1321, - "old:virtual_from_version:38841" => 1094, - "old:virtual_from_version:49917" => 3131, - "old:virtual_from_version:46427" => 1537, - "old:virtual_from_version:50603" => 1587, - "old:virtual_from_version:47438" => 1381, - "old:virtual_from_version:50511" => 3247, - "old:virtual_from_version:40286" => 1172, - "old:virtual_from_version:42670" => 1037, - "old:virtual_from_version:42074" => 1110, - "old:virtual_from_version:38442" => 1404, - "old:virtual_from_version:44452" => 1527, - "old:virtual_from_version:40566" => 1070, - "old:virtual_from_version:49773" => 3197, - "old:virtual_from_version:50546" => 3201, - "old:virtual_from_version:45043" => 1027, - "old:virtual_from_version:42709" => 1009, - "old:virtual_from_version:39312" => 1070, - "old:virtual_from_version:46924" => 1077, - "old:virtual_from_version:42766" => 1107, - "old:virtual_from_version:50731" => 1070, - "old:virtual_from_version:46669" => 1077, - "old:virtual_from_version:45231" => 1576, - "old:virtual_from_version:35686" => 1101, - "old:virtual_from_version:44592" => 1107, - "old:virtual_from_version:47811" => 3094, - "old:virtual_from_version:46112" => 1077, - "old:virtual_from_version:49312" => 1150, - "old:virtual_from_version:49645" => 3183, - "old:virtual_from_version:44887" => 1009, - "old:virtual_from_version:49501" => 1125, - "old:virtual_from_version:49466" => 1009, - "old:virtual_from_version:42671" => 1488, - "old:virtual_from_version:50717" => 1105, - "old:virtual_from_version:40883" => 1067, - "old:virtual_from_version:13410" => 1065, - "old:virtual_from_version:50401" => 3227, - "old:virtual_from_version:49753" => 3194, - "old:virtual_from_version:46564" => 1077, - "old:virtual_from_version:39371" => 1144, - "old:virtual_from_version:49173" => 1077, - "old:virtual_from_version:46433" => 1025, - "old:virtual_from_version:44250" => 1025, - "old:virtual_from_version:50131" => 1172, - "old:virtual_from_version:46236" => 1574, - "old:virtual_from_version:44433" => 1070, - "old:virtual_from_version:44368" => 1010, - "old:virtual_from_version:47562" => 1077, - "old:virtual_from_version:46114" => 1461, - "old:virtual_from_version:44092" => 1067, - "old:virtual_from_version:42895" => 1109, - "old:virtual_from_version:46221" => 1070, - "old:virtual_from_version:49179" => 1583, - "old:virtual_from_version:44563" => 1077, - "old:virtual_from_version:49404" => 1105, - "old:virtual_from_version:42837" => 1497, - "old:virtual_from_version:46831" => 1110, - "old:virtual_from_version:40703" => 1070, - "old:virtual_from_version:50701" => 3272, - "old:virtual_from_version:50575" => 1125, - "old:virtual_from_version:44638" => 1009, - "old:virtual_from_version:50665" => 1555, - "old:virtual_from_version:42976" => 1037, - "old:virtual_from_version:49436" => 1580, - "old:virtual_from_version:42034" => 1112, - "old:virtual_from_version:44046" => 1009, - "old:virtual_from_version:47611" => 1070, - "old:virtual_from_version:49622" => 1532, - "old:virtual_from_version:50365" => 3240, - "old:virtual_from_version:44419" => 1077, - "old:virtual_from_version:47150" => 3028, - "old:virtual_from_version:50670" => 3208, - "old:virtual_from_version:49323" => 3136, - "old:virtual_from_version:45612" => 1172, - "old:virtual_from_version:46843" => 1067, - "old:virtual_from_version:47661" => 1109, - "old:virtual_from_version:44091" => 1109, - "old:virtual_from_version:44947" => 1094, - "old:virtual_from_version:50541" => 1580, - "old:virtual_from_version:46914" => 3007, - "old:virtual_from_version:50530" => 1125, - "old:virtual_from_version:40886" => 1070, - "old:virtual_from_version:50322" => 1311, - "old:virtual_from_version:42457" => 1035, - "old:virtual_from_version:42220" => 1077, - "old:virtual_from_version:44096" => 1077, - "old:virtual_from_version:46524" => 1107, - "old:virtual_from_version:50006" => 3131, - "old:virtual_from_version:45883" => 1009, - "old:virtual_from_version:42362" => 1070, - "old:virtual_from_version:42892" => 1025, - "old:virtual_from_version:42472" => 1048, - "old:virtual_from_version:45393" => 1404, - "old:virtual_from_version:43054" => 2056, - "old:virtual_from_version:49850" => 1172, - "old:virtual_from_version:44191" => 1037, - "old:virtual_from_version:42764" => 1494, - "old:virtual_from_version:47029" => 3008, - "old:virtual_from_version:46367" => 1444, - "old:virtual_from_version:42295" => 1427, - "old:virtual_from_version:46562" => 1125, - "old:virtual_from_version:46530" => 1091, - "old:virtual_from_version:50507" => 3261, - "old:virtual_from_version:45441" => 1062, - "old:virtual_from_version:44318" => 1520, - "old:virtual_from_version:46195" => 1630, - "old:virtual_from_version:50604" => 1689, - "old:virtual_from_version:44358" => 1125, - "old:virtual_from_version:47306" => 3042, - "old:virtual_from_version:44494" => 1070, - "old:virtual_from_version:45544" => 1076, - "old:virtual_from_version:45718" => 1007, - "old:virtual_from_version:47455" => 3043, - "old:virtual_from_version:49635" => 3139, - "old:virtual_from_version:40711" => 1025, - "old:virtual_from_version:45463" => 1404, - "old:virtual_from_version:45903" => 1632, - "old:virtual_from_version:50118" => 1070, - "old:virtual_from_version:45700" => 1019, - "old:virtual_from_version:43062" => 2063, - "old:virtual_from_version:46279" => 1077, - "old:virtual_from_version:49274" => 1077, - "old:virtual_from_version:40791" => 1370, - "old:virtual_from_version:49787" => 3194, - "old:virtual_from_version:40861" => 1070, - "old:virtual_from_version:42439" => 1037, - "old:virtual_from_version:50129" => 3224, - "old:virtual_from_version:47592" => 1077, - "old:virtual_from_version:42974" => 1025, - "old:virtual_from_version:46160" => 1659, - "old:virtual_from_version:50073" => 3221, - "old:virtual_from_version:49050" => 1689, - "old:virtual_from_version:42651" => 1487, - "old:virtual_from_version:46525" => 1048, - "old:virtual_from_version:44502" => 1009, - "old:virtual_from_version:42798" => 1110, - "old:virtual_from_version:47126" => 1444, - "old:virtual_from_version:45006" => 1077, - "old:virtual_from_version:40287" => 1107, - "old:virtual_from_version:39235" => 1061, - "old:virtual_from_version:44894" => 1125, - "old:virtual_from_version:42297" => 1429, - "old:virtual_from_version:10003" => 2002, - "old:virtual_from_version:49201" => 1070, - "old:virtual_from_version:47092" => 1125, - "old:virtual_from_version:49574" => 1158, - "old:virtual_from_version:46109" => 1077, - "old:virtual_from_version:47127" => 1585, - "old:virtual_from_version:42384" => 1077, - "old:virtual_from_version:43050" => 2020, - "old:virtual_from_version:45881" => 1630, - "old:virtual_from_version:40642" => 1393, - "old:virtual_from_version:47241" => 1109, - "old:virtual_from_version:46072" => 1077, - "old:virtual_from_version:45037" => 1115, - "old:virtual_from_version:39709" => 1110, - "old:virtual_from_version:44463" => 1048, - "old:virtual_from_version:42455" => 1114, - "old:virtual_from_version:45134" => 1009, - "old:virtual_from_version:38631" => 1126, - "old:virtual_from_version:47464" => 3008, - "old:virtual_from_version:47909" => 3006, - "old:virtual_from_version:50146" => 3058, - "old:virtual_from_version:47104" => 1077, - "old:virtual_from_version:50655" => 1555, - "old:virtual_from_version:49717" => 1006, - "old:virtual_from_version:49206" => 1136, - "old:virtual_from_version:50724" => 1666, - "old:virtual_from_version:45551" => 1077, - "old:virtual_from_version:49735" => 3194, - "old:virtual_from_version:47177" => 1638, - "old:virtual_from_version:46910" => 1077, - "old:virtual_from_version:44314" => 1062, - "old:virtual_from_version:46025" => 1067, - "old:virtual_from_version:46745" => 1070, - "old:virtual_from_version:50215" => 3131, - "old:virtual_from_version:46103" => 1077, - "old:virtual_from_version:42463" => 1009, - "old:virtual_from_version:42053" => 1110, - "old:virtual_from_version:46770" => 1070, - "old:virtual_from_version:39952" => 1107, - "old:virtual_from_version:49726" => 1404, - "old:virtual_from_version:42204" => 1070, - "old:virtual_from_version:49883" => 1444, - "old:virtual_from_version:50305" => 1067, - "old:virtual_from_version:47892" => 1699, - "old:virtual_from_version:45631" => 1136, - "old:virtual_from_version:50547" => 3227, - "old:virtual_from_version:42496" => 1067, - "old:virtual_from_version:49299" => 3008, - "old:virtual_from_version:42279" => 1037, - "old:virtual_from_version:47842" => 3094, - "old:virtual_from_version:40568" => 1077, - "old:virtual_from_version:49289" => 3146, - "old:virtual_from_version:47896" => 1125, - "old:virtual_from_version:50550" => 3259, - "old:virtual_from_version:50460" => 1580, - "old:virtual_from_version:44487" => 1007, - "old:virtual_from_version:45087" => 1565, - "old:virtual_from_version:42394" => 1067, - "old:virtual_from_version:50019" => 3131, - "old:virtual_from_version:44702" => 1037, - "old:virtual_from_version:49536" => 1105, - "old:virtual_from_version:45514" => 1077, - "old:virtual_from_version:44437" => 1109, - "old:virtual_from_version:38857" => 1404, - "old:virtual_from_version:42923" => 1077, - "old:virtual_from_version:40989" => 1037, - "old:virtual_from_version:42161" => 1057, - "old:virtual_from_version:47539" => 1077, - "old:virtual_from_version:49654" => 1489, - "old:virtual_from_version:47596" => 1125, - "old:virtual_from_version:46931" => 1105, - "old:virtual_from_version:39706" => 1077, - "old:virtual_from_version:39537" => 1172, - "old:virtual_from_version:46425" => 1112, - "old:virtual_from_version:49981" => 1314, - "old:virtual_from_version:46697" => 1077, - "old:virtual_from_version:45834" => 1621, - "old:virtual_from_version:39274" => 1107, - "old:virtual_from_version:49642" => 1069, - "old:virtual_from_version:44689" => 1025, - "old:virtual_from_version:47382" => 1125, - "old:virtual_from_version:46095" => 1136, - "old:virtual_from_version:46216" => 1077, - "old:virtual_from_version:47039" => 1070, - "old:virtual_from_version:46677" => 1070, - "old:virtual_from_version:42834" => 1418, - "old:virtual_from_version:49618" => 3184, - "old:virtual_from_version:49806" => 3131, - "old:virtual_from_version:40514" => 1048, - "old:virtual_from_version:47059" => 1065, - "old:virtual_from_version:45086" => 1077, - "old:virtual_from_version:45885" => 1070, - "old:virtual_from_version:46848" => 1067, - "old:virtual_from_version:49122" => 1105, - "old:virtual_from_version:46819" => 1077, - "old:virtual_from_version:29531" => 1083, - "old:virtual_from_version:45380" => 1009, - "old:virtual_from_version:40737" => 1081, - "old:virtual_from_version:47276" => 1689, - "old:virtual_from_version:45931" => 1070, - "old:virtual_from_version:44559" => 1037, - "old:virtual_from_version:45796" => 1027, - "old:virtual_from_version:43018" => 2043, - "old:virtual_from_version:42868" => 1067, - "old:virtual_from_version:42283" => 1425, - "old:virtual_from_version:46256" => 1077, - "old:virtual_from_version:44073" => 1107, - "old:virtual_from_version:44860" => 1553, - "old:virtual_from_version:47489" => 1077, - "old:virtual_from_version:44042" => 1037, - "old:virtual_from_version:47957" => 1689, - "old:virtual_from_version:46803" => 1070, - "old:virtual_from_version:38996" => 1078, - "old:virtual_from_version:47054" => 1015, - "old:virtual_from_version:50055" => 1006, - "old:virtual_from_version:42210" => 1077, - "old:virtual_from_version:42784" => 1037, - "old:virtual_from_version:42898" => 1077, - "old:virtual_from_version:47537" => 1109, - "old:virtual_from_version:45577" => 1404, - "old:virtual_from_version:44098" => 1067, - "old:virtual_from_version:47616" => 1537, - "old:virtual_from_version:42866" => 1037, - "old:virtual_from_version:42245" => 1077, - "old:virtual_from_version:42772" => 1077, - "old:virtual_from_version:44716" => 1076, - "old:virtual_from_version:44745" => 1006, - "old:virtual_from_version:44540" => 1009, - "old:virtual_from_version:46932" => 1077, - "old:virtual_from_version:43047" => 2003, - "old:virtual_from_version:47806" => 1105, - "old:virtual_from_version:47014" => 1070, - "old:virtual_from_version:50007" => 3215, - "old:virtual_from_version:46501" => 1537, - "old:virtual_from_version:47225" => 1689, - "old:virtual_from_version:49895" => 1069, - "old:virtual_from_version:42377" => 1037, - "old:virtual_from_version:47236" => 1109, - "old:virtual_from_version:45090" => 1517, - "old:virtual_from_version:46627" => 1077, - "old:virtual_from_version:49615" => 1404, - "old:virtual_from_version:46148" => 1070, - "old:virtual_from_version:44567" => 1009, - "old:virtual_from_version:44203" => 1067, - "old:virtual_from_version:44273" => 1077, - "old:virtual_from_version:42978" => 1067, - "old:virtual_from_version:47510" => 1077, - "old:virtual_from_version:45029" => 1010, - "old:virtual_from_version:44627" => 1077, - "old:virtual_from_version:44083" => 1009, - "old:virtual_from_version:45547" => 1070, - "old:virtual_from_version:45103" => 1077, - "old:virtual_from_version:44548" => 1037, - "old:virtual_from_version:47214" => 1172, - "old:virtual_from_version:42155" => 1077, - "old:virtual_from_version:40488" => 1037, - "old:virtual_from_version:46464" => 1362, - "old:virtual_from_version:38949" => 1070, - "old:virtual_from_version:49816" => 1057, - "old:virtual_from_version:46717" => 1697, - "old:virtual_from_version:46238" => 1659, - "old:virtual_from_version:47545" => 1070, - "old:virtual_from_version:47114" => 3020, - "old:virtual_from_version:45591" => 1136, - "old:virtual_from_version:40525" => 1077, - "old:virtual_from_version:42025" => 1109, - "old:virtual_from_version:50010" => 1012, - "old:virtual_from_version:42771" => 1025, - "old:virtual_from_version:42807" => 1025, - "old:virtual_from_version:40794" => 1069, - "old:virtual_from_version:46423" => 1070, - "old:virtual_from_version:38417" => 1077, - "old:virtual_from_version:42183" => 1077, - "old:virtual_from_version:39575" => 1110, - "old:virtual_from_version:45923" => 1048, - "old:virtual_from_version:50459" => 1532, - "old:virtual_from_version:50056" => 3131, - "old:virtual_from_version:49906" => 3078, - "old:virtual_from_version:50001" => 1689, - "old:virtual_from_version:39148" => 1077, - "old:virtual_from_version:49459" => 1062, - "old:virtual_from_version:44809" => 1070, - "old:virtual_from_version:42792" => 1070, - "old:virtual_from_version:45656" => 1076, - "old:virtual_from_version:49926" => 3209, - "old:virtual_from_version:46310" => 1025, - "old:virtual_from_version:42879" => 1009, - "old:virtual_from_version:42840" => 1009, - "old:virtual_from_version:44722" => 1067, - "old:virtual_from_version:50420" => 1037, - "old:virtual_from_version:47403" => 1697, - "old:virtual_from_version:46789" => 1125, - "old:virtual_from_version:50042" => 1009, - "old:virtual_from_version:40945" => 1009, - "old:virtual_from_version:42462" => 1007, - "old:virtual_from_version:50372" => 3008, - "old:virtual_from_version:46198" => 1404, - "old:virtual_from_version:46384" => 1402, - "old:virtual_from_version:42995" => 1070, - "old:virtual_from_version:47067" => 1070, - "old:virtual_from_version:47132" => 1125, - "old:virtual_from_version:40483" => 1369, - "old:virtual_from_version:40844" => 1410, - "old:virtual_from_version:40823" => 1067, - "old:virtual_from_version:42593" => 1077, - "old:virtual_from_version:47703" => 1077, - "old:virtual_from_version:49161" => 1077, - "old:virtual_from_version:39903" => 1077, - "old:virtual_from_version:46715" => 1077, - "old:virtual_from_version:46639" => 1070, - "old:virtual_from_version:45495" => 1136, - "old:virtual_from_version:40196" => 1007, - "old:virtual_from_version:47333" => 1077, - "old:virtual_from_version:42905" => 1109, - "old:virtual_from_version:44440" => 1070, - "old:virtual_from_version:44441" => 1009, - "old:virtual_from_version:47933" => 1077, - "old:virtual_from_version:42779" => 1077, - "old:virtual_from_version:49938" => 1125, - "old:virtual_from_version:46840" => 1025, - "old:virtual_from_version:44741" => 1070, - "old:virtual_from_version:44784" => 1025, - "old:virtual_from_version:14391" => 1068, - "old:virtual_from_version:42067" => 1025, - "old:virtual_from_version:47363" => 1025, - "old:virtual_from_version:45636" => 1172, - "old:virtual_from_version:49166" => 1125, - "old:virtual_from_version:45323" => 1110, - "old:virtual_from_version:47829" => 1037, - "old:virtual_from_version:46754" => 1070, - "old:virtual_from_version:47776" => 1070, - "old:virtual_from_version:45782" => 1587, - "old:virtual_from_version:50178" => 1172, - "old:virtual_from_version:44309" => 1009, - "old:virtual_from_version:39885" => 1136, - "old:virtual_from_version:50272" => 3131, - "old:virtual_from_version:42356" => 1070, - "old:virtual_from_version:45617" => 1172, - "old:virtual_from_version:44568" => 1517, - "old:virtual_from_version:46212" => 1070, - "old:virtual_from_version:46289" => 1107, - "old:virtual_from_version:40862" => 1077, - "old:virtual_from_version:47506" => 1070, - "old:virtual_from_version:46462" => 1125, - "old:virtual_from_version:45084" => 1070, - "old:virtual_from_version:39476" => 1081, - "old:virtual_from_version:46352" => 1190, - "old:virtual_from_version:50268" => 1488, - "old:virtual_from_version:47242" => 1077, - "old:virtual_from_version:45442" => 1150, - "old:virtual_from_version:44724" => 1539, - "old:virtual_from_version:47281" => 1172, - "old:virtual_from_version:40594" => 1070, - "old:virtual_from_version:46941" => 1125, - "old:virtual_from_version:46411" => 1070, - "old:virtual_from_version:46086" => 1017, - "old:virtual_from_version:44647" => 1077, - "old:virtual_from_version:50307" => 3131, - "old:virtual_from_version:44787" => 1057, - "old:virtual_from_version:42208" => 1070, - "old:virtual_from_version:13404" => 1047, - "old:virtual_from_version:50026" => 1125, - "old:virtual_from_version:44856" => 1070, - "old:virtual_from_version:44171" => 1070, - "old:virtual_from_version:49974" => 3120, - "old:virtual_from_version:44124" => 1107, - "old:virtual_from_version:50738" => 1689, - "old:virtual_from_version:42870" => 1025, - "old:virtual_from_version:46446" => 1537, - "old:virtual_from_version:40478" => 1070, - "old:virtual_from_version:42413" => 1037, - "old:virtual_from_version:50680" => 1583, - "old:virtual_from_version:49439" => 1070, - "old:virtual_from_version:50467" => 3009, - "old:virtual_from_version:44337" => 1081, - "old:virtual_from_version:42853" => 1504, - "old:virtual_from_version:49291" => 1649, - "old:virtual_from_version:45812" => 1574, - "old:virtual_from_version:45565" => 1404, - "old:virtual_from_version:46515" => 1070, - "old:virtual_from_version:49499" => 3078, - "old:virtual_from_version:46085" => 1070, - "old:virtual_from_version:42196" => 1070, - "old:virtual_from_version:45534" => 1489, - "old:virtual_from_version:44029" => 1070, - "old:virtual_from_version:44087" => 1009, - "old:virtual_from_version:45034" => 1064, - "old:virtual_from_version:50048" => 1444, - "old:virtual_from_version:46992" => 1025, - "old:virtual_from_version:45042" => 1025, - "old:virtual_from_version:47243" => 1070, - "old:virtual_from_version:49453" => 1444, - "old:virtual_from_version:40536" => 1070, - "old:virtual_from_version:45045" => 1077, - "old:virtual_from_version:45395" => 1112, - "old:virtual_from_version:42367" => 1413, - "old:virtual_from_version:46424" => 1125, - "old:virtual_from_version:40966" => 1048, - "old:virtual_from_version:42777" => 1070, - "old:virtual_from_version:49380" => 1077, - "old:virtual_from_version:46476" => 1009, - "old:virtual_from_version:46636" => 1067, - "old:virtual_from_version:38617" => 1123, - "old:virtual_from_version:44744" => 1070, - "old:virtual_from_version:40749" => 1077, - "old:virtual_from_version:47630" => 1109, - "old:virtual_from_version:40738" => 1048, - "old:virtual_from_version:47169" => 3031, - "old:virtual_from_version:46549" => 1125, - "old:virtual_from_version:45594" => 1009, - "old:virtual_from_version:40969" => 1009, - "old:virtual_from_version:49099" => 3136, - "old:virtual_from_version:38342" => 1006, - "old:virtual_from_version:44857" => 1077, - "old:virtual_from_version:49693" => 1078, - "old:virtual_from_version:44581" => 1009, - "old:virtual_from_version:44905" => 1555, - "old:virtual_from_version:44574" => 1070, - "old:virtual_from_version:39605" => 1067, - "old:virtual_from_version:44590" => 1037, - "old:virtual_from_version:45317" => 1125, - "old:virtual_from_version:50686" => 3259, - "old:virtual_from_version:49236" => 1070, - "old:virtual_from_version:42732" => 1037, - "old:virtual_from_version:44370" => 1012, - "old:virtual_from_version:42831" => 1077, - "old:virtual_from_version:49220" => 1314, - "old:virtual_from_version:47988" => 1009, - "old:virtual_from_version:50061" => 1019, - "old:virtual_from_version:42712" => 1311, - "old:virtual_from_version:50279" => 3131, - "old:virtual_from_version:46838" => 1172, - "old:virtual_from_version:49626" => 1158, - "old:virtual_from_version:44535" => 1077, - "old:virtual_from_version:47951" => 3124, - "old:virtual_from_version:40394" => 1136, - "old:virtual_from_version:40294" => 1321, - "old:virtual_from_version:45505" => 1580, - "old:virtual_from_version:45953" => 1108, - "old:virtual_from_version:50253" => 1489, - "old:virtual_from_version:40691" => 1009, - "old:virtual_from_version:50587" => 1417, - "old:virtual_from_version:45007" => 1031, - "old:virtual_from_version:50269" => 1078, - "old:virtual_from_version:47293" => 1105, - "old:virtual_from_version:40292" => 1048, - "old:virtual_from_version:45460" => 1067, - "old:virtual_from_version:42020" => 1037, - "old:virtual_from_version:49903" => 1404, - "old:virtual_from_version:46390" => 1172, - "old:virtual_from_version:46277" => 1070, - "old:virtual_from_version:46181" => 1537, - "old:virtual_from_version:49117" => 1037, - "old:virtual_from_version:42698" => 1037, - "old:virtual_from_version:42228" => 1419, - "old:virtual_from_version:44539" => 1070, - "old:virtual_from_version:50421" => 1314, - "old:virtual_from_version:42416" => 1070, - "old:virtual_from_version:46252" => 1665, - "old:virtual_from_version:40830" => 1077, - "old:virtual_from_version:46316" => 1613, - "old:virtual_from_version:46033" => 1410, - "old:virtual_from_version:49241" => 1532, - "old:virtual_from_version:45827" => 1362, - "old:virtual_from_version:47257" => 1517, - "old:virtual_from_version:46913" => 3007, - "old:virtual_from_version:47080" => 1584, - "old:virtual_from_version:47270" => 1037, - "old:virtual_from_version:50167" => 1413, - "old:virtual_from_version:44189" => 1025, - "old:virtual_from_version:44899" => 1123, - "old:virtual_from_version:42804" => 1070, - "old:virtual_from_version:44917" => 1070, - "old:virtual_from_version:46281" => 1077, - "old:virtual_from_version:49348" => 3139, - "old:virtual_from_version:44799" => 1321, - "old:virtual_from_version:45305" => 1125, - "old:virtual_from_version:44661" => 1077, - "old:virtual_from_version:50754" => 3186, - "old:virtual_from_version:44434" => 1009, - "old:virtual_from_version:50104" => 1222, - "old:virtual_from_version:49544" => 1404, - "old:virtual_from_version:47037" => 1689, - "old:virtual_from_version:50657" => 1009, - "old:virtual_from_version:45859" => 1077, - "old:virtual_from_version:49766" => 1077, - "old:virtual_from_version:49147" => 1532, - "old:virtual_from_version:40746" => 1070, - "old:virtual_from_version:47217" => 1689, - "old:virtual_from_version:50539" => 1404, - "old:virtual_from_version:49751" => 1006, - "old:virtual_from_version:42588" => 1062, - "old:virtual_from_version:49984" => 1070, - "old:virtual_from_version:47034" => 1555, - "old:virtual_from_version:40895" => 1110, - "old:virtual_from_version:46584" => 1689, - "old:virtual_from_version:48027" => 2025, - "old:virtual_from_version:33505" => 1081, - "old:virtual_from_version:40922" => 1037, - "old:virtual_from_version:47917" => 1109, - "old:virtual_from_version:41007" => 2018, - "old:virtual_from_version:40253" => 1110, - "old:virtual_from_version:38358" => 1040, - "old:virtual_from_version:45258" => 1081, - "old:virtual_from_version:47985" => 1125, - "old:virtual_from_version:44552" => 1107, - "old:virtual_from_version:45053" => 1110, - "old:virtual_from_version:40804" => 1025, - "old:virtual_from_version:44765" => 1015, - "old:virtual_from_version:49072" => 1083, - "old:virtual_from_version:44891" => 1070, - "old:virtual_from_version:48014" => 2114, - "old:virtual_from_version:13342" => 1064, - "old:virtual_from_version:47890" => 1109, - "old:virtual_from_version:46206" => 1633, - "old:virtual_from_version:46655" => 1007, - "old:virtual_from_version:49467" => 1689, - "old:virtual_from_version:38436" => 1006, - "old:virtual_from_version:45548" => 1109, - "old:virtual_from_version:42867" => 1109, - "old:virtual_from_version:40179" => 1015, - "old:virtual_from_version:47245" => 1037, - "old:virtual_from_version:50306" => 1404, - "old:virtual_from_version:47264" => 1689, - "old:virtual_from_version:46556" => 1125, - "old:virtual_from_version:40238" => 1144, - "old:virtual_from_version:47262" => 1009, - "old:virtual_from_version:47302" => 1580, - "old:virtual_from_version:47320" => 1070, - "old:virtual_from_version:46098" => 1649, - "old:virtual_from_version:47552" => 1105, - "old:virtual_from_version:47078" => 1077, - "old:virtual_from_version:46594" => 1172, - "old:virtual_from_version:38800" => 1110, - "old:virtual_from_version:39510" => 1070, - "old:virtual_from_version:47206" => 1109, - "old:virtual_from_version:44207" => 1107, - "old:virtual_from_version:44323" => 1070, - "old:virtual_from_version:42688" => 1077, - "old:virtual_from_version:49755" => 1070, - "old:virtual_from_version:46930" => 1051, - "old:virtual_from_version:42603" => 1105, - "old:virtual_from_version:45735" => 1077, - "old:virtual_from_version:46081" => 1415, - "old:virtual_from_version:46001" => 1649, - "old:virtual_from_version:47151" => 1007, - "old:virtual_from_version:45266" => 1027, - "old:virtual_from_version:47674" => 1109, - "old:virtual_from_version:40563" => 1077, - "old:virtual_from_version:46179" => 1077, - "old:virtual_from_version:45318" => 1009, - "old:virtual_from_version:44547" => 1077, - "old:virtual_from_version:46410" => 1676, - "old:virtual_from_version:44352" => 1037, - "old:virtual_from_version:40739" => 1084, - "old:virtual_from_version:40531" => 1077, - "old:virtual_from_version:46978" => 1037, - "old:virtual_from_version:46347" => 1555, - "old:virtual_from_version:50523" => 1016, - "old:virtual_from_version:42946" => 1037, - "old:virtual_from_version:45137" => 1057, - "old:virtual_from_version:47634" => 1585, - "old:virtual_from_version:49687" => 1009, - "old:virtual_from_version:50071" => 3131, - "old:virtual_from_version:40473" => 1037, - "old:virtual_from_version:47348" => 1109, - "old:virtual_from_version:49834" => 3120, - "old:virtual_from_version:44005" => 1500, - "old:virtual_from_version:42041" => 1172, - "old:virtual_from_version:46645" => 1537, - "old:virtual_from_version:49235" => 1689, - "old:virtual_from_version:49114" => 1070, - "old:virtual_from_version:42872" => 1037, - "old:virtual_from_version:49435" => 1555, - "old:virtual_from_version:46865" => 3004, - "old:virtual_from_version:42277" => 1069, - "old:virtual_from_version:46595" => 1077, - "old:virtual_from_version:45096" => 1517, - "old:virtual_from_version:49227" => 1077, - "old:virtual_from_version:42065" => 1048, - "old:virtual_from_version:49690" => 1489, - "old:virtual_from_version:39531" => 1069, - "old:virtual_from_version:49149" => 1007, - "old:virtual_from_version:49779" => 1404, - "old:virtual_from_version:46326" => 1062, - "old:virtual_from_version:44963" => 1065, - "old:virtual_from_version:49945" => 1025, - "old:virtual_from_version:50032" => 1070, - "old:virtual_from_version:46137" => 1077, - "old:virtual_from_version:50679" => 1417, - "old:virtual_from_version:46011" => 1109, - "old:virtual_from_version:47446" => 1621, - "old:virtual_from_version:44371" => 1015, - "old:virtual_from_version:49276" => 1616, - "old:virtual_from_version:46030" => 1062, - "old:virtual_from_version:47885" => 1077, - "old:virtual_from_version:47542" => 1109, - "old:virtual_from_version:45430" => 1009, - "old:virtual_from_version:45795" => 1109, - "old:virtual_from_version:49119" => 1109, - "old:virtual_from_version:40721" => 1070, - "old:virtual_from_version:46389" => 1112, - "old:virtual_from_version:47557" => 1070, - "old:virtual_from_version:43015" => 2040, - "old:virtual_from_version:45047" => 1036, - "old:virtual_from_version:40783" => 1048, - "old:virtual_from_version:47927" => 1659, - "old:virtual_from_version:49332" => 1077, - "old:virtual_from_version:46219" => 1077, - "old:virtual_from_version:40921" => 1077, - "old:virtual_from_version:47851" => 1583, - "old:virtual_from_version:45916" => 1109, - "old:virtual_from_version:40521" => 1105, - "old:virtual_from_version:45897" => 1077, - "old:virtual_from_version:43046" => 2000, - "old:virtual_from_version:47597" => 1109, - "old:virtual_from_version:45481" => 1070, - "old:virtual_from_version:46065" => 1070, - "old:virtual_from_version:42193" => 1070, - "old:virtual_from_version:42594" => 1037, - "old:virtual_from_version:40889" => 1025, - "old:virtual_from_version:42715" => 1009, - "old:virtual_from_version:46039" => 1410, - "old:virtual_from_version:50255" => 3131, - "old:virtual_from_version:49030" => 1649, - "old:virtual_from_version:50586" => 1032, - "old:virtual_from_version:40914" => 1077, - "old:virtual_from_version:44163" => 1110, - "old:virtual_from_version:46303" => 1425, - "old:virtual_from_version:44558" => 1077, - "old:virtual_from_version:45910" => 1404, - "old:virtual_from_version:42625" => 1037, - "old:virtual_from_version:47478" => 1077, - "old:virtual_from_version:50127" => 1689, - "old:virtual_from_version:50627" => 1407, - "old:virtual_from_version:44039" => 1009, - "old:virtual_from_version:46500" => 1136, - "old:virtual_from_version:46399" => 1077, - "old:virtual_from_version:47030" => 1070, - "old:virtual_from_version:44359" => 1000, - "old:virtual_from_version:47461" => 1444, - "old:virtual_from_version:50567" => 1125, - "old:virtual_from_version:46656" => 1070, - "old:virtual_from_version:50231" => 1005, - "old:virtual_from_version:45428" => 1109, - "old:virtual_from_version:49027" => 3131, - "old:virtual_from_version:47440" => 1070, - "old:virtual_from_version:50393" => 3131, - "old:virtual_from_version:38348" => 1014, - "old:virtual_from_version:45370" => 1407, - "old:virtual_from_version:46983" => 1584, - "old:virtual_from_version:40806" => 1136, - "old:virtual_from_version:50218" => 3008, - "old:virtual_from_version:40009" => 1192, - "old:virtual_from_version:47598" => 1077, - "old:virtual_from_version:47479" => 1381, - "old:virtual_from_version:50275" => 3231, - "old:virtual_from_version:43084" => 2081, - "old:virtual_from_version:49204" => 1077, - "old:virtual_from_version:46449" => 1532, - "old:virtual_from_version:44704" => 1540, - "old:virtual_from_version:49896" => 3131, - "old:virtual_from_version:47899" => 1077, - "old:virtual_from_version:40897" => 1070, - "old:virtual_from_version:46873" => 1410, - "old:virtual_from_version:44605" => 1025, - "old:virtual_from_version:46361" => 1070, - "old:virtual_from_version:43049" => 2019, - "old:virtual_from_version:45579" => 1172, - "old:virtual_from_version:42123" => 1172, - "old:virtual_from_version:47032" => 1172, - "old:virtual_from_version:45951" => 1533, - "old:virtual_from_version:44876" => 1067, - "old:virtual_from_version:45327" => 1125, - "old:virtual_from_version:40808" => 1007, - "old:virtual_from_version:46406" => 1025, - "old:virtual_from_version:47277" => 1125, - "old:virtual_from_version:46313" => 1537, - "old:virtual_from_version:49995" => 1404, - "old:virtual_from_version:46519" => 1025, - "old:virtual_from_version:42232" => 1070, - "old:virtual_from_version:42610" => 1037, - "old:virtual_from_version:50722" => 1084, - "old:virtual_from_version:49046" => 1583, - "old:virtual_from_version:46614" => 1070, - "old:virtual_from_version:42981" => 1077, - "old:virtual_from_version:40713" => 1048, - "old:virtual_from_version:47536" => 1125, - "old:virtual_from_version:40881" => 1110, - "old:virtual_from_version:45026" => 1007, - "old:virtual_from_version:44344" => 1081, - "old:virtual_from_version:50703" => 1172, - "old:virtual_from_version:42819" => 1501, - "old:virtual_from_version:49259" => 1404, - "old:virtual_from_version:45310" => 1580, - "old:virtual_from_version:45152" => 1107, - "old:virtual_from_version:44771" => 1070, - "old:virtual_from_version:45645" => 1077, - "old:virtual_from_version:47284" => 3009, - "old:virtual_from_version:46191" => 1070, - "old:virtual_from_version:50538" => 1402, - "old:virtual_from_version:36622" => 1008, - "old:virtual_from_version:42137" => 1007, - "old:virtual_from_version:47991" => 1070, - "old:virtual_from_version:44823" => 1349, - "old:virtual_from_version:42124" => 1070, - "old:virtual_from_version:42669" => 1077, - "old:virtual_from_version:47683" => 1136, - "old:virtual_from_version:49989" => 1100, - "old:virtual_from_version:44749" => 1224, - "old:virtual_from_version:49902" => 1070, - "old:virtual_from_version:49821" => 1444, - "old:virtual_from_version:49309" => 1077, - "old:virtual_from_version:39532" => 1015, - "old:virtual_from_version:46864" => 1076, - "old:virtual_from_version:50040" => 3159, - "old:virtual_from_version:49171" => 1125, - "old:virtual_from_version:50149" => 1125, - "old:virtual_from_version:38702" => 1062, - "old:virtual_from_version:46307" => 1067, - "old:virtual_from_version:45556" => 1070, - "old:virtual_from_version:42475" => 1000, - "old:virtual_from_version:42992" => 1110, - "old:virtual_from_version:46688" => 1077, - "old:virtual_from_version:45376" => 1314, - "old:virtual_from_version:42855" => 1070, - "old:virtual_from_version:47038" => 3008, - "old:virtual_from_version:44642" => 1125, - "old:virtual_from_version:42180" => 1070, - "old:virtual_from_version:46928" => 1070, - "old:virtual_from_version:44839" => 1488, - "old:virtual_from_version:45081" => 1555, - "old:virtual_from_version:45572" => 1077, - "old:virtual_from_version:40787" => 1067, - "old:virtual_from_version:42351" => 1125, - "old:virtual_from_version:50176" => 3131, - "old:virtual_from_version:40454" => 1404, - "old:virtual_from_version:47255" => 1001, - "old:virtual_from_version:46724" => 1517, - "old:virtual_from_version:50278" => 1444, - "old:virtual_from_version:45582" => 1077, - "old:virtual_from_version:45307" => 1565, - "old:virtual_from_version:47636" => 1488, - "old:virtual_from_version:40931" => 1070, - "old:virtual_from_version:44114" => 1125, - "old:virtual_from_version:47570" => 1105, - "old:virtual_from_version:46396" => 1070, - "old:virtual_from_version:42692" => 1048, - "old:virtual_from_version:49591" => 1444, - "old:virtual_from_version:45269" => 1090, - "old:virtual_from_version:42592" => 1009, - "old:virtual_from_version:47508" => 1109, - "old:virtual_from_version:40515" => 1067, - "old:virtual_from_version:40276" => 1115, - "old:virtual_from_version:42968" => 1037, - "old:virtual_from_version:46833" => 1015, - "old:virtual_from_version:40728" => 1025, - "old:virtual_from_version:42934" => 1009, - "old:virtual_from_version:40493" => 1404, - "old:virtual_from_version:45000" => 1008, - "old:virtual_from_version:45914" => 1077, - "old:virtual_from_version:46857" => 1070, - "old:virtual_from_version:46967" => 1134, - "old:virtual_from_version:47928" => 1070, - "old:virtual_from_version:50439" => 3243, - "old:virtual_from_version:44527" => 1025, - "old:virtual_from_version:45245" => 1049, - "old:virtual_from_version:46275" => 1077, - "old:virtual_from_version:49786" => 3131, - "old:virtual_from_version:47457" => 1070, - "old:virtual_from_version:39579" => 1086, - "old:virtual_from_version:44235" => 1110, - "old:virtual_from_version:40753" => 1070, - "old:virtual_from_version:39728" => 1048, - "old:virtual_from_version:46681" => 1125, - "old:virtual_from_version:42576" => 1070, - "old:virtual_from_version:49982" => 1689, - "old:virtual_from_version:44818" => 1070, - "old:virtual_from_version:45302" => 1414, - "old:virtual_from_version:42290" => 1115, - "old:virtual_from_version:42160" => 1037, - "old:virtual_from_version:49836" => 3194, - "old:virtual_from_version:49653" => 1314, - "old:virtual_from_version:50468" => 3246, - "old:virtual_from_version:40993" => 1070, - "old:virtual_from_version:50137" => 1540, - "old:virtual_from_version:40654" => 1083, - "old:virtual_from_version:47120" => 1070, - "old:virtual_from_version:42214" => 1025, - "old:virtual_from_version:43007" => 2032, - "old:virtual_from_version:42645" => 1109, - "old:virtual_from_version:49070" => 1404, - "old:virtual_from_version:50356" => 3131, - "old:virtual_from_version:50765" => 1070, - "old:virtual_from_version:49293" => 1051, - "old:virtual_from_version:50519" => 1311, - "old:virtual_from_version:50466" => 1172, - "old:virtual_from_version:45816" => 1125, - "old:virtual_from_version:40833" => 1070, - "old:virtual_from_version:49492" => 1125, - "old:virtual_from_version:45429" => 1067, - "old:virtual_from_version:50702" => 1070, - "old:virtual_from_version:40348" => 1095, - "old:virtual_from_version:46301" => 1613, - "old:virtual_from_version:50464" => 3204, - "old:virtual_from_version:44514" => 1070, - "old:virtual_from_version:46837" => 1070, - "old:virtual_from_version:42865" => 1077, - "old:virtual_from_version:42707" => 1037, - "old:virtual_from_version:45493" => 1580, - "old:virtual_from_version:50192" => 3028, - "old:virtual_from_version:50653" => 1419, - "old:virtual_from_version:46727" => 1584, - "old:virtual_from_version:44461" => 1077, - "old:virtual_from_version:50282" => 3131, - "old:virtual_from_version:44259" => 1172, - "old:virtual_from_version:45625" => 1136, - "old:virtual_from_version:47673" => 1070, - "old:virtual_from_version:45963" => 1461, - "old:virtual_from_version:49019" => 1035, - "old:virtual_from_version:45297" => 1125, - "old:virtual_from_version:44065" => 1077, - "old:virtual_from_version:42705" => 1070, - "old:virtual_from_version:45046" => 1031, - "old:virtual_from_version:46746" => 1077, - "old:virtual_from_version:47911" => 1314, - "old:virtual_from_version:45061" => 1051, - "old:virtual_from_version:40097" => 1083, - "old:virtual_from_version:46942" => 1107, - "old:virtual_from_version:49667" => 1070, - "old:virtual_from_version:40540" => 1067, - "old:virtual_from_version:44664" => 1077, - "old:virtual_from_version:44669" => 1077, - "old:virtual_from_version:50561" => 3259, - "old:virtual_from_version:10001" => 2000, - "old:virtual_from_version:46101" => 1077, - "old:virtual_from_version:40648" => 1128, - "old:virtual_from_version:46124" => 1555, - "old:virtual_from_version:4513 " => 1053, - "old:virtual_from_version:44297" => 1070, - "old:virtual_from_version:50183" => 1069, - "old:virtual_from_version:45335" => 1125, - "old:virtual_from_version:47857" => 1070, - "old:virtual_from_version:42042" => 1172, - "old:virtual_from_version:42541" => 1070, - "old:virtual_from_version:45984" => 1613, - "old:virtual_from_version:44285" => 1070, - "old:virtual_from_version:49538" => 1413, - "old:virtual_from_version:47141" => 1583, - "old:virtual_from_version:46222" => 1077, - "old:virtual_from_version:49954" => 3131, - "old:virtual_from_version:44365" => 1144, - "old:virtual_from_version:46842" => 1070, - "old:virtual_from_version:45835" => 1146, - "old:virtual_from_version:42597" => 1172, - "old:virtual_from_version:50248" => 1489, - "old:virtual_from_version:46254" => 1070, - "old:virtual_from_version:50123" => 3184, - "old:virtual_from_version:49585" => 1107, - "old:virtual_from_version:44964" => 1078, - "old:virtual_from_version:49473" => 1580, - "old:virtual_from_version:47881" => 1689, - "old:virtual_from_version:40705" => 1025, - "old:virtual_from_version:46513" => 1659, - "old:virtual_from_version:44084" => 1515, - "old:virtual_from_version:46617" => 1081, - "old:virtual_from_version:42744" => 1070, - "old:virtual_from_version:40133" => 1290, - "old:virtual_from_version:50018" => 1006, - "old:virtual_from_version:45108" => 1077, - "old:virtual_from_version:42859" => 1067, - "old:virtual_from_version:50222" => 1404, - "old:virtual_from_version:47646" => 1689, - "old:virtual_from_version:42921" => 1070, - "old:virtual_from_version:45355" => 1084, - "old:virtual_from_version:47332" => 1109, - "old:virtual_from_version:48025" => 2126, - "old:virtual_from_version:49768" => 3131, - "old:virtual_from_version:44013" => 1037, - "old:virtual_from_version:49146" => 1070, - "old:virtual_from_version:40834" => 1077, - "old:virtual_from_version:40726" => 1401, - "old:virtual_from_version:46362" => 1109, - "old:virtual_from_version:45981" => 1321, - "old:virtual_from_version:46539" => 1568, - "old:virtual_from_version:47878" => 1009, - "old:virtual_from_version:45343" => 1009, - "old:virtual_from_version:44489" => 1077, - "old:virtual_from_version:49148" => 3150, - "old:virtual_from_version:49940" => 1048, - "old:virtual_from_version:47213" => 1109, - "old:virtual_from_version:46947" => 1583, - "old:virtual_from_version:50180" => 1489, - "old:virtual_from_version:47854" => 1150, - "old:virtual_from_version:43064" => 2065, - "old:virtual_from_version:42404" => 1107, - "old:virtual_from_version:45102" => 1070, - "old:virtual_from_version:39295" => 1025, - "old:virtual_from_version:50085" => 1125, - "old:virtual_from_version:50210" => 1404, - "old:virtual_from_version:49303" => 1413, - "old:virtual_from_version:45668" => 1027, - "old:virtual_from_version:44933" => 1172, - "old:virtual_from_version:45153" => 1009, - "old:virtual_from_version:44278" => 1009, - "old:virtual_from_version:46870" => 1404, - "old:virtual_from_version:44289" => 1037, - "old:virtual_from_version:44473" => 1009, - "old:virtual_from_version:46897" => 1076, - "old:virtual_from_version:50139" => 1070, - "old:virtual_from_version:42255" => 1070, - "old:virtual_from_version:49613" => 1070, - "old:virtual_from_version:42999" => 1136, - "old:virtual_from_version:44479" => 1037, - "old:virtual_from_version:49396" => 1505, - "old:virtual_from_version:47732" => 1689, - "old:virtual_from_version:46373" => 1583, - "old:virtual_from_version:47411" => 1321, - "old:virtual_from_version:49932" => 3197, - "old:virtual_from_version:47554" => 3016, - "old:virtual_from_version:50742" => 1070, - "old:virtual_from_version:46886" => 1105, - "old:virtual_from_version:45681" => 1042, - "old:virtual_from_version:42700" => 1070, - "old:virtual_from_version:47978" => 1125, - "old:virtual_from_version:49640" => 1107, - "old:virtual_from_version:42241" => 1067, - "old:virtual_from_version:44112" => 1109, - "old:virtual_from_version:49918" => 3206, - "old:virtual_from_version:50410" => 1689, - "old:virtual_from_version:50015" => 3217, - "old:virtual_from_version:39544" => 1190, - "old:virtual_from_version:42294" => 1110, - "old:virtual_from_version:47816" => 3094, - "old:virtual_from_version:44238" => 1125, - "old:virtual_from_version:45499" => 1109, - "old:virtual_from_version:42839" => 1070, - "old:virtual_from_version:42848" => 1070, - "old:virtual_from_version:44682" => 1025, - "old:virtual_from_version:49287" => 1689, - "old:virtual_from_version:47426" => 1070, - "old:virtual_from_version:49770" => 1404, - "old:virtual_from_version:50656" => 3259, - "old:virtual_from_version:45936" => 1070, - "old:virtual_from_version:42699" => 1067, - "old:virtual_from_version:44588" => 1070, - "old:virtual_from_version:46825" => 1107, - "old:virtual_from_version:43017" => 2042, - "old:virtual_from_version:50532" => 1067, - "old:virtual_from_version:45329" => 1404, - "old:virtual_from_version:46496" => 1125, - "old:virtual_from_version:48000" => 2101, - "old:virtual_from_version:42762" => 1037, - "old:virtual_from_version:46802" => 1123, - "old:virtual_from_version:40990" => 1110, - "old:virtual_from_version:44651" => 1025, - "old:virtual_from_version:49542" => 1105, - "old:virtual_from_version:42127" => 1037, - "old:virtual_from_version:42259" => 1037, - "old:virtual_from_version:46577" => 1070, - "old:virtual_from_version:47307" => 1616, - "old:virtual_from_version:40759" => 1070, - "old:virtual_from_version:47802" => 1037, - "old:virtual_from_version:47024" => 1070, - "old:virtual_from_version:49056" => 1070, - "old:virtual_from_version:42309" => 1077, - "old:virtual_from_version:42706" => 1077, - "old:virtual_from_version:42058" => 1037, - "old:virtual_from_version:45922" => 1070, - "old:virtual_from_version:50223" => 1583, - "old:virtual_from_version:44662" => 1037, - "old:virtual_from_version:49127" => 1583, - "old:virtual_from_version:44756" => 1109, - "old:virtual_from_version:44701" => 1077, - "old:virtual_from_version:44562" => 1023, - "old:virtual_from_version:47831" => 1048, - "old:virtual_from_version:47787" => 1109, - "old:virtual_from_version:44610" => 1537, - "old:virtual_from_version:45360" => 1583, - "old:virtual_from_version:47723" => 1404, - "old:virtual_from_version:44766" => 1077, - "old:virtual_from_version:50521" => 1016, - "old:virtual_from_version:38483" => 1030, - "old:virtual_from_version:45911" => 1070, - "old:virtual_from_version:50294" => 1321, - "old:virtual_from_version:46988" => 1136, - "old:virtual_from_version:49345" => 1105, - "old:virtual_from_version:50080" => 1125, - "old:virtual_from_version:40644" => 1032, - "old:virtual_from_version:40853" => 1037, - "old:virtual_from_version:40826" => 1070, - "old:virtual_from_version:49167" => 1077, - "old:virtual_from_version:45072" => 1067, - "old:virtual_from_version:42131" => 1070, - "old:virtual_from_version:50323" => 3237, - "old:virtual_from_version:50555" => 1580, - "old:virtual_from_version:44459" => 1070, - "old:virtual_from_version:44412" => 1115, - "old:virtual_from_version:40094" => 1062, - "old:virtual_from_version:50449" => 1037, - "old:virtual_from_version:46630" => 1070, - "old:virtual_from_version:44094" => 1009, - "old:virtual_from_version:38379" => 1025, - "old:virtual_from_version:46205" => 1092, - "old:virtual_from_version:40866" => 1070, - "old:virtual_from_version:45039" => 1517, - "old:virtual_from_version:42629" => 1136, - "old:virtual_from_version:38018" => 1095, - "old:virtual_from_version:44422" => 1037, - "old:virtual_from_version:40820" => 1070, - "old:virtual_from_version:49010" => 1172, - "old:virtual_from_version:45805" => 1006, - "old:virtual_from_version:45050" => 1042, - "old:virtual_from_version:45868" => 1517, - "old:virtual_from_version:44308" => 1070, - "old:virtual_from_version:49482" => 3151, - "old:virtual_from_version:44079" => 1172, - "old:virtual_from_version:45588" => 1616, - "old:virtual_from_version:47845" => 1132, - "old:virtual_from_version:45800" => 1112, - "old:virtual_from_version:50382" => 1070, - "old:virtual_from_version:40572" => 1070, - "old:virtual_from_version:44395" => 1222, - "old:virtual_from_version:42189" => 1070, - "old:virtual_from_version:46728" => 1585, - "old:virtual_from_version:44120" => 1062, - "old:virtual_from_version:48026" => 2127, - "old:virtual_from_version:44076" => 1025, - "old:virtual_from_version:42620" => 1077, - "old:virtual_from_version:38961" => 1025, - "old:virtual_from_version:38790" => 1025, - "old:virtual_from_version:46344" => 1067, - "old:virtual_from_version:50155" => 1125, - "old:virtual_from_version:47077" => 1125, - "old:virtual_from_version:40730" => 1402, - "old:virtual_from_version:42730" => 1009, - "old:virtual_from_version:46006" => 1070, - "old:virtual_from_version:46203" => 1070, - "old:virtual_from_version:45627" => 1107, - "old:virtual_from_version:44041" => 1077, - "old:virtual_from_version:46182" => 1537, - "old:virtual_from_version:46585" => 1070, - "old:virtual_from_version:42206" => 1037, - "old:virtual_from_version:44782" => 1172, - "old:virtual_from_version:44445" => 1025, - "old:virtual_from_version:50287" => 1532, - "old:virtual_from_version:42813" => 1070, - "old:virtual_from_version:49177" => 1070, - "old:virtual_from_version:45253" => 1023, - "old:virtual_from_version:42631" => 1009, - "old:virtual_from_version:46405" => 1070, - "old:virtual_from_version:47558" => 1125, - "old:virtual_from_version:42490" => 1070, - "old:virtual_from_version:46233" => 1070, - "old:virtual_from_version:47859" => 1109, - "old:virtual_from_version:40693" => 1125, - "old:virtual_from_version:49418" => 3029, - "old:virtual_from_version:42888" => 1037, - "old:virtual_from_version:46879" => 1077, - "old:virtual_from_version:49176" => 1062, - "old:virtual_from_version:46829" => 1397, - "old:virtual_from_version:46756" => 1070, - "old:virtual_from_version:39508" => 1040, - "old:virtual_from_version:42094" => 1070, - "old:virtual_from_version:45052" => 1109, - "old:virtual_from_version:47729" => 1067, - "old:virtual_from_version:39547" => 1192, - "old:virtual_from_version:46224" => 1070, - "old:virtual_from_version:45552" => 1614, - "old:virtual_from_version:40695" => 1077, - "old:virtual_from_version:44536" => 1037, - "old:virtual_from_version:47919" => 1009, - "old:virtual_from_version:38765" => 1107, - "old:virtual_from_version:50619" => 1070, - "old:virtual_from_version:47834" => 1009, - "old:virtual_from_version:44407" => 1015, - "old:virtual_from_version:47093" => 1172, - "old:virtual_from_version:39509" => 1044, - "old:virtual_from_version:45793" => 1051, - "old:virtual_from_version:42656" => 1070, - "old:virtual_from_version:42112" => 1077, - "old:virtual_from_version:50134" => 1070, - "old:virtual_from_version:45306" => 1404, - "old:virtual_from_version:46202" => 1062, - "old:virtual_from_version:39311" => 1107, - "old:virtual_from_version:44008" => 1070, - "old:virtual_from_version:49068" => 1070, - "old:virtual_from_version:44386" => 1043, - "old:virtual_from_version:44453" => 1528, - "old:virtual_from_version:40933" => 1037, - "old:virtual_from_version:49830" => 1015, - "old:virtual_from_version:46043" => 1649, - "old:virtual_from_version:50481" => 3255, - "old:virtual_from_version:46710" => 1070, - "old:virtual_from_version:50343" => 3131, - "old:virtual_from_version:44435" => 1077, - "old:virtual_from_version:47998" => 1070, - "old:virtual_from_version:47402" => 3047, - "old:virtual_from_version:47064" => 3003, - "old:virtual_from_version:50182" => 1070, - "old:virtual_from_version:45815" => 1070, - "old:virtual_from_version:50563" => 1125, - "old:virtual_from_version:42464" => 1125, - "old:virtual_from_version:42359" => 1077, - "old:virtual_from_version:50494" => 3226, - "old:virtual_from_version:47418" => 3008, - "old:virtual_from_version:40558" => 1025, - "old:virtual_from_version:42773" => 1037, - "old:virtual_from_version:50483" => 3247, - "old:virtual_from_version:45142" => 1125, - "old:virtual_from_version:50675" => 3192, - "old:virtual_from_version:45118" => 1070, - "old:virtual_from_version:44066" => 1037, - "old:virtual_from_version:44972" => 1110, - "old:virtual_from_version:46155" => 1070, - "old:virtual_from_version:44606" => 1077, - "old:virtual_from_version:45878" => 1630, - "old:virtual_from_version:40955" => 1109, - "old:virtual_from_version:49530" => 1489, - "old:virtual_from_version:44299" => 1077, - "old:virtual_from_version:47090" => 1321, - "old:virtual_from_version:45263" => 1224, - "old:virtual_from_version:40825" => 1077, - "old:virtual_from_version:43019" => 2044, - "old:virtual_from_version:49814" => 3194, - "old:virtual_from_version:38415" => 1069, - "old:virtual_from_version:47207" => 1009, - "old:virtual_from_version:49757" => 1585, - "old:virtual_from_version:44791" => 1025, - "old:virtual_from_version:44943" => 1517, - "old:virtual_from_version:44132" => 1037, - "old:virtual_from_version:44228" => 1037, - "old:virtual_from_version:45961" => 1025, - "old:virtual_from_version:49130" => 1689, - "old:virtual_from_version:49752" => 1689, - "old:virtual_from_version:47031" => 1125, - "old:virtual_from_version:40468" => 1067, - "old:virtual_from_version:39965" => 1095, - "old:virtual_from_version:42555" => 1025, - "old:virtual_from_version:46343" => 1109, - "old:virtual_from_version:44255" => 1105, - "old:virtual_from_version:49376" => 1077, - "old:virtual_from_version:42904" => 1037, - "old:virtual_from_version:46019" => 1404, - "old:virtual_from_version:46658" => 1461, - "old:virtual_from_version:42794" => 1115, - "old:virtual_from_version:42327" => 1077, - "old:virtual_from_version:39284" => 1007, - "old:virtual_from_version:38978" => 1107, - "old:virtual_from_version:45337" => 1125, - "old:virtual_from_version:47976" => 1062, - "old:virtual_from_version:40434" => 1109, - "old:virtual_from_version:38570" => 1095, - "old:virtual_from_version:47680" => 1659, - "old:virtual_from_version:49543" => 1009, - "old:virtual_from_version:44958" => 1560, - "old:virtual_from_version:44139" => 1070, - "old:virtual_from_version:47442" => 1109, - "old:virtual_from_version:50644" => 1148, - "old:virtual_from_version:47836" => 1404, - "old:virtual_from_version:46054" => 1651, - "old:virtual_from_version:46348" => 1671, - "old:virtual_from_version:46079" => 1150, - "old:virtual_from_version:49281" => 1659, - "old:virtual_from_version:44325" => 1009, - "old:virtual_from_version:42858" => 1037, - "old:virtual_from_version:36542" => 1069, - "old:virtual_from_version:47361" => 1107, - "old:virtual_from_version:48017" => 2117, - "old:virtual_from_version:45069" => 1125, - "old:virtual_from_version:38545" => 1115, - "old:virtual_from_version:45449" => 1222, - "old:virtual_from_version:49053" => 3094, - "old:virtual_from_version:45240" => 1062, - "old:virtual_from_version:40709" => 1070, - "old:virtual_from_version:44792" => 1077, - "old:virtual_from_version:43004" => 2029, - "old:virtual_from_version:42606" => 1172, - "old:virtual_from_version:42835" => 1501, - "old:virtual_from_version:50142" => 3131, - "old:virtual_from_version:47235" => 1070, - "old:virtual_from_version:40533" => 1070, - "old:virtual_from_version:42871" => 1077, - "old:virtual_from_version:49340" => 3167, - "old:virtual_from_version:46853" => 3002, - "old:virtual_from_version:46624" => 1051, - "old:virtual_from_version:38990" => 1141, - "old:virtual_from_version:47672" => 3078, - "old:virtual_from_version:40164" => 1048, - "old:virtual_from_version:42055" => 1070, - "old:virtual_from_version:50554" => 1125, - "old:virtual_from_version:47709" => 1070, - "old:virtual_from_version:49411" => 1532, - "old:virtual_from_version:46437" => 1077, - "old:virtual_from_version:50544" => 3016, - "old:virtual_from_version:13356" => 1022, - "old:virtual_from_version:47073" => 3008, - "old:virtual_from_version:45855" => 1070, - "old:virtual_from_version:45136" => 1001, - "old:virtual_from_version:45882" => 1070, - "old:virtual_from_version:50235" => 1689, - "old:virtual_from_version:45230" => 1569, - "old:virtual_from_version:45518" => 1070, - "old:virtual_from_version:49965" => 3211, - "old:virtual_from_version:40838" => 1107, - "old:virtual_from_version:46739" => 1077, - "old:virtual_from_version:45414" => 1009, - "old:virtual_from_version:49373" => 3167, - "old:virtual_from_version:44406" => 1012, - "old:virtual_from_version:44674" => 1077, - "old:virtual_from_version:47310" => 1125, - "old:virtual_from_version:42187" => 1109, - "old:virtual_from_version:44239" => 1070, - "old:virtual_from_version:47534" => 1077, - "old:virtual_from_version:47589" => 1070, - "old:virtual_from_version:50277" => 1659, - "old:virtual_from_version:45144" => 1125, - "old:virtual_from_version:45653" => 1067, - "old:virtual_from_version:46729" => 1697, - "old:virtual_from_version:44733" => 1077, - "old:virtual_from_version:47500" => 1077, - "old:virtual_from_version:44829" => 1011, - "old:virtual_from_version:40947" => 1037, - "old:virtual_from_version:50186" => 1037, - "old:virtual_from_version:46456" => 1444, - "old:virtual_from_version:42703" => 1037, - "old:virtual_from_version:46966" => 1077, - "old:virtual_from_version:40916" => 1110, - "old:virtual_from_version:44668" => 1070, - "old:virtual_from_version:49873" => 1070, - "old:virtual_from_version:47253" => 1067, - "old:virtual_from_version:50531" => 1048, - "old:virtual_from_version:49607" => 1404, - "old:virtual_from_version:39009" => 1083, - "old:virtual_from_version:42118" => 1136, - "old:virtual_from_version:42291" => 1025, - "old:virtual_from_version:42389" => 1070, - "old:virtual_from_version:42406" => 1077, - "old:virtual_from_version:44971" => 1064, - "old:virtual_from_version:46309" => 1009, - "old:virtual_from_version:49254" => 1689, - "old:virtual_from_version:46664" => 1077, - "old:virtual_from_version:50512" => 1583, - "old:virtual_from_version:46100" => 1070, - "old:virtual_from_version:49073" => 1666, - "old:virtual_from_version:44586" => 1077, - "old:virtual_from_version:46466" => 1404, - "old:virtual_from_version:42028" => 1037, - "old:virtual_from_version:47221" => 1070, - "old:virtual_from_version:42317" => 1413, - "old:virtual_from_version:44587" => 1037, - "old:virtual_from_version:44759" => 1006, - "old:virtual_from_version:44714" => 1037, - "old:virtual_from_version:40754" => 1077, - "old:virtual_from_version:46568" => 1070, - "old:virtual_from_version:46329" => 1077, - "old:virtual_from_version:46899" => 1070, - "old:virtual_from_version:47417" => 1689, - "old:virtual_from_version:49867" => 3131, - "old:virtual_from_version:49091" => 3139, - "old:virtual_from_version:42197" => 1077, - "old:virtual_from_version:46475" => 1105, - "old:virtual_from_version:46902" => 1404, - "old:virtual_from_version:46965" => 1125, - "old:virtual_from_version:39716" => 1083, - "old:virtual_from_version:45223" => 1576, - "old:virtual_from_version:49797" => 1070, - "old:virtual_from_version:47850" => 1532, - "old:virtual_from_version:45575" => 1070, - "old:virtual_from_version:47822" => 3094, - "old:virtual_from_version:47226" => 1070, - "old:virtual_from_version:45250" => 1110, - "old:virtual_from_version:50337" => 3131, - "old:virtual_from_version:46618" => 1172, - "old:virtual_from_version:42958" => 1009, - "old:virtual_from_version:50629" => 1419, - "old:virtual_from_version:47711" => 1109, - "old:virtual_from_version:42090" => 1070, - "old:virtual_from_version:44413" => 1021, - "old:virtual_from_version:44393" => 1000, - "old:virtual_from_version:46314" => 1665, - "old:virtual_from_version:49800" => 1107, - "old:virtual_from_version:50524" => 1033, - "old:virtual_from_version:40799" => 1070, - "old:virtual_from_version:46207" => 1070, - "old:virtual_from_version:40929" => 1037, - "old:virtual_from_version:49528" => 1362, - "old:virtual_from_version:39596" => 1000, - "old:virtual_from_version:46921" => 1621, - "old:virtual_from_version:45013" => 1136, - "old:virtual_from_version:46906" => 1077, - "old:virtual_from_version:46116" => 1353, - "old:virtual_from_version:46245" => 1574, - "old:virtual_from_version:40652" => 1398, - "old:virtual_from_version:47123" => 1172, - "old:virtual_from_version:38847" => 1112, - "old:virtual_from_version:46168" => 1070, - "old:virtual_from_version:40859" => 1037, - "old:virtual_from_version:47759" => 1037, - "old:virtual_from_version:47420" => 1070, - "old:virtual_from_version:49841" => 1517, - "old:virtual_from_version:40399" => 1349, - "old:virtual_from_version:46877" => 1125, - "old:virtual_from_version:49430" => 3029, - "old:virtual_from_version:50395" => 3214, - "old:virtual_from_version:49033" => 3046, - "old:virtual_from_version:46571" => 1498, - "old:virtual_from_version:49402" => 1070, - "old:virtual_from_version:42318" => 1070, - "old:virtual_from_version:45432" => 1077, - "old:virtual_from_version:44869" => 1009, - "old:virtual_from_version:46542" => 1077, - "old:virtual_from_version:49186" => 1404, - "old:virtual_from_version:40846" => 1077, - "old:virtual_from_version:49929" => 3209, - "old:virtual_from_version:49999" => 1070, - "old:virtual_from_version:44873" => 1070, - "old:virtual_from_version:46736" => 1070, - "old:virtual_from_version:39933" => 1247, - "old:virtual_from_version:49226" => 1314, - "old:virtual_from_version:47204" => 1070, - "old:virtual_from_version:40925" => 1067, - "old:virtual_from_version:44993" => 1069, - "old:virtual_from_version:41008" => 2019, - "old:virtual_from_version:47719" => 1321, - "old:virtual_from_version:47766" => 3078, - "old:virtual_from_version:47553" => 1077, - "old:virtual_from_version:44693" => 1048, - "old:virtual_from_version:42504" => 1012, - "old:virtual_from_version:40750" => 1109, - "old:virtual_from_version:49116" => 1051, - "old:virtual_from_version:47198" => 1125, - "old:virtual_from_version:47168" => 1444, - "old:virtual_from_version:45079" => 1402, - "old:virtual_from_version:47282" => 1397, - "old:virtual_from_version:47358" => 3045, - "old:virtual_from_version:49546" => 1125, - "old:virtual_from_version:46606" => 1404, - "old:virtual_from_version:44035" => 1037, - "old:virtual_from_version:49108" => 3136, - "old:virtual_from_version:44404" => 1010, - "old:virtual_from_version:50400" => 3131, - "old:virtual_from_version:44381" => 1027, - "old:virtual_from_version:45387" => 1362, - "old:virtual_from_version:44424" => 1043, - "old:virtual_from_version:47447" => 1057, - "old:virtual_from_version:47157" => 1583, - "old:virtual_from_version:45851" => 1109, - "old:virtual_from_version:44507" => 1053, - "old:virtual_from_version:42096" => 1037, - "old:virtual_from_version:49298" => 3136, - "old:virtual_from_version:46053" => 1077, - "old:virtual_from_version:44524" => 1136, - "old:virtual_from_version:45576" => 1077, - "old:virtual_from_version:49032" => 1649, - "old:virtual_from_version:40655" => 1083, - "old:virtual_from_version:45080" => 1110, - "old:virtual_from_version:40786" => 1077, - "old:virtual_from_version:45819" => 1077, - "old:virtual_from_version:50355" => 1689, - "old:virtual_from_version:44659" => 1070, - "old:virtual_from_version:49629" => 3184, - "old:virtual_from_version:40952" => 1009, - "old:virtual_from_version:42323" => 1112, - "old:virtual_from_version:44798" => 1067, - "old:virtual_from_version:45009" => 1517, - "old:virtual_from_version:47042" => 1172, - "old:virtual_from_version:45530" => 1009, - "old:virtual_from_version:47191" => 1070, - "old:virtual_from_version:45366" => 1125, - "old:virtual_from_version:44513" => 1107, - "old:virtual_from_version:45536" => 1136, - "old:virtual_from_version:40657" => 1125, - "old:virtual_from_version:46264" => 1070, - "old:virtual_from_version:46909" => 1095, - "old:virtual_from_version:50047" => 1105, - "old:virtual_from_version:46175" => 1532, - "old:virtual_from_version:42483" => 1104, - "old:virtual_from_version:40511" => 1070, - "old:virtual_from_version:44482" => 1077, - "old:virtual_from_version:50432" => 1057, - "old:virtual_from_version:50455" => 1025, - "old:virtual_from_version:42591" => 1070, - "old:virtual_from_version:49511" => 3180, - "old:virtual_from_version:50260" => 3131, - "old:virtual_from_version:45739" => 1070, - "old:virtual_from_version:38375" => 1070, - "old:virtual_from_version:38835" => 1051, - "old:virtual_from_version:42547" => 1070, - "old:virtual_from_version:49588" => 1105, - "old:virtual_from_version:45644" => 1009, - "old:virtual_from_version:47770" => 1070, - "old:virtual_from_version:47399" => 1077, - "old:virtual_from_version:49976" => 3209, - "old:virtual_from_version:46638" => 1404, - "old:virtual_from_version:42967" => 1077, - "old:virtual_from_version:45351" => 1362, - "old:virtual_from_version:38538" => 1077, - "old:virtual_from_version:45288" => 1568, - "old:virtual_from_version:45308" => 1125, - "old:virtual_from_version:49447" => 1580, - "old:virtual_from_version:41002" => 2014, - "old:virtual_from_version:42357" => 1009, - "old:virtual_from_version:42023" => 1077, - "old:virtual_from_version:49885" => 3131, - "old:virtual_from_version:45856" => 1125, - "old:virtual_from_version:42296" => 1428, - "old:virtual_from_version:45268" => 1015, - "old:virtual_from_version:42337" => 1037, - "old:virtual_from_version:49121" => 1112, - "old:virtual_from_version:49928" => 3009, - "old:virtual_from_version:46113" => 1404, - "old:virtual_from_version:46878" => 1025, - "old:virtual_from_version:50251" => 3186, - "old:virtual_from_version:47124" => 1025, - "old:virtual_from_version:46038" => 1077, - "old:virtual_from_version:47651" => 1077, - "old:virtual_from_version:39578" => 1100, - "old:virtual_from_version:43026" => 2051, - "old:virtual_from_version:50624" => 1110, - "old:virtual_from_version:50590" => 3267, - "old:virtual_from_version:47441" => 1125, - "old:virtual_from_version:40882" => 1048, - "old:virtual_from_version:40872" => 1019, - "old:virtual_from_version:47807" => 1077, - "old:virtual_from_version:47111" => 3017, - "old:virtual_from_version:50472" => 3249, - "old:virtual_from_version:50674" => 3270, - "old:virtual_from_version:47025" => 1172, - "old:virtual_from_version:49446" => 1444, - "old:virtual_from_version:44121" => 1110, - "old:virtual_from_version:50503" => 3174, - "old:virtual_from_version:42477" => 1444, - "old:virtual_from_version:42509" => 1062, - "old:virtual_from_version:45641" => 1070, - "old:virtual_from_version:50398" => 1069, - "old:virtual_from_version:42274" => 1222, - "old:virtual_from_version:45533" => 1613, - "old:virtual_from_version:47973" => 1689, - "old:virtual_from_version:47528" => 1109, - "old:virtual_from_version:45311" => 1583, - "old:virtual_from_version:47359" => 1070, - "old:virtual_from_version:43066" => 2067, - "old:virtual_from_version:49400" => 1025, - "old:virtual_from_version:50387" => 1070, - "old:virtual_from_version:50473" => 3250, - "old:virtual_from_version:49112" => 3146, - "old:virtual_from_version:49648" => 1489, - "old:virtual_from_version:40477" => 1083, - "old:virtual_from_version:45993" => 1076, - "old:virtual_from_version:44341" => 1077, - "old:virtual_from_version:46916" => 1136, - "old:virtual_from_version:45239" => 1016, - "old:virtual_from_version:47492" => 1025, - "old:virtual_from_version:34143" => 1051, - "old:virtual_from_version:39771" => 1088, - "old:virtual_from_version:42222" => 1413, - "old:virtual_from_version:45731" => 1125, - "old:virtual_from_version:39704" => 1019, - "old:virtual_from_version:49961" => 1580, - "old:virtual_from_version:44130" => 1009, - "old:virtual_from_version:46591" => 1077, - "old:virtual_from_version:50377" => 1125, - "old:virtual_from_version:42737" => 1108, - "old:virtual_from_version:46132" => 1109, - "old:virtual_from_version:42331" => 1032, - "old:virtual_from_version:45861" => 1125, - "old:virtual_from_version:50557" => 3259, - "old:virtual_from_version:42983" => 1507, - "old:virtual_from_version:42502" => 1091, - "old:virtual_from_version:46888" => 1070, - "old:virtual_from_version:44788" => 1125, - "old:virtual_from_version:40998" => 1109, - "old:virtual_from_version:40689" => 1107, - "old:virtual_from_version:44601" => 1107, - "old:virtual_from_version:45628" => 1067, - "old:virtual_from_version:46730" => 1070, - "old:virtual_from_version:47524" => 1410, - "old:virtual_from_version:39935" => 1025, - "old:virtual_from_version:47749" => 1125, - "old:virtual_from_version:47487" => 1109, - "old:virtual_from_version:44133" => 1062, - "old:virtual_from_version:46335" => 1670, - "old:virtual_from_version:49668" => 1136, - "old:virtual_from_version:50643" => 3259, - "old:virtual_from_version:39941" => 1009, - "old:virtual_from_version:42602" => 1037, - "old:virtual_from_version:45019" => 1107, - "old:virtual_from_version:46834" => 1172, - "old:virtual_from_version:40948" => 1048, - "old:virtual_from_version:50347" => 1125, - "old:virtual_from_version:38339" => 1107, - "old:virtual_from_version:45559" => 1107, - "old:virtual_from_version:42345" => 1037, - "old:virtual_from_version:46250" => 1070, - "old:virtual_from_version:44361" => 1222, - "old:virtual_from_version:45147" => 1125, - "old:virtual_from_version:44630" => 1172, - "old:virtual_from_version:49710" => 1084, - "old:virtual_from_version:45304" => 1580, - "old:virtual_from_version:46535" => 1070, - "old:virtual_from_version:45978" => 1533, - "old:virtual_from_version:40911" => 1110, - "old:virtual_from_version:49156" => 1077, - "old:virtual_from_version:44074" => 1070, - "old:virtual_from_version:44396" => 1070, - "old:virtual_from_version:49403" => 1689, - "old:virtual_from_version:45532" => 1085, - "old:virtual_from_version:44162" => 1037, - "old:virtual_from_version:44850" => 1077, - "old:virtual_from_version:40857" => 1025, - "old:virtual_from_version:49784" => 1070, - "old:virtual_from_version:49689" => 1404, - "old:virtual_from_version:50297" => 3234, - "old:virtual_from_version:44728" => 1077, - "old:virtual_from_version:47414" => 1037, - "old:virtual_from_version:42115" => 1077, - "old:virtual_from_version:45619" => 1070, - "old:virtual_from_version:45722" => 1107, - "old:virtual_from_version:46631" => 1077, - "old:virtual_from_version:42568" => 1077, - "old:virtual_from_version:42249" => 1070, - "old:virtual_from_version:49047" => 1584, - "old:virtual_from_version:42361" => 1000, - "old:virtual_from_version:47765" => 3078, - "old:virtual_from_version:40725" => 1048, - "old:virtual_from_version:45097" => 1077, - "old:virtual_from_version:42611" => 1172, - "old:virtual_from_version:45396" => 1009, - "old:virtual_from_version:49410" => 1404, - "old:virtual_from_version:40870" => 1070, - "old:virtual_from_version:45808" => 1397, - "old:virtual_from_version:47525" => 1070, - "old:virtual_from_version:42073" => 1037, - "old:virtual_from_version:50193" => 3131, - "old:virtual_from_version:47398" => 1172, - "old:virtual_from_version:44942" => 1014, - "old:virtual_from_version:49992" => 1666, - "old:virtual_from_version:46548" => 1070, - "old:virtual_from_version:44645" => 1517, - "old:virtual_from_version:49761" => 1672, - "old:virtual_from_version:44147" => 1037, - "old:virtual_from_version:46131" => 1070, - "old:virtual_from_version:50296" => 3131, - "old:virtual_from_version:40273" => 1222, - "old:virtual_from_version:44414" => 1517, - "old:virtual_from_version:36625" => 1012, - "old:virtual_from_version:49971" => 3209, - "old:virtual_from_version:46023" => 1580, - "old:virtual_from_version:50270" => 1070, - "old:virtual_from_version:47625" => 1077, - "old:virtual_from_version:44698" => 1077, - "old:virtual_from_version:44697" => 1025, - "old:virtual_from_version:46554" => 1555, - "old:virtual_from_version:44382" => 1030, - "old:virtual_from_version:45261" => 1109, - "old:virtual_from_version:50157" => 1580, - "old:virtual_from_version:49759" => 1689, - "old:virtual_from_version:42646" => 1112, - "old:virtual_from_version:46882" => 1070, - "old:virtual_from_version:44085" => 1107, - "old:virtual_from_version:46308" => 1172, - "old:virtual_from_version:42059" => 1112, - "old:virtual_from_version:49107" => 3147, - "old:virtual_from_version:47584" => 1007, - "old:virtual_from_version:40813" => 1107, - "old:virtual_from_version:44652" => 1077, - "old:virtual_from_version:42374" => 1107, - "old:virtual_from_version:42412" => 1077, - "old:virtual_from_version:50394" => 3159, - "old:virtual_from_version:42370" => 1077, - "old:virtual_from_version:40606" => 1077, - "old:virtual_from_version:45324" => 1125, - "old:virtual_from_version:46872" => 1410, - "old:virtual_from_version:47470" => 1402, - "old:virtual_from_version:44976" => 1021, - "old:virtual_from_version:40520" => 1109, - "old:virtual_from_version:39234" => 1150, - "old:virtual_from_version:42780" => 1037, - "old:virtual_from_version:45092" => 1077, - "old:virtual_from_version:46117" => 1070, - "old:virtual_from_version:45767" => 1035, - "old:virtual_from_version:45456" => 1070, - "old:virtual_from_version:40912" => 1067, - "old:virtual_from_version:47925" => 3008, - "old:virtual_from_version:50505" => 1311, - "old:virtual_from_version:46772" => 1070, - "old:virtual_from_version:47380" => 3008, - "old:virtual_from_version:46333" => 1077, - "old:virtual_from_version:44017" => 1125, - "old:virtual_from_version:46226" => 1070, - "old:virtual_from_version:46232" => 1615, - "old:virtual_from_version:45737" => 1555, - "old:virtual_from_version:44775" => 1423, - "old:virtual_from_version:46029" => 1649, - "old:virtual_from_version:43000" => 2000, - "old:virtual_from_version:46712" => 1070, - "old:virtual_from_version:49997" => 3214, - "old:virtual_from_version:50257" => 1070, - "old:virtual_from_version:44240" => 1009, - "old:virtual_from_version:44009" => 1009, - "old:virtual_from_version:40368" => 1009, - "old:virtual_from_version:46273" => 1030, - "old:virtual_from_version:40595" => 1077, - "old:virtual_from_version:45756" => 1077, - "old:virtual_from_version:45651" => 1125, - "old:virtual_from_version:49022" => 1689, - "old:virtual_from_version:49305" => 1584, - "old:virtual_from_version:45496" => 1007, - "old:virtual_from_version:42154" => 1070, - "old:virtual_from_version:50212" => 3131, - "old:virtual_from_version:46869" => 1077, - "old:virtual_from_version:44614" => 1017, - "old:virtual_from_version:44526" => 1009, - "old:virtual_from_version:47665" => 1077, - "old:virtual_from_version:42379" => 1311, - "old:virtual_from_version:44584" => 1070, - "old:virtual_from_version:45695" => 1027, - "old:virtual_from_version:42478" => 1009, - "old:virtual_from_version:44636" => 1136, - "old:virtual_from_version:44180" => 1321, - "old:virtual_from_version:42246" => 1037, - "old:virtual_from_version:44910" => 1077, - "old:virtual_from_version:44468" => 1009, - "old:virtual_from_version:40901" => 1037, - "old:virtual_from_version:42516" => 1172, - "old:virtual_from_version:45567" => 1614, - "old:virtual_from_version:42445" => 1067, - "old:virtual_from_version:46684" => 1659, - "old:virtual_from_version:50237" => 1035, - "old:virtual_from_version:45753" => 1070, - "old:virtual_from_version:45523" => 1136, - "old:virtual_from_version:46714" => 1172, - "old:virtual_from_version:45595" => 1077, - "old:virtual_from_version:42691" => 1109, - "old:virtual_from_version:44663" => 1070, - "old:virtual_from_version:47566" => 1588, - "old:virtual_from_version:49632" => 1070, - "old:virtual_from_version:40600" => 1048, - "old:virtual_from_version:42815" => 1025, - "old:virtual_from_version:40509" => 1110, - "old:virtual_from_version:40444" => 1105, - "old:virtual_from_version:47323" => 1172, - "old:virtual_from_version:44321" => 1172, - "old:virtual_from_version:47220" => 1050, - "old:virtual_from_version:47005" => 1125, - "old:virtual_from_version:42796" => 1077, - "old:virtual_from_version:42951" => 1025, - "old:virtual_from_version:42102" => 1077, - "old:virtual_from_version:42864" => 1009, - "old:virtual_from_version:42330" => 1141, - "old:virtual_from_version:46875" => 1613, - "old:virtual_from_version:47139" => 1172, - "old:virtual_from_version:49891" => 1489, - "old:virtual_from_version:44555" => 1037, - "old:virtual_from_version:44327" => 1025, - "old:virtual_from_version:46709" => 1077, - "old:virtual_from_version:46012" => 1090, - "old:virtual_from_version:44123" => 1125, - "old:virtual_from_version:42129" => 1105, - "old:virtual_from_version:40981" => 1077, - "old:virtual_from_version:46107" => 1070, - "old:virtual_from_version:40920" => 1025, - "old:virtual_from_version:49349" => 1070, - "old:virtual_from_version:49568" => 1404, - "old:virtual_from_version:46094" => 1070, - "old:virtual_from_version:47280" => 1125, - "old:virtual_from_version:42944" => 1009, - "old:virtual_from_version:50022" => 1125, - "old:virtual_from_version:47641" => 1109, - "old:virtual_from_version:44948" => 1001, - "old:virtual_from_version:42690" => 1062, - "old:virtual_from_version:47097" => 1070, - "old:virtual_from_version:46055" => 1070, - "old:virtual_from_version:49310" => 1077, - "old:virtual_from_version:42545" => 1343, - "old:virtual_from_version:44726" => 1009, - "old:virtual_from_version:50746" => 3259, - "old:virtual_from_version:46936" => 1076, - "old:virtual_from_version:46342" => 1070, - "old:virtual_from_version:46532" => 1025, - "old:virtual_from_version:49480" => 1689, - "old:virtual_from_version:49416" => 1580, - "old:virtual_from_version:46336" => 1007, - "old:virtual_from_version:46589" => 1404, - "old:virtual_from_version:50501" => 3131, - "old:virtual_from_version:47279" => 3038, - "old:virtual_from_version:45143" => 1107, - "old:virtual_from_version:47344" => 1689, - "old:virtual_from_version:42010" => 1070, - "old:virtual_from_version:42397" => 1077, - "old:virtual_from_version:50642" => 1587, - "old:virtual_from_version:45018" => 1222, - "old:virtual_from_version:47133" => 1172, - "old:virtual_from_version:44511" => 1172, - "old:virtual_from_version:40260" => 1146, - "old:virtual_from_version:42282" => 1424, - "old:virtual_from_version:45592" => 1070, - "old:virtual_from_version:49321" => 3146, - "old:virtual_from_version:40066" => 1070, - "old:virtual_from_version:42099" => 1077, - "old:virtual_from_version:49440" => 1172, - "old:virtual_from_version:44102" => 1037, - "old:virtual_from_version:42489" => 1107, - "old:virtual_from_version:46776" => 1077, - "old:virtual_from_version:50716" => 1007, - "old:virtual_from_version:45568" => 1172, - "old:virtual_from_version:46380" => 1005, - "old:virtual_from_version:49774" => 3031, - "old:virtual_from_version:47061" => 1172, - "old:virtual_from_version:40247" => 1107, - "old:virtual_from_version:46122" => 1070, - "old:virtual_from_version:46163" => 1006, - "old:virtual_from_version:44877" => 1136, - "old:virtual_from_version:44687" => 1070, - "old:virtual_from_version:44801" => 1125, - "old:virtual_from_version:49388" => 1095, - "old:virtual_from_version:44354" => 1515, - "old:virtual_from_version:47026" => 1077, - "old:virtual_from_version:49215" => 1404, - "old:virtual_from_version:40732" => 1070, - "old:virtual_from_version:46748" => 1070, - "old:virtual_from_version:44345" => 1070, - "old:virtual_from_version:40817" => 1077, - "old:virtual_from_version:44301" => 1404, - "old:virtual_from_version:49155" => 1009, - "old:virtual_from_version:42021" => 1070, - "old:virtual_from_version:49192" => 3078, - "old:virtual_from_version:43039" => 2030, - "old:virtual_from_version:43060" => 2059, - "old:virtual_from_version:42116" => 1037, - "old:virtual_from_version:40994" => 1009, - "old:virtual_from_version:50135" => 1172, - "old:virtual_from_version:47263" => 1077, - "old:virtual_from_version:40743" => 1025, - "old:virtual_from_version:49160" => 1070, - "old:virtual_from_version:50199" => 3131, - "old:virtual_from_version:42286" => 1070, - "old:virtual_from_version:46498" => 1107, - "old:virtual_from_version:44585" => 1025, - "old:virtual_from_version:46766" => 1025, - "old:virtual_from_version:45480" => 1136, - "old:virtual_from_version:40489" => 1070, - "old:virtual_from_version:44530" => 1110, - "old:virtual_from_version:47720" => 1070, - "old:virtual_from_version:28096" => 1084, - "old:virtual_from_version:45001" => 1009, - "old:virtual_from_version:39956" => 1076, - "old:virtual_from_version:43093" => 2085, - "old:virtual_from_version:46826" => 1048, - "old:virtual_from_version:42725" => 1110, - "old:virtual_from_version:42558" => 1070, - "old:virtual_from_version:47298" => 1070, - "old:virtual_from_version:47338" => 1070, - "old:virtual_from_version:50708" => 1533, - "old:virtual_from_version:49680" => 3190, - "old:virtual_from_version:40218" => 1112, - "old:virtual_from_version:46816" => 1509, - "old:virtual_from_version:46173" => 1009, - "old:virtual_from_version:40425" => 1335, - "old:virtual_from_version:40187" => 1051, - "old:virtual_from_version:45447" => 1107, - "old:virtual_from_version:47444" => 1077, - "old:virtual_from_version:47856" => 1314, - "old:virtual_from_version:47469" => 1077, - "old:virtual_from_version:49077" => 1666, - "old:virtual_from_version:49614" => 1025, - "old:virtual_from_version:39577" => 1087, - "old:virtual_from_version:49333" => 1404, - "old:virtual_from_version:42392" => 1077, - "old:virtual_from_version:50525" => 1062, - "old:virtual_from_version:45748" => 1019, - "old:virtual_from_version:49889" => 1070, - "old:virtual_from_version:47849" => 1077, - "old:virtual_from_version:46393" => 1404, - "old:virtual_from_version:46516" => 1125, - "old:virtual_from_version:44499" => 1125, - "old:virtual_from_version:39431" => 1110, - "old:virtual_from_version:42026" => 1070, - "old:virtual_from_version:50068" => 3131, - "old:virtual_from_version:44444" => 1070, - "old:virtual_from_version:44216" => 1419, - "old:virtual_from_version:47994" => 1070, - "old:virtual_from_version:10002" => 2001, - "old:virtual_from_version:49736" => 1007, - "old:virtual_from_version:42682" => 1037, - "old:virtual_from_version:45129" => 1009, - "old:virtual_from_version:42100" => 1037, - "old:virtual_from_version:50319" => 1125, - "old:virtual_from_version:42664" => 1077, - "old:virtual_from_version:49904" => 3131, - "old:virtual_from_version:38705" => 1051, - "old:virtual_from_version:45502" => 1009, - "old:virtual_from_version:50445" => 3189, - "old:virtual_from_version:50647" => 1110, - "old:virtual_from_version:44184" => 1404, - "old:virtual_from_version:40339" => 1328, - "old:virtual_from_version:42302" => 1009, - "old:virtual_from_version:42587" => 1037, - "old:virtual_from_version:4525 " => 1055, - "old:virtual_from_version:49594" => 1105, - "old:virtual_from_version:45226" => 1414, - "old:virtual_from_version:42754" => 1077, - "old:virtual_from_version:47300" => 1109, - "old:virtual_from_version:49554" => 1005, - "old:virtual_from_version:49844" => 3194, - "old:virtual_from_version:38811" => 1009, - "old:virtual_from_version:43109" => 2070, - "old:virtual_from_version:49199" => 1070, - "old:virtual_from_version:49278" => 1070, - "old:virtual_from_version:46774" => 1666, - "old:virtual_from_version:46315" => 1666, - "old:virtual_from_version:44671" => 1224, - "old:virtual_from_version:45723" => 1070, - "old:virtual_from_version:44060" => 1070, - "old:virtual_from_version:49887" => 1311, - "old:virtual_from_version:50107" => 3221, - "old:virtual_from_version:47710" => 1107, - "old:virtual_from_version:43099" => 2091, - "old:virtual_from_version:46667" => 1141, - "old:virtual_from_version:42079" => 1051, - "old:virtual_from_version:50184" => 3131, - "old:virtual_from_version:47452" => 1077, - "old:virtual_from_version:46073" => 1070, - "old:virtual_from_version:50422" => 1413, - "old:virtual_from_version:46378" => 1076, - "old:virtual_from_version:49846" => 1172, - "old:virtual_from_version:47971" => 1077, - "old:virtual_from_version:46850" => 1070, - "old:virtual_from_version:46241" => 1107, - "old:virtual_from_version:44262" => 1009, - "old:virtual_from_version:38787" => 1130, - "old:virtual_from_version:40528" => 1077, - "old:virtual_from_version:44817" => 1107, - "old:virtual_from_version:44691" => 1037, - "old:virtual_from_version:44946" => 1419, - "old:virtual_from_version:49978" => 3137, - "old:virtual_from_version:40506" => 1077, - "old:virtual_from_version:44808" => 1172, - "old:virtual_from_version:45436" => 1077, - "old:virtual_from_version:45697" => 1067, - "old:virtual_from_version:50753" => 3266, - "old:virtual_from_version:49327" => 1689, - "old:virtual_from_version:45831" => 1009, - "old:virtual_from_version:49370" => 1005, - "old:virtual_from_version:38642" => 1123, - "old:virtual_from_version:49048" => 1585, - "old:virtual_from_version:49641" => 1067, - "old:virtual_from_version:46830" => 1070, - "old:virtual_from_version:47308" => 1062, - "old:virtual_from_version:50227" => 3228, - "old:virtual_from_version:46294" => 1555, - "old:virtual_from_version:47252" => 1109, - "old:virtual_from_version:39394" => 1051, - "old:virtual_from_version:39331" => 1030, - "old:virtual_from_version:40812" => 1067, - "old:virtual_from_version:46534" => 1533, - "old:virtual_from_version:46021" => 1461, - "old:virtual_from_version:39134" => 1094, - "old:virtual_from_version:45669" => 1077, - "old:virtual_from_version:13338" => 1016, - "old:virtual_from_version:46732" => 1172, - "old:virtual_from_version:42422" => 1107, - "old:virtual_from_version:40758" => 1081, - "old:virtual_from_version:50110" => 1070, - "old:virtual_from_version:46527" => 1077, - "old:virtual_from_version:45381" => 1404, - "old:virtual_from_version:42739" => 1077, - "old:virtual_from_version:44116" => 1070, - "old:virtual_from_version:42599" => 1007, - "old:virtual_from_version:47930" => 1125, - "old:virtual_from_version:47002" => 1037, - "old:virtual_from_version:40435" => 1067, - "old:virtual_from_version:40583" => 1136, - "old:virtual_from_version:13386" => 1039, - "old:virtual_from_version:47712" => 1077, - "old:virtual_from_version:44392" => 1095, - "old:virtual_from_version:50498" => 3251, - "old:virtual_from_version:50391" => 1172, - "old:virtual_from_version:45133" => 1488, - "old:virtual_from_version:49598" => 1095, - "old:virtual_from_version:47527" => 1048, - "old:virtual_from_version:44159" => 1070, - "old:virtual_from_version:42030" => 1070, - "old:virtual_from_version:40456" => 1035, - "old:virtual_from_version:45115" => 1070, - "old:virtual_from_version:42019" => 1077, - "old:virtual_from_version:13352" => 1021, - "old:virtual_from_version:42328" => 1037, - "old:virtual_from_version:49395" => 3120, - "old:virtual_from_version:43056" => 2058, - "old:virtual_from_version:44199" => 1077, - "old:virtual_from_version:44223" => 1077, - "old:virtual_from_version:48042" => 2139, - "old:virtual_from_version:45467" => 1070, - "old:virtual_from_version:38776" => 1067, - "old:virtual_from_version:50690" => 1417, - "old:virtual_from_version:50509" => 3183, - "old:virtual_from_version:49962" => 3131, - "old:virtual_from_version:46510" => 1585, - "old:virtual_from_version:46166" => 1630, - "old:virtual_from_version:50747" => 3267, - "old:virtual_from_version:44411" => 1019, - "old:virtual_from_version:47533" => 1109, - "old:virtual_from_version:50138" => 1659, - "old:virtual_from_version:46225" => 1077, - "old:virtual_from_version:47394" => 1070, - "old:virtual_from_version:49942" => 1172, - "old:virtual_from_version:45558" => 1125, - "old:virtual_from_version:44175" => 1067, - "old:virtual_from_version:42827" => 1070, - "old:virtual_from_version:42040" => 1037, - "old:virtual_from_version:47049" => 1689, - "old:virtual_from_version:42786" => 1497, - "old:virtual_from_version:50345" => 3233, - "old:virtual_from_version:43076" => 2040, - "old:virtual_from_version:46453" => 1009, - "old:virtual_from_version:42917" => 1077, - "old:virtual_from_version:49579" => 1498, - "old:virtual_from_version:44170" => 1125, - "old:virtual_from_version:44843" => 1057, - "old:virtual_from_version:42087" => 1070, - "old:virtual_from_version:45893" => 1009, - "old:virtual_from_version:45662" => 1005, - "old:virtual_from_version:42145" => 1009, - "old:virtual_from_version:40598" => 1077, - "old:virtual_from_version:50024" => 3218, - "old:virtual_from_version:39545" => 1148, - "old:virtual_from_version:49124" => 1077, - "old:virtual_from_version:40355" => 1091, - "old:virtual_from_version:39046" => 1095, - "old:virtual_from_version:46444" => 1172, - "old:virtual_from_version:40896" => 1048, - "old:virtual_from_version:47643" => 1583, - "old:virtual_from_version:40961" => 1070, - "old:virtual_from_version:45613" => 1136, - "old:virtual_from_version:46929" => 1125, - "old:virtual_from_version:45022" => 1078, - "old:virtual_from_version:45804" => 1025, - "old:virtual_from_version:44251" => 1077, - "old:virtual_from_version:44429" => 1049, - "old:virtual_from_version:50640" => 1001, - "old:virtual_from_version:49222" => 1393, - "old:virtual_from_version:50336" => 1105, - "old:virtual_from_version:46951" => 1172, - "old:virtual_from_version:46507" => 1580, - "old:virtual_from_version:46598" => 1172, - "old:virtual_from_version:42178" => 1172, - "old:virtual_from_version:40903" => 1070, - "old:virtual_from_version:50694" => 1070, - "old:virtual_from_version:47509" => 1009, - "old:virtual_from_version:49685" => 1105, - "old:virtual_from_version:45040" => 1022, - "old:virtual_from_version:45758" => 1070, - "old:virtual_from_version:42803" => 1107, - "old:virtual_from_version:48023" => 2124, - "old:virtual_from_version:49643" => 1583, - "old:virtual_from_version:42908" => 1009, - "old:virtual_from_version:46096" => 1362, - "old:virtual_from_version:40793" => 1070, - "old:virtual_from_version:45083" => 1125, - "old:virtual_from_version:42142" => 1351, - "old:virtual_from_version:42226" => 1077, - "old:virtual_from_version:42461" => 1070, - "old:virtual_from_version:45251" => 1030, - "old:virtual_from_version:45369" => 1461, - "old:virtual_from_version:44761" => 1077, - "old:virtual_from_version:47058" => 1580, - "old:virtual_from_version:44038" => 1007, - "old:virtual_from_version:45435" => 1070, - "old:virtual_from_version:44874" => 1009, - "old:virtual_from_version:46074" => 1172, - "old:virtual_from_version:49344" => 1067, - "old:virtual_from_version:46143" => 1070, - "old:virtual_from_version:50191" => 1070, - "old:virtual_from_version:42884" => 1109, - "old:virtual_from_version:44448" => 1249, - "old:virtual_from_version:46925" => 3008, - "old:virtual_from_version:44979" => 1107, - "old:virtual_from_version:40117" => 1100, - "old:virtual_from_version:50613" => 3259, - "old:virtual_from_version:47330" => 1070, - "old:virtual_from_version:42901" => 1070, - "old:virtual_from_version:46704" => 1697, - "old:virtual_from_version:45989" => 1640, - "old:virtual_from_version:45606" => 1009, - "old:virtual_from_version:47036" => 1583, - "old:virtual_from_version:47762" => 1666, - "old:virtual_from_version:50059" => 3131, - "old:virtual_from_version:44136" => 1077, - "old:virtual_from_version:47993" => 1077, - "old:virtual_from_version:46818" => 1172, - "old:virtual_from_version:50335" => 1224, - "old:virtual_from_version:42401" => 1077, - "old:virtual_from_version:47246" => 1109, - "old:virtual_from_version:49113" => 1649, - "old:virtual_from_version:49675" => 1009, - "old:virtual_from_version:42172" => 1009, - "old:virtual_from_version:44304" => 1509, - "old:virtual_from_version:39336" => 1158, - "old:virtual_from_version:47328" => 1109, - "old:virtual_from_version:42322" => 1404, - "old:virtual_from_version:48007" => 2107, - "old:virtual_from_version:47578" => 1109, - "old:virtual_from_version:39715" => 1136, - "old:virtual_from_version:45633" => 1077, - "old:virtual_from_version:42829" => 1009, - "old:virtual_from_version:44373" => 1064, - "old:virtual_from_version:42887" => 1077, - "old:virtual_from_version:45123" => 1009, - "old:virtual_from_version:44334" => 1025, - "old:virtual_from_version:42382" => 1009, - "old:virtual_from_version:44793" => 1172, - "old:virtual_from_version:50271" => 1025, - "old:virtual_from_version:49941" => 1112, - "old:virtual_from_version:45590" => 1172, - "old:virtual_from_version:42263" => 1037, - "old:virtual_from_version:50752" => 3259, - "old:virtual_from_version:42063" => 1077, - "old:virtual_from_version:50252" => 1150, - "old:virtual_from_version:42410" => 1070, - "old:virtual_from_version:42018" => 1125, - "old:virtual_from_version:39710" => 1070, - "old:virtual_from_version:44282" => 1109, - "old:virtual_from_version:45392" => 1009, - "old:virtual_from_version:46743" => 1077, - "old:virtual_from_version:50202" => 1222, - "old:virtual_from_version:38657" => 1128, - "old:virtual_from_version:40498" => 1070, - "old:virtual_from_version:47311" => 1037, - "old:virtual_from_version:44391" => 1049, - "old:virtual_from_version:42940" => 1077, - "old:virtual_from_version:44078" => 1037, - "old:virtual_from_version:47582" => 1666, - "old:virtual_from_version:45078" => 1077, - "old:virtual_from_version:44880" => 1009, - "old:virtual_from_version:42352" => 1077, - "old:virtual_from_version:46894" => 1125, - "old:virtual_from_version:40486" => 1077, - "old:virtual_from_version:49764" => 1070, - "old:virtual_from_version:45578" => 1411, - "old:virtual_from_version:47979" => 1109, - "old:virtual_from_version:46863" => 1077, - "old:virtual_from_version:46177" => 1070, - "old:virtual_from_version:46412" => 1109, - "old:virtual_from_version:44892" => 1077, - "old:virtual_from_version:42616" => 1037, - "old:virtual_from_version:49468" => 1696, - "old:virtual_from_version:47663" => 1565, - "old:virtual_from_version:50397" => 1070, - "old:virtual_from_version:50067" => 1009, - "old:virtual_from_version:44713" => 1077, - "old:virtual_from_version:46858" => 1172, - "old:virtual_from_version:45017" => 1090, - "old:virtual_from_version:46234" => 1172, - "old:virtual_from_version:47248" => 3020, - "old:virtual_from_version:49686" => 1008, - "old:virtual_from_version:45853" => 1077, - "old:virtual_from_version:45151" => 1125, - "old:virtual_from_version:49609" => 1587, - "old:virtual_from_version:49357" => 3167, - "old:virtual_from_version:50573" => 3259, - "old:virtual_from_version:40780" => 1009, - "old:virtual_from_version:46980" => 1172, - "old:virtual_from_version:42066" => 1070, - "old:virtual_from_version:49207" => 1077, - "old:virtual_from_version:45774" => 1125, - "old:virtual_from_version:40991" => 1404, - "old:virtual_from_version:44737" => 1083, - "old:virtual_from_version:42443" => 1077, - "old:virtual_from_version:45887" => 1009, - "old:virtual_from_version:40523" => 1070, - "old:virtual_from_version:42466" => 1077, - "old:virtual_from_version:45871" => 1125, - "old:virtual_from_version:47952" => 1070, - "old:virtual_from_version:49080" => 1110, - "old:virtual_from_version:38345" => 1069, - "old:virtual_from_version:47259" => 1070, - "old:virtual_from_version:43025" => 2050, - "old:virtual_from_version:43034" => 2033, - "old:virtual_from_version:45419" => 1009, - "old:virtual_from_version:49062" => 1070, - "old:virtual_from_version:50069" => 3214, - "old:virtual_from_version:40785" => 1070, - "old:virtual_from_version:44569" => 1077, - "old:virtual_from_version:46364" => 1533, - "old:virtual_from_version:42340" => 1136, - "old:virtual_from_version:40240" => 1077, - "old:virtual_from_version:46324" => 1077, - "old:virtual_from_version:46945" => 1070, - "old:virtual_from_version:42543" => 1037, - "old:virtual_from_version:46227" => 1172, - "old:virtual_from_version:40781" => 1025, - "old:virtual_from_version:40418" => 1067, - "old:virtual_from_version:50417" => 3131, - "old:virtual_from_version:47237" => 1077, - "old:virtual_from_version:46547" => 1077, - "old:virtual_from_version:39580" => 1085, - "old:virtual_from_version:40463" => 1311, - "old:virtual_from_version:40769" => 1125, - "old:virtual_from_version:49484" => 3162, - "old:virtual_from_version:45598" => 1070, - "old:virtual_from_version:44767" => 1070, - "old:virtual_from_version:45503" => 1077, - "old:virtual_from_version:45252" => 1144, - "old:virtual_from_version:43043" => 2022, - "old:virtual_from_version:40544" => 1067, - "old:virtual_from_version:49025" => 1077, - "old:virtual_from_version:46693" => 1077, - "old:virtual_from_version:46814" => 1070, - "old:virtual_from_version:44676" => 1110, - "old:virtual_from_version:42893" => 1077, - "old:virtual_from_version:49502" => 1037, - "old:virtual_from_version:50728" => 3262, - "old:virtual_from_version:49283" => 3136, - "old:virtual_from_version:44324" => 1006, - "old:virtual_from_version:42076" => 1077, - "old:virtual_from_version:49488" => 1125, - "old:virtual_from_version:42091" => 1077, - "old:virtual_from_version:45321" => 1009, - "old:virtual_from_version:44119" => 1037, - "old:virtual_from_version:40524" => 1091, - "old:virtual_from_version:47649" => 1125, - "old:virtual_from_version:42321" => 1109, - "old:virtual_from_version:40774" => 1048, - "old:virtual_from_version:39724" => 1108, - "old:virtual_from_version:45299" => 1582, - "old:virtual_from_version:42271" => 1025, - "old:virtual_from_version:50636" => 1148, - "old:virtual_from_version:42724" => 1037, - "old:virtual_from_version:44280" => 1077, - "old:virtual_from_version:45920" => 1633, - "old:virtual_from_version:44916" => 1172, - "old:virtual_from_version:45601" => 1141, - "old:virtual_from_version:50062" => 3131, - "old:virtual_from_version:46106" => 1397, - "old:virtual_from_version:42402" => 1037, - "old:virtual_from_version:47887" => 1038, - "old:virtual_from_version:45707" => 1404, - "old:virtual_from_version:49069" => 1077, - "old:virtual_from_version:47200" => 1077, - "old:virtual_from_version:45904" => 1062, - "old:virtual_from_version:42425" => 1077, - "old:virtual_from_version:42785" => 1083, - "old:virtual_from_version:40959" => 1413, - "old:virtual_from_version:44475" => 1037, - "old:virtual_from_version:47511" => 1621, - "old:virtual_from_version:40878" => 1009, - "old:virtual_from_version:49921" => 3207, - "old:virtual_from_version:50740" => 3266, - "old:virtual_from_version:44978" => 1037, - "old:virtual_from_version:50447" => 1007, - "old:virtual_from_version:49372" => 1057, - "old:virtual_from_version:47660" => 1051, - "old:virtual_from_version:46952" => 1077, - "old:virtual_from_version:46172" => 1070, - "old:virtual_from_version:46287" => 1070, - "old:virtual_from_version:10005" => 2004, - "old:virtual_from_version:44492" => 1125, - "old:virtual_from_version:50621" => 1417, - "old:virtual_from_version:45062" => 1105, - "old:virtual_from_version:49162" => 1404, - "old:virtual_from_version:39886" => 1107, - "old:virtual_from_version:46512" => 1489, - "old:virtual_from_version:44332" => 1009, - "old:virtual_from_version:46108" => 1107, - "old:virtual_from_version:46845" => 1077, - "old:virtual_from_version:47972" => 1532, - "old:virtual_from_version:40326" => 1404, - "old:virtual_from_version:42838" => 1032, - "old:virtual_from_version:44257" => 1523, - "old:virtual_from_version:50012" => 3131, - "old:virtual_from_version:45760" => 1019, - "old:virtual_from_version:45328" => 1009, - "old:virtual_from_version:45810" => 1413, - "old:virtual_from_version:46140" => 1172, - "old:virtual_from_version:42125" => 1009, - "old:virtual_from_version:46654" => 1537, - "old:virtual_from_version:46616" => 1125, - "old:virtual_from_version:49991" => 3131, - "old:virtual_from_version:44252" => 1037, - "old:virtual_from_version:46985" => 1689, - "old:virtual_from_version:42729" => 1070, - "old:virtual_from_version:50033" => 1125, - "old:virtual_from_version:46192" => 1009, - "old:virtual_from_version:49170" => 1070, - "old:virtual_from_version:42181" => 1009, - "old:virtual_from_version:49257" => 1070, - "old:virtual_from_version:49952" => 1025, - "old:virtual_from_version:44881" => 1077, - "old:virtual_from_version:49890" => 1048, - "old:virtual_from_version:40839" => 1070, - "old:virtual_from_version:40755" => 1107, - "old:virtual_from_version:49596" => 1005, - "old:virtual_from_version:42320" => 1037, - "old:virtual_from_version:45603" => 1136, - "old:virtual_from_version:50286" => 1404, - "old:virtual_from_version:44194" => 1125, - "old:virtual_from_version:45434" => 1136, - "old:virtual_from_version:47387" => 3008, - "old:virtual_from_version:47496" => 1077, - "old:virtual_from_version:46365" => 1070, - "old:virtual_from_version:42184" => 1031, - "old:virtual_from_version:49307" => 1070, - "old:virtual_from_version:44505" => 1110, - "old:virtual_from_version:50580" => 1150, - "old:virtual_from_version:49548" => 1009, - "old:virtual_from_version:45367" => 1107, - "old:virtual_from_version:45315" => 1009, - "old:virtual_from_version:42745" => 1009, - "old:virtual_from_version:42134" => 1037, - "old:virtual_from_version:49252" => 1077, - "old:virtual_from_version:44776" => 1351, - "old:virtual_from_version:45915" => 1070, - "old:virtual_from_version:50295" => 1314, - "old:virtual_from_version:40550" => 1070, - "old:virtual_from_version:46317" => 1032, - "old:virtual_from_version:47725" => 1070, - "old:virtual_from_version:40923" => 1110, - "old:virtual_from_version:45089" => 1070, - "old:virtual_from_version:45341" => 1125, - "old:virtual_from_version:49655" => 1583, - "old:virtual_from_version:47188" => 1125, - "old:virtual_from_version:45790" => 1005, - "old:virtual_from_version:42033" => 1037, - "old:virtual_from_version:50226" => 3227, - "old:virtual_from_version:40800" => 1009, - "old:virtual_from_version:4519 " => 1054, - "old:virtual_from_version:50117" => 1035, - "old:virtual_from_version:46044" => 1070, - "old:virtual_from_version:49960" => 1489, - "old:virtual_from_version:40821" => 1025, - "old:virtual_from_version:49302" => 1077, - "old:virtual_from_version:40879" => 1077, - "old:virtual_from_version:47687" => 1077, - "old:virtual_from_version:46259" => 1070, - "old:virtual_from_version:47434" => 1070, - "old:virtual_from_version:49691" => 1583, - "old:virtual_from_version:46283" => 1070, - "old:virtual_from_version:42005" => 1077, - "old:virtual_from_version:50111" => 1048, - "old:virtual_from_version:40742" => 1009, - "old:virtual_from_version:42484" => 1070, - "old:virtual_from_version:49555" => 1051, - "old:virtual_from_version:40720" => 1404, - "old:virtual_from_version:46270" => 1666, - "old:virtual_from_version:42001" => 1070, - "old:virtual_from_version:44245" => 1521, - "old:virtual_from_version:47448" => 1621, - "old:virtual_from_version:49851" => 3203, - "old:virtual_from_version:50593" => 1417, - "old:virtual_from_version:42346" => 1112, - "old:virtual_from_version:47513" => 1032, - "old:virtual_from_version:45257" => 1107, - "old:virtual_from_version:46089" => 1123, - "old:virtual_from_version:44342" => 1037, - "old:virtual_from_version:47247" => 1077, - "old:virtual_from_version:49159" => 1404, - "old:virtual_from_version:42194" => 1077, - "old:virtual_from_version:47852" => 1584, - "old:virtual_from_version:47274" => 1105, - "old:virtual_from_version:49086" => 3094, - "old:virtual_from_version:40660" => 1362, - "old:virtual_from_version:46004" => 1000, - "old:virtual_from_version:45244" => 1007, - "old:virtual_from_version:44113" => 1105, - "old:virtual_from_version:45580" => 1136, - "old:virtual_from_version:44234" => 1037, - "old:virtual_from_version:42014" => 1105, - "old:virtual_from_version:50723" => 1417, - "old:virtual_from_version:40530" => 1070, - "old:virtual_from_version:42579" => 1110, - "old:virtual_from_version:44721" => 1109, - "old:virtual_from_version:49082" => 3094, - "old:virtual_from_version:41012" => 2022, - "old:virtual_from_version:50552" => 3264, - "old:virtual_from_version:47011" => 3015, - "old:virtual_from_version:42590" => 1172, - "old:virtual_from_version:49996" => 3131, - "old:virtual_from_version:49280" => 1404, - "old:virtual_from_version:45274" => 1091, - "old:virtual_from_version:50515" => 1057, - "old:virtual_from_version:40845" => 1070, - "old:virtual_from_version:44646" => 1025, - "old:virtual_from_version:44982" => 1036, - "old:virtual_from_version:47789" => 1583, - "old:virtual_from_version:46416" => 1077, - "old:virtual_from_version:44480" => 1125, - "old:virtual_from_version:44640" => 1037, - "old:virtual_from_version:47033" => 1077, - "old:virtual_from_version:42440" => 1110, - "old:virtual_from_version:44230" => 1125, - "old:virtual_from_version:49749" => 1051, - "old:virtual_from_version:50197" => 1105, - "old:virtual_from_version:50660" => 1070, - "old:virtual_from_version:49977" => 3212, - "old:virtual_from_version:38678" => 1025, - "old:virtual_from_version:47727" => 1051, - "old:virtual_from_version:44896" => 1070, - "old:virtual_from_version:42720" => 1070, - "old:virtual_from_version:45557" => 1110, - "old:virtual_from_version:47583" => 1689, - "old:virtual_from_version:49925" => 1616, - "old:virtual_from_version:47595" => 1070, - "old:virtual_from_version:46358" => 1095, - "old:virtual_from_version:45402" => 1029, - "old:virtual_from_version:47750" => 1109, - "old:virtual_from_version:47278" => 1125, - "old:virtual_from_version:46340" => 1077, - "old:virtual_from_version:46737" => 1067, - "old:virtual_from_version:47343" => 1404, - "old:virtual_from_version:45492" => 1077, - "old:virtual_from_version:42465" => 1025, - "old:virtual_from_version:44785" => 1077, - "old:virtual_from_version:38383" => 1109, - "old:virtual_from_version:42056" => 1009, - "old:virtual_from_version:45348" => 1136, - "old:virtual_from_version:45822" => 1077, - "old:virtual_from_version:40602" => 1091, - "old:virtual_from_version:50659" => 1033, - "old:virtual_from_version:46260" => 1172, - "old:virtual_from_version:42524" => 1070, - "old:virtual_from_version:42963" => 1067, - "old:virtual_from_version:46489" => 1112, - "old:virtual_from_version:44751" => 1070, - "old:virtual_from_version:47355" => 1621, - "old:virtual_from_version:49510" => 1689, - "old:virtual_from_version:46499" => 1489, - "old:virtual_from_version:42740" => 1037, - "old:virtual_from_version:44889" => 1077, - "old:virtual_from_version:47697" => 1621, - "old:virtual_from_version:40751" => 1067, - "old:virtual_from_version:49061" => 3094, - "old:virtual_from_version:40417" => 1404, - "old:virtual_from_version:44018" => 1070, - "old:virtual_from_version:49240" => 1077, - "old:virtual_from_version:44504" => 1037, - "old:virtual_from_version:38360" => 1042, - "old:virtual_from_version:44137" => 1037, - "old:virtual_from_version:46982" => 1583, - "old:virtual_from_version:42844" => 1037, - "old:virtual_from_version:50568" => 1025, - "old:virtual_from_version:47577" => 1037, - "old:virtual_from_version:44357" => 1172, - "old:virtual_from_version:42994" => 1510, - "old:virtual_from_version:49857" => 3194, - "old:virtual_from_version:47538" => 1025, - "old:virtual_from_version:50669" => 3208, - "old:virtual_from_version:40207" => 1091, - "old:virtual_from_version:44400" => 1144, - "old:virtual_from_version:49563" => 1498, - "old:virtual_from_version:45271" => 1067, - "old:virtual_from_version:45497" => 1070, - "old:virtual_from_version:45608" => 1077, - "old:virtual_from_version:49794" => 1136, - "old:virtual_from_version:49602" => 1070, - "old:virtual_from_version:50143" => 3094, - "old:virtual_from_version:50004" => 1314, - "old:virtual_from_version:46300" => 1107, - "old:virtual_from_version:46628" => 1568, - "old:virtual_from_version:42619" => 1025, - "old:virtual_from_version:45759" => 1009, - "old:virtual_from_version:45205" => 1224, - "old:virtual_from_version:46479" => 1321, - "old:virtual_from_version:49804" => 1404, - "old:virtual_from_version:50758" => 1417, - "old:virtual_from_version:45599" => 1009, - "old:virtual_from_version:42639" => 1070, - "old:virtual_from_version:49811" => 1444, - "old:virtual_from_version:49608" => 1070, - "old:virtual_from_version:46883" => 1125, - "old:virtual_from_version:41015" => 2024, - "old:virtual_from_version:42086" => 1037, - "old:virtual_from_version:50663" => 1417, - "old:virtual_from_version:49909" => 3131, - "old:virtual_from_version:46613" => 1613, - "old:virtual_from_version:47155" => 1105, - "old:virtual_from_version:50250" => 3131, - "old:virtual_from_version:48011" => 2111, - "old:virtual_from_version:47541" => 1125, - "old:virtual_from_version:44472" => 1070, - "old:virtual_from_version:49355" => 1689, - "old:virtual_from_version:42077" => 1037, - "old:virtual_from_version:47682" => 1070, - "old:virtual_from_version:44174" => 1037, - "old:virtual_from_version:45836" => 1397, - "old:virtual_from_version:40962" => 1006, - "old:virtual_from_version:40315" => 1091, - "old:virtual_from_version:49855" => 1537, - "old:virtual_from_version:45114" => 1077, - "old:virtual_from_version:49863" => 1125, - "old:virtual_from_version:49379" => 1077, - "old:virtual_from_version:50000" => 1100, - "old:virtual_from_version:45685" => 1019, - "old:virtual_from_version:49813" => 3131, - "old:virtual_from_version:46327" => 1070, - "old:virtual_from_version:46120" => 1404, - "old:virtual_from_version:42354" => 1067, - "old:virtual_from_version:45713" => 1123, - "old:virtual_from_version:44865" => 1172, - "old:virtual_from_version:42333" => 1009, - "old:virtual_from_version:44816" => 1172, - "old:virtual_from_version:13397" => 1043, - "old:virtual_from_version:50094" => 1136, - "old:virtual_from_version:42148" => 1037, - "old:virtual_from_version:49747" => 1158, - "old:virtual_from_version:39478" => 1032, - "old:virtual_from_version:44343" => 1062, - "old:virtual_from_version:49527" => 1666, - "old:virtual_from_version:47743" => 1109, - "old:virtual_from_version:49604" => 1009, - "old:virtual_from_version:40358" => 1332, - "old:virtual_from_version:46374" => 1584, - "old:virtual_from_version:47739" => 1070, - "old:virtual_from_version:40239" => 1125, - "old:virtual_from_version:47529" => 1077, - "old:virtual_from_version:44303" => 1057, - "old:virtual_from_version:47931" => 1109, - "old:virtual_from_version:42736" => 1038, - "old:virtual_from_version:47013" => 1007, - "old:virtual_from_version:49672" => 1070, - "old:virtual_from_version:45888" => 1025, - "old:virtual_from_version:50602" => 1444, - "old:virtual_from_version:49067" => 3137, - "old:virtual_from_version:40545" => 1105, - "old:virtual_from_version:50529" => 1362, - "old:virtual_from_version:43052" => 2055, - "old:virtual_from_version:46593" => 1037, - "old:virtual_from_version:47375" => 1070, - "old:virtual_from_version:45926" => 1077, - "old:virtual_from_version:44921" => 1110, - "old:virtual_from_version:42036" => 1413, - "old:virtual_from_version:40522" => 1321, - "old:virtual_from_version:45945" => 1077, - "old:virtual_from_version:42499" => 1172, - "old:virtual_from_version:50029" => 1125, - "old:virtual_from_version:44088" => 1025, - "old:virtual_from_version:44991" => 1019, - "old:virtual_from_version:42312" => 1070, - "old:virtual_from_version:44672" => 1070, - "old:virtual_from_version:42035" => 1172, - "old:virtual_from_version:49242" => 1615, - "old:virtual_from_version:42972" => 1009, - "old:virtual_from_version:44420" => 1031, - "old:virtual_from_version:40353" => 1404, - "old:virtual_from_version:40854" => 1048, - "old:virtual_from_version:46723" => 1077, - "old:virtual_from_version:49854" => 1105, - "old:virtual_from_version:46827" => 1009, - "old:virtual_from_version:42553" => 1070, - "old:virtual_from_version:38953" => 1136, - "old:virtual_from_version:44421" => 1036, - "old:virtual_from_version:49975" => 3131, - "old:virtual_from_version:42770" => 1009, - "old:virtual_from_version:45820" => 1070, - "old:virtual_from_version:46678" => 1125, - "old:virtual_from_version:40727" => 1070, - "old:virtual_from_version:42435" => 1009, - "old:virtual_from_version:45752" => 1009, - "old:virtual_from_version:44834" => 1402, - "old:virtual_from_version:49765" => 1025, - "old:virtual_from_version:47368" => 1362, - "old:virtual_from_version:44515" => 1009, - "old:virtual_from_version:42149" => 1110, - "old:virtual_from_version:44855" => 1077, - "old:virtual_from_version:49315" => 1070, - "old:virtual_from_version:45734" => 1007, - "old:virtual_from_version:42009" => 1067, - "old:virtual_from_version:39125" => 1094, - "old:virtual_from_version:40250" => 1025, - "old:virtual_from_version:47261" => 1109, - "old:virtual_from_version:49987" => 3120, - "old:virtual_from_version:49190" => 1565, - "old:virtual_from_version:38349" => 1025, - "old:virtual_from_version:38557" => 1067, - "old:virtual_from_version:42456" => 1041, - "old:virtual_from_version:46651" => 1070, - "old:virtual_from_version:47303" => 1037, - "old:virtual_from_version:50065" => 1107, - "old:virtual_from_version:49911" => 3206, - "old:virtual_from_version:42501" => 1070, - "old:virtual_from_version:46757" => 1125, - "old:virtual_from_version:42734" => 1077, - "old:virtual_from_version:46777" => 1404, - "old:virtual_from_version:46994" => 1689, - "old:virtual_from_version:49715" => 1689, - "old:virtual_from_version:45733" => 1070, - "old:virtual_from_version:45842" => 1009, - "old:virtual_from_version:40744" => 1077, - "old:virtual_from_version:43083" => 2080, - "old:virtual_from_version:45946" => 1404, - "old:virtual_from_version:45843" => 1025, - "old:virtual_from_version:50281" => 1150, - "old:virtual_from_version:46237" => 1035, - "old:virtual_from_version:42721" => 1009, - "old:virtual_from_version:47839" => 1621, - "old:virtual_from_version:40350" => 1009, - "old:virtual_from_version:40388" => 1048, - "old:virtual_from_version:47422" => 1009, - "old:virtual_from_version:44556" => 1070, - "old:virtual_from_version:45373" => 1125, - "old:virtual_from_version:50136" => 3131, - "old:virtual_from_version:40621" => 1077, - "old:virtual_from_version:47864" => 1584, - "old:virtual_from_version:46123" => 1077, - "old:virtual_from_version:40752" => 1000, - "old:virtual_from_version:45715" => 1172, - "old:virtual_from_version:44952" => 1009, - "old:virtual_from_version:45326" => 1587, - "old:virtual_from_version:45515" => 1580, - "old:virtual_from_version:44188" => 1009, - "old:virtual_from_version:44886" => 1070, - "old:virtual_from_version:46265" => 1067, - "old:virtual_from_version:49497" => 3178, - "old:virtual_from_version:45688" => 1009, - "old:virtual_from_version:47780" => 1109, - "old:virtual_from_version:49507" => 1070, - "old:virtual_from_version:47089" => 1077, - "old:virtual_from_version:44068" => 1070, - "old:virtual_from_version:50105" => 1032, - "old:virtual_from_version:40940" => 1037, - "old:virtual_from_version:49006" => 1584, - "old:virtual_from_version:45051" => 1043, - "old:virtual_from_version:40747" => 1009, - "old:virtual_from_version:47410" => 3008, - "old:virtual_from_version:47060" => 1070, - "old:virtual_from_version:45110" => 1125, - "old:virtual_from_version:50711" => 1417, - "old:virtual_from_version:47172" => 1070, - "old:virtual_from_version:40988" => 1077, - "old:virtual_from_version:45604" => 1070, - "old:virtual_from_version:47773" => 1565, - "old:virtual_from_version:43035" => 2034, - "old:virtual_from_version:47331" => 1125, - "old:virtual_from_version:49946" => 1404, - "old:virtual_from_version:49968" => 1585, - "old:virtual_from_version:49559" => 1410, - "old:virtual_from_version:44270" => 1070, - "old:virtual_from_version:42299" => 1000, - "old:virtual_from_version:44903" => 1077, - "old:virtual_from_version:50291" => 3232, - "old:virtual_from_version:44532" => 1070, - "old:virtual_from_version:50327" => 1125, - "old:virtual_from_version:50759" => 3259, - "old:virtual_from_version:44431" => 1095, - "old:virtual_from_version:46646" => 1062, - "old:virtual_from_version:47227" => 1109, - "old:virtual_from_version:44546" => 1009, - "old:virtual_from_version:46465" => 1150, - "old:virtual_from_version:45394" => 1009, - "old:virtual_from_version:42071" => 1070, - "old:virtual_from_version:50576" => 1006, - "old:virtual_from_version:47935" => 3120, - "old:virtual_from_version:46623" => 1125, - "old:virtual_from_version:44679" => 1414, - "old:virtual_from_version:46363" => 1077, - "old:virtual_from_version:45776" => 1304, - "old:virtual_from_version:42863" => 1070, - "old:virtual_from_version:44181" => 1083, - "old:virtual_from_version:42935" => 1077, - "old:virtual_from_version:45405" => 1112, - "old:virtual_from_version:47076" => 1070, - "old:virtual_from_version:42085" => 1077, - "old:virtual_from_version:44146" => 1077, - "old:virtual_from_version:50750" => 1580, - "old:virtual_from_version:46726" => 1583, - "old:virtual_from_version:48016" => 2116, - "old:virtual_from_version:44097" => 1037, - "old:virtual_from_version:39051" => 1069, - "old:virtual_from_version:49931" => 3206, - "old:virtual_from_version:15751" => 1011, - "old:virtual_from_version:45549" => 1009, - "old:virtual_from_version:45070" => 1070, - "old:virtual_from_version:47401" => 3008, - "old:virtual_from_version:42306" => 1037, - "old:virtual_from_version:42808" => 1077, - "old:virtual_from_version:39513" => 1077, - "old:virtual_from_version:45300" => 1125, - "old:virtual_from_version:44709" => 1222, - "old:virtual_from_version:49914" => 1100, - "old:virtual_from_version:46572" => 1070, - "old:virtual_from_version:44043" => 1125, - "old:virtual_from_version:45621" => 1112, - "old:virtual_from_version:44861" => 1172, - "old:virtual_from_version:46971" => 1070, - "old:virtual_from_version:49547" => 1105, - "old:virtual_from_version:50630" => 1555, - "old:virtual_from_version:46111" => 1070, - "old:virtual_from_version:40907" => 1070, - "old:virtual_from_version:45498" => 1125, - "old:virtual_from_version:46626" => 1025, - "old:virtual_from_version:47841" => 3108, - "old:virtual_from_version:47920" => 1077, - "old:virtual_from_version:46961" => 1070, - "old:virtual_from_version:47942" => 1077, - "old:virtual_from_version:49636" => 3185, - "old:virtual_from_version:46007" => 1110, - "old:virtual_from_version:46397" => 1048, - "old:virtual_from_version:44449" => 1172, - "old:virtual_from_version:49213" => 1009, - "old:virtual_from_version:44044" => 1107, - "old:virtual_from_version:48001" => 2102, - "old:virtual_from_version:44802" => 1070, - "old:virtual_from_version:44053" => 1009, - "old:virtual_from_version:50300" => 1404, - "old:virtual_from_version:50384" => 1314, - "old:virtual_from_version:44644" => 1009, - "old:virtual_from_version:49506" => 3179, - "old:virtual_from_version:45107" => 1070, - "old:virtual_from_version:47428" => 1037, - "old:virtual_from_version:50456" => 1006, - "old:virtual_from_version:45865" => 1070, - "old:virtual_from_version:47066" => 3008, - "old:virtual_from_version:49727" => 1070, - "old:virtual_from_version:45778" => 1062, - "old:virtual_from_version:49237" => 1077, - "old:virtual_from_version:44377" => 1021, - "old:virtual_from_version:47053" => 1107, - "old:virtual_from_version:49537" => 1009, - "old:virtual_from_version:49163" => 3151, - "old:virtual_from_version:50208" => 3139, - "old:virtual_from_version:45589" => 1057, - "old:virtual_from_version:42288" => 1009, - "old:virtual_from_version:42212" => 1070, - "old:virtual_from_version:44467" => 1070, - "old:virtual_from_version:45349" => 1413, - "old:virtual_from_version:47631" => 1077, - "old:virtual_from_version:44757" => 1136, - "old:virtual_from_version:47801" => 1070, - "old:virtual_from_version:23466" => 1076, - "old:virtual_from_version:50058" => 1314, - "old:virtual_from_version:44100" => 1025, - "old:virtual_from_version:47751" => 1172, - "old:virtual_from_version:44804" => 1077, - "old:virtual_from_version:47891" => 1077, - "old:virtual_from_version:49791" => 1006, - "old:virtual_from_version:46696" => 1025, - "old:virtual_from_version:45479" => 1172, - "old:virtual_from_version:38748" => 1048, - "old:virtual_from_version:47051" => 1070, - "old:virtual_from_version:46649" => 1077, - "old:virtual_from_version:47934" => 1689, - "old:virtual_from_version:45821" => 1067, - "old:virtual_from_version:42051" => 1077, - "old:virtual_from_version:49092" => 3094, - "old:virtual_from_version:47804" => 1109, - "old:virtual_from_version:50097" => 3131, - "old:virtual_from_version:45418" => 1069, - "old:virtual_from_version:45295" => 1362, - "old:virtual_from_version:38581" => 1091, - "old:virtual_from_version:44803" => 1025, - "old:virtual_from_version:42574" => 1037, - "old:virtual_from_version:46937" => 2100, - "old:virtual_from_version:44712" => 1009, - "old:virtual_from_version:50687" => 3216, - "old:virtual_from_version:49744" => 1532, - "old:virtual_from_version:45629" => 1077, - "old:virtual_from_version:42649" => 1484, - "old:virtual_from_version:49271" => 1077, - "old:virtual_from_version:49955" => 1659, - "old:virtual_from_version:45986" => 1639, - "old:virtual_from_version:42195" => 1037, - "old:virtual_from_version:50198" => 1689, - "old:virtual_from_version:46278" => 1009, - "old:virtual_from_version:44428" => 1048, - "old:virtual_from_version:49934" => 1078, - "old:virtual_from_version:48009" => 2109, - "old:virtual_from_version:45597" => 1136, - "old:virtual_from_version:42881" => 1025, - "old:virtual_from_version:46663" => 1070, - "old:virtual_from_version:42658" => 1025, - "old:virtual_from_version:46583" => 1077, - "old:virtual_from_version:46751" => 1070, - "old:virtual_from_version:49621" => 1125, - "old:virtual_from_version:43012" => 2037, - "old:virtual_from_version:50650" => 1172, - "old:virtual_from_version:44575" => 1009, - "old:virtual_from_version:50239" => 1489, - "old:virtual_from_version:47491" => 1109, - "old:virtual_from_version:47020" => 1461, - "old:virtual_from_version:50246" => 3131, - "old:virtual_from_version:40708" => 1081, - "old:virtual_from_version:47180" => 1070, - "old:virtual_from_version:40597" => 1070, - "old:virtual_from_version:48041" => 2138, - "old:virtual_from_version:42653" => 1025, - "old:virtual_from_version:49105" => 3146, - "old:virtual_from_version:42451" => 1438, - "old:virtual_from_version:42411" => 1009, - "old:virtual_from_version:49250" => 3159, - "old:virtual_from_version:46907" => 3007, - "old:virtual_from_version:40770" => 1025, - "old:virtual_from_version:42417" => 1009, - "old:virtual_from_version:43028" => 2028, - "old:virtual_from_version:50536" => 1032, - "old:virtual_from_version:50378" => 1172, - "old:virtual_from_version:44072" => 1125, - "old:virtual_from_version:50414" => 3227, - "old:virtual_from_version:47950" => 1314, - "old:virtual_from_version:42890" => 1070, - "old:virtual_from_version:47666" => 1689, - "old:virtual_from_version:47459" => 1109, - "old:virtual_from_version:40686" => 1095, - "old:virtual_from_version:49788" => 1100, - "old:virtual_from_version:45077" => 1009, - "old:virtual_from_version:46045" => 1109, - "old:virtual_from_version:46087" => 1025, - "old:virtual_from_version:49202" => 1125, - "old:virtual_from_version:46891" => 1077, - "old:virtual_from_version:47135" => 1532, - "old:virtual_from_version:50578" => 3259, - "old:virtual_from_version:40116" => 1172, - "old:virtual_from_version:49777" => 1070, - "old:virtual_from_version:50565" => 1689, - "old:virtual_from_version:45757" => 1107, - "old:virtual_from_version:46165" => 1532, - "old:virtual_from_version:47668" => 1109, - "old:virtual_from_version:42506" => 1025, - "old:virtual_from_version:44773" => 1489, - "old:virtual_from_version:50570" => 1489, - "old:virtual_from_version:49581" => 1158, - "old:virtual_from_version:45950" => 1626, - "old:virtual_from_version:40482" => 1037, - "old:virtual_from_version:42648" => 1484, - "old:virtual_from_version:44794" => 1070, - "old:virtual_from_version:49354" => 1532, - "old:virtual_from_version:47376" => 1125, - "old:virtual_from_version:45741" => 1621, - "old:virtual_from_version:44851" => 1062, - "old:virtual_from_version:49251" => 1070, - "old:virtual_from_version:49214" => 1077, - "old:virtual_from_version:40438" => 1009, - "old:virtual_from_version:40757" => 1077, - "old:virtual_from_version:38495" => 1091, - "old:virtual_from_version:49524" => 1107, - "old:virtual_from_version:45049" => 1062, - "old:virtual_from_version:47501" => 1659, - "old:virtual_from_version:46057" => 1070, - "old:virtual_from_version:42684" => 1067, - "old:virtual_from_version:49164" => 3152, - "old:virtual_from_version:44544" => 1125, - "old:virtual_from_version:50074" => 1125, - "old:virtual_from_version:47397" => 1109, - "old:virtual_from_version:45909" => 1077, - "old:virtual_from_version:50584" => 3266, - "old:virtual_from_version:49514" => 1070, - "old:virtual_from_version:49638" => 1007, - "old:virtual_from_version:50751" => 1689, - "old:virtual_from_version:49367" => 3016, - "old:virtual_from_version:50526" => 1007, - "old:virtual_from_version:47745" => 1565, - "old:virtual_from_version:47648" => 1070, - "old:virtual_from_version:42280" => 1422, - "old:virtual_from_version:49606" => 1070, - "old:virtual_from_version:47184" => 1077, - "old:virtual_from_version:44675" => 1037, - "old:virtual_from_version:49262" => 1077, - "old:virtual_from_version:50331" => 3239, - "old:virtual_from_version:50077" => 3214, - "old:virtual_from_version:45410" => 1533, - "old:virtual_from_version:42526" => 1025, - "old:virtual_from_version:45525" => 1077, - "old:virtual_from_version:49392" => 1172, - "old:virtual_from_version:45065" => 1000, - "old:virtual_from_version:44998" => 1222, - "old:virtual_from_version:47288" => 1134, - "old:virtual_from_version:42315" => 1037, - "old:virtual_from_version:40707" => 1109, - "old:virtual_from_version:40571" => 1146, - "old:virtual_from_version:40067" => 1077, - "old:virtual_from_version:42168" => 1077, - "old:virtual_from_version:45345" => 1381, - "old:virtual_from_version:40958" => 1095, - "old:virtual_from_version:44028" => 1125, - "old:virtual_from_version:50622" => 3259, - "old:virtual_from_version:46454" => 1012, - "old:virtual_from_version:39546" => 1192, - "old:virtual_from_version:42581" => 1461, - "old:virtual_from_version:45280" => 1025, - "old:virtual_from_version:45154" => 1012, - "old:virtual_from_version:46787" => 1491, - "old:virtual_from_version:44315" => 1081, - "old:virtual_from_version:44481" => 1070, - "old:virtual_from_version:43107" => 2099, - "old:virtual_from_version:49847" => 1489, - "old:virtual_from_version:50346" => 1007, - "old:virtual_from_version:46016" => 1025, - "old:virtual_from_version:49103" => 1649, - "old:virtual_from_version:46991" => 1222, - "old:virtual_from_version:44561" => 1009, - "old:virtual_from_version:46778" => 1070, - "old:virtual_from_version:49043" => 1009, - "old:virtual_from_version:42201" => 1015, - "old:virtual_from_version:47223" => 1109, - "old:virtual_from_version:38369" => 1048, - "old:virtual_from_version:45030" => 1069, - "old:virtual_from_version:46197" => 1077, - "old:virtual_from_version:49211" => 1070, - "old:virtual_from_version:47190" => 1077, - "old:virtual_from_version:40626" => 1091, - "old:virtual_from_version:42982" => 1037, - "old:virtual_from_version:47183" => 1109, - "old:virtual_from_version:47412" => 1697, - "old:virtual_from_version:40957" => 1048, - "old:virtual_from_version:44022" => 1110, - "old:virtual_from_version:45650" => 1070, - "old:virtual_from_version:45158" => 1498, - "old:virtual_from_version:40539" => 1109, - "old:virtual_from_version:44226" => 1070, - "old:virtual_from_version:50261" => 1136, - "old:virtual_from_version:48013" => 2113, - "old:virtual_from_version:40554" => 1077, - "old:virtual_from_version:44577" => 1037, - "old:virtual_from_version:49115" => 1125, - "old:virtual_from_version:39228" => 1009, - "old:virtual_from_version:47726" => 1125, - "old:virtual_from_version:47882" => 1070, - "old:virtual_from_version:49021" => 1077, - "old:virtual_from_version:45624" => 1172, - "old:virtual_from_version:49705" => 1410, - "old:virtual_from_version:47679" => 1035, - "old:virtual_from_version:42236" => 1420, - "old:virtual_from_version:44602" => 1070, - "old:virtual_from_version:45960" => 1070, - "old:virtual_from_version:50396" => 3227, - "old:virtual_from_version:42662" => 1070, - "old:virtual_from_version:40631" => 1070, - "old:virtual_from_version:46867" => 1070, - "old:virtual_from_version:46895" => 1077, - "old:virtual_from_version:46502" => 1583, - "old:virtual_from_version:46509" => 1584, - "old:virtual_from_version:46409" => 1537, - "old:virtual_from_version:46056" => 1077, - "old:virtual_from_version:50292" => 3233, - "old:virtual_from_version:46922" => 1070, - "old:virtual_from_version:49949" => 3131, - "old:virtual_from_version:50672" => 3208, - "old:virtual_from_version:47655" => 1077, - "old:virtual_from_version:40930" => 1048, - "old:virtual_from_version:50408" => 1584, - "old:virtual_from_version:44049" => 1037, - "old:virtual_from_version:44389" => 1112, - "old:virtual_from_version:49631" => 1078, - "old:virtual_from_version:40937" => 1134, - "old:virtual_from_version:49490" => 1689, - "old:virtual_from_version:42419" => 1037, - "old:virtual_from_version:40380" => 1007, - "old:virtual_from_version:45675" => 1555, - "old:virtual_from_version:49665" => 3139, - "old:virtual_from_version:47244" => 1125, - "old:virtual_from_version:39180" => 1017, - "old:virtual_from_version:42852" => 1067, - "old:virtual_from_version:40580" => 1006, - "old:virtual_from_version:38344" => 1009, - "old:virtual_from_version:40217" => 1404, - "old:virtual_from_version:50348" => 1224, - "old:virtual_from_version:44624" => 1077, - "old:virtual_from_version:47721" => 1109, - "old:virtual_from_version:49378" => 1025, - "old:virtual_from_version:49662" => 1125, - "old:virtual_from_version:45215" => 1570, - "old:virtual_from_version:42147" => 1077, - "old:virtual_from_version:46900" => 1125, - "old:virtual_from_version:46088" => 1077, - "old:virtual_from_version:39858" => 1069, - "old:virtual_from_version:50438" => 3191, - "old:virtual_from_version:44498" => 1067, - "old:virtual_from_version:38802" => 1132, - "old:virtual_from_version:42078" => 1109, - "old:virtual_from_version:42293" => 1037, - "old:virtual_from_version:45512" => 1009, - "old:virtual_from_version:44430" => 1067, - "old:virtual_from_version:50263" => 1489, - "old:virtual_from_version:50560" => 1489, - "old:virtual_from_version:42674" => 1009, - "old:virtual_from_version:49512" => 1070, - "old:virtual_from_version:44047" => 1025, - "old:virtual_from_version:45638" => 1046, - "old:virtual_from_version:44125" => 1070, - "old:virtual_from_version:46529" => 1125, - "old:virtual_from_version:50089" => 3210, - "old:virtual_from_version:47613" => 1109, - "old:virtual_from_version:46788" => 1070, - "old:virtual_from_version:46659" => 1694, - "old:virtual_from_version:49742" => 1136, - "old:virtual_from_version:47192" => 1125, - "old:virtual_from_version:49452" => 1172, - "old:virtual_from_version:45980" => 1520, - "old:virtual_from_version:38461" => 1051, - "old:virtual_from_version:42609" => 1077, - "old:virtual_from_version:50385" => 1689, - "old:virtual_from_version:39836" => 1009, - "old:virtual_from_version:46820" => 1397, - "old:virtual_from_version:46526" => 1172, - "old:virtual_from_version:49249" => 1689, - "old:virtual_from_version:40314" => 1078, - "old:virtual_from_version:49592" => 1580, - "old:virtual_from_version:50284" => 3223, - "old:virtual_from_version:40763" => 1105, - "old:virtual_from_version:40455" => 1105, - "old:virtual_from_version:46048" => 1070, - "old:virtual_from_version:50349" => 1006, - "old:virtual_from_version:44866" => 1125, - "old:virtual_from_version:49406" => 3157, - "old:virtual_from_version:47477" => 1172, - "old:virtual_from_version:42767" => 1070, - "old:virtual_from_version:49862" => 1070, - "old:virtual_from_version:49853" => 1070, - "old:virtual_from_version:46915" => 1070, - "old:virtual_from_version:47987" => 1067, - "old:virtual_from_version:40714" => 1067, - "old:virtual_from_version:45038" => 1021, - "old:virtual_from_version:44755" => 1077, - "old:virtual_from_version:49042" => 1105, - "old:virtual_from_version:49034" => 1649, - "old:virtual_from_version:46635" => 1125, - "old:virtual_from_version:46597" => 1070, - "old:virtual_from_version:12547" => 1125, - "old:virtual_from_version:46662" => 1694, - "old:virtual_from_version:47847" => 1037, - "old:virtual_from_version:47163" => 1150, - "old:virtual_from_version:45279" => 1009, - "old:virtual_from_version:40827" => 1078, - "old:virtual_from_version:42757" => 1110, - "old:virtual_from_version:50106" => 3131, - "old:virtual_from_version:44040" => 1025, - "old:virtual_from_version:46438" => 1070, - "old:virtual_from_version:47291" => 1048, - "old:virtual_from_version:45489" => 1112, - "old:virtual_from_version:43045" => 2002, - "old:virtual_from_version:45452" => 1031, - "old:virtual_from_version:49745" => 1689, - "old:virtual_from_version:42985" => 1070, - "old:virtual_from_version:46632" => 1070, - "old:virtual_from_version:42894" => 1037, - "old:virtual_from_version:42667" => 1488, - "old:virtual_from_version:45379" => 1015, - "old:virtual_from_version:49011" => 1077, - "old:virtual_from_version:44901" => 1070, - "old:virtual_from_version:29684" => 1089, - "old:virtual_from_version:40822" => 1077, - "old:virtual_from_version:49871" => 3131, - "old:virtual_from_version:46349" => 1070, - "old:virtual_from_version:45303" => 1565, - "old:virtual_from_version:44908" => 1007, - "old:virtual_from_version:40450" => 1105, - "old:virtual_from_version:44849" => 1015, - "old:virtual_from_version:50165" => 1006, - "old:virtual_from_version:47580" => 1517, - "old:virtual_from_version:40070" => 1025, - "old:virtual_from_version:44460" => 1009, - "old:virtual_from_version:44506" => 1067, - "old:virtual_from_version:39343" => 1061, - "old:virtual_from_version:50099" => 3221, - "old:virtual_from_version:43101" => 2093, - "old:virtual_from_version:49369" => 1070, - "old:virtual_from_version:40768" => 1009, - "old:virtual_from_version:42580" => 1456, - "old:virtual_from_version:50431" => 3241, - "old:virtual_from_version:47106" => 1584, - "old:virtual_from_version:45698" => 1077, - "old:virtual_from_version:49231" => 1070, - "old:virtual_from_version:45775" => 1532, - "old:virtual_from_version:47560" => 1048, - "old:virtual_from_version:49762" => 3131, - "old:virtual_from_version:44670" => 1037, - "old:virtual_from_version:45111" => 1070, - "old:virtual_from_version:40915" => 1037, - "old:virtual_from_version:46383" => 1381, - "old:virtual_from_version:42039" => 1077, - "old:virtual_from_version:47193" => 1109, - "old:virtual_from_version:49825" => 3131, - "old:virtual_from_version:40381" => 1125, - "old:virtual_from_version:41001" => 2013, - "old:virtual_from_version:40656" => 1104, - "old:virtual_from_version:42339" => 1067, - "old:virtual_from_version:42883" => 1037, - "old:virtual_from_version:49363" => 1077, - "old:virtual_from_version:44187" => 1070, - "old:virtual_from_version:42083" => 1037, - "old:virtual_from_version:39893" => 1146, - "old:virtual_from_version:43001" => 2020, - "old:virtual_from_version:46599" => 1077, - "old:virtual_from_version:44182" => 1083, - "old:virtual_from_version:46150" => 1077, - "old:virtual_from_version:50158" => 1689, - "old:virtual_from_version:45075" => 1125, - "old:virtual_from_version:45461" => 1009, - "old:virtual_from_version:42702" => 1077, - "old:virtual_from_version:42388" => 1000, - "old:virtual_from_version:40202" => 1304, - "old:virtual_from_version:42235" => 1037, - "old:virtual_from_version:44211" => 1025, - "old:virtual_from_version:39786" => 1125, - "old:virtual_from_version:45260" => 1036, - "old:virtual_from_version:49523" => 1070, - "old:virtual_from_version:47416" => 1402, - "old:virtual_from_version:44401" => 1007, - "old:virtual_from_version:46382" => 1077, - "old:virtual_from_version:49260" => 1532, - "old:virtual_from_version:47626" => 3078, - "old:virtual_from_version:49443" => 1689, - "old:virtual_from_version:49200" => 1077, - "old:virtual_from_version:42988" => 1037, - "old:virtual_from_version:42048" => 1070, - "old:virtual_from_version:50406" => 1150, - "old:virtual_from_version:44069" => 1077, - "old:virtual_from_version:46650" => 1537, - "old:virtual_from_version:38330" => 1070, - "old:virtual_from_version:49417" => 1689, - "old:virtual_from_version:44862" => 1070, - "old:virtual_from_version:50148" => 1032, - "old:virtual_from_version:49858" => 1070, - "old:virtual_from_version:42108" => 1070, - "old:virtual_from_version:42497" => 1130, - "old:virtual_from_version:40408" => 1404, - "old:virtual_from_version:50760" => 3274, - "old:virtual_from_version:50301" => 3131, - "old:virtual_from_version:45602" => 1172, - "old:virtual_from_version:49539" => 1489, - "old:virtual_from_version:47019" => 1077, - "old:virtual_from_version:46976" => 1070, - "old:virtual_from_version:45550" => 1025, - "old:virtual_from_version:45806" => 1077, - "old:virtual_from_version:45336" => 1009, - "old:virtual_from_version:46152" => 1077, - "old:virtual_from_version:49266" => 1070, - "old:virtual_from_version:50169" => 3201, - "old:virtual_from_version:49711" => 1037, - "old:virtual_from_version:46944" => 1077, - "old:virtual_from_version:42924" => 1037, - "old:virtual_from_version:42823" => 1077, - "old:virtual_from_version:44432" => 1526, - "old:virtual_from_version:50175" => 1314, - "old:virtual_from_version:47082" => 1070, - "old:virtual_from_version:47989" => 1077, - "old:virtual_from_version:40710" => 1009, - "old:virtual_from_version:45716" => 1107, - "old:virtual_from_version:50766" => 1057, - "old:virtual_from_version:49658" => 3189, - "old:virtual_from_version:47156" => 1077, - "old:virtual_from_version:42054" => 1048, - "old:virtual_from_version:45762" => 1027, - "old:virtual_from_version:47693" => 1077, - "old:virtual_from_version:49963" => 3210, - "old:virtual_from_version:42873" => 1505, - "old:virtual_from_version:44625" => 1037, - "old:virtual_from_version:49516" => 1580, - "old:virtual_from_version:46780" => 1077, - "old:virtual_from_version:47373" => 3008, - "old:virtual_from_version:47879" => 1077, - "old:virtual_from_version:45438" => 1136, - "old:virtual_from_version:47825" => 1659, - "old:virtual_from_version:47299" => 1125, - "old:virtual_from_version:50596" => 3265, - "old:virtual_from_version:44490" => 1037, - "old:virtual_from_version:42519" => 1077, - "old:virtual_from_version:42640" => 1009, - "old:virtual_from_version:47790" => 3006, - "old:virtual_from_version:40671" => 1025, - "old:virtual_from_version:50036" => 3219, - "old:virtual_from_version:44142" => 1110, - "old:virtual_from_version:44538" => 1125, - "old:virtual_from_version:44594" => 1009, - "old:virtual_from_version:45350" => 1110, - "old:virtual_from_version:44296" => 1107, - "old:virtual_from_version:50078" => 3222, - "old:virtual_from_version:44989" => 1015, - "old:virtual_from_version:49556" => 1107, - "old:virtual_from_version:42405" => 1070, - "old:virtual_from_version:42559" => 1009, - "old:virtual_from_version:45098" => 1110, - "old:virtual_from_version:40894" => 1109, - "old:virtual_from_version:45970" => 1009, - "old:virtual_from_version:46009" => 1051, - "old:virtual_from_version:49877" => 1150, - "old:virtual_from_version:46799" => 1555, - "old:virtual_from_version:42198" => 1037, - "old:virtual_from_version:44833" => 1077, - "old:virtual_from_version:47860" => 1001, - "old:virtual_from_version:45732" => 1532, - "old:virtual_from_version:46262" => 1517, - "old:virtual_from_version:49817" => 3199, - "old:virtual_from_version:44054" => 1025, - "old:virtual_from_version:46005" => 1078, - "old:virtual_from_version:50633" => 3192, - "old:virtual_from_version:40847" => 1037, - "old:virtual_from_version:49842" => 3003, - "old:virtual_from_version:49464" => 1070, - "old:virtual_from_version:45340" => 1136, - "old:virtual_from_version:42174" => 1037, - "old:virtual_from_version:44600" => 1498, - "old:virtual_from_version:42308" => 1070, - "old:virtual_from_version:40818" => 1067, - "old:virtual_from_version:42696" => 1077, - "old:virtual_from_version:49823" => 1621, - "old:virtual_from_version:50749" => 1417, - "old:virtual_from_version:49852" => 3200, - "old:virtual_from_version:42257" => 1025, - "old:virtual_from_version:50163" => 1070, - "old:virtual_from_version:46590" => 1070, - "old:virtual_from_version:47423" => 1077, - "old:virtual_from_version:45309" => 1009, - "old:virtual_from_version:46239" => 1659, - "old:virtual_from_version:47272" => 1070, - "old:virtual_from_version:45725" => 1077, - "old:virtual_from_version:45399" => 1125, - "old:virtual_from_version:46251" => 1077, - "old:virtual_from_version:45642" => 1107, - "old:virtual_from_version:47742" => 1070, - "old:virtual_from_version:47057" => 1444, - "old:virtual_from_version:50258" => 1532, - "old:virtual_from_version:25148" => 1049, - "old:virtual_from_version:43100" => 2092, - "old:virtual_from_version:50767" => 1057, - "old:virtual_from_version:40565" => 1222, - "old:virtual_from_version:47351" => 1404, - "old:virtual_from_version:49422" => 1689, - "old:virtual_from_version:49181" => 1585, - "old:virtual_from_version:46719" => 1007, - "old:virtual_from_version:44790" => 1070, - "old:virtual_from_version:44677" => 1067, - "old:virtual_from_version:49486" => 1025, - "old:virtual_from_version:49674" => 1067, - "old:virtual_from_version:50120" => 1172, - "old:virtual_from_version:46974" => 1689, - "old:virtual_from_version:46797" => 1025, - "old:virtual_from_version:49020" => 1070, - "old:virtual_from_version:42752" => 1023, - "old:virtual_from_version:50008" => 1070, - "old:virtual_from_version:42395" => 1070, - "old:virtual_from_version:44364" => 1091, - "old:virtual_from_version:49861" => 3131, - "old:virtual_from_version:46903" => 1689, - "old:virtual_from_version:49246" => 1077, - "old:virtual_from_version:50572" => 3214, - "old:virtual_from_version:47753" => 1517, - "old:virtual_from_version:47292" => 1109, - "old:virtual_from_version:45390" => 1362, - "old:virtual_from_version:50641" => 1417, - "old:virtual_from_version:40858" => 1077, - "old:virtual_from_version:45766" => 1401, - "old:virtual_from_version:46701" => 1070, - "old:virtual_from_version:50363" => 3131, - "old:virtual_from_version:44397" => 1063, - "old:virtual_from_version:42276" => 1070, - "old:virtual_from_version:44615" => 1025, - "old:virtual_from_version:45935" => 1404, - "old:virtual_from_version:47777" => 1125, - "old:virtual_from_version:38984" => 1067, - "old:virtual_from_version:45484" => 1532, - "old:virtual_from_version:46604" => 1006, - "old:virtual_from_version:44347" => 1077, - "old:virtual_from_version:46407" => 1077, - "old:virtual_from_version:40553" => 1007, - "old:virtual_from_version:40777" => 1404, - "old:virtual_from_version:42314" => 1077, - "old:virtual_from_version:44551" => 1037, - "old:virtual_from_version:49567" => 1402, - "old:virtual_from_version:39002" => 1104, - "old:virtual_from_version:44685" => 1037, - "old:virtual_from_version:49729" => 1489, - "old:virtual_from_version:42814" => 1009, - "old:virtual_from_version:49230" => 3157, - "old:virtual_from_version:40801" => 1077, - "old:virtual_from_version:42965" => 1009, - "old:virtual_from_version:40798" => 1107, - "old:virtual_from_version:38377" => 1007, - "old:virtual_from_version:40682" => 1404, - "old:virtual_from_version:48022" => 2122, - "old:virtual_from_version:49558" => 1009, - "old:virtual_from_version:50052" => 1070, - "old:virtual_from_version:42191" => 1077, - "old:virtual_from_version:42143" => 1222, - "old:virtual_from_version:49009" => 1125, - "old:virtual_from_version:46758" => 1109, - "old:virtual_from_version:42637" => 1484, - "old:virtual_from_version:44090" => 1037, - "old:virtual_from_version:47349" => 1172, - "old:virtual_from_version:45354" => 1009, - "old:virtual_from_version:46366" => 1077, - "old:virtual_from_version:50696" => 1417, - "old:virtual_from_version:50628" => 1417, - "old:virtual_from_version:39798" => 1237, - "old:virtual_from_version:47170" => 3032, - "old:virtual_from_version:42811" => 1081, - "old:virtual_from_version:40659" => 1035, - "old:virtual_from_version:45891" => 1070, - "old:virtual_from_version:45282" => 1115, - "old:virtual_from_version:47572" => 1444, - "old:virtual_from_version:46559" => 1574, - "old:virtual_from_version:45146" => 1567, - "old:virtual_from_version:50241" => 3131, - "old:virtual_from_version:42088" => 1077, - "old:virtual_from_version:49633" => 1404, - "old:virtual_from_version:44541" => 1025, - "old:virtual_from_version:42554" => 1009, - "old:virtual_from_version:49805" => 1621, - "old:virtual_from_version:46274" => 1025, - "old:virtual_from_version:42533" => 1037, - "old:virtual_from_version:42349" => 1091, - "old:virtual_from_version:47239" => 1070, - "old:virtual_from_version:49973" => 1689, - "old:virtual_from_version:47685" => 1109, - "old:virtual_from_version:47045" => 1070, - "old:virtual_from_version:47407" => 1109, - "old:virtual_from_version:47571" => 1077, - "old:virtual_from_version:47099" => 1077, - "old:virtual_from_version:47654" => 1109, - "old:virtual_from_version:46214" => 1077, - "old:virtual_from_version:42833" => 1062, - "old:virtual_from_version:38703" => 1081, - "old:virtual_from_version:47341" => 1109, - "old:virtual_from_version:49039" => 1125, - "old:virtual_from_version:46703" => 1077, - "old:virtual_from_version:49023" => 1070, - "old:virtual_from_version:50632" => 3259, - "old:virtual_from_version:42341" => 1070, - "old:virtual_from_version:45637" => 1136, - "old:virtual_from_version:45811" => 1532, - "old:virtual_from_version:49368" => 3139, - "old:virtual_from_version:47623" => 1109, - "old:virtual_from_version:45587" => 1077, - "old:virtual_from_version:42218" => 1070, - "old:virtual_from_version:47086" => 1070, - "old:virtual_from_version:44002" => 1009, - "old:virtual_from_version:45939" => 1397, - "old:virtual_from_version:50367" => 1125, - "old:virtual_from_version:29976" => 1009, - "old:virtual_from_version:39976" => 1257, - "old:virtual_from_version:44838" => 1488, - "old:virtual_from_version:38370" => 1067, - "old:virtual_from_version:49500" => 1070, - "old:virtual_from_version:40508" => 1037, - "old:virtual_from_version:49967" => 1583, - "old:virtual_from_version:40527" => 1070, - "old:virtual_from_version:45483" => 1077, - "old:virtual_from_version:49859" => 1125, - "old:virtual_from_version:38364" => 1001, - "old:virtual_from_version:49153" => 1689, - "old:virtual_from_version:46795" => 1125, - "old:virtual_from_version:44557" => 1009, - "old:virtual_from_version:49532" => 1689, - "old:virtual_from_version:49513" => 1125, - "old:virtual_from_version:46332" => 1172, - "old:virtual_from_version:50403" => 3131, - "old:virtual_from_version:46672" => 1125, - "old:virtual_from_version:39038" => 1142, - "old:virtual_from_version:44349" => 1067, - "old:virtual_from_version:45541" => 1404, - "old:virtual_from_version:40616" => 1172, - "old:virtual_from_version:49366" => 1585, - "old:virtual_from_version:40999" => 1110, - "old:virtual_from_version:46540" => 1070, - "old:virtual_from_version:40504" => 1070, - "old:virtual_from_version:47178" => 1101, - "old:virtual_from_version:50609" => 1067, - "old:virtual_from_version:44723" => 1537, - "old:virtual_from_version:49245" => 1015, - "old:virtual_from_version:46963" => 1077, - "old:virtual_from_version:42583" => 1070, - "old:virtual_from_version:50588" => 3194, - "old:virtual_from_version:45225" => 1444, - "old:virtual_from_version:40982" => 1037, - "old:virtual_from_version:45987" => 1639, - "old:virtual_from_version:50230" => 1070, - "old:virtual_from_version:45826" => 1070, - "old:virtual_from_version:39291" => 1076, - "old:virtual_from_version:45426" => 1037, - "old:virtual_from_version:47083" => 1125, - "old:virtual_from_version:47069" => 1125, - "old:virtual_from_version:42841" => 1025, - "old:virtual_from_version:40987" => 1070, - "old:virtual_from_version:44020" => 1077, - "old:virtual_from_version:43092" => 2084, - "old:virtual_from_version:45830" => 1112, - "old:virtual_from_version:42111" => 1070, - "old:virtual_from_version:45849" => 1070, - "old:virtual_from_version:44968" => 1136, - "old:virtual_from_version:40809" => 1009, - "old:virtual_from_version:46665" => 1070, - "old:virtual_from_version:42505" => 1023, - "old:virtual_from_version:47009" => 1070, - "old:virtual_from_version:42316" => 1136, - "old:virtual_from_version:47055" => 1172, - "old:virtual_from_version:44000" => 1125, - "old:virtual_from_version:47354" => 1077, - "old:virtual_from_version:42414" => 1105, - "old:virtual_from_version:44686" => 1311, - "old:virtual_from_version:47612" => 1125, - "old:virtual_from_version:47289" => 1070, - "old:virtual_from_version:45286" => 1404, - "old:virtual_from_version:50187" => 1580, - "old:virtual_from_version:50066" => 1172, - "old:virtual_from_version:49123" => 1012, - "old:virtual_from_version:40841" => 1025, - "old:virtual_from_version:39350" => 1062, - "old:virtual_from_version:44835" => 1381, - "old:virtual_from_version:46862" => 1172, - "old:virtual_from_version:44330" => 1107, - "old:virtual_from_version:45917" => 1001, - "old:virtual_from_version:46491" => 1568, - "old:virtual_from_version:44772" => 1077, - "old:virtual_from_version:45943" => 1070, - "old:virtual_from_version:47803" => 1048, - "old:virtual_from_version:45469" => 1025, - "old:virtual_from_version:40387" => 1081, - "old:virtual_from_version:50599" => 1125, - "old:virtual_from_version:40462" => 1311, - "old:virtual_from_version:50520" => 1311, - "old:virtual_from_version:42185" => 1037, - "old:virtual_from_version:38608" => 1110, - "old:virtual_from_version:50060" => 1125, - "old:virtual_from_version:42990" => 1077, - "old:virtual_from_version:44363" => 1078, - "old:virtual_from_version:47913" => 1070, - "old:virtual_from_version:45290" => 1578, - "old:virtual_from_version:46027" => 1070, - "old:virtual_from_version:49295" => 1077, - "old:virtual_from_version:42418" => 1077, - "old:virtual_from_version:46815" => 1077, - "old:virtual_from_version:42538" => 1025, - "old:virtual_from_version:50433" => 1401, - "old:virtual_from_version:47568" => 1125, - "old:virtual_from_version:40275" => 1019, - "old:virtual_from_version:44227" => 1077, - "old:virtual_from_version:49509" => 1037, - "old:virtual_from_version:39155" => 1067, - "old:virtual_from_version:49886" => 1488, - "old:virtual_from_version:49267" => 1077, - "old:virtual_from_version:44474" => 1077, - "old:virtual_from_version:44576" => 1077, - "old:virtual_from_version:49375" => 1656, - "old:virtual_from_version:47522" => 1537, - "old:virtual_from_version:45546" => 1136, - "old:virtual_from_version:46040" => 1488, - "old:virtual_from_version:49081" => 1555, - "old:virtual_from_version:39366" => 1017, - "old:virtual_from_version:39536" => 1112, - "old:virtual_from_version:44281" => 1037, - "old:virtual_from_version:40992" => 1107, - "old:virtual_from_version:42266" => 1037, - "old:virtual_from_version:46813" => 1666, - "old:virtual_from_version:39595" => 1084, - "old:virtual_from_version:50054" => 1025, - "old:virtual_from_version:42307" => 1110, - "old:virtual_from_version:49104" => 3136, - "old:virtual_from_version:45982" => 1638, - "old:virtual_from_version:45064" => 1125, - "old:virtual_from_version:50339" => 3236, - "old:virtual_from_version:49168" => 1070, - "old:virtual_from_version:42365" => 1037, - "old:virtual_from_version:45690" => 1621, - "old:virtual_from_version:42110" => 1037, - "old:virtual_from_version:49769" => 1078, - "old:virtual_from_version:44597" => 1110, - "old:virtual_from_version:46851" => 1077, - "old:virtual_from_version:44553" => 1070, - "old:virtual_from_version:44248" => 1009, - "old:virtual_from_version:49820" => 1100, - "old:virtual_from_version:44997" => 1172, - "old:virtual_from_version:44178" => 1438, - "old:virtual_from_version:45657" => 1076, - "old:virtual_from_version:46546" => 1125, - "old:virtual_from_version:44700" => 1070, - "old:virtual_from_version:49004" => 1532, - "old:virtual_from_version:42661" => 1067, - "old:virtual_from_version:46142" => 1077, - "old:virtual_from_version:38786" => 1104, - "old:virtual_from_version:42672" => 1489, - "old:virtual_from_version:49803" => 1070, - "old:virtual_from_version:44619" => 1110, - "old:virtual_from_version:43085" => 2082, - "old:virtual_from_version:42801" => 1057, - "old:virtual_from_version:40561" => 1067, - "old:virtual_from_version:47551" => 1109, - "old:virtual_from_version:49203" => 1107, - "old:virtual_from_version:44486" => 1070, - "old:virtual_from_version:49573" => 1659, - "old:virtual_from_version:47585" => 1070, - "old:virtual_from_version:38355" => 1108, - "old:virtual_from_version:46436" => 1067, - "old:virtual_from_version:49133" => 3137, - "old:virtual_from_version:46560" => 1689, - "old:virtual_from_version:44520" => 1048, - "old:virtual_from_version:46960" => 1077, - "old:virtual_from_version:42544" => 1110, - "old:virtual_from_version:49269" => 1025, - "old:virtual_from_version:46467" => 1321, - "old:virtual_from_version:49849" => 1537, - "old:virtual_from_version:46394" => 1582, - "old:virtual_from_version:50100" => 3221, - "old:virtual_from_version:43075" => 2073, - "old:virtual_from_version:46180" => 1404, - "old:virtual_from_version:42415" => 1107, - "old:virtual_from_version:50342" => 1224, - "old:virtual_from_version:50714" => 1417, - "old:virtual_from_version:45918" => 1077, - "old:virtual_from_version:49322" => 1649, - "old:virtual_from_version:50023" => 3131, - "old:virtual_from_version:44754" => 1025, - "old:virtual_from_version:43027" => 2052, - "old:virtual_from_version:50224" => 3016, - "old:virtual_from_version:40852" => 1077, - "old:virtual_from_version:42007" => 1110, - "old:virtual_from_version:46015" => 1009, - "old:virtual_from_version:13578" => 1032, - "old:virtual_from_version:49750" => 1112, - "old:virtual_from_version:42492" => 1125, - "old:virtual_from_version:46323" => 1070, - "old:virtual_from_version:44025" => 1037, - "old:virtual_from_version:49550" => 1574, - "old:virtual_from_version:49600" => 1095, - "old:virtual_from_version:47458" => 1125, - "old:virtual_from_version:46561" => 1070, - "old:virtual_from_version:44871" => 1498, - "old:virtual_from_version:49760" => 3002, - "old:virtual_from_version:44595" => 1077, - "old:virtual_from_version:46588" => 1077, - "old:virtual_from_version:45375" => 1009, - "old:virtual_from_version:46188" => 1649, - "old:virtual_from_version:49783" => 1659, - "old:virtual_from_version:50009" => 1314, - "old:virtual_from_version:47543" => 1077, - "old:virtual_from_version:45488" => 1107, - "old:virtual_from_version:42756" => 1109, - "old:virtual_from_version:39727" => 1224, - "old:virtual_from_version:49832" => 1689, - "old:virtual_from_version:40701" => 1077, - "old:virtual_from_version:45890" => 1506, - "old:virtual_from_version:45932" => 1077, - "old:virtual_from_version:46209" => 1077, - "old:virtual_from_version:44821" => 1077, - "old:virtual_from_version:49079" => 1070, - "old:virtual_from_version:44996" => 1017, - "old:virtual_from_version:50266" => 1105, - "old:virtual_from_version:46957" => 1007, - "old:virtual_from_version:44518" => 1037, - "old:virtual_from_version:40249" => 1009, - "old:virtual_from_version:45736" => 1109, - "old:virtual_from_version:46325" => 1404, - "old:virtual_from_version:50734" => 1404, - "old:virtual_from_version:50666" => 3259, - "old:virtual_from_version:50064" => 1125, - "old:virtual_from_version:44777" => 1353, - "old:virtual_from_version:45902" => 1038, - "old:virtual_from_version:47968" => 1125, - "old:virtual_from_version:40516" => 1070, - "old:virtual_from_version:50458" => 1489, - "old:virtual_from_version:13323" => 1010, - "old:virtual_from_version:50034" => 3131, - "old:virtual_from_version:45947" => 1627, - "old:virtual_from_version:50013" => 3215, - "old:virtual_from_version:46432" => 1136, - "old:virtual_from_version:46284" => 1077, - "old:virtual_from_version:44920" => 1009, - "old:virtual_from_version:42748" => 1110, - "old:virtual_from_version:50159" => 3131, - "old:virtual_from_version:41011" => 2022, - "old:virtual_from_version:44336" => 1037, - "old:virtual_from_version:42104" => 1070, - "old:virtual_from_version:42371" => 1037, - "old:virtual_from_version:47395" => 1125, - "old:virtual_from_version:49661" => 1070, - "old:virtual_from_version:49463" => 1423, - "old:virtual_from_version:45825" => 1626, - "old:virtual_from_version:46881" => 1689, - "old:virtual_from_version:39019" => 1016, - "old:virtual_from_version:40863" => 1037, - "old:virtual_from_version:42861" => 1136, - "old:virtual_from_version:47189" => 1109, - "old:virtual_from_version:50249" => 3131, - "old:virtual_from_version:49874" => 1100, - "old:virtual_from_version:50715" => 3259, - "old:virtual_from_version:47240" => 1136, - "old:virtual_from_version:40906" => 1037, - "old:virtual_from_version:49700" => 1070, - "old:virtual_from_version:50309" => 1067, - "old:virtual_from_version:38546" => 1025, - "old:virtual_from_version:45264" => 1095, - "old:virtual_from_version:44688" => 1009, - "old:virtual_from_version:45988" => 1362, - "old:virtual_from_version:42420" => 1404, - "old:virtual_from_version:44383" => 1031, - "old:virtual_from_version:47929" => 1362, - "old:virtual_from_version:49334" => 1037, - "old:virtual_from_version:50625" => 1128, - "old:virtual_from_version:40592" => 1077, - "old:virtual_from_version:50114" => 1689, - "old:virtual_from_version:44161" => 1077, - "old:virtual_from_version:50225" => 3131, - "old:virtual_from_version:49743" => 1404, - "old:virtual_from_version:44629" => 1082, - "old:virtual_from_version:50569" => 1404, - "old:virtual_from_version:42151" => 1009, - "old:virtual_from_version:45024" => 1006, - "old:virtual_from_version:42043" => 1070, - "old:virtual_from_version:42768" => 1006, - "old:virtual_from_version:39612" => 1035, - "old:virtual_from_version:48005" => 2106, - "old:virtual_from_version:49819" => 1070, - "old:virtual_from_version:46272" => 1136, - "old:virtual_from_version:42575" => 1172, - "old:virtual_from_version:44037" => 1070, - "old:virtual_from_version:49493" => 1105, - "old:virtual_from_version:47986" => 1109, - "old:virtual_from_version:49880" => 1070, - "old:virtual_from_version:41010" => 2021, - "old:virtual_from_version:50360" => 3131, - "old:virtual_from_version:45616" => 1077, - "old:virtual_from_version:42227" => 1037, - "old:virtual_from_version:47875" => 1037, - "old:virtual_from_version:46771" => 1077, - "old:virtual_from_version:44011" => 1016, - "old:virtual_from_version:50332" => 1076, - "old:virtual_from_version:44992" => 1067, - "old:virtual_from_version:48006" => 2105, - "old:virtual_from_version:45609" => 1404, - "old:virtual_from_version:49646" => 1070, - "old:virtual_from_version:42272" => 1077, - "old:virtual_from_version:43037" => 2036, - "old:virtual_from_version:40741" => 1070, - "old:virtual_from_version:42485" => 1009, - "old:virtual_from_version:42735" => 1037, - "old:virtual_from_version:44974" => 1144, - "old:virtual_from_version:45521" => 1580, - "old:virtual_from_version:50386" => 3131, - "old:virtual_from_version:42038" => 1009, - "old:virtual_from_version:44981" => 1048, - "old:virtual_from_version:42551" => 1172, - "old:virtual_from_version:49239" => 1070, - "old:virtual_from_version:44954" => 1077, - "old:virtual_from_version:47871" => 1314, - "old:virtual_from_version:44844" => 1070, - "old:virtual_from_version:50381" => 1049, - "old:virtual_from_version:44847" => 1070, - "old:virtual_from_version:50317" => 3236, - "old:virtual_from_version:45874" => 1077, - "old:virtual_from_version:49409" => 1067, - "old:virtual_from_version:49197" => 1517, - "old:virtual_from_version:47467" => 1070, - "old:virtual_from_version:42851" => 1037, - "old:virtual_from_version:40541" => 1070, - "old:virtual_from_version:49582" => 3119, - "old:virtual_from_version:46647" => 1070, - "old:virtual_from_version:50623" => 1033, - "old:virtual_from_version:47273" => 1109, - "old:virtual_from_version:46024" => 1070, - "old:virtual_from_version:40735" => 1025, - "old:virtual_from_version:46157" => 1070, - "old:virtual_from_version:49748" => 1070, - "old:virtual_from_version:45664" => 1019, - "old:virtual_from_version:42586" => 1077, - "old:virtual_from_version:49519" => 1125, - "old:virtual_from_version:50172" => 1070, - "old:virtual_from_version:44454" => 1529, - "old:virtual_from_version:44626" => 1070, - "old:virtual_from_version:45571" => 1105, - "old:virtual_from_version:44493" => 1107, - "old:virtual_from_version:50204" => 3131, - "old:virtual_from_version:49495" => 1689, - "old:virtual_from_version:50216" => 3131, - "old:virtual_from_version:50684" => 1689, - "old:virtual_from_version:47260" => 1125, - "old:virtual_from_version:40764" => 1046, - "old:virtual_from_version:40874" => 1077, - "old:virtual_from_version:42480" => 1077, - "old:virtual_from_version:50152" => 3131, - "old:virtual_from_version:45021" => 1063, - "old:virtual_from_version:42717" => 1077, - "old:virtual_from_version:47062" => 1077, - "old:virtual_from_version:49398" => 1070, - "old:virtual_from_version:42303" => 1125, - "old:virtual_from_version:13209" => 1061, - "old:virtual_from_version:50527" => 1070, - "old:virtual_from_version:46602" => 1125, - "old:virtual_from_version:46744" => 1555, - "old:virtual_from_version:40943" => 1037, - "old:virtual_from_version:40939" => 1077, - "old:virtual_from_version:44990" => 1090, - "old:virtual_from_version:47932" => 1067, - "old:virtual_from_version:42373" => 1105, - "old:virtual_from_version:46522" => 1070, - "old:virtual_from_version:38929" => 1061, - "old:virtual_from_version:47325" => 1077, - "old:virtual_from_version:39909" => 1115, - "old:virtual_from_version:50470" => 3247, - "old:virtual_from_version:47471" => 1444, - "old:virtual_from_version:49041" => 1067, - "old:virtual_from_version:47639" => 1070, - "old:virtual_from_version:49387" => 3129, - "old:virtual_from_version:47574" => 1689, - "old:virtual_from_version:49833" => 3002, - "old:virtual_from_version:45832" => 1077, - "old:virtual_from_version:44503" => 1077, - "old:virtual_from_version:50428" => 1580, - "old:virtual_from_version:49093" => 3094, - "old:virtual_from_version:44402" => 1008, - "old:virtual_from_version:38351" => 1029, - "old:virtual_from_version:41018" => 2027, - "old:virtual_from_version:46841" => 1077, - "old:virtual_from_version:46690" => 1070, - "old:virtual_from_version:38753" => 1000, - "old:virtual_from_version:46637" => 1077, - "old:virtual_from_version:47339" => 1125, - "old:virtual_from_version:48008" => 2108, - "old:virtual_from_version:49868" => 3204, - "old:virtual_from_version:46429" => 1077, - "old:virtual_from_version:40704" => 1009, - "old:virtual_from_version:40762" => 1048, - "old:virtual_from_version:46282" => 1404, - "old:virtual_from_version:42398" => 1037, - "old:virtual_from_version:42446" => 1107, - "old:virtual_from_version:47576" => 1070, - "old:virtual_from_version:44655" => 1009, - "old:virtual_from_version:44384" => 1036, - "old:virtual_from_version:49109" => 3146, - "old:virtual_from_version:47910" => 3008, - "old:virtual_from_version:46034" => 1649, - "old:virtual_from_version:40586" => 1077, - "old:virtual_from_version:40243" => 1136, - "old:virtual_from_version:44036" => 1488, - "old:virtual_from_version:50474" => 3251, - "old:virtual_from_version:46010" => 1048, - "old:virtual_from_version:40860" => 1048, - "old:virtual_from_version:45900" => 1077, - "old:virtual_from_version:47391" => 3008, - "old:virtual_from_version:45219" => 1574, - "old:virtual_from_version:37575" => 1015, - "old:virtual_from_version:49187" => 1070, - "old:virtual_from_version:39951" => 1109, - "old:virtual_from_version:47923" => 1565, - "old:virtual_from_version:47563" => 1404, - "old:virtual_from_version:44366" => 1007, - "old:virtual_from_version:42615" => 1077, - "old:virtual_from_version:50190" => 1146, - "old:virtual_from_version:45145" => 1037, - "old:virtual_from_version:45948" => 1627, - "old:virtual_from_version:44827" => 1552, - "old:virtual_from_version:46046" => 1077, - "old:virtual_from_version:42548" => 1009, - "old:virtual_from_version:49796" => 1689, - "old:virtual_from_version:47187" => 1070, - "old:virtual_from_version:45769" => 1009, - "old:virtual_from_version:44740" => 1172, - "old:virtual_from_version:46288" => 1070, - "old:virtual_from_version:46668" => 1070, - "old:virtual_from_version:49371" => 1077, - "old:virtual_from_version:47873" => 1070, - "old:virtual_from_version:46531" => 1105, - "old:virtual_from_version:47431" => 1404, - "old:virtual_from_version:46375" => 1585, - "old:virtual_from_version:44828" => 1070, - "old:virtual_from_version:44033" => 1070, - "old:virtual_from_version:47897" => 1037, - "old:virtual_from_version:44654" => 1070, - "old:virtual_from_version:42820" => 1104, - "old:virtual_from_version:40868" => 1037, - "old:virtual_from_version:40627" => 1025, - "old:virtual_from_version:45398" => 1008, - "old:virtual_from_version:47016" => 1067, - "old:virtual_from_version:42089" => 1037, - "old:virtual_from_version:49183" => 1070, - "old:virtual_from_version:46119" => 1092, - "old:virtual_from_version:42630" => 1070, - "old:virtual_from_version:40146" => 1078, - "old:virtual_from_version:44534" => 1025, - "old:virtual_from_version:46752" => 1077, - "old:virtual_from_version:47136" => 1659, - "old:virtual_from_version:50156" => 1517, - "old:virtual_from_version:44927" => 1125, - "old:virtual_from_version:40970" => 1077, - "old:virtual_from_version:47275" => 1077, - "old:virtual_from_version:47995" => 1125, - "old:virtual_from_version:46927" => 1077, - "old:virtual_from_version:42570" => 1172, - "old:virtual_from_version:46686" => 1125, - "old:virtual_from_version:40773" => 1404, - "old:virtual_from_version:46621" => 1070, - "old:virtual_from_version:45117" => 1077, - "old:virtual_from_version:49185" => 1077, - "old:virtual_from_version:45475" => 1110, - "old:virtual_from_version:45683" => 1019, - "old:virtual_from_version:49277" => 1007, - "old:virtual_from_version:42268" => 1070, - "old:virtual_from_version:47334" => 3006, - "old:virtual_from_version:50151" => 1580, - "old:virtual_from_version:50682" => 1585, - "old:virtual_from_version:49294" => 1037, - "old:virtual_from_version:40985" => 1407, - "old:virtual_from_version:42092" => 1037, - "old:virtual_from_version:47713" => 1621, - "old:virtual_from_version:42987" => 1077, - "old:virtual_from_version:44570" => 1037, - "old:virtual_from_version:46118" => 1077, - "old:virtual_from_version:46722" => 1172, - "old:virtual_from_version:45740" => 1077, - "old:virtual_from_version:46049" => 1125, - "old:virtual_from_version:50264" => 3131, - "old:virtual_from_version:45738" => 1067, - "old:virtual_from_version:49939" => 1107, - "old:virtual_from_version:42979" => 1070, - "old:virtual_from_version:44966" => 1049, - "old:virtual_from_version:45473" => 1136, - "old:virtual_from_version:46769" => 1498, - "old:virtual_from_version:47954" => 1109, - "old:virtual_from_version:42589" => 1110, - "old:virtual_from_version:46999" => 3015, - "old:virtual_from_version:40400" => 1350, - "old:virtual_from_version:44608" => 1110, - "old:virtual_from_version:44446" => 1077, - "old:virtual_from_version:44528" => 1077, - "old:virtual_from_version:42093" => 1335, - "old:virtual_from_version:46749" => 1077, - "old:virtual_from_version:44415" => 1022, - "old:virtual_from_version:50559" => 1070, - "old:virtual_from_version:49286" => 1077, - "old:virtual_from_version:42447" => 1070, - "old:virtual_from_version:44131" => 1077, - "old:virtual_from_version:40960" => 1107, - "old:virtual_from_version:49647" => 1314, - "old:virtual_from_version:49620" => 1158, - "old:virtual_from_version:50583" => 3259, - "old:virtual_from_version:42961" => 1037, - "old:virtual_from_version:42424" => 1009, - "old:virtual_from_version:47653" => 1125, - "old:virtual_from_version:49401" => 3169, - "old:virtual_from_version:42229" => 1083, - "old:virtual_from_version:44118" => 1077, - "old:virtual_from_version:42452" => 1439, - "old:virtual_from_version:44509" => 1311, - "old:virtual_from_version:49336" => 1404, - "old:virtual_from_version:39966" => 1053, - "old:virtual_from_version:43040" => 2038, - "old:virtual_from_version:46442" => 1343, - "old:virtual_from_version:42932" => 1146, - "old:virtual_from_version:44416" => 1023, - "old:virtual_from_version:49767" => 3002, - "old:virtual_from_version:42173" => 1077, - "old:virtual_from_version:44277" => 1070, - "old:virtual_from_version:46037" => 1107, - "old:virtual_from_version:44727" => 1025, - "old:virtual_from_version:44201" => 1081, - "old:virtual_from_version:40983" => 1328, - "old:virtual_from_version:46969" => 1070, - "old:virtual_from_version:40789" => 1025, - "old:virtual_from_version:49505" => 1404, - "old:virtual_from_version:42560" => 1025, - "old:virtual_from_version:44350" => 1070, - "old:virtual_from_version:49001" => 3127, - "old:virtual_from_version:46786" => 1077, - "old:virtual_from_version:45614" => 1070, - "old:virtual_from_version:49720" => 1689, - "old:virtual_from_version:40840" => 1009, - "old:virtual_from_version:47650" => 1109, - "old:virtual_from_version:47999" => 1125, - "old:virtual_from_version:49456" => 1070, - "old:virtual_from_version:40646" => 1394, - "old:virtual_from_version:46990" => 1172, - "old:virtual_from_version:49838" => 1009, - "old:virtual_from_version:50440" => 3244, - "old:virtual_from_version:47371" => 3046, - "old:virtual_from_version:39662" => 1081, - "old:virtual_from_version:42139" => 1077, - "old:virtual_from_version:50388" => 1125, - "old:virtual_from_version:47945" => 1070, - "old:virtual_from_version:47590" => 1125, - "old:virtual_from_version:45276" => 1222, - "old:virtual_from_version:44045" => 1070, - "old:virtual_from_version:47966" => 1649, - "old:virtual_from_version:44399" => 1091, - "old:virtual_from_version:40829" => 1125, - "old:virtual_from_version:47194" => 1077, - "old:virtual_from_version:47569" => 1109, - "old:virtual_from_version:44409" => 1064, - "old:virtual_from_version:44911" => 1125, - "old:virtual_from_version:46311" => 1077, - "old:virtual_from_version:49892" => 1689, - "old:virtual_from_version:46641" => 1077, - "old:virtual_from_version:44639" => 1077, - "old:virtual_from_version:49089" => 3139, - "old:virtual_from_version:47893" => 1123, - "old:virtual_from_version:46806" => 1077, - "old:virtual_from_version:45066" => 1070, - "old:virtual_from_version:46625" => 1009, - "old:virtual_from_version:42061" => 1070, - "old:virtual_from_version:47779" => 1048, - "old:virtual_from_version:42996" => 1077, - "old:virtual_from_version:47048" => 1517, - "old:virtual_from_version:47251" => 1037, - "old:virtual_from_version:44425" => 1094, - "old:virtual_from_version:49424" => 1172, - "old:virtual_from_version:46296" => 1172, - "old:virtual_from_version:44192" => 1110, - "old:virtual_from_version:46612" => 1077, - "old:virtual_from_version:49827" => 1070, - "old:virtual_from_version:42941" => 1037, - "old:virtual_from_version:40986" => 1107, - "old:virtual_from_version:46050" => 1009, - "old:virtual_from_version:46319" => 1222, - "old:virtual_from_version:46354" => 1057, - "old:virtual_from_version:40805" => 1077, - "old:virtual_from_version:50211" => 1532, - "old:virtual_from_version:46807" => 1666, - "old:virtual_from_version:47342" => 1077, - "old:virtual_from_version:40451" => 1091, - "old:virtual_from_version:44845" => 1009, - "old:virtual_from_version:44478" => 1077, - "old:virtual_from_version:46871" => 1444, - "old:virtual_from_version:42624" => 1077, - "old:virtual_from_version:40534" => 1077, - "old:virtual_from_version:42213" => 1009, - "old:virtual_from_version:42508" => 1037, - "old:virtual_from_version:46104" => 1070, - "old:virtual_from_version:47230" => 1689, - "old:virtual_from_version:42960" => 1077, - "old:virtual_from_version:50283" => 3222, - "old:virtual_from_version:42907" => 1070, - "old:virtual_from_version:45099" => 1070, - "old:virtual_from_version:45632" => 1070, - "old:virtual_from_version:39624" => 1082, - "old:virtual_from_version:45517" => 1136, - "old:virtual_from_version:46258" => 1537, - "old:virtual_from_version:45041" => 1023, - "old:virtual_from_version:47404" => 1411, - "old:virtual_from_version:40390" => 1341, - "old:virtual_from_version:46504" => 1585, - "old:virtual_from_version:49221" => 1314, - "old:virtual_from_version:50476" => 1659, - "old:virtual_from_version:45474" => 1070, - "old:virtual_from_version:46979" => 1067, - "old:virtual_from_version:47437" => 1077, - "old:virtual_from_version:50326" => 1070, - "old:virtual_from_version:45510" => 1070, - "old:virtual_from_version:47615" => 1077, - "old:virtual_from_version:49990" => 1404, - "old:virtual_from_version:50562" => 1070, - "old:virtual_from_version:46679" => 1077, - "old:virtual_from_version:46161" => 1070, - "old:virtual_from_version:42459" => 1107, - "old:virtual_from_version:50374" => 3131, - "old:virtual_from_version:46694" => 1404, - "old:virtual_from_version:42687" => 1009, - "old:virtual_from_version:46447" => 1172, - "old:virtual_from_version:10004" => 2003, - "old:virtual_from_version:46138" => 1414, - "old:virtual_from_version:40887" => 1009, - "old:virtual_from_version:40079" => 1081, - "old:virtual_from_version:49074" => 3002, - "old:virtual_from_version:46448" => 1031, - "old:virtual_from_version:8056 " => 1060, - "old:virtual_from_version:49828" => 1125, - "old:virtual_from_version:47317" => 3009, - "old:virtual_from_version:46439" => 1077, - "old:virtual_from_version:47656" => 1404, - "old:virtual_from_version:40936" => 1037, - "old:virtual_from_version:44516" => 1025, - "old:virtual_from_version:44980" => 1081, - "old:virtual_from_version:42947" => 1110, - "old:virtual_from_version:49826" => 3201, - "old:virtual_from_version:42517" => 1070, - "old:virtual_from_version:44167" => 1522, - "old:virtual_from_version:50328" => 1224, - "old:virtual_from_version:50288" => 3131, - "old:virtual_from_version:46036" => 1070, - "old:virtual_from_version:44103" => 1516, - "old:virtual_from_version:42566" => 1009, - "old:virtual_from_version:42253" => 1037, - "old:virtual_from_version:49775" => 3131, - "old:virtual_from_version:46574" => 1689, - "old:virtual_from_version:49937" => 1136, - "old:virtual_from_version:49058" => 1404, - "old:virtual_from_version:49364" => 1583, - "old:virtual_from_version:50046" => 1070, - "old:virtual_from_version:44895" => 1107, - "old:virtual_from_version:47256" => 1077, - "old:virtual_from_version:47809" => 3108, - "old:virtual_from_version:50443" => 1035, - "old:virtual_from_version:42618" => 1070, - "old:virtual_from_version:45803" => 1009, - "old:virtual_from_version:49758" => 1666, - "old:virtual_from_version:44317" => 1067, - "old:virtual_from_version:45265" => 1042, - "old:virtual_from_version:42120" => 1077, - "old:virtual_from_version:49561" => 1070, - "old:virtual_from_version:40643" => 1005, - "old:virtual_from_version:47519" => 1109, - "old:virtual_from_version:44596" => 1037, - "old:virtual_from_version:42360" => 1037, - "old:virtual_from_version:49754" => 3195, - "old:virtual_from_version:45119" => 1009, - "old:virtual_from_version:50243" => 1070, - "old:virtual_from_version:47485" => 1070, - "old:virtual_from_version:50164" => 1172, - "old:virtual_from_version:22824" => 1035, - "old:virtual_from_version:40061" => 1067, - "old:virtual_from_version:47409" => 1621, - "old:virtual_from_version:45148" => 1568, - "old:virtual_from_version:42617" => 1172, - "old:virtual_from_version:49792" => 3131, - "old:virtual_from_version:47969" => 1037, - "old:virtual_from_version:46213" => 1009, - "old:virtual_from_version:40679" => 1109, - "old:virtual_from_version:47833" => 1172, - "old:virtual_from_version:42849" => 1009, - "old:virtual_from_version:39183" => 1036, - "old:virtual_from_version:46127" => 1070, - "old:virtual_from_version:49255" => 1410, - "old:virtual_from_version:44795" => 1025, - "old:virtual_from_version:42106" => 1037, - "old:virtual_from_version:46022" => 1574, - "old:virtual_from_version:45094" => 1070, - "old:virtual_from_version:42877" => 1063, - "old:virtual_from_version:44918" => 1009, - "old:virtual_from_version:46201" => 1633, - "old:virtual_from_version:49191" => 1689, - "old:virtual_from_version:49534" => 1585, - "old:virtual_from_version:49126" => 1580, - "old:virtual_from_version:45273" => 1112, - "old:virtual_from_version:46868" => 1067, - "old:virtual_from_version:47633" => 1584, - "old:virtual_from_version:46392" => 1077, - "old:virtual_from_version:45768" => 1070, - "old:virtual_from_version:49531" => 1532, - "old:virtual_from_version:46231" => 1615, - "old:virtual_from_version:45457" => 1125, - "old:virtual_from_version:49005" => 1583, - "old:virtual_from_version:42989" => 1070, - "old:virtual_from_version:46740" => 1404, - "old:virtual_from_version:45623" => 1077, - "old:virtual_from_version:50168" => 3131, - "old:virtual_from_version:45907" => 1107, - "old:virtual_from_version:40582" => 1105, - "old:virtual_from_version:46713" => 1048, - "old:virtual_from_version:46550" => 1048, - "old:virtual_from_version:49872" => 3194, - "old:virtual_from_version:40932" => 1077, - "old:virtual_from_version:47466" => 1621, - "old:virtual_from_version:45581" => 1070, - "old:virtual_from_version:46028" => 1077, - "old:virtual_from_version:50664" => 1419, - "old:virtual_from_version:42510" => 1109, - "old:virtual_from_version:39317" => 1123, - "old:virtual_from_version:42300" => 1107, - "old:virtual_from_version:44864" => 1077, - "old:virtual_from_version:47984" => 1070, - "old:virtual_from_version:45509" => 1136, - "old:virtual_from_version:49209" => 1565, - "old:virtual_from_version:49438" => 1150, - "old:virtual_from_version:49517" => 1070, - "old:virtual_from_version:47848" => 1109, - "old:virtual_from_version:47046" => 1125, - "old:virtual_from_version:45860" => 1070, - "old:virtual_from_version:50490" => 3252, - "old:virtual_from_version:45545" => 1172, - "old:virtual_from_version:49988" => 3131, - "old:virtual_from_version:46128" => 1077, - "old:virtual_from_version:46567" => 1077, - "old:virtual_from_version:50132" => 1404, - "old:virtual_from_version:44012" => 1077, - "old:virtual_from_version:47846" => 1070, - "old:virtual_from_version:44128" => 1037, - "old:virtual_from_version:49898" => 1006, - "old:virtual_from_version:44897" => 1077, - "old:virtual_from_version:44135" => 1070, - "old:virtual_from_version:44462" => 1037, - "old:virtual_from_version:42240" => 1037, - "old:virtual_from_version:45220" => 1575, - "old:virtual_from_version:50667" => 1070, - "old:virtual_from_version:44353" => 1172, - "old:virtual_from_version:49681" => 3190, - "old:virtual_from_version:46676" => 1077, - "old:virtual_from_version:45807" => 1381, - "old:virtual_from_version:42952" => 1077, - "old:virtual_from_version:44591" => 1110, - "old:virtual_from_version:50762" => 1070, - "old:virtual_from_version:50435" => 1057, - "old:virtual_from_version:45071" => 1077, - "old:virtual_from_version:42862" => 1321, - "old:virtual_from_version:50315" => 3186, - "old:virtual_from_version:50434" => 3239, - "old:virtual_from_version:45458" => 1107, - "old:virtual_from_version:50383" => 1125, - "old:virtual_from_version:44550" => 1077, - "old:virtual_from_version:50072" => 3215, - "old:virtual_from_version:49617" => 1158, - "old:virtual_from_version:50090" => 1070, - "old:virtual_from_version:50704" => 1012, - "old:virtual_from_version:45962" => 1077, - "old:virtual_from_version:40470" => 1091, - "old:virtual_from_version:47523" => 1580, - "old:virtual_from_version:50426" => 1070, - "old:virtual_from_version:47322" => 1109, - "old:virtual_from_version:43074" => 2072, - "old:virtual_from_version:50371" => 3131, - "old:virtual_from_version:46013" => 1172, - "old:virtual_from_version:46601" => 1005, - "old:virtual_from_version:46090" => 1655, - "old:virtual_from_version:50488" => 3221, - "old:virtual_from_version:47202" => 1035, - "old:virtual_from_version:45116" => 1009, - "old:virtual_from_version:44810" => 1077, - "old:virtual_from_version:42164" => 1070, - "old:virtual_from_version:42003" => 1009, - "old:virtual_from_version:40401" => 1351, - "old:virtual_from_version:49256" => 1649, - "old:virtual_from_version:46912" => 1621, - "old:virtual_from_version:49471" => 1314, - "old:virtual_from_version:42221" => 1037, - "old:virtual_from_version:40905" => 1077, - "old:virtual_from_version:49498" => 1035, - "old:virtual_from_version:38727" => 1083, - "old:virtual_from_version:50214" => 1172, - "old:virtual_from_version:47047" => 1077, - "old:virtual_from_version:47096" => 1311, - "old:virtual_from_version:42900" => 1110, - "old:virtual_from_version:45841" => 1172, - "old:virtual_from_version:49140" => 1689, - "old:virtual_from_version:49353" => 1077, - "old:virtual_from_version:50329" => 3131, - "old:virtual_from_version:47035" => 1580, - "old:virtual_from_version:44995" => 1091, - "old:virtual_from_version:49899" => 3131, - "old:virtual_from_version:47201" => 1587, - "old:virtual_from_version:46228" => 1077, - "old:virtual_from_version:50732" => 1048, - "old:virtual_from_version:44143" => 1125, - "old:virtual_from_version:47903" => 3119, - "old:virtual_from_version:45913" => 1009, - "old:virtual_from_version:50093" => 3131, - "old:virtual_from_version:44031" => 1037, - "old:virtual_from_version:46042" => 1650, - "old:virtual_from_version:44928" => 1107, - "old:virtual_from_version:49407" => 1070, - "old:virtual_from_version:49738" => 1489, - "old:virtual_from_version:49795" => 1489, - "old:virtual_from_version:47781" => 1077, - "old:virtual_from_version:50354" => 1314, - "old:virtual_from_version:42710" => 1077, - "old:virtual_from_version:44909" => 1009, - "old:virtual_from_version:46734" => 1517, - "old:virtual_from_version:46126" => 1077, - "old:virtual_from_version:49970" => 3209, - "old:virtual_from_version:44879" => 1070, - "old:virtual_from_version:42896" => 1070, - "old:virtual_from_version:50188" => 3131, - "old:virtual_from_version:39658" => 1007, - "old:virtual_from_version:45427" => 1048, - "old:virtual_from_version:50082" => 3131, - "old:virtual_from_version:40465" => 1009, - "old:virtual_from_version:45275" => 1017, - "old:virtual_from_version:42886" => 1009, - "old:virtual_from_version:45635" => 1076, - "old:virtual_from_version:43065" => 2066, - "old:virtual_from_version:44195" => 1070, - "old:virtual_from_version:40687" => 1051, - "old:virtual_from_version:40729" => 1077, - "old:virtual_from_version:42219" => 1009, - "old:virtual_from_version:38563" => 1116, - "old:virtual_from_version:49479" => 1583, - "old:virtual_from_version:50631" => 1689, - "old:virtual_from_version:47316" => 1689, - "old:virtual_from_version:50021" => 1070, - "old:virtual_from_version:42927" => 1077, - "old:virtual_from_version:39901" => 1070, - "old:virtual_from_version:49704" => 3191, - "old:virtual_from_version:42723" => 1077, - "old:virtual_from_version:49485" => 1070, - "old:virtual_from_version:45622" => 1009, - "old:virtual_from_version:46421" => 1077, - "old:virtual_from_version:44004" => 1037, - "old:virtual_from_version:46099" => 1649, - "old:virtual_from_version:43081" => 2078, - "old:virtual_from_version:47314" => 1077, - "old:virtual_from_version:44667" => 1172, - "old:virtual_from_version:46186" => 1077, - "old:virtual_from_version:49901" => 1616, - "old:virtual_from_version:49652" => 1070, - "old:virtual_from_version:49703" => 3129, - "old:virtual_from_version:42153" => 1037, - "old:virtual_from_version:47424" => 1689, - "old:virtual_from_version:47587" => 1109, - "old:virtual_from_version:49049" => 1666, - "old:virtual_from_version:47052" => 1125, - "old:virtual_from_version:44837" => 1009, - "old:virtual_from_version:47290" => 1125, - "old:virtual_from_version:45032" => 1015, - "old:virtual_from_version:45563" => 1012, - "old:virtual_from_version:44442" => 1077, - "old:virtual_from_version:42945" => 1077, - "old:virtual_from_version:50480" => 3174, - "old:virtual_from_version:44836" => 1033, - "old:virtual_from_version:49120" => 1067, - "old:virtual_from_version:46334" => 1659, - "old:virtual_from_version:46633" => 1077, - "old:virtual_from_version:47000" => 1070, - "old:virtual_from_version:49038" => 1070, - "old:virtual_from_version:40788" => 1070, - "old:virtual_from_version:42369" => 1009, - "old:virtual_from_version:43051" => 2018, - "old:virtual_from_version:44949" => 1404, - "old:virtual_from_version:49884" => 1689, - "old:virtual_from_version:46144" => 1105, - "old:virtual_from_version:50577" => 3031, - "old:virtual_from_version:40303" => 1109, - "old:virtual_from_version:42891" => 1009, - "old:virtual_from_version:38291" => 1082, - "old:virtual_from_version:49725" => 1006, - "old:virtual_from_version:50677" => 1070, - "old:virtual_from_version:46835" => 1077, - "old:virtual_from_version:50594" => 3227, - "old:virtual_from_version:49487" => 1070, - "old:virtual_from_version:44797" => 1109, - "old:virtual_from_version:47698" => 1672, - "old:virtual_from_version:49150" => 1107, - "old:virtual_from_version:47795" => 3078, - "old:virtual_from_version:45163" => 1009, - "old:virtual_from_version:47946" => 1109, - "old:virtual_from_version:39050" => 1007, - "old:virtual_from_version:44967" => 1070, - "old:virtual_from_version:49290" => 3136, - "old:virtual_from_version:42015" => 1107, - "old:virtual_from_version:46576" => 1007, - "old:virtual_from_version:40935" => 1077, - "old:virtual_from_version:46141" => 1012, - "old:virtual_from_version:49248" => 1532, - "old:virtual_from_version:49698" => 1659, - "old:virtual_from_version:45908" => 1009, - "old:virtual_from_version:47454" => 1402, - "old:virtual_from_version:44938" => 1110, - "old:virtual_from_version:40601" => 1070, - "old:virtual_from_version:43009" => 2034, - "old:virtual_from_version:44523" => 1172, - "old:virtual_from_version:45256" => 1037, - "old:virtual_from_version:49212" => 1172, - "old:virtual_from_version:39329" => 1069, - "old:virtual_from_version:49799" => 1125, - "old:virtual_from_version:46545" => 1070, - "old:virtual_from_version:45937" => 1015, - "old:virtual_from_version:47926" => 3008, - "old:virtual_from_version:50461" => 1689, - "old:virtual_from_version:44832" => 1029, - "old:virtual_from_version:46742" => 1070, - "old:virtual_from_version:46949" => 1659, - "old:virtual_from_version:45802" => 1105, - "old:virtual_from_version:39991" => 2006, - "old:virtual_from_version:42350" => 1009, - "old:virtual_from_version:46791" => 1689, - "old:virtual_from_version:46395" => 1423, - "old:virtual_from_version:49338" => 1689, - "old:virtual_from_version:50761" => 3009, - "old:virtual_from_version:44173" => 1077, - "old:virtual_from_version:50595" => 3259, - "old:virtual_from_version:50232" => 1689, - "old:virtual_from_version:44613" => 1009, - "old:virtual_from_version:49526" => 1580, - "old:virtual_from_version:44554" => 1077, - "old:virtual_from_version:47315" => 1517, - "old:virtual_from_version:45352" => 1125, - "old:virtual_from_version:38362" => 1110, - "old:virtual_from_version:45729" => 1112, - "old:virtual_from_version:46759" => 1077, - "old:virtual_from_version:45160" => 1107, - "old:virtual_from_version:45519" => 1025, - "old:virtual_from_version:49346" => 1077, - "old:virtual_from_version:42577" => 1077, - "old:virtual_from_version:42238" => 1009, - "old:virtual_from_version:49078" => 1666, - "old:virtual_from_version:49268" => 1070, - "old:virtual_from_version:40084" => 1107, - "old:virtual_from_version:50545" => 3120, - "old:virtual_from_version:44711" => 1070, - "old:virtual_from_version:44500" => 1107, - "old:virtual_from_version:42207" => 1172, - "old:virtual_from_version:46388" => 1107, - "old:virtual_from_version:42075" => 1070, - "old:virtual_from_version:42527" => 1077, - "old:virtual_from_version:47071" => 1077, - "old:virtual_from_version:39322" => 1025, - "old:virtual_from_version:46962" => 1125, - "old:virtual_from_version:46764" => 1070, - "old:virtual_from_version:47921" => 1404, - "old:virtual_from_version:44742" => 1077, - "old:virtual_from_version:38553" => 1007, - "old:virtual_from_version:50614" => 1070, - "old:virtual_from_version:40824" => 1070, - "old:virtual_from_version:47982" => 1689, - "old:virtual_from_version:42564" => 1110, - "old:virtual_from_version:46792" => 2072, - "old:virtual_from_version:40908" => 1125, - "old:virtual_from_version:44641" => 1136, - "old:virtual_from_version:47476" => 1109, - "old:virtual_from_version:44750" => 1076, - "old:virtual_from_version:49983" => 3131, - "old:virtual_from_version:42956" => 1125, - "old:virtual_from_version:41005" => 2017, - "old:virtual_from_version:42621" => 1037, - "old:virtual_from_version:45867" => 1077, - "old:virtual_from_version:42298" => 1430, - "old:virtual_from_version:50185" => 1062, - "old:virtual_from_version:45930" => 1077, - "old:virtual_from_version:40089" => 1136, - "old:virtual_from_version:42571" => 1000, - "old:virtual_from_version:44786" => 1110, - "old:virtual_from_version:50698" => 1580, - "old:virtual_from_version:42954" => 1067, - "old:virtual_from_version:46566" => 1125, - "old:virtual_from_version:42826" => 1136, - "old:virtual_from_version:44260" => 1107, - "old:virtual_from_version:45561" => 1009, - "old:virtual_from_version:40461" => 1328, - "old:virtual_from_version:46371" => 1077, - "old:virtual_from_version:44985" => 1095, - "old:virtual_from_version:40223" => 1099, - "old:virtual_from_version:40518" => 1077, - "old:virtual_from_version:44612" => 1070, - "old:virtual_from_version:47159" => 1633, - "old:virtual_from_version:49900" => 3194, - "old:virtual_from_version:42267" => 1057, - "old:virtual_from_version:50566" => 1070, - "old:virtual_from_version:49601" => 1070, - "old:virtual_from_version:40884" => 1105, - "old:virtual_from_version:46302" => 1553, - "old:virtual_from_version:46493" => 1413, - "old:virtual_from_version:45895" => 1070, - "old:virtual_from_version:46859" => 1077, - "old:virtual_from_version:47131" => 1070, - "old:virtual_from_version:46297" => 1077, - "old:virtual_from_version:42192" => 1037, - "old:virtual_from_version:50685" => 3002, - "old:virtual_from_version:45862" => 1077, - "old:virtual_from_version:45704" => 1070, - "old:virtual_from_version:45386" => 1051, - "old:virtual_from_version:47103" => 1172, - "old:virtual_from_version:44220" => 1051, - "old:virtual_from_version:42733" => 1070, - "old:virtual_from_version:46255" => 1063, - "old:virtual_from_version:40182" => 1031, - "old:virtual_from_version:47472" => 1689, - "old:virtual_from_version:49612" => 1125, - "old:virtual_from_version:44450" => 1104, - "old:virtual_from_version:49728" => 1404, - "old:virtual_from_version:44820" => 1025, - "old:virtual_from_version:42916" => 1025, - "old:virtual_from_version:40588" => 1070, - "old:virtual_from_version:47301" => 1077, - "old:virtual_from_version:50242" => 3230, - "old:virtual_from_version:40658" => 1136, - "old:virtual_from_version:40816" => 1025, - "old:virtual_from_version:45777" => 1397, - "old:virtual_from_version:49950" => 3194, - "old:virtual_from_version:49325" => 1037, - "old:virtual_from_version:42011" => 1009, - "old:virtual_from_version:46685" => 1070, - "old:virtual_from_version:50041" => 1070, - "old:virtual_from_version:32632" => 1030, - "old:virtual_from_version:50654" => 1489, - "old:virtual_from_version:46151" => 1070, - "old:virtual_from_version:46350" => 1001, - "old:virtual_from_version:45149" => 1125, - "old:virtual_from_version:39502" => 1015, - "old:virtual_from_version:42434" => 1070, - "old:virtual_from_version:50220" => 1037, - "old:virtual_from_version:42126" => 1077, - "old:virtual_from_version:49933" => 1000, - "old:virtual_from_version:50238" => 1070, - "old:virtual_from_version:44512" => 1125, - "old:virtual_from_version:37035" => 1104, - "old:virtual_from_version:44219" => 1067, - "old:virtual_from_version:46987" => 1070, - "old:virtual_from_version:38681" => 1110, - "old:virtual_from_version:49781" => 3131, - "old:virtual_from_version:42622" => 1084, - "old:virtual_from_version:44853" => 1107, - "old:virtual_from_version:44372" => 1016, - "old:virtual_from_version:45445" => 1070, - "old:virtual_from_version:47808" => 1404, - "old:virtual_from_version:40835" => 1062, - "old:virtual_from_version:47098" => 1172, - "old:virtual_from_version:44089" => 1077, - "old:virtual_from_version:47948" => 1689, - "old:virtual_from_version:47819" => 3078, - "old:virtual_from_version:46360" => 1555, - "old:virtual_from_version:49261" => 1070, - "old:virtual_from_version:44109" => 1025, - "old:virtual_from_version:42523" => 1107, - "old:virtual_from_version:40559" => 1077, - "old:virtual_from_version:46377" => 1076, - "old:virtual_from_version:38952" => 1077, - "old:virtual_from_version:46586" => 1025, - "old:virtual_from_version:44708" => 1537, - "old:virtual_from_version:40615" => 1095, - "old:virtual_from_version:46972" => 1077, - "old:virtual_from_version:47940" => 1109, - "old:virtual_from_version:49597" => 1107, - "old:virtual_from_version:46767" => 1077, - "old:virtual_from_version:44983" => 1109, - "old:virtual_from_version:44841" => 1110, - "old:virtual_from_version:47963" => 1077, - "old:virtual_from_version:48037" => 2079, - "old:virtual_from_version:46291" => 1172, - "old:virtual_from_version:46675" => 1125, - "old:virtual_from_version:45708" => 1532, - "old:virtual_from_version:40647" => 1362, - "old:virtual_from_version:45726" => 1402, - "old:virtual_from_version:40888" => 1125, - "old:virtual_from_version:47346" => 1070, - "old:virtual_from_version:50087" => 1025, - "old:virtual_from_version:40449" => 1404, - "old:virtual_from_version:40796" => 1081, - "old:virtual_from_version:42216" => 1037, - "old:virtual_from_version:45466" => 1136, - "old:virtual_from_version:47638" => 1032, - "old:virtual_from_version:46261" => 1077, - "old:virtual_from_version:49616" => 3183, - "old:virtual_from_version:46520" => 1077, - "old:virtual_from_version:46918" => 1095, - "old:virtual_from_version:50125" => 1125, - "old:virtual_from_version:42885" => 1070, - "old:virtual_from_version:40579" => 1404, - "old:virtual_from_version:50683" => 1666, - "old:virtual_from_version:42665" => 1037, - "old:virtual_from_version:50402" => 1314, - "old:virtual_from_version:47324" => 1012, - "old:virtual_from_version:47138" => 1070, - "old:virtual_from_version:44517" => 1077, - "old:virtual_from_version:49169" => 1077, - "old:virtual_from_version:44351" => 1077, - "old:virtual_from_version:40724" => 1404, - "old:virtual_from_version:42301" => 1070, - "old:virtual_from_version:47208" => 1077, - "old:virtual_from_version:44739" => 1077, - "old:virtual_from_version:50005" => 1689, - "old:virtual_from_version:40782" => 1077, - "old:virtual_from_version:40891" => 1037, - "old:virtual_from_version:47495" => 1109, - "old:virtual_from_version:42203" => 1037, - "old:virtual_from_version:44945" => 1077, - "old:virtual_from_version:45241" => 1000, - "old:virtual_from_version:45555" => 1136, - "old:virtual_from_version:42275" => 1107, - "old:virtual_from_version:50712" => 3259, - "old:virtual_from_version:45248" => 1043, - "old:virtual_from_version:49253" => 1404, - "old:virtual_from_version:45670" => 1621, - "old:virtual_from_version:50102" => 1015, - "old:virtual_from_version:43041" => 2053, - "old:virtual_from_version:42550" => 1037, - "old:virtual_from_version:46849" => 1077, - "old:virtual_from_version:49959" => 1070, - "old:virtual_from_version:42515" => 1150, - "old:virtual_from_version:50115" => 3131, - "old:virtual_from_version:42899" => 1037, - "old:virtual_from_version:44875" => 1077, - "old:virtual_from_version:40979" => 1070, - "old:virtual_from_version:49994" => 1100, - "old:virtual_from_version:46497" => 1537, - "old:virtual_from_version:42758" => 1461, - "old:virtual_from_version:39994" => 2009, - "old:virtual_from_version:49182" => 3153, - "old:virtual_from_version:44923" => 1125, - "old:virtual_from_version:38384" => 1067, - "old:virtual_from_version:50504" => 3261, - "old:virtual_from_version:47550" => 1070, - "old:virtual_from_version:44491" => 1110, - "old:virtual_from_version:42719" => 1037, - "old:virtual_from_version:38366" => 1065, - "old:virtual_from_version:50418" => 1070, - "old:virtual_from_version:40885" => 1057, - "old:virtual_from_version:47028" => 3008, - "old:virtual_from_version:49829" => 1037, - "old:virtual_from_version:49195" => 1070, - "old:virtual_from_version:46121" => 1461, - "old:virtual_from_version:47165" => 1125, - "old:virtual_from_version:47805" => 1172, - "old:virtual_from_version:50205" => 3137, - "old:virtual_from_version:50366" => 1007, - "old:virtual_from_version:50027" => 3131, - "old:virtual_from_version:49637" => 1158, - "old:virtual_from_version:46357" => 1070, - "old:virtual_from_version:47883" => 1109, - "old:virtual_from_version:42755" => 1037, - "old:virtual_from_version:42573" => 1077, - "old:virtual_from_version:42380" => 1172, - "old:virtual_from_version:38672" => 1104, - "old:virtual_from_version:49595" => 1070, - "old:virtual_from_version:47735" => 1109, - "old:virtual_from_version:42850" => 1077, - "old:virtual_from_version:50436" => 3242, - "old:virtual_from_version:47941" => 1025, - "old:virtual_from_version:46455" => 1537, - "old:virtual_from_version:47079" => 1583, - "old:virtual_from_version:50273" => 3131, - "old:virtual_from_version:46609" => 1125, - "old:virtual_from_version:47820" => 3094, - "old:virtual_from_version:47140" => 1077, - "old:virtual_from_version:44884" => 1136, - "old:virtual_from_version:42821" => 1070, - "old:virtual_from_version:49719" => 1489, - "old:virtual_from_version:50709" => 3273, - "old:virtual_from_version:44221" => 1070, - "old:virtual_from_version:40926" => 1107, - "old:virtual_from_version:46386" => 1552, - "old:virtual_from_version:40641" => 1025, - "old:virtual_from_version:50606" => 3131, - "old:virtual_from_version:42171" => 1070, - "old:virtual_from_version:46451" => 1172, - "old:virtual_from_version:50688" => 1005, - "old:virtual_from_version:42925" => 1506, - "old:virtual_from_version:44950" => 1067, - "old:virtual_from_version:45112" => 1009, - "old:virtual_from_version:44075" => 1009, - "old:virtual_from_version:42535" => 1067, - "old:virtual_from_version:42931" => 1051, - "old:virtual_from_version:49947" => 1580, - "old:virtual_from_version:42132" => 1009, - "old:virtual_from_version:44732" => 1070, - "old:virtual_from_version:50101" => 1070, - "old:virtual_from_version:47827" => 1070, - "old:virtual_from_version:45764" => 1404, - "old:virtual_from_version:44984" => 1022, - "old:virtual_from_version:44367" => 1008, - "old:virtual_from_version:49304" => 1583, - "old:virtual_from_version:50017" => 1314, - "old:virtual_from_version:46731" => 1125, - "old:virtual_from_version:45744" => 1009, - "old:virtual_from_version:39708" => 1109, - "old:virtual_from_version:39232" => 1062, - "old:virtual_from_version:44994" => 1112, - "old:virtual_from_version:46290" => 1067, - "old:virtual_from_version:47667" => 1070, - "old:virtual_from_version:47234" => 1640, - "old:virtual_from_version:47164" => 1070, - "old:virtual_from_version:50044" => 1689, - "old:virtual_from_version:50678" => 1150, - "old:virtual_from_version:40585" => 1025, - "old:virtual_from_version:42783" => 1077, - "old:virtual_from_version:47619" => 1311, - "old:virtual_from_version:44019" => 1009, - "old:virtual_from_version:44110" => 1077, - "old:virtual_from_version:47740" => 1109, - "old:virtual_from_version:46058" => 1077, - "old:virtual_from_version:38932" => 1007, - "old:virtual_from_version:50695" => 1006, - "old:virtual_from_version:46110" => 1404, - "old:virtual_from_version:47922" => 1413, - "old:virtual_from_version:42638" => 1172, - "old:virtual_from_version:45104" => 1070, - "old:virtual_from_version:44609" => 1051, - "old:virtual_from_version:43068" => 2069, - "old:virtual_from_version:44306" => 1172, - "old:virtual_from_version:45233" => 1083, - "old:virtual_from_version:47326" => 1070, - "old:virtual_from_version:37416" => 1001, - "old:virtual_from_version:42243" => 1070, - "old:virtual_from_version:46939" => 3009, - "old:virtual_from_version:46541" => 1125, - "old:virtual_from_version:42284" => 1426, - "old:virtual_from_version:44287" => 1025, - "old:virtual_from_version:44919" => 1077, - "old:virtual_from_version:38762" => 1108, - "old:virtual_from_version:46047" => 1488, - "old:virtual_from_version:46700" => 1417, - "old:virtual_from_version:45076" => 1070, - "old:virtual_from_version:48003" => 2104, - "old:virtual_from_version:50173" => 1125, - "old:virtual_from_version:44617" => 1037, - "old:virtual_from_version:50463" => 3159, - "old:virtual_from_version:34128" => 1091, - "old:virtual_from_version:44842" => 1081, - "old:virtual_from_version:50462" => 3131, - "old:virtual_from_version:47182" => 1051, - "old:virtual_from_version:43094" => 2086, - "old:virtual_from_version:40699" => 1016, - "old:virtual_from_version:46836" => 1351, - "old:virtual_from_version:49956" => 1070, - "old:virtual_from_version:42627" => 1311, - "old:virtual_from_version:45526" => 1404, - "old:virtual_from_version:49869" => 1584, - "old:virtual_from_version:50648" => 1038, - "old:virtual_from_version:49998" => 3215, - "old:virtual_from_version:50564" => 1150, - "old:virtual_from_version:45056" => 1112, - "old:virtual_from_version:45490" => 1105, - "old:virtual_from_version:42969" => 1110, - "old:virtual_from_version:46558" => 1077, - "old:virtual_from_version:42857" => 1077, - "old:virtual_from_version:47866" => 1689, - "old:virtual_from_version:45755" => 1012, - "old:virtual_from_version:46821" => 1509, - "old:virtual_from_version:47211" => 1070, - "old:virtual_from_version:50514" => 1585, - "old:virtual_from_version:45500" => 1112, - "old:virtual_from_version:45829" => 1107, - "old:virtual_from_version:47861" => 1077, - "old:virtual_from_version:47980" => 1077, - "old:virtual_from_version:50113" => 1580, - "old:virtual_from_version:46318" => 1070, - "old:virtual_from_version:50427" => 1064, - "old:virtual_from_version:40851" => 1009, - "old:virtual_from_version:47546" => 1125, - "old:virtual_from_version:49071" => 1689, - "old:virtual_from_version:42347" => 1107, - "old:virtual_from_version:49397" => 3008, - "old:virtual_from_version:49337" => 1666, - "old:virtual_from_version:49923" => 3206, - "old:virtual_from_version:47774" => 1666, - "old:virtual_from_version:44048" => 1077, - "old:virtual_from_version:39815" => 1149, - "old:virtual_from_version:50081" => 1051, - "old:virtual_from_version:46661" => 1077, - "old:virtual_from_version:46370" => 1005, - "old:virtual_from_version:47939" => 1070, - "old:virtual_from_version:47977" => 1070, - "old:virtual_from_version:44210" => 1183, - "old:virtual_from_version:47992" => 1109, - "old:virtual_from_version:48028" => 2079, - "old:virtual_from_version:49145" => 1077, - "old:virtual_from_version:47385" => 3008, - "old:virtual_from_version:46775" => 1070, - "old:virtual_from_version:45378" => 1125, - "old:virtual_from_version:40637" => 1057, - "old:virtual_from_version:46964" => 1070, - "old:virtual_from_version:44185" => 1125, - "old:virtual_from_version:42673" => 1070, - "old:virtual_from_version:49137" => 1649, - "old:virtual_from_version:46989" => 1125, - "old:virtual_from_version:40672" => 1077, - "old:virtual_from_version:42716" => 1023, - "old:virtual_from_version:42453" => 1440, - "old:virtual_from_version:45586" => 1070, - "old:virtual_from_version:46805" => 1048, - "old:virtual_from_version:44003" => 1077, - "old:virtual_from_version:46565" => 1070, - "old:virtual_from_version:46217" => 1404, - "old:virtual_from_version:49083" => 3136, - "old:virtual_from_version:47392" => 3008, - "old:virtual_from_version:44924" => 1070, - "old:virtual_from_version:49790" => 1037, - "old:virtual_from_version:49695" => 3008, - "old:virtual_from_version:49154" => 1070, - "old:virtual_from_version:49623" => 3185, - "old:virtual_from_version:46885" => 1172, - "old:virtual_from_version:42237" => 1070, - "old:virtual_from_version:42242" => 1172, - "old:virtual_from_version:44944" => 1026, - "old:virtual_from_version:42655" => 1037, - "old:virtual_from_version:44988" => 1010, - "old:virtual_from_version:47480" => 1444, - "old:virtual_from_version:42856" => 1009, - "old:virtual_from_version:44753" => 1009, - "old:virtual_from_version:47197" => 1070, - "old:virtual_from_version:45875" => 1532, - "old:virtual_from_version:40635" => 1077, - "old:virtual_from_version:39752" => 1404, - "old:virtual_from_version:47830" => 1107, - "old:virtual_from_version:45507" => 1585, - "old:virtual_from_version:38667" => 1069, - "old:virtual_from_version:49734" => 1067, - "old:virtual_from_version:46149" => 1037, - "old:virtual_from_version:44346" => 1025, - "old:virtual_from_version:45676" => 1048, - "old:virtual_from_version:49724" => 1070, - "old:virtual_from_version:42747" => 1037, - "old:virtual_from_version:49330" => 1659, - "old:virtual_from_version:45105" => 1077, - "old:virtual_from_version:44374" => 1017, - "old:virtual_from_version:50011" => 1565, - "old:virtual_from_version:49152" => 1105, - "old:virtual_from_version:49864" => 1404, - "old:virtual_from_version:44356" => 1081, - "old:virtual_from_version:46194" => 1649, - "old:virtual_from_version:49358" => 1070, - "old:virtual_from_version:50579" => 1125, - "old:virtual_from_version:47122" => 1067, - "old:virtual_from_version:45232" => 1083, - "old:virtual_from_version:42562" => 1037, - "old:virtual_from_version:49605" => 1070, - "old:virtual_from_version:50333" => 1070, - "old:virtual_from_version:42789" => 1353, - "old:virtual_from_version:50233" => 3131, - "old:virtual_from_version:49007" => 1585, - "old:virtual_from_version:44423" => 1042, - "old:virtual_from_version:44657" => 1077, - "old:virtual_from_version:45626" => 1070, - "old:virtual_from_version:44056" => 1037, - "old:virtual_from_version:47532" => 1070, - "old:virtual_from_version:46747" => 1632, - "old:virtual_from_version:50079" => 3223, - "old:virtual_from_version:40499" => 1077, - "old:virtual_from_version:47772" => 1077, - "old:virtual_from_version:44673" => 1009, - "old:virtual_from_version:40237" => 1070, - "old:virtual_from_version:49184" => 1105, - "old:virtual_from_version:49393" => 1381, - "old:virtual_from_version:43077" => 2074, - "old:virtual_from_version:38981" => 1009, - "old:virtual_from_version:42713" => 1311, - "old:virtual_from_version:40690" => 1070, - "old:virtual_from_version:40480" => 1077, - "old:virtual_from_version:46711" => 1077, - "old:virtual_from_version:45938" => 1077, - "old:virtual_from_version:47115" => 3021, - "old:virtual_from_version:44846" => 1077, - "old:virtual_from_version:44533" => 1009, - "old:virtual_from_version:49772" => 1651, - "old:virtual_from_version:49587" => 1172, - "old:virtual_from_version:41003" => 2015, - "old:virtual_from_version:45294" => 1581, - "old:virtual_from_version:47676" => 1404, - "old:virtual_from_version:40152" => 1105, - "old:virtual_from_version:47460" => 1077, - "old:virtual_from_version:40795" => 1077, - "old:virtual_from_version:49907" => 1007, - "old:virtual_from_version:44214" => 1037, - "old:virtual_from_version:43032" => 2031, - "old:virtual_from_version:49985" => 1100, - "old:virtual_from_version:45128" => 1125, - "old:virtual_from_version:49809" => 1100, - "old:virtual_from_version:42910" => 1077, - "old:virtual_from_version:40549" => 1107, - "old:virtual_from_version:42130" => 1136, - "old:virtual_from_version:50370" => 3131, - "old:virtual_from_version:44940" => 1070, - "old:virtual_from_version:49746" => 3194, - "old:virtual_from_version:42376" => 1077, - "old:virtual_from_version:45067" => 1077, - "old:virtual_from_version:46552" => 1077, - "old:virtual_from_version:50582" => 1689, - "old:virtual_from_version:39970" => 1048, - "old:virtual_from_version:42613" => 1009, - "old:virtual_from_version:44476" => 1067, - "old:virtual_from_version:44666" => 1497, - "old:virtual_from_version:49583" => 1070, - "old:virtual_from_version:50389" => 1314, - "old:virtual_from_version:44885" => 1125, - "old:virtual_from_version:41014" => 2007, - "old:virtual_from_version:47728" => 1109, - "old:virtual_from_version:45221" => 1101, - "old:virtual_from_version:42552" => 1172, - "old:virtual_from_version:42738" => 1070, - "old:virtual_from_version:42847" => 1067, - "old:virtual_from_version:42750" => 1070, - "old:virtual_from_version:46220" => 1633, - "old:virtual_from_version:47107" => 1585, - "old:virtual_from_version:49125" => 1404, - "old:virtual_from_version:42680" => 1009, - "old:virtual_from_version:40494" => 1070, - "old:virtual_from_version:47620" => 3077, - "old:virtual_from_version:46653" => 1077, - "old:virtual_from_version:46235" => 1077, - "old:virtual_from_version:50262" => 1032, - "old:virtual_from_version:47736" => 1084, - "old:virtual_from_version:47134" => 1077, - "old:virtual_from_version:46244" => 1077, - "old:virtual_from_version:43033" => 2032, - "old:virtual_from_version:40664" => 1007, - "old:virtual_from_version:42261" => 1070, - "old:virtual_from_version:38333" => 1007, - "old:virtual_from_version:47435" => 1109, - "old:virtual_from_version:49908" => 1444, - "old:virtual_from_version:45596" => 1172, - "old:virtual_from_version:46692" => 1009, - "old:virtual_from_version:44658" => 1037, - "old:virtual_from_version:46523" => 1125, - "old:virtual_from_version:50038" => 1012, - "old:virtual_from_version:46695" => 1070, - "old:virtual_from_version:47018" => 1172, - "old:virtual_from_version:50457" => 1444, - "old:virtual_from_version:46553" => 1404, - "old:virtual_from_version:42578" => 1037, - "old:virtual_from_version:42681" => 1077, - "old:virtual_from_version:49451" => 1070, - "old:virtual_from_version:42426" => 1037, - "old:virtual_from_version:42064" => 1037, - "old:virtual_from_version:48024" => 2125, - "old:virtual_from_version:47125" => 1077, - "old:virtual_from_version:45028" => 1009, - "old:virtual_from_version:40389" => 1067, - "old:virtual_from_version:50757" => 1048, - "old:virtual_from_version:44443" => 1037, - "old:virtual_from_version:40767" => 1070, - "old:virtual_from_version:50479" => 3253, - "old:virtual_from_version:44582" => 1077, - "old:virtual_from_version:42652" => 1070, - "old:virtual_from_version:45912" => 1172, - "old:virtual_from_version:44912" => 1070, - "old:virtual_from_version:46846" => 1070, - "old:virtual_from_version:44634" => 1077, - "old:virtual_from_version:49144" => 1070, - "old:virtual_from_version:42975" => 1077, - "old:virtual_from_version:40194" => 1222, - "old:virtual_from_version:40501" => 1105, - "old:virtual_from_version:49326" => 1077, - "old:virtual_from_version:45409" => 1582, - "old:virtual_from_version:46299" => 1362, - "old:virtual_from_version:42714" => 1070, - "old:virtual_from_version:50658" => 1321, - "old:virtual_from_version:44256" => 1350, - "old:virtual_from_version:47229" => 1077, - "old:virtual_from_version:45538" => 1009, - "old:virtual_from_version:50293" => 1035, - "old:virtual_from_version:45214" => 1125, - "old:virtual_from_version:47918" => 1067, - "old:virtual_from_version:45957" => 1092, - "old:virtual_from_version:49692" => 1224, - "old:virtual_from_version:50741" => 3186, - "old:virtual_from_version:49666" => 1062, - "old:virtual_from_version:47353" => 1109, - "old:virtual_from_version:47494" => 1070, - "old:virtual_from_version:50452" => 1105, - "old:virtual_from_version:44329" => 1037, - "old:virtual_from_version:44360" => 1090, - "old:virtual_from_version:46781" => 1517, - "old:virtual_from_version:50240" => 1689, - "old:virtual_from_version:45470" => 1077, - "old:virtual_from_version:44696" => 1009, - "old:virtual_from_version:45025" => 1144, - "old:virtual_from_version:45027" => 1008, - "old:virtual_from_version:43069" => 2059, - "old:virtual_from_version:45254" => 1021, - "old:virtual_from_version:43024" => 2049, - "old:virtual_from_version:39351" => 1109, - "old:virtual_from_version:45863" => 1335, - "old:virtual_from_version:44632" => 1070, - "old:virtual_from_version:47498" => 1125, - "old:virtual_from_version:47637" => 1350, - "old:virtual_from_version:46785" => 1125, - "old:virtual_from_version:45101" => 1077, - "old:virtual_from_version:49593" => 1689, - "old:virtual_from_version:44394" => 1090, - "old:virtual_from_version:42915" => 1015, - "old:virtual_from_version:44464" => 1067, - "old:virtual_from_version:49716" => 3192, - "old:virtual_from_version:47486" => 1037, - "old:virtual_from_version:38346" => 1011, - "old:virtual_from_version:40490" => 1077, - "old:virtual_from_version:45942" => 1007, - "old:virtual_from_version:50634" => 3268, - "old:virtual_from_version:40570" => 1146, - "old:virtual_from_version:40954" => 1037, - "old:virtual_from_version:47027" => 3008, - "old:virtual_from_version:47318" => 3042, - "old:virtual_from_version:45719" => 1009, - "old:virtual_from_version:42633" => 1077, - "old:virtual_from_version:42537" => 1070, - "old:virtual_from_version:45701" => 1027, - "old:virtual_from_version:44080" => 1125, - "old:virtual_from_version:47219" => 1533, - "old:virtual_from_version:45267" => 1010, - "old:virtual_from_version:40803" => 1070, - "old:virtual_from_version:44095" => 1025, - "old:virtual_from_version:49054" => 1659, - "old:virtual_from_version:44678" => 1076, - "old:virtual_from_version:47884" => 1025, - "old:virtual_from_version:47313" => 1172, - "old:virtual_from_version:44937" => 1077, - "old:virtual_from_version:44620" => 1067, - "old:virtual_from_version:49037" => 1007, - "old:virtual_from_version:49545" => 1413, - "old:virtual_from_version:42998" => 1505, - "old:virtual_from_version:39310" => 1000, - "old:virtual_from_version:50003" => 3215, - "old:virtual_from_version:47686" => 1112, - "old:virtual_from_version:47383" => 1109, - "old:virtual_from_version:42170" => 1172, - "old:virtual_from_version:40510" => 1084, - "old:virtual_from_version:44319" => 1104, - "old:virtual_from_version:45406" => 1009, - "old:virtual_from_version:47670" => 1009, - "old:virtual_from_version:50671" => 3208, - "old:virtual_from_version:42287" => 1007, - "old:virtual_from_version:42938" => 1070, - "old:virtual_from_version:42880" => 1015, - "old:virtual_from_version:49141" => 1070, - "old:virtual_from_version:46435" => 1070, - "old:virtual_from_version:46032" => 1077, - "old:virtual_from_version:40415" => 1077, - "old:virtual_from_version:46934" => 1584, - "old:virtual_from_version:47283" => 1461, - "old:virtual_from_version:45791" => 1125, - "old:virtual_from_version:39992" => 2007, - "old:virtual_from_version:47462" => 1689, - "old:virtual_from_version:46579" => 1689, - "old:virtual_from_version:47453" => 1381, - "old:virtual_from_version:44717" => 1070, - "old:virtual_from_version:49793" => 1100, - "old:virtual_from_version:44267" => 1067, - "old:virtual_from_version:50392" => 1689, - "old:virtual_from_version:40756" => 1070, - "old:virtual_from_version:40890" => 1077, - "old:virtual_from_version:42468" => 1037, - "old:virtual_from_version:42503" => 1009, - "old:virtual_from_version:46642" => 1537, - "old:virtual_from_version:44398" => 1078, - "old:virtual_from_version:44653" => 1037, - "old:virtual_from_version:44107" => 1009, - "old:virtual_from_version:46271" => 1070, - "old:virtual_from_version:45014" => 1413, - "old:virtual_from_version:38341" => 1005, - "old:virtual_from_version:50334" => 1125, - "old:virtual_from_version:49969" => 3131, - "old:virtual_from_version:45044" => 1030, - "old:virtual_from_version:42955" => 1150, - "old:virtual_from_version:50543" => 1689, - "old:virtual_from_version:46372" => 1402, - "old:virtual_from_version:42623" => 1070, - "old:virtual_from_version:42270" => 1015, - "old:virtual_from_version:44854" => 1070, - "old:virtual_from_version:47764" => 3094, - "old:virtual_from_version:39156" => 1136, - "old:virtual_from_version:47063" => 1689, - "old:virtual_from_version:46169" => 1067, - "old:virtual_from_version:49553" => 1070, - "old:virtual_from_version:47771" => 1109, - "old:virtual_from_version:46091" => 1656, - "old:virtual_from_version:42150" => 1070, - "old:virtual_from_version:44872" => 1141, - "old:virtual_from_version:46312" => 1404, - "old:virtual_from_version:47738" => 1404, - "old:virtual_from_version:46779" => 1172, - "old:virtual_from_version:45750" => 1407, - "old:virtual_from_version:42122" => 1353, - "old:virtual_from_version:47588" => 1077, - "old:virtual_from_version:42805" => 1007, - "old:virtual_from_version:47632" => 1583, - "old:virtual_from_version:42539" => 1077, - "old:virtual_from_version:42939" => 1009, - "old:virtual_from_version:42824" => 1037, - "old:virtual_from_version:49483" => 3152, - "old:virtual_from_version:45788" => 1007, - "old:virtual_from_version:42269" => 1009, - "old:virtual_from_version:46555" => 1070, - "old:virtual_from_version:47068" => 1136, - "old:virtual_from_version:46484" => 1172, - "old:virtual_from_version:45593" => 1110, - "old:virtual_from_version:49365" => 1584, - "old:virtual_from_version:50160" => 3214, - "old:virtual_from_version:49525" => 1404, - "old:virtual_from_version:47088" => 1048, - "old:virtual_from_version:46755" => 1077, - "old:virtual_from_version:39326" => 1067, - "old:virtual_from_version:45857" => 1109, - "old:virtual_from_version:49311" => 3162, - "old:virtual_from_version:50618" => 3259, - "old:virtual_from_version:46017" => 1006, - "old:virtual_from_version:40784" => 1067, - "old:virtual_from_version:44858" => 1070, - "old:virtual_from_version:45886" => 1125, - "old:virtual_from_version:40776" => 1077, - "old:virtual_from_version:46402" => 1672, - "old:virtual_from_version:45929" => 1009, - "old:virtual_from_version:42763" => 1110, - "old:virtual_from_version:42626" => 1051, - "old:virtual_from_version:45850" => 1125, - "old:virtual_from_version:50407" => 1583, - "old:virtual_from_version:50492" => 3258, - "old:virtual_from_version:39402" => 1168, - "old:virtual_from_version:50454" => 1314, - "old:virtual_from_version:40975" => 1009, - "old:virtual_from_version:45543" => 1613, - "old:virtual_from_version:43006" => 2031, - "old:virtual_from_version:47432" => 1580, - "old:virtual_from_version:42528" => 1037, - "old:virtual_from_version:44057" => 1081, - "old:virtual_from_version:49564" => 1070, - "old:virtual_from_version:46581" => 1070, - "old:virtual_from_version:49297" => 3152, - "old:virtual_from_version:47520" => 1009, - "old:virtual_from_version:44867" => 1107, - "old:virtual_from_version:42364" => 1077, - "old:virtual_from_version:44144" => 1070, - "old:virtual_from_version:44705" => 1070, - "old:virtual_from_version:49316" => 1077, - "old:virtual_from_version:47837" => 1583, - "old:virtual_from_version:44200" => 1037, - "old:virtual_from_version:46680" => 1125, - "old:virtual_from_version:50692" => 3259, - "old:virtual_from_version:49948" => 1689, - "old:virtual_from_version:45658" => 1172, - "old:virtual_from_version:38606" => 1108, - "old:virtual_from_version:45779" => 1574, - "old:virtual_from_version:40012" => 1069, - "old:virtual_from_version:50179" => 1025, - "old:virtual_from_version:44160" => 1009, - "old:virtual_from_version:44312" => 1077, - "old:virtual_from_version:47254" => 1172, - "old:virtual_from_version:47901" => 1689, - "old:virtual_from_version:49619" => 1696, - "old:virtual_from_version:38610" => 1104, - "old:virtual_from_version:42943" => 1070, - "old:virtual_from_version:50707" => 3259, - "old:virtual_from_version:44274" => 1037, - "old:virtual_from_version:46060" => 1077, - "old:virtual_from_version:42474" => 1172, - "old:virtual_from_version:47758" => 1125, - "old:virtual_from_version:44936" => 1009, - "old:virtual_from_version:40938" => 1070, - "old:virtual_from_version:44023" => 1070, - "old:virtual_from_version:47222" => 1107, - "old:virtual_from_version:47547" => 1109, - "old:virtual_from_version:50495" => 3259, - "old:virtual_from_version:50318" => 1070, - "old:virtual_from_version:47390" => 3008, - "old:virtual_from_version:49875" => 1107, - "old:virtual_from_version:45607" => 1025, - "old:virtual_from_version:44825" => 1009, - "old:virtual_from_version:45562" => 1025, - "old:virtual_from_version:39725" => 1062, - "old:virtual_from_version:42098" => 1070, - "old:virtual_from_version:39718" => 1222, - "old:virtual_from_version:49916" => 1444, - "old:virtual_from_version:42816" => 1077, - "old:virtual_from_version:47493" => 1077, - "old:virtual_from_version:46355" => 1057, - "old:virtual_from_version:44549" => 1070, - "old:virtual_from_version:45870" => 1070, - "old:virtual_from_version:46351" => 1077, - "old:virtual_from_version:45844" => 1077, - "old:virtual_from_version:47499" => 1109, - "old:virtual_from_version:50145" => 3210, - "old:virtual_from_version:40078" => 1110, - "old:virtual_from_version:47304" => 3042, - "old:virtual_from_version:45444" => 1136, - "old:virtual_from_version:45016" => 1000, - "old:virtual_from_version:42378" => 1404, - "old:virtual_from_version:40685" => 1067, - "old:virtual_from_version:46544" => 1689, - "old:virtual_from_version:44058" => 1125, - "old:virtual_from_version:45431" => 1025, - "old:virtual_from_version:50744" => 1417, - "old:virtual_from_version:49913" => 1070, - "old:virtual_from_version:45407" => 1404, - "old:virtual_from_version:42141" => 1110, - "old:virtual_from_version:50057" => 1125, - "old:virtual_from_version:50144" => 3058, - "old:virtual_from_version:46159" => 1404, - "old:virtual_from_version:40736" => 1077, - "old:virtual_from_version:47216" => 1077, - "old:virtual_from_version:50229" => 1007, - "old:virtual_from_version:42247" => 1404, - "old:virtual_from_version:49151" => 1172, - "old:virtual_from_version:43013" => 2038, - "old:virtual_from_version:40831" => 1407, - "old:virtual_from_version:39477" => 1404, - "old:virtual_from_version:45781" => 1136, - "old:virtual_from_version:42561" => 1077, - "old:virtual_from_version:40715" => 1070, - "old:virtual_from_version:47535" => 1070, - "old:virtual_from_version:49664" => 1583, - "old:virtual_from_version:46648" => 1125, - "old:virtual_from_version:50221" => 1314, - "old:virtual_from_version:42491" => 1009, - "old:virtual_from_version:46130" => 1077, - "old:virtual_from_version:45346" => 1413, - "old:virtual_from_version:49285" => 1009, - "old:virtual_from_version:45659" => 1136, - "old:virtual_from_version:45618" => 1136, - "old:virtual_from_version:45979" => 1613, - "old:virtual_from_version:47167" => 1077, - "old:virtual_from_version:46603" => 1172, - "old:virtual_from_version:49801" => 3131, - "old:virtual_from_version:49888" => 1035, - "old:virtual_from_version:40177" => 1006, - "old:virtual_from_version:47622" => 1070, - "old:virtual_from_version:50558" => 3265, - "old:virtual_from_version:46135" => 1404, - "old:virtual_from_version:46242" => 1172, - "old:virtual_from_version:49386" => 1659, - "old:virtual_from_version:47450" => 1109, - "old:virtual_from_version:45058" => 1049, - "old:virtual_from_version:47659" => 1125, - "old:virtual_from_version:49731" => 1070, - "old:virtual_from_version:44962" => 1000, - "old:virtual_from_version:47540" => 1070, - "old:virtual_from_version:42765" => 1484, - "old:virtual_from_version:44197" => 1009, - "old:virtual_from_version:45150" => 1009, - "old:virtual_from_version:42348" => 1070, - "old:virtual_from_version:47158" => 1584, - "old:virtual_from_version:47518" => 1037, - "old:virtual_from_version:49014" => 3129, - "old:virtual_from_version:45357" => 1031, - "old:virtual_from_version:42950" => 1009, - "old:virtual_from_version:42812" => 1107, - "old:virtual_from_version:49342" => 1125, - "old:virtual_from_version:45537" => 1070, - "old:virtual_from_version:39528" => 1107, - "old:virtual_from_version:50412" => 3201, - "old:virtual_from_version:45749" => 1077, - "old:virtual_from_version:44960" => 1016, - "old:virtual_from_version:45222" => 1576, - "old:virtual_from_version:49688" => 1381, - "old:virtual_from_version:49522" => 1488, - "old:virtual_from_version:47007" => 1077, - "old:virtual_from_version:44405" => 1069, - "old:virtual_from_version:40968" => 1070, - "old:virtual_from_version:42500" => 1107, - "old:virtual_from_version:47970" => 1109, - "old:virtual_from_version:46400" => 1402, - "old:virtual_from_version:46440" => 1070, - "old:virtual_from_version:45761" => 1362, - "old:virtual_from_version:44300" => 1037, - "old:virtual_from_version:50404" => 3214, - "old:virtual_from_version:42052" => 1037, - "old:virtual_from_version:49412" => 3008, - "old:virtual_from_version:42140" => 1037, - "old:virtual_from_version:50502" => 1035, - "old:virtual_from_version:46164" => 1077, - "old:virtual_from_version:47618" => 1583, - "old:virtual_from_version:42966" => 1016, - "old:virtual_from_version:47956" => 1077, - "old:virtual_from_version:50510" => 3261, - "old:virtual_from_version:47702" => 1109, - "old:virtual_from_version:44695" => 1070, - "old:virtual_from_version:49118" => 1048, - "old:virtual_from_version:47755" => 3092, - "old:virtual_from_version:40436" => 1057, - "old:virtual_from_version:47786" => 1125, - "old:virtual_from_version:50053" => 1314, - "old:virtual_from_version:47748" => 1070, - "old:virtual_from_version:45374" => 1107, - "old:virtual_from_version:45702" => 1077, - "old:virtual_from_version:44747" => 1009, - "old:virtual_from_version:47531" => 3058, - "old:virtual_from_version:47591" => 1109, - "old:virtual_from_version:39215" => 1058, - "old:virtual_from_version:47757" => 1070, - "old:virtual_from_version:42366" => 1311, - "old:virtual_from_version:44390" => 1048, - "old:virtual_from_version:47335" => 3043, - "old:virtual_from_version:46193" => 1077, - "old:virtual_from_version:50312" => 3131, - "old:virtual_from_version:40620" => 1025, - "old:virtual_from_version:46322" => 1402, - "old:virtual_from_version:42375" => 1070, - "old:virtual_from_version:47895" => 1070, - "old:virtual_from_version:45615" => 1009, - "old:virtual_from_version:50673" => 3208, - "old:virtual_from_version:42711" => 1037, - "old:virtual_from_version:49087" => 3030, - "old:virtual_from_version:38858" => 1070, - "old:virtual_from_version:44957" => 1057, - "old:virtual_from_version:45933" => 1070, - "old:virtual_from_version:47614" => 1069, - "old:virtual_from_version:42082" => 1077, - "old:virtual_from_version:45448" => 1109, - "old:virtual_from_version:39583" => 1031, - "old:virtual_from_version:46741" => 1689, - "old:virtual_from_version:50189" => 3025, - "old:virtual_from_version:47691" => 1109, - "old:virtual_from_version:49415" => 1532, - "old:virtual_from_version:46443" => 1051, - "old:virtual_from_version:42217" => 1000, - "old:virtual_from_version:42471" => 1112, - "old:virtual_from_version:47617" => 1565, - "old:virtual_from_version:40953" => 1077, - "old:virtual_from_version:45255" => 1051, - "old:virtual_from_version:50689" => 1404, - "old:virtual_from_version:40129" => 1125, - "old:virtual_from_version:49741" => 1070, - "old:virtual_from_version:42335" => 1077, - "old:virtual_from_version:39990" => 1260, - "old:virtual_from_version:49356" => 3167, - "old:virtual_from_version:40871" => 1009, - "old:virtual_from_version:42678" => 1048, - "old:virtual_from_version:49663" => 1150, - "old:virtual_from_version:44953" => 1025, - "old:virtual_from_version:46145" => 1009, - "old:virtual_from_version:45809" => 1404, - "old:virtual_from_version:50423" => 1689, - "old:virtual_from_version:47880" => 1585, - "old:virtual_from_version:47233" => 1077, - "old:virtual_from_version:47377" => 1109, - "old:virtual_from_version:44340" => 1025, - "old:virtual_from_version:46076" => 1404, - "old:virtual_from_version:48021" => 2121, - "old:virtual_from_version:39126" => 1070, - "old:virtual_from_version:44593" => 1070, - "old:virtual_from_version:50764" => 3259, - "old:virtual_from_version:43008" => 2033, - "old:virtual_from_version:50736" => 1489, - "old:virtual_from_version:44763" => 1070, - "old:virtual_from_version:44213" => 1077, - "old:virtual_from_version:42919" => 1062, - "old:virtual_from_version:45892" => 1109, - "old:virtual_from_version:46505" => 1084, - "old:virtual_from_version:49915" => 1107, - "old:virtual_from_version:42614" => 1025, - "old:virtual_from_version:47886" => 1108, - "old:virtual_from_version:49590" => 1404, - "old:virtual_from_version:45652" => 1107, - "old:virtual_from_version:44975" => 1023, - "old:virtual_from_version:44715" => 1067, - "old:virtual_from_version:50748" => 3206, - "old:virtual_from_version:42487" => 1037, - "old:virtual_from_version:50646" => 1108, - "old:virtual_from_version:42760" => 1009, - "old:virtual_from_version:44288" => 1077, - "old:virtual_from_version:44243" => 1110, - "old:virtual_from_version:47877" => 1314, - "old:virtual_from_version:49843" => 3131, - "old:virtual_from_version:38797" => 1125, - "old:virtual_from_version:49165" => 1070, - "old:virtual_from_version:42521" => 1037, - "old:virtual_from_version:42882" => 1077, - "old:virtual_from_version:45620" => 1067, - "old:virtual_from_version:46652" => 1025, - "old:virtual_from_version:42601" => 1077, - "old:virtual_from_version:42971" => 1063, - "old:virtual_from_version:46920" => 1077, - "old:virtual_from_version:47360" => 1037, - "old:virtual_from_version:47006" => 1172, - "old:virtual_from_version:47228" => 1172, - "old:virtual_from_version:44339" => 1009, - "old:virtual_from_version:42660" => 1037, - "old:virtual_from_version:46379" => 1070, - "old:virtual_from_version:47384" => 1077, - "old:virtual_from_version:49919" => 3206, - "old:virtual_from_version:42103" => 1037, - "old:virtual_from_version:50141" => 1580, - "old:virtual_from_version:50743" => 1105, - "old:virtual_from_version:45765" => 1048, - "old:virtual_from_version:49426" => 3002, - "old:virtual_from_version:44496" => 1037, - "old:virtual_from_version:49405" => 1689, - "old:virtual_from_version:49894" => 1070, - "old:virtual_from_version:45678" => 1009, - "old:virtual_from_version:42332" => 1070, - "old:virtual_from_version:50405" => 3227, - "old:virtual_from_version:46935" => 1585, - "old:virtual_from_version:42095" => 1077, - "old:virtual_from_version:39424" => 1172, - "old:virtual_from_version:39944" => 1037, - "old:virtual_from_version:47761" => 1077, - "old:virtual_from_version:42825" => 1172, - "old:virtual_from_version:45848" => 1627, - "old:virtual_from_version:38621" => 1081, - "old:virtual_from_version:45852" => 1009, - "old:virtual_from_version:44883" => 1172, - "old:virtual_from_version:42022" => 1009, - "old:virtual_from_version:40899" => 1025, - "old:virtual_from_version:47561" => 1109, - "old:virtual_from_version:42685" => 1491, - "old:virtual_from_version:46345" => 1172, - "old:virtual_from_version:46210" => 1555, - "old:virtual_from_version:45487" => 1070, - "old:virtual_from_version:49196" => 1077, - "old:virtual_from_version:46640" => 1125, - "old:virtual_from_version:50699" => 1689, - "old:virtual_from_version:44603" => 1007, - "old:virtual_from_version:43061" => 2062, - "old:virtual_from_version:46839" => 1105, - "old:virtual_from_version:44913" => 1009, - "old:virtual_from_version:50693" => 3271, - "old:virtual_from_version:39753" => 1067, - "old:virtual_from_version:50124" => 1070, - "old:virtual_from_version:46557" => 1009, - "old:virtual_from_version:42708" => 1070, - "old:virtual_from_version:45540" => 1077, - "old:virtual_from_version:50705" => 1417, - "old:virtual_from_version:42494" => 1077, - "old:virtual_from_version:46018" => 1077, - "old:virtual_from_version:46359" => 1077, - "old:virtual_from_version:44436" => 1037, - "old:virtual_from_version:44265" => 1037, - "old:virtual_from_version:49008" => 1070, - "old:virtual_from_version:50769" => 1070, - "old:virtual_from_version:46620" => 1404, - "old:virtual_from_version:38677" => 1009, - "old:virtual_from_version:47664" => 1109, - "old:virtual_from_version:43011" => 2036, - "old:virtual_from_version:47176" => 1638, - "old:virtual_from_version:45647" => 1076, - "old:virtual_from_version:47309" => 1070, - "old:virtual_from_version:44241" => 1077, - "old:virtual_from_version:49465" => 1067, - "old:virtual_from_version:44387" => 1094, - "old:virtual_from_version:44729" => 1541, - "old:virtual_from_version:46563" => 1172, - "old:virtual_from_version:50359" => 1689, - "old:virtual_from_version:47573" => 1580, - "old:virtual_from_version:44748" => 1077, - "old:virtual_from_version:50542" => 1583, - "old:virtual_from_version:44086" => 1070, - "old:virtual_from_version:38873" => 1135, - "old:virtual_from_version:46887" => 1077, - "old:virtual_from_version:50489" => 1491, - "old:virtual_from_version:50611" => 1417, - "old:virtual_from_version:32145" => 1099, - "old:virtual_from_version:46408" => 1402, - "old:virtual_from_version:44635" => 1037, - "old:virtual_from_version:47889" => 1125, - "old:virtual_from_version:42569" => 1037, - "old:virtual_from_version:46133" => 1067, - "old:virtual_from_version:42273" => 1037, - "old:virtual_from_version:50430" => 1659, - "old:virtual_from_version:50039" => 3131, - "old:virtual_from_version:45229" => 1461, - "old:virtual_from_version:43048" => 2021, - "old:virtual_from_version:50497" => 3251, - "old:virtual_from_version:42540" => 1037, - "old:virtual_from_version:49552" => 1007, - "old:virtual_from_version:45743" => 1532, - "old:virtual_from_version:44269" => 1125, - "old:virtual_from_version:39977" => 1104, - "old:virtual_from_version:46955" => 3012, - "old:virtual_from_version:47374" => 3008, - "old:virtual_from_version:42441" => 1070, - "old:virtual_from_version:47642" => 1077, - "old:virtual_from_version:45513" => 1025, - "old:virtual_from_version:44545" => 1070, - "old:virtual_from_version:40723" => 1077, - "old:virtual_from_version:47072" => 1689, - "old:virtual_from_version:47413" => 1125, - "old:virtual_from_version:47990" => 3016, - "old:virtual_from_version:49953" => 3131, - "old:virtual_from_version:42726" => 1083, - "old:virtual_from_version:50437" => 1257, - "old:virtual_from_version:50092" => 1172, - "old:virtual_from_version:40790" => 1077, - "old:virtual_from_version:42152" => 1077, - "old:virtual_from_version:46682" => 1070, - "old:virtual_from_version:49128" => 1584, - "old:virtual_from_version:45278" => 1008, - "old:virtual_from_version:49247" => 1404, - "old:virtual_from_version:45361" => 1584, - "old:virtual_from_version:44253" => 1081, - "old:virtual_from_version:44455" => 1136, - "old:virtual_from_version:42044" => 1009, - "old:virtual_from_version:47128" => 1621, - "old:virtual_from_version:48012" => 2112, - "old:virtual_from_version:49111" => 1136, - "old:virtual_from_version:45742" => 1125, - "old:virtual_from_version:47955" => 1112, - "old:virtual_from_version:42363" => 1025, - "old:virtual_from_version:50201" => 1069, - "old:virtual_from_version:47021" => 1532, - "old:virtual_from_version:46518" => 1067, - "old:virtual_from_version:40043" => 1094, - "old:virtual_from_version:49737" => 1128, - "old:virtual_from_version:44752" => 1006, - "old:virtual_from_version:39778" => 1000, - "old:virtual_from_version:43108" => 2100, - "old:virtual_from_version:46368" => 1555, - "old:virtual_from_version:42675" => 1077, - "old:virtual_from_version:50076" => 3131, - "old:virtual_from_version:44906" => 1321, - "old:virtual_from_version:47070" => 1172, - "old:virtual_from_version:50719" => 3259, - "old:virtual_from_version:49628" => 3184, - "old:virtual_from_version:46031" => 1070, - "old:virtual_from_version:49308" => 1025, - "old:virtual_from_version:46125" => 1070, - "old:virtual_from_version:42289" => 1015, - "old:virtual_from_version:40378" => 1107, - "old:virtual_from_version:45135" => 1009, - "old:virtual_from_version:50330" => 3238, - "old:virtual_from_version:47688" => 1621, - "old:virtual_from_version:42488" => 1136, - "old:virtual_from_version:45471" => 1031, - "old:virtual_from_version:44778" => 1076, - "old:virtual_from_version:45566" => 1532, - "old:virtual_from_version:50171" => 1314, - "old:virtual_from_version:46346" => 1077, - "old:virtual_from_version:42666" => 1488, - "old:virtual_from_version:42842" => 1077, - "old:virtual_from_version:44380" => 1023, - "old:virtual_from_version:45356" => 1012, - "old:virtual_from_version:40814" => 1070, - "old:virtual_from_version:40214" => 1109, - "old:virtual_from_version:42782" => 1070, - "old:virtual_from_version:44710" => 1107, - "old:virtual_from_version:42572" => 1070, - "old:virtual_from_version:45293" => 1580, - "old:virtual_from_version:47365" => 1444, - "old:virtual_from_version:50088" => 3131, - "old:virtual_from_version:14174" => 1059, - "old:virtual_from_version:49432" => 3008, - "old:virtual_from_version:47203" => 1123, - "old:virtual_from_version:46856" => 3003, - "old:virtual_from_version:47876" => 1109, - "old:virtual_from_version:40771" => 1077, - "old:virtual_from_version:47497" => 1070, - "old:virtual_from_version:49194" => 1649, - "old:virtual_from_version:42342" => 1009, - "old:virtual_from_version:45322" => 1586, - "old:virtual_from_version:39174" => 1404, - "old:virtual_from_version:47388" => 1037, - "old:virtual_from_version:46959" => 1105, - "old:virtual_from_version:50130" => 1070, - "old:virtual_from_version:48015" => 2115, - "old:virtual_from_version:38634" => 1000, - "old:virtual_from_version:40413" => 1070, - "old:virtual_from_version:45141" => 1321, - "old:virtual_from_version:50025" => 1070, - "old:virtual_from_version:42121" => 1037, - "old:virtual_from_version:42498" => 1057, - "old:virtual_from_version:44115" => 1107, - "old:virtual_from_version:47548" => 1077, - "old:virtual_from_version:42409" => 1172, - "old:virtual_from_version:47040" => 1077, - "old:virtual_from_version:46514" => 1007, - "old:virtual_from_version:45140" => 1110, - "old:virtual_from_version:50361" => 1125, - "old:virtual_from_version:40980" => 1125, - "old:virtual_from_version:47381" => 1070, - "old:virtual_from_version:45283" => 1006, - "old:virtual_from_version:38756" => 1007, - "old:virtual_from_version:42761" => 1077, - "old:virtual_from_version:42846" => 1081, - "old:virtual_from_version:50358" => 1150, - "old:virtual_from_version:50522" => 1033, - "old:virtual_from_version:49454" => 1689, - "old:virtual_from_version:45846" => 1498, - "old:virtual_from_version:46794" => 1070, - "old:virtual_from_version:46263" => 1537, - "old:virtual_from_version:49016" => 1009, - "old:virtual_from_version:46898" => 2100, - "old:virtual_from_version:47794" => 3104, - "old:virtual_from_version:44410" => 1017, - "old:virtual_from_version:46156" => 1077, - "old:virtual_from_version:40996" => 1077, - "old:virtual_from_version:47215" => 1009, - "old:virtual_from_version:49421" => 1070, - "old:virtual_from_version:44999" => 1105, - "old:virtual_from_version:50247" => 1070, - "old:virtual_from_version:47015" => 1125, - "old:virtual_from_version:45721" => 1362, - "old:virtual_from_version:49557" => 1067, - "old:virtual_from_version:49951" => 1070, - "old:virtual_from_version:45696" => 1019, - "old:virtual_from_version:49520" => 1574, - "old:virtual_from_version:50556" => 1689, - "old:virtual_from_version:42305" => 1077, - "old:virtual_from_version:46619" => 1077, - "old:virtual_from_version:44806" => 1070, - "old:virtual_from_version:50725" => 3259, - "old:virtual_from_version:47350" => 1077, - "old:virtual_from_version:42600" => 1009, - "old:virtual_from_version:38611" => 1122, - "old:virtual_from_version:44859" => 1077, - "old:virtual_from_version:40815" => 1009, - "old:virtual_from_version:50304" => 3131, - "old:virtual_from_version:39906" => 1404, - "old:virtual_from_version:42399" => 1067, - "old:virtual_from_version:39503" => 1183, - "old:virtual_from_version:50399" => 1689, - "old:virtual_from_version:40557" => 1070, - "old:virtual_from_version:50320" => 1067, - "old:virtual_from_version:46538" => 1077, - "old:virtual_from_version:43059" => 2059, - "old:virtual_from_version:42929" => 1037, - "old:virtual_from_version:48020" => 2120, - "old:virtual_from_version:39521" => 1104, - "old:virtual_from_version:50380" => 3131, - "old:virtual_from_version:50170" => 3226, - "old:virtual_from_version:45751" => 1532, - "old:virtual_from_version:50043" => 1012, - "old:virtual_from_version:45927" => 1633, - "old:virtual_from_version:49441" => 1404, - "old:virtual_from_version:46067" => 1077, - "old:virtual_from_version:50419" => 1136, - "old:virtual_from_version:42679" => 1070, - "old:virtual_from_version:40810" => 1125, - "old:virtual_from_version:49279" => 1077, - "old:virtual_from_version:42251" => 1025, - "old:virtual_from_version:50390" => 1125, - "old:virtual_from_version:46940" => 1070, - "old:virtual_from_version:44417" => 1027, - "old:virtual_from_version:44447" => 1037, - "old:virtual_from_version:39241" => 1109, - "old:virtual_from_version:39524" => 1025, - "old:virtual_from_version:49494" => 1404, - "old:virtual_from_version:47853" => 1585, - "old:virtual_from_version:47347" => 1125, - "old:virtual_from_version:49521" => 1580, - "old:virtual_from_version:50537" => 1381, - "old:virtual_from_version:47788" => 1077, - "old:virtual_from_version:42068" => 1077, - "old:virtual_from_version:40484" => 1370, - "old:virtual_from_version:46014" => 1105, - "old:virtual_from_version:49771" => 3131, - "old:virtual_from_version:42809" => 1037, - "old:virtual_from_version:42728" => 1237, - "old:virtual_from_version:44408" => 1016, - "old:virtual_from_version:40748" => 1025, - "old:virtual_from_version:43082" => 2079, - "old:virtual_from_version:40716" => 1077, - "old:virtual_from_version:42097" => 1110, - "old:virtual_from_version:45817" => 1019, - "old:virtual_from_version:45338" => 1125, - "old:virtual_from_version:46768" => 1517, - "old:virtual_from_version:44542" => 1077, - "old:virtual_from_version:47327" => 1125, - "old:virtual_from_version:44589" => 1077, - "old:virtual_from_version:40402" => 1352, - "old:virtual_from_version:42119" => 1070, - "old:virtual_from_version:49448" => 1689, - "old:virtual_from_version:49216" => 1190, - "old:virtual_from_version:46434" => 1077, - "old:virtual_from_version:45654" => 1009, - "old:virtual_from_version:50376" => 1070, - "old:virtual_from_version:47775" => 1689, - "old:virtual_from_version:49444" => 1070, - "old:virtual_from_version:44951" => 1070, - "old:virtual_from_version:50727" => 1070, - "old:virtual_from_version:40927" => 1070, - "old:virtual_from_version:40666" => 1012, - "old:virtual_from_version:50119" => 1112, - "old:virtual_from_version:42800" => 1498, - "old:virtual_from_version:44510" => 1532, - "old:virtual_from_version:44611" => 1125, - "old:virtual_from_version:44893" => 1048, - "old:virtual_from_version:46993" => 1077, - "old:virtual_from_version:46608" => 1070, - "old:virtual_from_version:45968" => 1070, - "old:virtual_from_version:47840" => 1689, - "old:virtual_from_version:46611" => 1012, - "old:virtual_from_version:42585" => 1009, - "old:virtual_from_version:44264" => 1077, - "old:virtual_from_version:46008" => 1125, - "old:virtual_from_version:46059" => 1070, - "old:virtual_from_version:42393" => 1037, - "old:virtual_from_version:40997" => 1037, - "old:virtual_from_version:44707" => 1037, - "old:virtual_from_version:45312" => 1584, - "old:virtual_from_version:47369" => 1109, - "old:virtual_from_version:46995" => 3008, - "old:virtual_from_version:50745" => 1689, - "old:virtual_from_version:50213" => 1070, - "old:virtual_from_version:49634" => 1532, - "old:virtual_from_version:42774" => 1110, - "old:virtual_from_version:47415" => 1105, - "old:virtual_from_version:42260" => 1000, - "old:virtual_from_version:46341" => 1671, - "old:virtual_from_version:47112" => 3019, - "old:virtual_from_version:42069" => 1037, - "old:virtual_from_version:47389" => 1037, - "old:virtual_from_version:40700" => 1025, - "old:virtual_from_version:49296" => 1580, - "old:virtual_from_version:49789" => 1070, - "old:virtual_from_version:42793" => 1009, - "old:virtual_from_version:50259" => 1689, - "old:virtual_from_version:49434" => 1070, - "old:virtual_from_version:45785" => 1048, - "old:virtual_from_version:44485" => 1107, - "old:virtual_from_version:49673" => 1136, - "old:virtual_from_version:47421" => 1109, - "old:virtual_from_version:40918" => 1070, - "old:virtual_from_version:45284" => 1077, - "old:virtual_from_version:42860" => 1498, - "old:virtual_from_version:49822" => 1565, - "old:virtual_from_version:46463" => 1172, - "old:virtual_from_version:50710" => 1070, - "old:virtual_from_version:49052" => 3094, - "old:virtual_from_version:49870" => 1689, - "old:virtual_from_version:42046" => 1037, - "old:virtual_from_version:44519" => 1112, - "old:virtual_from_version:50028" => 1032, - "old:virtual_from_version:43096" => 2088, - "old:virtual_from_version:18960" => 1041, - "old:virtual_from_version:44157" => 1125, - "old:virtual_from_version:47352" => 1070, - "old:virtual_from_version:42822" => 1025, - "old:virtual_from_version:44762" => 1062, - "old:virtual_from_version:45362" => 1585, - "old:virtual_from_version:42199" => 1070, - "old:virtual_from_version:42778" => 1009, - "old:virtual_from_version:47110" => 1640, - "old:virtual_from_version:46533" => 1077, - "old:virtual_from_version:42045" => 1077, - "old:virtual_from_version:49224" => 1070, - "old:virtual_from_version:40909" => 1077, - "old:virtual_from_version:40964" => 1037, - "old:virtual_from_version:40662" => 1070, - "old:virtual_from_version:40665" => 1009, - "old:virtual_from_version:49848" => 1537, - "old:virtual_from_version:47105" => 1583, - "old:virtual_from_version:42163" => 1172, - "old:virtual_from_version:49713" => 1404, - "old:virtual_from_version:45511" => 1105, - "old:virtual_from_version:50485" => 3189, - "old:virtual_from_version:45956" => 1077, - "old:virtual_from_version:49671" => 3155, - "old:virtual_from_version:46441" => 1077, - "old:virtual_from_version:39907" => 1222, - "old:virtual_from_version:47224" => 1077, - "old:virtual_from_version:46706" => 1697, - "old:virtual_from_version:44070" => 1037, - "old:virtual_from_version:45385" => 1125, - "old:virtual_from_version:35826" => 1000, - "old:virtual_from_version:44077" => 1077, - "old:virtual_from_version:47669" => 1112, - "old:virtual_from_version:39895" => 1007, - "old:virtual_from_version:45583" => 1615, - "old:virtual_from_version:44469" => 1077, - "old:virtual_from_version:50661" => 1110, - "old:virtual_from_version:50303" => 3131, - "old:virtual_from_version:49697" => 1640, - "old:virtual_from_version:40974" => 1007, - "old:virtual_from_version:42057" => 1077, - "old:virtual_from_version:45724" => 1009, - "old:virtual_from_version:46306" => 1125, - "old:virtual_from_version:46968" => 3013, - "old:virtual_from_version:50375" => 1007, - "old:virtual_from_version:50181" => 3131, - "old:virtual_from_version:50448" => 1070, - "old:virtual_from_version:42802" => 1172, - "old:virtual_from_version:47975" => 1649, - "old:virtual_from_version:46506" => 1112, - "old:virtual_from_version:47181" => 1125, - "old:virtual_from_version:46644" => 1077, - "old:virtual_from_version:49669" => 1404, - "old:virtual_from_version:39222" => 1110, - "old:virtual_from_version:44680" => 1070, - "old:virtual_from_version:47744" => 1077, - "old:virtual_from_version:46671" => 1070, - "old:virtual_from_version:40869" => 1222, - "old:virtual_from_version:44470" => 1037, - "old:virtual_from_version:46430" => 1587, - "old:virtual_from_version:49491" => 1659, - "old:virtual_from_version:42957" => 1070, - "old:virtual_from_version:46765" => 1136, - "old:virtual_from_version:44935" => 1078, - "old:virtual_from_version:40775" => 1070, - "old:virtual_from_version:47629" => 1070, - "old:virtual_from_version:38758" => 1125, - "old:virtual_from_version:45773" => 1067, - "old:virtual_from_version:45424" => 1007, - "old:virtual_from_version:42889" => 1067, - "old:virtual_from_version:44681" => 1009, - "old:virtual_from_version:44127" => 1077, - "old:virtual_from_version:44699" => 1037, - "old:virtual_from_version:46178" => 1125, - "old:virtual_from_version:42258" => 1077, - "old:virtual_from_version:44831" => 1024, - "old:virtual_from_version:46517" => 1109, - "old:virtual_from_version:44529" => 1037, - "old:virtual_from_version:47185" => 1404, - "old:virtual_from_version:42677" => 1109, - "old:virtual_from_version:45661" => 1070, - "old:virtual_from_version:44560" => 1070, - "old:virtual_from_version:40951" => 1070, - "old:virtual_from_version:45113" => 1517, - "old:virtual_from_version:45008" => 1413, - "old:virtual_from_version:49359" => 1125, - "old:virtual_from_version:44703" => 1539, - "old:virtual_from_version:42643" => 1037, - "old:virtual_from_version:47340" => 1037, - "old:virtual_from_version:42133" => 1077, - "old:virtual_from_version:47166" => 1001, - "old:virtual_from_version:45528" => 1136, - "old:virtual_from_version:45249" => 1064, - "old:virtual_from_version:50549" => 3259, - "old:virtual_from_version:43042" => 2054, - "old:virtual_from_version:44064" => 1070, - "old:virtual_from_version:45560" => 1109, - "old:virtual_from_version:42353" => 1037, - "old:virtual_from_version:38361" => 1109, - "old:virtual_from_version:46387" => 1070, - "old:virtual_from_version:42135" => 1110, - "old:virtual_from_version:42244" => 1009, - "old:virtual_from_version:49866" => 3002, - "old:virtual_from_version:42334" => 1025, - "old:virtual_from_version:42654" => 1077, - "old:virtual_from_version:44081" => 1107, - "old:virtual_from_version:40577" => 1077, - "old:virtual_from_version:46760" => 1689, - "old:virtual_from_version:42444" => 1037, - "old:virtual_from_version:40661" => 1107, - "old:virtual_from_version:46105" => 1077, - "old:virtual_from_version:46911" => 1397, - "old:virtual_from_version:45894" => 1077, - "old:virtual_from_version:42450" => 1037, - "old:virtual_from_version:49533" => 1532, - "old:virtual_from_version:45397" => 1404, - "old:virtual_from_version:40414" => 1009, - "old:virtual_from_version:50605" => 3259, - "old:virtual_from_version:46811" => 1077, - "old:virtual_from_version:50147" => 1032, - "old:virtual_from_version:50265" => 1070, - "old:virtual_from_version:49383" => 1077, - "old:virtual_from_version:45262" => 1022, - "old:virtual_from_version:47981" => 1574, - "old:virtual_from_version:49423" => 1070, - "old:virtual_from_version:50768" => 1353, - "old:virtual_from_version:46674" => 1070, - "old:virtual_from_version:44495" => 1077, - "old:virtual_from_version:47964" => 1689, - "old:virtual_from_version:49264" => 1689, - "old:virtual_from_version:50540" => 1489, - "old:virtual_from_version:42311" => 1000, - "old:virtual_from_version:49075" => 3094, - "old:virtual_from_version:49377" => 1070, - "old:virtual_from_version:47507" => 1005, - "old:virtual_from_version:47419" => 1007, - "old:virtual_from_version:42128" => 1110, - "old:virtual_from_version:45358" => 1404, - "old:virtual_from_version:50338" => 3214, - "old:virtual_from_version:43003" => 2028, - "old:virtual_from_version:42190" => 1009, - "old:virtual_from_version:42205" => 1077, - "old:virtual_from_version:45667" => 1025, - "old:virtual_from_version:38828" => 1134, - "old:virtual_from_version:50491" => 3221, - "old:virtual_from_version:42027" => 1077, - "old:virtual_from_version:50285" => 1125, - "old:virtual_from_version:49110" => 1649, - "old:virtual_from_version:44271" => 1009, - "old:virtual_from_version:50109" => 3221, - "old:virtual_from_version:45074" => 1349, - "old:virtual_from_version:42109" => 1077, - "old:virtual_from_version:40383" => 1025, - "old:virtual_from_version:44063" => 1037, - "old:virtual_from_version:50574" => 1070, - "old:virtual_from_version:44718" => 1009, - "old:virtual_from_version:38562" => 1109, - "old:virtual_from_version:42223" => 1107, - "old:virtual_from_version:40971" => 1414, - "old:virtual_from_version:49389" => 1172, - "old:virtual_from_version:44812" => 1005, - "old:virtual_from_version:46904" => 3006, - "old:virtual_from_version:49300" => 1070, - "old:virtual_from_version:45235" => 1578, - "old:virtual_from_version:42612" => 1070, - "old:virtual_from_version:30081" => 1094, - "old:virtual_from_version:42224" => 1070, - "old:virtual_from_version:49630" => 1158, - "old:virtual_from_version:46933" => 1583, - "old:virtual_from_version:45924" => 1009, - "old:virtual_from_version:40949" => 1172, - "old:virtual_from_version:49807" => 3198, - "old:virtual_from_version:47023" => 1689, - "old:virtual_from_version:42113" => 1037, - "old:virtual_from_version:45898" => 1070, - "old:virtual_from_version:46052" => 1006, - "old:virtual_from_version:44743" => 1224, - "old:virtual_from_version:42400" => 1070, - "old:virtual_from_version:49922" => 3208, - "old:virtual_from_version:50506" => 3259, - "old:virtual_from_version:40628" => 1077, - "old:virtual_from_version:41016" => 2025, - "old:virtual_from_version:44758" => 1070, - "old:virtual_from_version:42565" => 1070, - "old:virtual_from_version:42265" => 1077, - "old:virtual_from_version:42542" => 1077, - "old:virtual_from_version:50416" => 1314, - "old:virtual_from_version:47924" => 1689, - "old:virtual_from_version:47408" => 1077, - "old:virtual_from_version:50548" => 3236, - "old:virtual_from_version:40850" => 1070, - "old:virtual_from_version:40302" => 1062, - "old:virtual_from_version:45524" => 1070, - "old:virtual_from_version:49335" => 1077, - "old:virtual_from_version:44006" => 1490, - "old:virtual_from_version:50517" => 3263, - "old:virtual_from_version:50450" => 1112, - "old:virtual_from_version:46246" => 1070, - "old:virtual_from_version:49927" => 3209, - "old:virtual_from_version:45060" => 1095, - "old:virtual_from_version:45412" => 1136, - "old:virtual_from_version:42970" => 1070, - "old:virtual_from_version:42325" => 1070, - "old:virtual_from_version:42495" => 1037, - "old:virtual_from_version:42753" => 1025, - "old:virtual_from_version:42918" => 1037, - "old:virtual_from_version:45564" => 1077, - "old:virtual_from_version:45639" => 1172, - "old:virtual_from_version:40779" => 1070, - "old:virtual_from_version:47101" => 1352, - "old:virtual_from_version:49017" => 1077, - "old:virtual_from_version:49881" => 1125, - "old:virtual_from_version:46490" => 1006, - "old:virtual_from_version:44438" => 1110, - "old:virtual_from_version:42769" => 1007, - "old:virtual_from_version:45155" => 1136, - "old:virtual_from_version:47212" => 1125, - "old:virtual_from_version:42264" => 1070, - "old:virtual_from_version:49865" => 1689, - "old:virtual_from_version:46460" => 1659, - "old:virtual_from_version:46070" => 1007, - "old:virtual_from_version:50276" => 3218, - "old:virtual_from_version:44902" => 1009, - "old:virtual_from_version:45529" => 1070, - "old:virtual_from_version:42854" => 1172, - "old:virtual_from_version:47199" => 1109, - "old:virtual_from_version:40242" => 1081, - "old:virtual_from_version:45106" => 1125, - "old:virtual_from_version:46280" => 1070, - "old:virtual_from_version:42549" => 1077, - "old:virtual_from_version:49839" => 1006, - "old:virtual_from_version:49188" => 1077, - "old:virtual_from_version:38680" => 1077, - "old:virtual_from_version:45646" => 1404, - "old:virtual_from_version:49029" => 1649, - "old:virtual_from_version:40819" => 1000, - "old:virtual_from_version:49306" => 1585, - "old:virtual_from_version:38783" => 1069, - "old:virtual_from_version:42403" => 1404, - "old:virtual_from_version:47218" => 3016, - "old:virtual_from_version:44233" => 1077, - "old:virtual_from_version:49101" => 3146, - "old:virtual_from_version:42556" => 1077, - "old:virtual_from_version:46129" => 1070, - "old:virtual_from_version:50236" => 3131, - "old:virtual_from_version:45833" => 1404, - "old:virtual_from_version:50126" => 1172, - "old:virtual_from_version:44904" => 1110, - "old:virtual_from_version:46721" => 1125, - "old:virtual_from_version:42704" => 1067, - "old:virtual_from_version:46146" => 1077, - "old:virtual_from_version:49944" => 1314, - "old:virtual_from_version:45780" => 1062, - "old:virtual_from_version:49477" => 1314, - "old:virtual_from_version:49361" => 1404, - "old:virtual_from_version:49831" => 1404, - "old:virtual_from_version:49198" => 1689, - "old:virtual_from_version:40485" => 1070, - "old:virtual_from_version:45023" => 1091, - "old:virtual_from_version:38912" => 1083, - "old:virtual_from_version:42595" => 1109, - "old:virtual_from_version:49343" => 1107, - "old:virtual_from_version:47947" => 1077, - "old:virtual_from_version:45138" => 1550, - "old:virtual_from_version:49489" => 1107, - "old:virtual_from_version:47737" => 1077, - "old:virtual_from_version:45531" => 1077, - "old:virtual_from_version:47967" => 1070, - "old:virtual_from_version:42695" => 1009, - "old:virtual_from_version:47567" => 1070, - "old:virtual_from_version:49840" => 1489, - "old:virtual_from_version:45813" => 1621, - "old:virtual_from_version:45858" => 1067, - "old:virtual_from_version:44172" => 1009, - "old:virtual_from_version:46208" => 1025, - "old:virtual_from_version:44660" => 1009, - "old:virtual_from_version:40944" => 1070, - "old:virtual_from_version:46136" => 1070, - "old:virtual_from_version:49399" => 1070, - "old:virtual_from_version:40875" => 1037, - "old:virtual_from_version:44648" => 1037, - "old:virtual_from_version:47173" => 1105, - "old:virtual_from_version:40698" => 1009, - "old:virtual_from_version:47996" => 1109, - "old:virtual_from_version:47898" => 1109, - "old:virtual_from_version:49986" => 1025, - "old:virtual_from_version:47160" => 1689, - "old:virtual_from_version:44934" => 1070, - "old:virtual_from_version:41013" => 2023, - "old:virtual_from_version:42233" => 1009, - "old:virtual_from_version:42225" => 1009, - "old:virtual_from_version:49910" => 3194, - "old:virtual_from_version:42749" => 1067, - "old:virtual_from_version:47645" => 1621, - "old:virtual_from_version:42964" => 1070, - "old:virtual_from_version:46369" => 1070, - "old:virtual_from_version:43029" => 2029, - "old:virtual_from_version:49730" => 1666, - "old:virtual_from_version:44071" => 1110, - "old:virtual_from_version:49350" => 1077, - "old:virtual_from_version:47362" => 1109, - "old:virtual_from_version:38692" => 1062, - "old:virtual_from_version:46569" => 1077, - "old:virtual_from_version:45277" => 1105, - "old:virtual_from_version:40972" => 1037, - "old:virtual_from_version:44335" => 1077, - "old:virtual_from_version:40537" => 1077, - "old:virtual_from_version:40261" => 1314, - "old:virtual_from_version:45368" => 1009, - "old:virtual_from_version:44099" => 1070, - "old:virtual_from_version:44501" => 1070, - "old:virtual_from_version:49292" => 1070, - "old:virtual_from_version:42797" => 1037, - "old:virtual_from_version:49084" => 3094, - "old:virtual_from_version:47171" => 1343, - "old:virtual_from_version:44206" => 1125, - "old:virtual_from_version:50362" => 1689, - "old:virtual_from_version:44734" => 1070, - "old:virtual_from_version:46134" => 1077, - "old:virtual_from_version:45344" => 1031, - "old:virtual_from_version:50103" => 1172, - "old:virtual_from_version:47521" => 1077, - "old:virtual_from_version:40697" => 1070, - "old:virtual_from_version:40880" => 1037, - "old:virtual_from_version:50196" => 1172, - "old:virtual_from_version:47559" => 1037, - "old:virtual_from_version:44126" => 1009, - "old:virtual_from_version:42144" => 1070, - "old:virtual_from_version:44977" => 1051, - "old:virtual_from_version:43020" => 2045, - "old:virtual_from_version:49442" => 1580, - "old:virtual_from_version:47400" => 3008, - "old:virtual_from_version:49529" => 1410, - "old:virtual_from_version:42518" => 1009, - "old:virtual_from_version:47249" => 1070, - "old:virtual_from_version:49535" => 3008, - "old:virtual_from_version:49301" => 1136, - "old:virtual_from_version:50351" => 1659, - "old:virtual_from_version:46204" => 1077, - "old:virtual_from_version:40928" => 1077, - "old:virtual_from_version:44348" => 1037, - "old:virtual_from_version:46353" => 1190, - "old:virtual_from_version:49656" => 1070, - "old:virtual_from_version:49063" => 1077, - "old:virtual_from_version:50756" => 1125, - "old:virtual_from_version:47305" => 3042, - "old:virtual_from_version:42407" => 1037, - "old:virtual_from_version:45054" => 1081, - "old:virtual_from_version:44169" => 1136, - "old:virtual_from_version:47041" => 1070, - "old:virtual_from_version:45035" => 1017, - "old:virtual_from_version:45270" => 1019, - "old:virtual_from_version:47838" => 1587, - "old:virtual_from_version:50245" => 1689, - "old:virtual_from_version:44780" => 1070, - "old:virtual_from_version:40842" => 1077, - "old:virtual_from_version:46298" => 1070, - "old:virtual_from_version:42531" => 1070, - "old:virtual_from_version:50528" => 1136, - "old:virtual_from_version:45643" => 1067, - "old:virtual_from_version:42437" => 1077, - "old:virtual_from_version:45797" => 1015, - "old:virtual_from_version:42326" => 1009, - "old:virtual_from_version:44719" => 1025, - "old:virtual_from_version:44961" => 1062, - "old:virtual_from_version:46600" => 1070, - "old:virtual_from_version:45889" => 1077, - "old:virtual_from_version:47734" => 1125, - "old:virtual_from_version:47965" => 3016, - "old:virtual_from_version:42642" => 1077, - "old:virtual_from_version:44566" => 1070, - "old:virtual_from_version:49457" => 1070, - "old:virtual_from_version:50691" => 1689, - "old:virtual_from_version:45313" => 1585, - "old:virtual_from_version:46725" => 1537, - "old:virtual_from_version:47828" => 1125, - "old:virtual_from_version:46796" => 1172, - "old:virtual_from_version:42845" => 1109, - "old:virtual_from_version:44769" => 1489, - "old:virtual_from_version:49699" => 1158, - "old:virtual_from_version:42997" => 1037, - "old:virtual_from_version:47700" => 1070, - "old:virtual_from_version:45745" => 1070, - "old:virtual_from_version:47321" => 1125, - "old:virtual_from_version:46800" => 1666, - "old:virtual_from_version:46673" => 1077, - "old:virtual_from_version:50484" => 1410, - "old:virtual_from_version:47109" => 1070, - "old:virtual_from_version:44067" => 1107, - "old:virtual_from_version:46401" => 1537, - "old:virtual_from_version:47652" => 1070, - "old:virtual_from_version:46946" => 1077, - "old:virtual_from_version:47696" => 1077, - "old:virtual_from_version:50598" => 1136, - "old:virtual_from_version:49639" => 1070, - "old:virtual_from_version:44735" => 1077, - "old:virtual_from_version:47579" => 1077, - "old:virtual_from_version:15764" => 1029, - "old:virtual_from_version:45864" => 1627, - "old:virtual_from_version:50737" => 1585, - "old:virtual_from_version:49175" => 1659, - "old:virtual_from_version:47117" => 1656, - "old:virtual_from_version:40766" => 1107, - "old:virtual_from_version:47121" => 1125, - "old:virtual_from_version:40865" => 1411, - "old:virtual_from_version:45585" => 1136, - "old:virtual_from_version:44052" => 1070, - "old:virtual_from_version:47874" => 1136, - "old:virtual_from_version:42791" => 1222, - "old:virtual_from_version:50037" => 3220, - "old:virtual_from_version:49433" => 1007, - "old:virtual_from_version:44418" => 1030, - "old:virtual_from_version:46884" => 1048, - "old:virtual_from_version:47684" => 1051, - "old:virtual_from_version:45246" => 1070, - "old:virtual_from_version:38518" => 1108, - "old:virtual_from_version:44320" => 1498, - "old:virtual_from_version:44583" => 1037, - "old:virtual_from_version:46874" => 1613, - "old:virtual_from_version:39316" => 1077, - "old:virtual_from_version:40573" => 1077, - "old:virtual_from_version:40562" => 1070, - "old:virtual_from_version:21275" => 1057, - "old:virtual_from_version:40393" => 1344, - "old:virtual_from_version:42795" => 1025, - "old:virtual_from_version:45520" => 1077, - "old:virtual_from_version:44484" => 1125, - "old:virtual_from_version:44537" => 1110, - "old:virtual_from_version:45823" => 1190, - "old:virtual_from_version:49360" => 1077, - "old:virtual_from_version:50254" => 1689, - "old:virtual_from_version:50533" => 1150, - "old:virtual_from_version:46257" => 1517, - "old:virtual_from_version:48002" => 2103, - "old:virtual_from_version:50194" => 3030, - "old:virtual_from_version:45905" => 1070, - "old:virtual_from_version:49808" => 1062, - "old:virtual_from_version:45400" => 1032, - "old:virtual_from_version:42449" => 1077, - "old:virtual_from_version:44573" => 1067, - "old:virtual_from_version:45281" => 1012, - "old:virtual_from_version:49782" => 3194, - "old:virtual_from_version:42390" => 1009, - "old:virtual_from_version:44720" => 1077, - "old:virtual_from_version:44268" => 1084, - "old:virtual_from_version:38964" => 1109, - "old:virtual_from_version:40950" => 1107, - "old:virtual_from_version:49876" => 1172, - "old:virtual_from_version:45501" => 1105, - "old:virtual_from_version:40924" => 1048, - "old:virtual_from_version:49733" => 1015, - "old:virtual_from_version:44061" => 1009, - "old:virtual_from_version:43022" => 2047, - "old:virtual_from_version:45772" => 1077, - "old:virtual_from_version:45319" => 1110, - "old:virtual_from_version:42657" => 1009, - "old:virtual_from_version:44598" => 1057, - "old:virtual_from_version:47746" => 3090, - "old:virtual_from_version:46293" => 1414, - "old:virtual_from_version:42546" => 1172, - "old:virtual_from_version:49374" => 3167, - "old:virtual_from_version:40618" => 1078, - "old:virtual_from_version:42458" => 1136, - "old:virtual_from_version:49740" => 1584, - "old:virtual_from_version:45301" => 1107, - "old:virtual_from_version:40567" => 1115, - "old:virtual_from_version:45969" => 1172, - "old:virtual_from_version:49408" => 1048, - "old:virtual_from_version:43087" => 2081, - "old:virtual_from_version:40807" => 1070, - "old:virtual_from_version:49331" => 1070, - "old:virtual_from_version:43070" => 2070, - "old:virtual_from_version:44016" => 1054, - "old:virtual_from_version:44628" => 1037, - "old:virtual_from_version:42913" => 1070, - "old:virtual_from_version:42165" => 1006, - "old:virtual_from_version:45798" => 1019, - "old:virtual_from_version:46174" => 1077, - "old:virtual_from_version:45958" => 1461, - "old:virtual_from_version:49384" => 1489, - "old:virtual_from_version:50302" => 1025, - "old:virtual_from_version:47152" => 1070, - "old:virtual_from_version:42292" => 1077, - "old:virtual_from_version:47085" => 3008, - "old:virtual_from_version:49562" => 1158, - "old:virtual_from_version:47741" => 1077, - "old:virtual_from_version:48036" => 2079, - "old:virtual_from_version:43063" => 2064, - "old:virtual_from_version:44807" => 1077, - "old:virtual_from_version:49060" => 3094, - "old:virtual_from_version:46956" => 1062, - "old:virtual_from_version:49905" => 3205, - "old:virtual_from_version:44466" => 1107, - "old:virtual_from_version:44789" => 1107, - "old:virtual_from_version:46855" => 1509, - "old:virtual_from_version:49580" => 1035, - "old:virtual_from_version:42926" => 1070, - "old:virtual_from_version:46199" => 1407, - "old:virtual_from_version:45504" => 1532, - "old:virtual_from_version:47087" => 1125, - "old:virtual_from_version:42668" => 1070, - "old:virtual_from_version:42536" => 1000, - "old:virtual_from_version:49097" => 1012, - "old:virtual_from_version:49912" => 1348, - "old:virtual_from_version:45840" => 1107, - "old:virtual_from_version:45363" => 1587, - "old:virtual_from_version:47429" => 1109, - "old:virtual_from_version:42343" => 1077, - "old:virtual_from_version:49385" => 1489, - "old:virtual_from_version:45600" => 1077, - "old:virtual_from_version:47004" => 1070, - "old:virtual_from_version:47468" => 1109, - "old:virtual_from_version:44093" => 1070, - "old:virtual_from_version:45699" => 1070, - "old:virtual_from_version:45314" => 1009, - "old:virtual_from_version:42060" => 1067, - "old:virtual_from_version:42024" => 1037, - "old:virtual_from_version:40377" => 1032, - "old:virtual_from_version:49040" => 1037, - "old:virtual_from_version:42962" => 1110, - "old:virtual_from_version:46761" => 1575, - "old:virtual_from_version:47832" => 1109, - "old:virtual_from_version:44706" => 1077, - "old:virtual_from_version:40898" => 1009, - "old:virtual_from_version:45944" => 1136, - "old:virtual_from_version:50645" => 1070, - "old:virtual_from_version:50121" => 1031, - "old:virtual_from_version:47449" => 1070, - "old:virtual_from_version:44209" => 1009, - "old:virtual_from_version:42869" => 1070, - "old:virtual_from_version:39734" => 1059, - "old:virtual_from_version:49461" => 1404, - "old:virtual_from_version:46828" => 1077, - "old:virtual_from_version:46670" => 1404, - "old:virtual_from_version:44578" => 1048, - "old:virtual_from_version:40584" => 1070, - "old:virtual_from_version:49000" => 1077, - "old:virtual_from_version:42117" => 1328, - "old:virtual_from_version:50718" => 1417, - "old:virtual_from_version:47517" => 1125, - "old:virtual_from_version:50589" => 3259, - "old:virtual_from_version:46958" => 1070, - "old:virtual_from_version:49845" => 1515, - "old:virtual_from_version:44914" => 1517, - "old:virtual_from_version:45325" => 1009, - "old:virtual_from_version:38368" => 1112, - "old:virtual_from_version:49059" => 1666, - "old:virtual_from_version:42902" => 1009, - "old:virtual_from_version:46854" => 3002, - "old:virtual_from_version:46798" => 1077, - "old:virtual_from_version:49018" => 3129, - "old:virtual_from_version:47635" => 1689, - "old:virtual_from_version:44746" => 1007, - "old:virtual_from_version:42906" => 1067, - "old:virtual_from_version:45298" => 1237, - "old:virtual_from_version:40946" => 1077, - "old:virtual_from_version:47084" => 1077, - "old:virtual_from_version:50571" => 3031, - "old:virtual_from_version:45649" => 1136, - "old:virtual_from_version:42037" => 1070, - "old:virtual_from_version:47161" => 3029, - "old:virtual_from_version:42878" => 1007, - "old:virtual_from_version:49258" => 1077, - "old:virtual_from_version:46536" => 1077, - "old:virtual_from_version:44034" => 1077, - "old:virtual_from_version:47295" => 1037, - "old:virtual_from_version:44907" => 1070, - "old:virtual_from_version:50713" => 1070, - "old:virtual_from_version:40904" => 1025, - "old:virtual_from_version:44117" => 1009, - "old:virtual_from_version:45157" => 1051, - "old:virtual_from_version:46812" => 3002, - "old:virtual_from_version:40760" => 1009, - "old:virtual_from_version:49391" => 1095, - "old:virtual_from_version:47386" => 3008, - "old:virtual_from_version:39264" => 1144, - "old:virtual_from_version:47378" => 1077, - "old:virtual_from_version:44580" => 1078, - "old:virtual_from_version:44774" => 1350, - "old:virtual_from_version:45132" => 1009, - "old:virtual_from_version:50425" => 1035, - "old:virtual_from_version:47526" => 1037, - "old:virtual_from_version:44970" => 1043, - "old:virtual_from_version:50652" => 1417, - "old:virtual_from_version:47706" => 1321, - "old:virtual_from_version:44307" => 1125, - "old:virtual_from_version:42013" => 1037, - "old:virtual_from_version:45122" => 1125, - "old:virtual_from_version:45238" => 1136, - "old:virtual_from_version:44471" => 1110, - "old:virtual_from_version:42175" => 1418, - "old:virtual_from_version:49210" => 3155, - "old:virtual_from_version:50206" => 1659, - "old:virtual_from_version:40495" => 1077, - "old:virtual_from_version:46158" => 1077, - "old:virtual_from_version:24814" => 1040, - "old:virtual_from_version:49679" => 3190, - "old:virtual_from_version:45139" => 1009, - "old:virtual_from_version:44141" => 1037, - "old:virtual_from_version:45709" => 1533, - "old:virtual_from_version:42659" => 1077, - "old:virtual_from_version:42694" => 1070, - "old:virtual_from_version:49066" => 3136, - "old:virtual_from_version:42909" => 1025, - "old:virtual_from_version:45839" => 1125, - "old:virtual_from_version:42050" => 1025, - "old:virtual_from_version:45682" => 1027, - "old:virtual_from_version:42032" => 1077, - "old:virtual_from_version:50002" => 3131, - "old:virtual_from_version:49272" => 3078, - "old:virtual_from_version:42942" => 1172, - "old:virtual_from_version:43010" => 2035, - "old:virtual_from_version:45711" => 1009, - "old:virtual_from_version:47800" => 1007, - "old:virtual_from_version:47379" => 1404, - "old:virtual_from_version:45403" => 1125, - "old:virtual_from_version:46162" => 1105, - "old:virtual_from_version:50035" => 3176, - "old:virtual_from_version:49714" => 1489, - "old:virtual_from_version:44650" => 1009, - "old:virtual_from_version:40684" => 1048, - "old:virtual_from_version:44522" => 1107, - "old:virtual_from_version:46295" => 1070, - "old:virtual_from_version:40712" => 1077, - "old:virtual_from_version:44051" => 1107, - "old:virtual_from_version:39042" => 1125, - "old:virtual_from_version:49362" => 1070, - "old:virtual_from_version:44439" => 1067, - "old:virtual_from_version:45906" => 1125, - "old:virtual_from_version:40497" => 1328, - "old:virtual_from_version:46381" => 1109, - "old:virtual_from_version:40591" => 1070, - "old:virtual_from_version:49508" => 1125, - "old:virtual_from_version:42949" => 1070, - "old:virtual_from_version:46984" => 1585, - "old:virtual_from_version:46699" => 1696, - "old:virtual_from_version:46750" => 1699, - "old:virtual_from_version:46292" => 1077, - "old:virtual_from_version:45837" => 1070, - "old:virtual_from_version:50122" => 3131, - "old:virtual_from_version:49702" => 1583, - "old:virtual_from_version:42396" => 1009, - "old:virtual_from_version:49964" => 3211, - "old:virtual_from_version:50153" => 1059, - "old:virtual_from_version:49756" => 1172, - "old:virtual_from_version:46485" => 1105, - "old:virtual_from_version:47689" => 1689, - "old:virtual_from_version:45088" => 1116, - "old:virtual_from_version:40856" => 1009, - "old:virtual_from_version:45085" => 1009, - "old:virtual_from_version:49879" => 3131, - "old:virtual_from_version:49584" => 1136, - "old:virtual_from_version:47022" => 1580, - "old:virtual_from_version:49860" => 1025, - "old:virtual_from_version:39804" => 1088, - "old:virtual_from_version:44427" => 1112, - "old:virtual_from_version:40867" => 1077, - "old:virtual_from_version:49980" => 1070, - "old:virtual_from_version:40976" => 1077, - "old:virtual_from_version:49718" => 1037, - "old:virtual_from_version:46528" => 1070, - "old:virtual_from_version:50095" => 1172, - "old:virtual_from_version:49351" => 1077, - "old:virtual_from_version:47102" => 1070, - "old:virtual_from_version:45159" => 1125, - "old:virtual_from_version:49936" => 1100, - "old:virtual_from_version:46115" => 1517, - "old:virtual_from_version:46328" => 1125, - "old:virtual_from_version:42047" => 1110, - "old:virtual_from_version:46615" => 1063, - "old:virtual_from_version:43038" => 2037, - "old:virtual_from_version:45247" => 1063, - "old:virtual_from_version:42324" => 1172, - "old:virtual_from_version:49540" => 3181, - "old:virtual_from_version:45824" => 1084, - "old:virtual_from_version:46578" => 1077, - "old:virtual_from_version:37911" => 1090, - "old:virtual_from_version:42072" => 1077, - "old:virtual_from_version:42358" => 1025, - "old:virtual_from_version:46943" => 1109, - "old:virtual_from_version:46852" => 1666, - "old:virtual_from_version:45655" => 1077, - "old:virtual_from_version:45413" => 1112, - "old:virtual_from_version:45801" => 1172, - "old:virtual_from_version:40832" => 1123, - "old:virtual_from_version:50513" => 1584, - "old:virtual_from_version:40479" => 1025, - "old:virtual_from_version:40605" => 1025, - "old:virtual_from_version:46643" => 1070, - "old:virtual_from_version:40977" => 1037, - "old:virtual_from_version:50150" => 1172, - "old:virtual_from_version:44683" => 1077, - "old:virtual_from_version:46876" => 1070, - "old:virtual_from_version:47862" => 1404, - "old:virtual_from_version:46860" => 1007, - "old:virtual_from_version:44868" => 1070, - "old:virtual_from_version:45710" => 1070, - "old:virtual_from_version:46075" => 1077, - "old:virtual_from_version:47074" => 1659, - "old:virtual_from_version:45630" => 1172, - "old:virtual_from_version:44328" => 1077, - "old:virtual_from_version:46698" => 1020, - "old:virtual_from_version:45048" => 1037, - "old:virtual_from_version:44497" => 1110, - "old:virtual_from_version:15732" => 1005, - "old:virtual_from_version:44488" => 1023, - "old:virtual_from_version:49427" => 1070, - "old:virtual_from_version:44848" => 1009, - "old:virtual_from_version:46071" => 1070, - "old:virtual_from_version:40433" => 1108, - "old:virtual_from_version:50161" => 3058, - "old:virtual_from_version:47231" => 1070, - "old:virtual_from_version:42304" => 1025, - "old:virtual_from_version:49106" => 3094, - "old:virtual_from_version:49549" => 1410, - "old:virtual_from_version:45648" => 1172, - "old:virtual_from_version:40900" => 1077, - "old:virtual_from_version:44104" => 1125, - "old:virtual_from_version:44930" => 1077, - "old:virtual_from_version:50274" => 3131, - "old:virtual_from_version:43057" => 2057, - "old:virtual_from_version:44145" => 1009, - "old:virtual_from_version:38819" => 1108, - "old:virtual_from_version:46051" => 1025, - "old:virtual_from_version:44607" => 1037, - "old:virtual_from_version:50112" => 1172, - "old:virtual_from_version:44783" => 1070, - "old:virtual_from_version:40372" => 1009, - "old:virtual_from_version:40409" => 1048, - "old:virtual_from_version:45002" => 1025, - "old:virtual_from_version:46139" => 1070, - "old:virtual_from_version:46223" => 1007, - "old:virtual_from_version:42310" => 1037, - "old:virtual_from_version:44649" => 1070, - "old:virtual_from_version:42936" => 1037, - "old:virtual_from_version:47760" => 1109, - "old:virtual_from_version:44208" => 1070, - "old:virtual_from_version:47250" => 1125, - "old:virtual_from_version:42911" => 1037, - "old:virtual_from_version:46503" => 1584, - "old:virtual_from_version:50340" => 1070, - "old:virtual_from_version:50091" => 1125, - "old:virtual_from_version:46973" => 1583, - "old:virtual_from_version:45316" => 1012, - "old:virtual_from_version:50096" => 1009, - "old:virtual_from_version:46683" => 1077, - "old:virtual_from_version:44736" => 1083, - "old:virtual_from_version:44007" => 1311, - "old:virtual_from_version:49088" => 3139, - "old:virtual_from_version:46414" => 1077, - "old:virtual_from_version:44623" => 1025, - "old:virtual_from_version:42107" => 1105, - "old:virtual_from_version:44369" => 1069, - "old:virtual_from_version:45838" => 1362, - "old:virtual_from_version:42062" => 1025, - "old:virtual_from_version:46461" => 1062, - "old:virtual_from_version:47372" => 3008, - "old:virtual_from_version:46468" => 1404, - "old:virtual_from_version:49450" => 3176, - "old:virtual_from_version:47393" => 1697, - "old:virtual_from_version:47843" => 3114, - "old:virtual_from_version:44105" => 1107, - "old:virtual_from_version:45584" => 1172, - "old:virtual_from_version:45684" => 1615, - "old:virtual_from_version:47154" => 1017, - "old:virtual_from_version:49136" => 1012, - "old:virtual_from_version:42722" => 1025, - "old:virtual_from_version:50730" => 3273, - "old:virtual_from_version:42157" => 1416, - "old:virtual_from_version:46793" => 3000, - "old:virtual_from_version:45320" => 1125, - "old:virtual_from_version:45455" => 1136, - "old:virtual_from_version:49051" => 3114, - "old:virtual_from_version:44196" => 1007, - "old:virtual_from_version:39152" => 1125, - "old:virtual_from_version:45462" => 1077, - "old:virtual_from_version:44388" => 1065, - "old:virtual_from_version:45285" => 1031, - "old:virtual_from_version:49284" => 3146, - "old:virtual_from_version:49625" => 3183, - "old:virtual_from_version:50739" => 3259, - "old:virtual_from_version:46977" => 1125, - "old:virtual_from_version:49780" => 1489, - "old:virtual_from_version:39585" => 1404, - "old:virtual_from_version:50133" => 3131, - "old:virtual_from_version:38683" => 1067, - "old:virtual_from_version:47367" => 1070, - "old:virtual_from_version:42514" => 1048, - "old:virtual_from_version:45712" => 1077, - "old:virtual_from_version:45415" => 1444, - "old:virtual_from_version:50203" => 1689, - "old:virtual_from_version:47205" => 1125, - "old:virtual_from_version:45794" => 1107, - "old:virtual_from_version:45125" => 1009, - "old:virtual_from_version:42781" => 1048, - "old:virtual_from_version:50344" => 3192, - "old:virtual_from_version:49065" => 3094, - "old:virtual_from_version:49778" => 1112, - "old:virtual_from_version:49972" => 3209, - "old:virtual_from_version:45747" => 1027, - "old:virtual_from_version:47366" => 1037, - "old:virtual_from_version:40913" => 1070, - "old:virtual_from_version:35710" => 1017, - "old:virtual_from_version:47210" => 1321, - "old:virtual_from_version:45156" => 1404, - "old:virtual_from_version:46339" => 1105, - "old:virtual_from_version:42281" => 1423, - "old:virtual_from_version:45417" => 1136, - "old:virtual_from_version:44458" => 1112, - "old:virtual_from_version:42285" => 1222, - "old:virtual_from_version:40546" => 1116, - "old:virtual_from_version:40170" => 1076, - "old:virtual_from_version:42532" => 1077, - "old:virtual_from_version:45093" => 1105, - "old:virtual_from_version:36614" => 1006, - "old:virtual_from_version:44925" => 1077, - "old:virtual_from_version:47835" => 1077, - "old:virtual_from_version:49518" => 1025, - "old:virtual_from_version:47581" => 1568, - "old:virtual_from_version:50364" => 1035, - "old:virtual_from_version:47433" => 1689, - "old:virtual_from_version:43088" => 2082, - "old:virtual_from_version:45771" => 1025, - "old:virtual_from_version:47010" => 3015, - "old:virtual_from_version:42049" => 1009, - "old:virtual_from_version:47488" => 1172, - "old:virtual_from_version:44621" => 1070, - "old:virtual_from_version:50098" => 3221, - "old:virtual_from_version:45451" => 1077, - "old:virtual_from_version:50086" => 1172, - "old:virtual_from_version:47142" => 3025, - "old:virtual_from_version:38340" => 1070, - "old:virtual_from_version:46494" => 1321, - "old:virtual_from_version:39993" => 2008, - "old:virtual_from_version:40245" => 1152, - "old:virtual_from_version:49683" => 1070, - "old:virtual_from_version:47174" => 1077, - "old:virtual_from_version:50649" => 1067, - "old:virtual_from_version:46605" => 1077, - "old:virtual_from_version:40291" => 1110, - "old:virtual_from_version:41006" => 1168, - "old:virtual_from_version:40046" => 1007, - "old:virtual_from_version:46691" => 1125, - "old:virtual_from_version:50369" => 3131, - "old:virtual_from_version:44331" => 1070, - "old:virtual_from_version:42200" => 1009, - "old:virtual_from_version:45746" => 1125, - "old:virtual_from_version:44215" => 1109 -} \ No newline at end of file diff --git a/lib/tasks/schema.rake b/lib/tasks/schema.rake index af1e0ca3c9..81e30e7f78 100644 --- a/lib/tasks/schema.rake +++ b/lib/tasks/schema.rake @@ -1,10 +1,10 @@ # frozen_string_literal: true -require_relative '../../config/initializers/graphql_client' +# require_relative '../../config/initializers/graphql_client' -namespace :schema do - desc 'Update GitHub GraphQL schema' - task :update do - GraphQL::Client.dump_schema(GitHub::HTTPAdapter, 'data/schema.json') - end -end +# namespace :schema do +# desc 'Update GitHub GraphQL schema' +# task :update do +# GraphQL::Client.dump_schema(GitHub::HTTPAdapter, 'data/schema.json') +# end +# end diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb index b4457f965e..aaba7ccc84 100644 --- a/test/application_system_test_case.rb +++ b/test/application_system_test_case.rb @@ -104,7 +104,6 @@ def tom_select(selector, values, open_to_add: false) element = find(ts_wrapper_selector) element.click - return unless page.has_selector?("#{ts_wrapper_selector} > .ts-dropdown") if multiple @@ -137,6 +136,7 @@ def date_picker_fill_in(selector, value, index = 0) end def agent_search(name) + sleep 1 within(".search-inputs:last-of-type") do input = find("input[name^='agent']") agent_id = input[:name].split('agent').last @@ -151,11 +151,11 @@ def agent_search(name) end - def agent_fill(agent, parent_id: nil, enable_affiliations: true) - id = agent.id ? "/#{agent.id}": '' + def agent_fill(agent, parent_id: nil, is_affiliation: false) + id = agent.id ? "/#{agent.id}" : '' form = all("form[action=\"/agents#{id}\"]").first - within form do - choose "", option: agent.agentType, allow_label_click: true if enable_affiliations + within form do + choose "", option: agent.agentType, allow_label_click: true unless is_affiliation fill_in 'name', with: agent.name if agent.agentType.eql?('organization') @@ -168,11 +168,17 @@ def agent_fill(agent, parent_id: nil, enable_affiliations: true) fill_in 'email', with: agent.email end - list_inputs ".agents-identifiers", - "[identifiers]", agent.identifiers + identifier = agent.identifiers.first + + if agent.agentType.eql?('organization') + fill_in "_identifiers_0_notation", with: identifier['notation'] + else + fill_in "_identifiers_1_notation", with: identifier['notation'] + end - unless enable_affiliations + if is_affiliation || agent.agentType.eql?('organization') refute_selector ".agents-affiliations" + click_on "Save" if agent.agentType.eql?('organization') return end @@ -184,8 +190,7 @@ def agent_fill(agent, parent_id: nil, enable_affiliations: true) agent_id = agent_search(aff.name) id = parent_id && !parent_id.eql?('NEW_RECORD') ? "#{parent_id}_#{agent_id}" : agent_id within "turbo-frame[id=\"#{id}\"]" do - agent_fill(aff, enable_affiliations: false) - click_on "Save" + agent_fill(aff, is_affiliation: true) sleep 1 end end diff --git a/test/controllers/ontologies_controller_test.rb b/test/controllers/ontologies_controller_test.rb index 054b4eb90d..b286994b0e 100644 --- a/test/controllers/ontologies_controller_test.rb +++ b/test/controllers/ontologies_controller_test.rb @@ -39,4 +39,69 @@ class OntologiesControllerTest < ActionDispatch::IntegrationTest end end + + test 'test get STY in html format' do + get '/ontologies/STY', headers: { 'Accept' => 'text/html' } + assert_response :success + assert_equal 'text/html; charset=utf-8', response.content_type + end + + test 'test get STY in json format' do + get '/ontologies/STY', headers: { 'Accept' => 'application/json' } + assert_response :success + assert_equal 'application/json', response.content_type + + end + + test 'test get STY in xml format' do + get '/ontologies/STY', headers: { 'Accept' => 'application/xml' } + assert_equal 500, response.status # STY has only Turtle + end + + test 'test get STY in csv format' do + get '/ontologies/STY', headers: { 'Accept' => 'text/csv' } + assert_response :success + end + + test 'test get STY in turtle format' do + get '/ontologies/STY', headers: { 'Accept' => 'text/turtle' } + assert_response :success + end + + test 'test get STY in ntriples format' do + get '/ontologies/STY', headers: { 'Accept' => 'application/ntriples' } + assert_response :not_acceptable + end + + + test 'test get STY resource in html format' do + get '/ontologies/STY/T071', headers: { 'Accept' => 'text/html' } + assert_includes ["http://www.example.com/ontologies/STY?conceptid=http%3A%2F%2Fpurl.bioontology.org%2Fontology%2FSTY%2FT071&p=classes", "http://www.example.com/ontologies/STY?conceptid=http%3A%2F%2Fpurl.lirmm.fr%2Fontology%2FSTY%2FT071&p=classes"], response.location + assert_response :redirect + assert_equal "text/html; charset=utf-8" , response.content_type + end + + test 'test get STY resource in json format' do + get '/ontologies/STY/T071', headers: { 'Accept' => 'application/json' } + assert_response :success + assert_equal "application/ld+json; charset=utf-8" , response.content_type + end + + test 'test get STY resource in xml format' do + get '/ontologies/STY/T071', headers: { 'Accept' => 'application/xml' } + assert_response :success + assert_equal "application/rdf+xml; charset=utf-8" , response.content_type + end + + test 'test get STY resource in ntriples format' do + get '/ontologies/STY/T071', headers: { 'Accept' => 'application/n-triples' } + assert_response :success + assert_equal "application/n-triples; charset=utf-8" , response.content_type + end + + test 'test get STY resource in turtle format' do + get '/ontologies/STY/T071', headers: { 'Accept' => 'text/turtle' } + assert_response :success + assert_equal "text/turtle; charset=utf-8" , response.content_type + end end diff --git a/test/fixtures/agents.yml b/test/fixtures/agents.yml index ce32845e0b..73554419d2 100644 --- a/test/fixtures/agents.yml +++ b/test/fixtures/agents.yml @@ -4,8 +4,6 @@ agent1: email: "jonh@test.com" identifiers: - notation: "0000-0001-2345-6789" - - notation: "0000-0001-2345-6788" - - notation: "0000-0001-2345-6788" affiliations: - name: "Research Institute X" agentType: "organization" @@ -97,25 +95,6 @@ organization1: agentType: "organization" identifiers: - notation: "1234-5678" - affiliations: - - name: "Research Consortium A" - agentType: "organization" - identifiers: - - notation: "9876-5432" - affiliations: [ ] - email: "contact@researchconsortiumA.com" - acronym: "RCA" - homepage: "https://www.researchconsortiumA.com/" - - - name: "Innovation Hub B" - agentType: "organization" - identifiers: - - notation: "3456-7890" - affiliations: [ ] - email: "info@innovationhubb.com" - acronym: "IHB" - homepage: "https://www.innovationhubb.com/" - email: "info@techsolutionsgroup.com" acronym: "TSG" homepage: "https://www.techsolutionsgroup.com/" @@ -125,23 +104,6 @@ organization2: agentType: "organization" identifiers: - notation: "5678-9012" - affiliations: - - name: "Space Exploration Consortium" - agentType: "organization" - identifiers: - - notation: "1234-1234" - affiliations: [] - email: "contact@spaceconsortium.com" - acronym: "SEC" - homepage: "https://www.spaceconsortium.com/" - - name: "Tech Innovators Guild" - agentType: "organization" - identifiers: - - notation: "7890-1234" - affiliations: [] - email: "info@techinnovatorsguild.com" - acronym: "TIG" - homepage: "https://www.techinnovatorsguild.com/" email: "info@quantumdynamics.com" acronym: "QDS" homepage: "https://www.quantumdynamics.com/" @@ -151,23 +113,6 @@ organization3: agentType: "organization" identifiers: - notation: "2345-6789" - affiliations: - - name: "Health Research Alliance" - agentType: "organization" - identifiers: - - notation: "5678-9012" - affiliations: [] - email: "contact@healthresearchalliance.com" - acronym: "HRA" - homepage: "https://www.healthresearchalliance.com/" - - name: "GreenTech Innovations" - agentType: "organization" - identifiers: - - notation: "8901-2345" - affiliations: [] - email: "info@greentechinnovations.com" - acronym: "GTI" - homepage: "https://www.greentechinnovations.com/" email: "info@biotechsolutions.com" acronym: "BSI" homepage: "https://www.biotechsolutions.com/" diff --git a/test/fixtures/annotator.yml b/test/fixtures/annotator.yml new file mode 100644 index 0000000000..d678eb033a --- /dev/null +++ b/test/fixtures/annotator.yml @@ -0,0 +1,181 @@ +yaml_structure: regular +sample_response: + - annotatedClass: + prefLabel: Melanom + synonym: + - cilt kanseri + "@id": http://aims.fao.org/aos/agrovoc/c_4713 + "@type": http://www.w3.org/2002/07/owl#Class + links: + self: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713 + ontology: http://localhost:9393/ontologies/STY + children: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/children + parents: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/parents + descendants: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/descendants + ancestors: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/ancestors + instances: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/instances + tree: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/tree + notes: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/notes + mappings: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/mappings + ui: http://stageportal.lirmm.fr/ontologies/AGROVOC?p=classes&conceptid=http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713 + "@context": + self: http://www.w3.org/2002/07/owl#Class + ontology: http://localhost:9393/ontologies/STY + children: http://www.w3.org/2002/07/owl#Class + parents: http://www.w3.org/2002/07/owl#Class + descendants: http://www.w3.org/2002/07/owl#Class + ancestors: http://www.w3.org/2002/07/owl#Class + instances: http://data.bioontology.org/metadata/Instance + tree: http://www.w3.org/2002/07/owl#Class + notes: http://data.bioontology.org/metadata/Note + mappings: http://data.bioontology.org/metadata/Mapping + ui: http://www.w3.org/2002/07/owl#Class + "@context": + "@vocab": http://data.bioontology.org/metadata/ + prefLabel: http://www.w3.org/2004/02/skos/core#prefLabel + synonym: http://www.w3.org/2004/02/skos/core#altLabel + "@language": en + hierarchy: [] + annotations: + - from: 1 + to: 8 + matchType: PREF + text: MELANOMA + mappings: [] + - annotatedClass: + prefLabel: Melanom + synonym: + - malignant melanoma + - melanoma patient + - melanocytes + "@id": http://data.europa.eu/8mn/euroscivoc/276b8c99-a318-48df-aa31-1f9f3e0ba910 + "@type": http://www.w3.org/2002/07/owl#Class + links: + self: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910 + ontology: http://localhost:9393/ontologies/STY + children: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/children + parents: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/parents + descendants: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/descendants + ancestors: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/ancestors + instances: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/instances + tree: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/tree + notes: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/notes + mappings: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/mappings + ui: http://stageportal.lirmm.fr/ontologies/EUROSCIVOC?p=classes&conceptid=http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910 + "@context": + self: http://www.w3.org/2002/07/owl#Class + ontology: http://localhost:9393/ontologies/STY + children: http://www.w3.org/2002/07/owl#Class + parents: http://www.w3.org/2002/07/owl#Class + descendants: http://www.w3.org/2002/07/owl#Class + ancestors: http://www.w3.org/2002/07/owl#Class + instances: http://data.bioontology.org/metadata/Instance + tree: http://www.w3.org/2002/07/owl#Class + notes: http://data.bioontology.org/metadata/Note + mappings: http://data.bioontology.org/metadata/Mapping + ui: http://www.w3.org/2002/07/owl#Class + "@context": + "@vocab": http://data.bioontology.org/metadata/ + prefLabel: http://www.w3.org/2004/02/skos/core#prefLabel + synonym: http://www.w3.org/2004/02/skos/core#altLabel + "@language": en + hierarchy: [] + annotations: + - from: 1 + to: 8 + matchType: PREF + text: MELANOMA + - from: 34 + to: 44 + matchType: SYN + text: MELANOCYTES + mappings: [] + - annotatedClass: + definition: + - http://opendata.inrae.fr/thesaurusINRAE/note_f18c0fe1 + prefLabel: mélanome + synonym: + - malignant melanoma + - mélanome malin + "@id": http://opendata.inrae.fr/thesaurusINRAE/c_11970 + "@type": http://www.w3.org/2002/07/owl#Class + links: + self: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970 + ontology: http://localhost:9393/ontologies/STY + children: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/children + parents: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/parents + descendants: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/descendants + ancestors: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/ancestors + instances: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/instances + tree: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/tree + notes: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/notes + mappings: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/mappings + ui: http://stageportal.lirmm.fr/ontologies/INRAETHES?p=classes&conceptid=http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970 + "@context": + self: http://www.w3.org/2002/07/owl#Class + ontology: http://localhost:9393/ontologies/STY + children: http://www.w3.org/2002/07/owl#Class + parents: http://www.w3.org/2002/07/owl#Class + descendants: http://www.w3.org/2002/07/owl#Class + ancestors: http://www.w3.org/2002/07/owl#Class + instances: http://data.bioontology.org/metadata/Instance + tree: http://www.w3.org/2002/07/owl#Class + notes: http://data.bioontology.org/metadata/Note + mappings: http://data.bioontology.org/metadata/Mapping + ui: http://www.w3.org/2002/07/owl#Class + "@context": + "@vocab": http://data.bioontology.org/metadata/ + prefLabel: http://www.w3.org/2004/02/skos/core#prefLabel + synonym: http://www.w3.org/2004/02/skos/core#altLabel + definition: http://www.w3.org/2004/02/skos/core#definition + "@language": en + hierarchy: [] + annotations: + - from: 1 + to: 8 + matchType: PREF + text: MELANOMA + mappings: [] + - annotatedClass: + prefLabel: tumeur + synonym: + - néoplasme + - néoplasie + "@id": http://opendata.inrae.fr/thesaurusINRAE/c_11887 + "@type": http://www.w3.org/2002/07/owl#Class + links: + self: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887 + ontology: http://localhost:9393/ontologies/STY + children: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/children + parents: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/parents + descendants: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/descendants + ancestors: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/ancestors + instances: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/instances + tree: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/tree + notes: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/notes + mappings: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/mappings + ui: http://stageportal.lirmm.fr/ontologies/INRAETHES?p=classes&conceptid=http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887 + "@context": + self: http://www.w3.org/2002/07/owl#Class + ontology: http://localhost:9393/ontologies/STY + children: http://www.w3.org/2002/07/owl#Class + parents: http://www.w3.org/2002/07/owl#Class + descendants: http://www.w3.org/2002/07/owl#Class + ancestors: http://www.w3.org/2002/07/owl#Class + instances: http://data.bioontology.org/metadata/Instance + tree: http://www.w3.org/2002/07/owl#Class + notes: http://data.bioontology.org/metadata/Note + mappings: http://data.bioontology.org/metadata/Mapping + ui: http://www.w3.org/2002/07/owl#Class + "@context": + "@vocab": http://data.bioontology.org/metadata/ + prefLabel: http://www.w3.org/2004/02/skos/core#prefLabel + synonym: http://www.w3.org/2004/02/skos/core#altLabel + "@language": en + hierarchy: [] + annotations: + - from: 25 + to: 29 + matchType: PREF + text: TUMOR + mappings: [] diff --git a/test/fixtures/ontologies.yml b/test/fixtures/ontologies.yml index 28d345e73c..100d00b3a3 100644 --- a/test/fixtures/ontologies.yml +++ b/test/fixtures/ontologies.yml @@ -61,3 +61,87 @@ ontology_view: hasDomain: acl: viewOf: "ONT1" + +resource_content_formats: + json: + "@context": + ns0: "http://purl.bioontology.org/ontology/STY/" + rdf: "http://www.w3.org/1999/02/22-rdf-syntax-ns#" + owl: "http://www.w3.org/2002/07/owl#" + rdfs: "http://www.w3.org/2000/01/rdf-schema#" + skos: "http://www.w3.org/2004/02/skos/core#" + metadata_def: "http://data.bioontology.org/metadata/def/" + "@graph": + - "@id": "ns0:T071" + "@type": "owl:Class" + "rdfs:subClassOf": + "@id": "owl:Thing" + "skos:prefLabel": + "@value": "Entity" + "@language": "en" + "skos:notation": "T071" + "metadata_def:mappingSameURI": + "@id": "ns0:T071" + "metadata_def:mappingLoom": "entity" + - "@id": "ns0:T072" + "rdfs:subClassOf": + "@id": "ns0:T071" + - "@id": "ns0:T077" + "rdfs:subClassOf": + "@id": "ns0:T071" + + xml: | + + + + + Entity + T071 + + entity + + + + + + + + + + + + + + ntriples: | + . + . + "Entity"@en . + "T071" . + . + "entity" . + . + . + . + + + turtle: | + @prefix rdf: . + @prefix ns0: . + @prefix owl: . + @prefix rdfs: . + @prefix skos: . + @prefix metadata_def: . + + ns0:T071 + metadata_def:mappingLoom "entity" ; + metadata_def:mappingSameURI ns0:T071 ; + a owl:Class ; + rdfs:subClassOf owl:Thing ; + skos:notation "T071" ; + skos:prefLabel "Entity"@en . + + ns0:T072 + rdfs:subClassOf ns0:T071 . + + ns0:T077 + rdfs:subClassOf ns0:T071 . \ No newline at end of file diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index eaaf3596e8..4c7e880436 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -1,3 +1,7 @@ +admin: + username: johndoe + email: admin@example.com + password: password john: firstName: John lastName: Doe diff --git a/test/helpers/application_test_helpers.rb b/test/helpers/application_test_helpers.rb index 054a9f7c40..975c220eac 100644 --- a/test/helpers/application_test_helpers.rb +++ b/test/helpers/application_test_helpers.rb @@ -19,25 +19,47 @@ def sign_in_as(username) if logged_in_user && !logged_in_user.errors logged_in_user = create_user(user) end - session[:user] = logged_in_user + logged_in_user end - def create_user(user , admin: false) - unless (existent_user = LinkedData::Client::Models::User.find_by_username(user.username).first) - values = user.to_h - values[:role] = ["ADMINISTRATOR"] if admin - existent_user = LinkedData::Client::Models::User.new(values: values).save + def create_user(user, admin: false) + admin_user = LinkedData::Client::Models::User.authenticate('admin', 'password') if admin + existent_user = LinkedData::Client::Models::User.find_by_username(user.username).first + + existent_user.delete if existent_user + + values = user.to_h + values[:role] = ["ADMINISTRATOR"] if admin + existent_user = LinkedData::Client::Models::User.new(values: values) + + if admin + # Overwrite the normal ".save" to accept creating admin user + conn = Faraday.new(url: LinkedData::Client.settings.rest_url) do |faraday| + faraday.request :url_encoded + faraday.response :logger + faraday.adapter Faraday.default_adapter + faraday.headers = { + "Accept" => "application/json", + "Authorization" => "apikey token=#{admin_user.apikey}", + "User-Agent" => "NCBO API Ruby Client v0.1.0" + } + + end + conn.post(existent_user.class.collection_path, existent_user.to_hash.to_json, 'Content-Type' => 'application/json') + else + existent_user.save end existent_user.password = user.password existent_user end - def delete_users(ontologies = LinkedData::Client::Models::Ontology.all) - Array(ontologies).each do |o| + def delete_users(users = LinkedData::Client::Models::User.all) + Array(users).each do |o| LinkedData::Client::Models::Ontology.find_by_acronym(o.acronym).first&.delete end end + def delete_user(user) LinkedData::Client::Models::User.find_by_username(user.username).first&.delete end diff --git a/test/integration/login_flows_test.rb b/test/integration/login_flows_test.rb index d446a6d6a3..0f1f70b444 100644 --- a/test/integration/login_flows_test.rb +++ b/test/integration/login_flows_test.rb @@ -50,7 +50,7 @@ class LoginFlowsTest < ActionDispatch::IntegrationTest assert_select '.notification', text: 'Account was successfully created' - get account_path + get "/accounts/#{new_user.username}" assert_response :success assert_select '.account-page-title', text: 'My account' diff --git a/test/system/agent_flows_test.rb b/test/system/agent_flows_test.rb index c4272b71fa..5eeb72055d 100644 --- a/test/system/agent_flows_test.rb +++ b/test/system/agent_flows_test.rb @@ -14,7 +14,7 @@ class AgentFlowsTest < ApplicationSystemTestCase def teardown delete_agents - delete_users + delete_user(@logged_user) if @logged_user end test "go admin page and create an agent person and edit it" do @@ -41,7 +41,7 @@ def teardown click_on "Persons & organizations" # Creation test - create_agent_flow(@new_organization, person_count: 0, organization_count: 3) + create_agent_flow(@new_organization, person_count: 0, organization_count: 1) # Edition test @new_organization2 = fixtures(:agents)[:organization2] @@ -50,7 +50,7 @@ def teardown @new_organization2.id = edit_link['href'].split('/')[-2] edit_link.click - edit_agent_flow(@new_organization2, person_count: 0, organization_count: 5) + edit_agent_flow(@new_organization2, person_count: 0, organization_count: 1) end @@ -61,21 +61,21 @@ def create_agent_flow(new_agent, person_count: , organization_count:) # Creation test click_on "Create New Agent" wait_for_text "TYPE" - agent_fill(new_agent) + agent_fill(new_agent, is_affiliation: false) sleep 1 assert_text "New Agent added successfully" find('.close').click within "table#admin_agents" do assert_selector '.human', count: person_count + organization_count # all created agents assert_text new_agent.name - new_agent.identifiers.map{|x| "https://orcid.org/#{x["notation"]}"}.each do |orcid| + new_agent.identifiers.map{|x| "https://#{new_agent.agentType.eql?('organization') ? 'ror' : 'orcid'}.org/#{x["notation"]}"}.each do |orcid| assert_text orcid end assert_text 'person', count: person_count assert_text 'organization', count: organization_count - new_agent.affiliations.map do |aff| + Array(new_agent.affiliations).map do |aff| aff["identifiers"] = aff["identifiers"].each{|x| x["schemaAgency"] = 'ORCID'} assert_text aff['name'] end @@ -87,16 +87,17 @@ def edit_agent_flow(agent, person_count: , organization_count: ) agent_fill(agent, parent_id: agent.id) # assert_text "New Agent added successfully" find('.close').click + sleep 1 within "table#admin_agents" do assert_selector '.human', count: person_count + organization_count # all created agents assert_text agent.name - agent.identifiers.map{|x| "https://orcid.org/#{x["notation"]}"}.each do |orcid| + agent.identifiers.map{|x| "https://#{agent.agentType.eql?('organization') ? 'ror' : 'orcid'}.org/#{x["notation"]}"}.each do |orcid| assert_text orcid end assert_text 'person', count: person_count assert_text 'organization', count: organization_count - agent.affiliations.map do |aff| + Array(agent.affiliations).map do |aff| aff["identifiers"] = aff["identifiers"].each{|x| x["schemaAgency"] = 'ORCID'} assert_text aff['name'] end diff --git a/test/system/annotator_page_test.rb b/test/system/annotator_page_test.rb new file mode 100644 index 0000000000..5956a75f36 --- /dev/null +++ b/test/system/annotator_page_test.rb @@ -0,0 +1,108 @@ +require "application_system_test_case" +require 'webmock/minitest' + +class AnnotatorPageTest < ApplicationSystemTestCase + def setup + WebMock.disable! + @apikey = LinkedData::Client.settings.apikey + @annotator_api = $ANNOTATOR_URL + @host = "#{@annotator_api.split('/')[-2]}:443" + @annotator_text_area = ".annotator-page-text-area > textarea" + @sample_response = fixtures(:annotator)["sample_response"] + end + + def teardown + WebMock.disable! + end + + test "go to annotator page and check if all the inputs and filters are there" do + visit root_url + click_link(href: '/annotator') + assert_selector @annotator_text_area + assert_selector 'div.insert-sample-text-button' + # Check if there are the annotator's options + assert_selector 'label[for="chips-whole_word_only-check"]' + assert_selector 'label[for="chips-longest_only-check"]' + assert_selector 'label[for="chips-expand_mappings-check"]' + assert_selector 'label[for="chips-exclude_numbers-check"]' + assert_selector 'label[for="chips-exclude_synonyms-check"]' + assert_selector 'div.select-ontologies' + + # Open the advanced options + find('div.advanced-options-button').click + + # Check if there are the advanced options + assert_selector 'input#select_umls_semantic_types-ts-control', visible: :all + assert_selector 'input#select_umls_semantic_groups-ts-control', visible: :all + assert_selector 'input#select_ancestors_level-ts-control', visible: :all + assert_selector 'input#select_include_score-ts-control', visible: :all + assert_selector 'input[name="score_threshold"]' + assert_selector 'input[name="confidence_threshold"]' + assert_selector 'label[for="chips-fast_context-check"]' + assert_selector 'label[for="chips-lemmatize-check"]' + end + + test "go to annotator page insert sample text and get annotations" do + visit root_url + click_link(href: '/annotator') + + # Fill the annotator's text area input by a sample text + find(@annotator_text_area).fill_in(with: 'Melanoma is a malignant tumor of melanocytes found mainly') + + # Mock the api call for the annotator with the entered text + WebMock.enable! + stub_request(:get, "#{@annotator_api}?class_hierarchy_max_level=None&confidence_threshold=0&score_threshold=0&text=Melanoma%20is%20a%20malignant%20tumor%20of%20melanocytes%20found%20mainly&whole_word_only=true") + .with( + headers: { + 'Accept'=>'application/json', + 'Authorization'=>"apikey token=#{@apikey}", + 'Host'=> @host, + 'User-Agent'=>'NCBO API Ruby Client v0.1.0' + }) + .to_return(status: 200, body: @sample_response.to_json, headers: {}) + + + find(".annotator-page-button #annotator").click + + # Check if we get the table of annotations + assert_selector 'table#annotator-table' + + # Check if the number of annotations is 4 + assert_equal 5, page.all('tr').count + + # Check if we got the correct annotations + assert_selector 'a[href="ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713"]', text: 'Melanom' + assert_selector 'a[href="ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910"]', text: 'Melanom' + assert_selector 'a[href="ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970"]', text: 'mélanome' + assert_selector 'a[href="ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887"]', text: 'tumeur' + + # Check if the action buttons below the table are there (json, rdf, cite us and api doc buttons) + assert_selector '#annotator_json' + assert_selector '#annotator_rdf' + assert_selector '#annotator_cite_us' + assert_selector '#annotator_api_doc' + + # Clear the sample text in the annotator text area + find(@annotator_text_area).native.clear + + # Fill it with a text that will return an empty state + find(@annotator_text_area).fill_in(with: 'mainly') + + # Mock the api call of the annotator to get and return an empty result + stub_request(:get, "#{@annotator_api}?class_hierarchy_max_level=None&confidence_threshold=0&score_threshold=0&text=mainly&whole_word_only=true") + .with( + headers: { + 'Accept'=>'application/json', + 'Authorization'=>"apikey token=#{@apikey}", + 'Host'=> @host, + 'User-Agent'=>'NCBO API Ruby Client v0.1.0' + }) + .to_return(status: 200, body: ([]).to_json, headers: {}) + + find(".annotator-page-button #annotator").click + + # Check if we got the empty state correctly + assert_selector 'div.browse-empty-illustration' + end + +end \ No newline at end of file diff --git a/test/system/content_redirection_test.rb b/test/system/content_redirection_test.rb new file mode 100644 index 0000000000..bf0a35ab66 --- /dev/null +++ b/test/system/content_redirection_test.rb @@ -0,0 +1,68 @@ +require "application_system_test_case" +require 'webmock/minitest' + +class ContentRedirectionTest < ApplicationSystemTestCase + def setup + WebMock.disable! + + @sty_url = root_url + 'ontologies/STY' + @ontology_portal_uri = 'div.field-container p.field-description_text' + @htaccess_button = 'a[data-show-modal-title-value="Rewrite rules for STY ontology"]' + @redirection_modal = 'div#redirection_rules_modal' + @htaccess_code = 'div.htacess-code-container' + @nginx_code = 'div.nginx-code-container' + @contact_support_button = 'div.contact-support' + + @generate_portal_link_button = 'span#generate_portal_link' + @accordion_concept_details = '.dropdown-title-bar[data-target="#accordion-concept-details"]' + + @resource_div_formats = 'div#content_resource_formats' + @json_response = fixtures(:ontologies)["resource_content_formats"].json + @xml_response = fixtures(:ontologies)["resource_content_formats"].xml.strip + @ntriples_response = fixtures(:ontologies)["resource_content_formats"].ntriples.strip + @turtle_response = fixtures(:ontologies)["resource_content_formats"].turtle.strip + end + + test "go to STY ontology page and test the htaccess button" do + visit @sty_url + assert_selector @ontology_portal_uri, text: $SITE + ' URI' + assert_selector @htaccess_button + find(@htaccess_button).click + assert_selector(@redirection_modal, visible: true, wait: 10) + assert_selector @htaccess_code + assert_selector @nginx_code + assert_selector @contact_support_button + find('button[data-action="turbo-modal#hide"]').click + end + + test "go to STY ontology classes page and test the different format of resource" do + visit @sty_url + click_link('Classes') + assert_selector(@generate_portal_link_button, visible: true, wait: 10) + generated_uri = find(@generate_portal_link_button + " .clipboard.d-flex.align-items-center").find('div[data-clipboard-target="content"]', visible: :all).native.attribute('innerHTML').strip + assert_equal "http://localhost:3000/ontologies/STY/T071", generated_uri + find(@generate_portal_link_button, visible: :all).click + assert_selector(@accordion_concept_details, visible: true, wait: 10) + find(@accordion_concept_details, visible: :all).click + assert_selector(@resource_div_formats, visible: true) + + # test formats content + ["json", "xml", "ntriples", "turtle"].each do |format| + find("a#resource_content_#{format}", visible: true).click + assert_selector("div#resource_content_modal", visible: true, wait: 10) + content = find("div#resource_content_modal pre code", visible: true).text.strip + case format + when "json" + assert_equal JSON.parse(content), @json_response + when "xml" + assert_equal content, @xml_response + when "ntriples" + assert_equal content, @ntriples_response + when "turtle" + assert_equal content, @turtle_response + end + find('button.close[data-action="turbo-modal#hide"]').click + end + end + +end \ No newline at end of file diff --git a/test/system/login_flows_test.rb b/test/system/login_flows_test.rb index 5ed014b2c8..d6ff0deb49 100644 --- a/test/system/login_flows_test.rb +++ b/test/system/login_flows_test.rb @@ -5,7 +5,7 @@ class LoginFlowsTest < ApplicationSystemTestCase setup do WebMock.disable! @user_john = fixtures(:users)[:john] - @user_bob = create_user(fixtures(:users)[:bob]) + @user_bob = fixtures(:users)[:bob] end teardown do @@ -40,7 +40,7 @@ class LoginFlowsTest < ApplicationSystemTestCase assert_selector '.notification', text: 'Account was successfully created' - visit root_url + '/account' + visit root_url + "/accounts/#{new_user.username}" assert_selector '.account-page-title', text: 'My account' @@ -77,7 +77,7 @@ class LoginFlowsTest < ApplicationSystemTestCase test "login and reset password" do login_in_as(@user_bob) - visit root_url + '/account' + visit root_url + "/accounts/#{@user_bob.username}" find("a[href=\"#{edit_user_path(@user_bob.username)}\"]").click diff --git a/test/system/submission_flows_test.rb b/test/system/submission_flows_test.rb index 4a11bd1b8f..6045308d04 100644 --- a/test/system/submission_flows_test.rb +++ b/test/system/submission_flows_test.rb @@ -43,7 +43,7 @@ class SubmissionFlowsTest < ApplicationSystemTestCase assert_selector '.alert-message', text: "The ontology is processing." @new_ontology.hasDomain.each do |cat| - assert_text cat.name + assert_text cat.acronym.titleize end @@ -143,12 +143,12 @@ class SubmissionFlowsTest < ApplicationSystemTestCase assert_text "#{ontology_2.name} (#{@new_ontology.acronym})" selected_categories.each do |cat| - assert_text cat.name + assert_text cat.acronym.titleize end assert_text submission_2.URI assert_text submission_2.versionIRI - assert_selector '#submission-status', text: submission_2.version + assert_selector '.submission-status', text: submission_2.version assert_selector ".flag-icon-fr" # todo fix this submission_2.identifier.each do |id| assert_text id @@ -203,12 +203,15 @@ class SubmissionFlowsTest < ApplicationSystemTestCase open_dropdown "#projects_section" usage_properties = [ :coverage, :knownUsage, - :hasDomain, :example + :example ] usage_properties.each do |property| Array(submission_2[property]).each { |v| assert_text v } # check end + has_domain_values = ["Has Domain2.1", "Has Domain2.2", "Has Domain2.3"] + has_domain_values.each { |v| assert_text v } + submission_2.designedForOntologyTask.each do |task| assert_text task.delete(' ') # TODO fix in the UI the disaply of taskes end @@ -329,7 +332,7 @@ class SubmissionFlowsTest < ApplicationSystemTestCase assert_equal existent_submission.pullLocation, find_field('submission[pullLocation]').value click_button 'Next' - + assert_equal Date.parse(existent_submission.modificationDate).to_s, find('[name="submission[modificationDate]"]', visible: false).value assert_equal existent_submission.contact.map(&:values).flatten.sort, all('[name^="submission[contact]"]').map(&:value).sort @@ -349,7 +352,7 @@ class SubmissionFlowsTest < ApplicationSystemTestCase assert_selector '.alert-message', text: "The ontology is processing." ontology_2.hasDomain.each do |cat| - assert_text cat.name + assert_text cat.acronym.titleize end refute_text 'Version IRI' @@ -651,4 +654,4 @@ def fill_ontology(new_ontology, new_submission, add_submission: false) click_button 'Finish' end end -end \ No newline at end of file +end diff --git a/test/test_helper.rb b/test/test_helper.rb index e8f7cf84af..af79730627 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -2,6 +2,7 @@ require_relative '../config/environment' require 'rails/test_help' require 'simplecov' +require 'webmock/minitest' SimpleCov.start 'rails' do add_filter '/bin/' @@ -16,6 +17,7 @@ class ActiveSupport::TestCase # Add more helper methods to be used by all tests here... + WebMock.allow_net_connect! Capybara.server_host = "0.0.0.0" Capybara.app_host = "http://#{Socket.gethostname}:#{Capybara.server_port}" diff --git a/vendor/assets/images/chosen/chosen-sprite.png b/vendor/assets/images/chosen/chosen-sprite.png deleted file mode 100755 index c57da70b4b5b1e08a6977ddde182677af0e5e1b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcmV+#0_FXQP)cz2)-WJLkv8J@4bb5L`rsE?Kc|FrXHkKz)ov z76MHYM&Apx%05P7orE!>9=yZ~6O0^V?1%{=1UASqa<2Pgnk7fs!OIs9gh{NCN+@=) z>Gfttd5uq;oeR{%NHjtqV~jEQeY?tDff=(jqx>~SZ_e+iN26HR*`0Q!Re)~HD85p> zbL()Mw}bI^#`7wp0+cv&7*LhrtOmR)?PK>(-BeLm#jL5Jfogv-QS(TBnUb;))Krqm zD}uDDeVLNhm1G*pFB`O?iA=dnWBEpqHk8Yh%Qu45EIG=&F-dDmt|;|nN@|3lOkVZ7>z*~a1?_t?U)c+&|JFJke1`&0-a z#PjhRlg?=$KTo4|rU@NyV_fzDy@>h!lVyKShsO8>V>$xyIXRbHK%H~^Aaz=s$Jz^V zlb?KfaKdZqu3^#m$mintvgJ15@j`sb2Zr%69Sn=xN01Tm5r)NQanT=jhwm7zqj2>O cEB}D~0$b-QdD7|v=>Px#07*qoM6N<$g6AXnUH||9 diff --git a/vendor/assets/images/chosen/chosen-sprite@2x.png b/vendor/assets/images/chosen/chosen-sprite@2x.png deleted file mode 100755 index 6b50545202cb4770039362c55025b0b9824663ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 738 zcmV<80v-K{P)oJoIWh{eAG@xkM<0ryd(K3(} zP8JV&;uuIJ4nL%g8!wSG9E$P+3QVMGgj><+00}M5I5kMzaT<~M;uJ`UhLfbp9Ahdsrux5(g+(>Q*+9wU{AuYPH0}W_u4`|q(9c->{ zt>Jn|lbhH<_x5jU6prFi#S}&XMZ=~Y5VyC3+ZN%hXciz8 zPcLpJgbIK#a49e31-%wf2zh2F&&(Nq;AL%4zA(=QJRGq`sx3y3#0_cg9Fim739XTOu1NKKjlWs`52Q+3 Uja*K~(*OVf07*qoM6N<$g3mu-GXMYp diff --git a/vendor/assets/javascripts/chosen.jquery.js b/vendor/assets/javascripts/chosen.jquery.js deleted file mode 100755 index 060c162842..0000000000 --- a/vendor/assets/javascripts/chosen.jquery.js +++ /dev/null @@ -1,1269 +0,0 @@ -/*! -Chosen, a Select Box Enhancer for jQuery and Prototype -by Patrick Filler for Harvest, http://getharvest.com - -Version 1.6.2 -Full source at https://github.com/harvesthq/chosen -Copyright (c) 2011-2016 Harvest http://getharvest.com - -MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md -This file is generated by `grunt build`, do not edit it by hand. -*/ - -(function() { - var $, AbstractChosen, Chosen, SelectParser, _ref, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - SelectParser = (function() { - function SelectParser() { - this.options_index = 0; - this.parsed = []; - } - - SelectParser.prototype.add_node = function(child) { - if (child.nodeName.toUpperCase() === "OPTGROUP") { - return this.add_group(child); - } else { - return this.add_option(child); - } - }; - - SelectParser.prototype.add_group = function(group) { - var group_position, option, _i, _len, _ref, _results; - group_position = this.parsed.length; - this.parsed.push({ - array_index: group_position, - group: true, - label: this.escapeExpression(group.label), - title: group.title ? group.title : void 0, - children: 0, - disabled: group.disabled, - classes: group.className - }); - _ref = group.childNodes; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - option = _ref[_i]; - _results.push(this.add_option(option, group_position, group.disabled)); - } - return _results; - }; - - SelectParser.prototype.add_option = function(option, group_position, group_disabled) { - if (option.nodeName.toUpperCase() === "OPTION") { - if (option.text !== "") { - if (group_position != null) { - this.parsed[group_position].children += 1; - } - this.parsed.push({ - array_index: this.parsed.length, - options_index: this.options_index, - value: option.value, - text: option.text, - html: option.innerHTML, - title: option.title ? option.title : void 0, - selected: option.selected, - disabled: group_disabled === true ? group_disabled : option.disabled, - group_array_index: group_position, - group_label: group_position != null ? this.parsed[group_position].label : null, - classes: option.className, - style: option.style.cssText - }); - } else { - this.parsed.push({ - array_index: this.parsed.length, - options_index: this.options_index, - empty: true - }); - } - return this.options_index += 1; - } - }; - - SelectParser.prototype.escapeExpression = function(text) { - var map, unsafe_chars; - if ((text == null) || text === false) { - return ""; - } - if (!/[\&\<\>\"\'\`]/.test(text)) { - return text; - } - map = { - "<": "<", - ">": ">", - '"': """, - "'": "'", - "`": "`" - }; - unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g; - return text.replace(unsafe_chars, function(chr) { - return map[chr] || "&"; - }); - }; - - return SelectParser; - - })(); - - SelectParser.select_to_array = function(select) { - var child, parser, _i, _len, _ref; - parser = new SelectParser(); - _ref = select.childNodes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - parser.add_node(child); - } - return parser.parsed; - }; - - AbstractChosen = (function() { - function AbstractChosen(form_field, options) { - this.form_field = form_field; - this.options = options != null ? options : {}; - if (!AbstractChosen.browser_is_supported()) { - return; - } - this.is_multiple = this.form_field.multiple; - this.set_default_text(); - this.set_default_values(); - this.setup(); - this.set_up_html(); - this.register_observers(); - this.on_ready(); - } - - AbstractChosen.prototype.set_default_values = function() { - var _this = this; - this.click_test_action = function(evt) { - return _this.test_active_click(evt); - }; - this.activate_action = function(evt) { - return _this.activate_field(evt); - }; - this.active_field = false; - this.mouse_on_container = false; - this.results_showing = false; - this.result_highlighted = null; - this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false; - this.disable_search_threshold = this.options.disable_search_threshold || 0; - this.disable_search = this.options.disable_search || false; - this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true; - this.group_search = this.options.group_search != null ? this.options.group_search : true; - this.search_contains = this.options.search_contains || false; - this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true; - this.max_selected_options = this.options.max_selected_options || Infinity; - this.inherit_select_classes = this.options.inherit_select_classes || false; - this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true; - this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true; - this.include_group_label_in_selected = this.options.include_group_label_in_selected || false; - this.max_shown_results = this.options.max_shown_results || Number.POSITIVE_INFINITY; - return this.case_sensitive_search = this.options.case_sensitive_search || false; - }; - - AbstractChosen.prototype.set_default_text = function() { - if (this.form_field.getAttribute("data-placeholder")) { - this.default_text = this.form_field.getAttribute("data-placeholder"); - } else if (this.is_multiple) { - this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text; - } else { - this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text; - } - return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text; - }; - - AbstractChosen.prototype.choice_label = function(item) { - if (this.include_group_label_in_selected && (item.group_label != null)) { - return "" + item.group_label + "" + item.html; - } else { - return item.html; - } - }; - - AbstractChosen.prototype.mouse_enter = function() { - return this.mouse_on_container = true; - }; - - AbstractChosen.prototype.mouse_leave = function() { - return this.mouse_on_container = false; - }; - - AbstractChosen.prototype.input_focus = function(evt) { - var _this = this; - if (this.is_multiple) { - if (!this.active_field) { - return setTimeout((function() { - return _this.container_mousedown(); - }), 50); - } - } else { - if (!this.active_field) { - return this.activate_field(); - } - } - }; - - AbstractChosen.prototype.input_blur = function(evt) { - var _this = this; - if (!this.mouse_on_container) { - this.active_field = false; - return setTimeout((function() { - return _this.blur_test(); - }), 100); - } - }; - - AbstractChosen.prototype.results_option_build = function(options) { - var content, data, data_content, shown_results, _i, _len, _ref; - content = ''; - shown_results = 0; - _ref = this.results_data; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - data = _ref[_i]; - data_content = ''; - if (data.group) { - data_content = this.result_add_group(data); - } else { - data_content = this.result_add_option(data); - } - if (data_content !== '') { - shown_results++; - content += data_content; - } - if (options != null ? options.first : void 0) { - if (data.selected && this.is_multiple) { - this.choice_build(data); - } else if (data.selected && !this.is_multiple) { - this.single_set_selected_text(this.choice_label(data)); - } - } - if (shown_results >= this.max_shown_results) { - break; - } - } - return content; - }; - - AbstractChosen.prototype.result_add_option = function(option) { - var classes, option_el; - if (!option.search_match) { - return ''; - } - if (!this.include_option_in_results(option)) { - return ''; - } - classes = []; - if (!option.disabled && !(option.selected && this.is_multiple)) { - classes.push("active-result"); - } - if (option.disabled && !(option.selected && this.is_multiple)) { - classes.push("disabled-result"); - } - if (option.selected) { - classes.push("result-selected"); - } - if (option.group_array_index != null) { - classes.push("group-option"); - } - if (option.classes !== "") { - classes.push(option.classes); - } - option_el = document.createElement("li"); - option_el.className = classes.join(" "); - option_el.style.cssText = option.style; - option_el.setAttribute("data-option-array-index", option.array_index); - option_el.innerHTML = option.search_text; - if (option.title) { - option_el.title = option.title; - } - return this.outerHTML(option_el); - }; - - AbstractChosen.prototype.result_add_group = function(group) { - var classes, group_el; - if (!(group.search_match || group.group_match)) { - return ''; - } - if (!(group.active_options > 0)) { - return ''; - } - classes = []; - classes.push("group-result"); - if (group.classes) { - classes.push(group.classes); - } - group_el = document.createElement("li"); - group_el.className = classes.join(" "); - group_el.innerHTML = group.search_text; - if (group.title) { - group_el.title = group.title; - } - return this.outerHTML(group_el); - }; - - AbstractChosen.prototype.results_update_field = function() { - this.set_default_text(); - if (!this.is_multiple) { - this.results_reset_cleanup(); - } - this.result_clear_highlight(); - this.results_build(); - if (this.results_showing) { - return this.winnow_results(); - } - }; - - AbstractChosen.prototype.reset_single_select_options = function() { - var result, _i, _len, _ref, _results; - _ref = this.results_data; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - result = _ref[_i]; - if (result.selected) { - _results.push(result.selected = false); - } else { - _results.push(void 0); - } - } - return _results; - }; - - AbstractChosen.prototype.results_toggle = function() { - if (this.results_showing) { - return this.results_hide(); - } else { - return this.results_show(); - } - }; - - AbstractChosen.prototype.results_search = function(evt) { - if (this.results_showing) { - return this.winnow_results(); - } else { - return this.results_show(); - } - }; - - AbstractChosen.prototype.winnow_results = function() { - var escapedSearchText, option, regex, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref; - this.no_results_clear(); - results = 0; - searchText = this.get_search_text(); - escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); - zregex = new RegExp(escapedSearchText, 'i'); - regex = this.get_search_regex(escapedSearchText); - _ref = this.results_data; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - option = _ref[_i]; - option.search_match = false; - results_group = null; - if (this.include_option_in_results(option)) { - if (option.group) { - option.group_match = false; - option.active_options = 0; - } - if ((option.group_array_index != null) && this.results_data[option.group_array_index]) { - results_group = this.results_data[option.group_array_index]; - if (results_group.active_options === 0 && results_group.search_match) { - results += 1; - } - results_group.active_options += 1; - } - option.search_text = option.group ? option.label : option.html; - if (!(option.group && !this.group_search)) { - option.search_match = this.search_string_match(option.search_text, regex); - if (option.search_match && !option.group) { - results += 1; - } - if (option.search_match) { - if (searchText.length) { - startpos = option.search_text.search(zregex); - text = option.search_text.substr(0, startpos + searchText.length) + '' + option.search_text.substr(startpos + searchText.length); - option.search_text = text.substr(0, startpos) + '' + text.substr(startpos); - } - if (results_group != null) { - results_group.group_match = true; - } - } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) { - option.search_match = true; - } - } - } - } - this.result_clear_highlight(); - if (results < 1 && searchText.length) { - this.update_results_content(""); - return this.no_results(searchText); - } else { - this.update_results_content(this.results_option_build()); - return this.winnow_results_set_highlight(); - } - }; - - AbstractChosen.prototype.get_search_regex = function(escaped_search_string) { - var regex_anchor, regex_flag; - regex_anchor = this.search_contains ? "" : "^"; - regex_flag = this.case_sensitive_search ? "" : "i"; - return new RegExp(regex_anchor + escaped_search_string, regex_flag); - }; - - AbstractChosen.prototype.search_string_match = function(search_string, regex) { - var part, parts, _i, _len; - if (regex.test(search_string)) { - return true; - } else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) { - parts = search_string.replace(/\[|\]/g, "").split(" "); - if (parts.length) { - for (_i = 0, _len = parts.length; _i < _len; _i++) { - part = parts[_i]; - if (regex.test(part)) { - return true; - } - } - } - } - }; - - AbstractChosen.prototype.choices_count = function() { - var option, _i, _len, _ref; - if (this.selected_option_count != null) { - return this.selected_option_count; - } - this.selected_option_count = 0; - _ref = this.form_field.options; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - option = _ref[_i]; - if (option.selected) { - this.selected_option_count += 1; - } - } - return this.selected_option_count; - }; - - AbstractChosen.prototype.choices_click = function(evt) { - evt.preventDefault(); - if (!(this.results_showing || this.is_disabled)) { - return this.results_show(); - } - }; - - AbstractChosen.prototype.keyup_checker = function(evt) { - var stroke, _ref; - stroke = (_ref = evt.which) != null ? _ref : evt.keyCode; - this.search_field_scale(); - switch (stroke) { - case 8: - if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) { - return this.keydown_backstroke(); - } else if (!this.pending_backstroke) { - this.result_clear_highlight(); - return this.results_search(); - } - break; - case 13: - evt.preventDefault(); - if (this.results_showing) { - return this.result_select(evt); - } - break; - case 27: - if (this.results_showing) { - this.results_hide(); - } - return true; - case 9: - case 38: - case 40: - case 16: - case 91: - case 17: - case 18: - break; - default: - return this.results_search(); - } - }; - - AbstractChosen.prototype.clipboard_event_checker = function(evt) { - var _this = this; - return setTimeout((function() { - return _this.results_search(); - }), 50); - }; - - AbstractChosen.prototype.container_width = function() { - if (this.options.width != null) { - return this.options.width; - } else { - return "" + this.form_field.offsetWidth + "px"; - } - }; - - AbstractChosen.prototype.include_option_in_results = function(option) { - if (this.is_multiple && (!this.display_selected_options && option.selected)) { - return false; - } - if (!this.display_disabled_options && option.disabled) { - return false; - } - if (option.empty) { - return false; - } - return true; - }; - - AbstractChosen.prototype.search_results_touchstart = function(evt) { - this.touch_started = true; - return this.search_results_mouseover(evt); - }; - - AbstractChosen.prototype.search_results_touchmove = function(evt) { - this.touch_started = false; - return this.search_results_mouseout(evt); - }; - - AbstractChosen.prototype.search_results_touchend = function(evt) { - if (this.touch_started) { - return this.search_results_mouseup(evt); - } - }; - - AbstractChosen.prototype.outerHTML = function(element) { - var tmp; - if (element.outerHTML) { - return element.outerHTML; - } - tmp = document.createElement("div"); - tmp.appendChild(element); - return tmp.innerHTML; - }; - - AbstractChosen.browser_is_supported = function() { - if ("Microsoft Internet Explorer" === window.navigator.appName) { - return document.documentMode >= 8; - } - if (/iP(od|hone)/i.test(window.navigator.userAgent) || /IEMobile/i.test(window.navigator.userAgent) || /Windows Phone/i.test(window.navigator.userAgent) || /BlackBerry/i.test(window.navigator.userAgent) || /BB10/i.test(window.navigator.userAgent) || /Android.*Mobile/i.test(window.navigator.userAgent)) { - return false; - } - return true; - }; - - AbstractChosen.default_multiple_text = "Select Some Options"; - - AbstractChosen.default_single_text = "Select an Option"; - - AbstractChosen.default_no_result_text = "No results match"; - - return AbstractChosen; - - })(); - - $ = jQuery; - - $.fn.extend({ - chosen: function(options) { - if (!AbstractChosen.browser_is_supported()) { - return this; - } - return this.each(function(input_field) { - var $this, chosen; - $this = $(this); - chosen = $this.data('chosen'); - if (options === 'destroy') { - if (chosen instanceof Chosen) { - chosen.destroy(); - } - return; - } - if (!(chosen instanceof Chosen)) { - $this.data('chosen', new Chosen(this, options)); - } - }); - } - }); - - Chosen = (function(_super) { - __extends(Chosen, _super); - - function Chosen() { - _ref = Chosen.__super__.constructor.apply(this, arguments); - return _ref; - } - - Chosen.prototype.setup = function() { - this.form_field_jq = $(this.form_field); - this.current_selectedIndex = this.form_field.selectedIndex; - return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl"); - }; - - Chosen.prototype.set_up_html = function() { - var container_classes, container_props; - container_classes = ["chosen-container"]; - container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single")); - if (this.inherit_select_classes && this.form_field.className) { - container_classes.push(this.form_field.className); - } - if (this.is_rtl) { - container_classes.push("chosen-rtl"); - } - container_props = { - 'class': container_classes.join(' '), - 'style': "width: " + (this.container_width()) + ";", - 'title': this.form_field.title - }; - if (this.form_field.id.length) { - container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen"; - } - this.container = $("
", container_props); - if (this.is_multiple) { - this.container.html('
    '); - } else { - this.container.html('' + this.default_text + '
      '); - } - this.form_field_jq.hide().after(this.container); - this.dropdown = this.container.find('div.chosen-drop').first(); - this.search_field = this.container.find('input').first(); - this.search_results = this.container.find('ul.chosen-results').first(); - this.search_field_scale(); - this.search_no_results = this.container.find('li.no-results').first(); - if (this.is_multiple) { - this.search_choices = this.container.find('ul.chosen-choices').first(); - this.search_container = this.container.find('li.search-field').first(); - } else { - this.search_container = this.container.find('div.chosen-search').first(); - this.selected_item = this.container.find('.chosen-single').first(); - } - this.results_build(); - this.set_tab_index(); - return this.set_label_behavior(); - }; - - Chosen.prototype.on_ready = function() { - return this.form_field_jq.trigger("chosen:ready", { - chosen: this - }); - }; - - Chosen.prototype.register_observers = function() { - var _this = this; - this.container.bind('touchstart.chosen', function(evt) { - _this.container_mousedown(evt); - return evt.preventDefault(); - }); - this.container.bind('touchend.chosen', function(evt) { - _this.container_mouseup(evt); - return evt.preventDefault(); - }); - this.container.bind('mousedown.chosen', function(evt) { - _this.container_mousedown(evt); - }); - this.container.bind('mouseup.chosen', function(evt) { - _this.container_mouseup(evt); - }); - this.container.bind('mouseenter.chosen', function(evt) { - _this.mouse_enter(evt); - }); - this.container.bind('mouseleave.chosen', function(evt) { - _this.mouse_leave(evt); - }); - this.search_results.bind('mouseup.chosen', function(evt) { - _this.search_results_mouseup(evt); - }); - this.search_results.bind('mouseover.chosen', function(evt) { - _this.search_results_mouseover(evt); - }); - this.search_results.bind('mouseout.chosen', function(evt) { - _this.search_results_mouseout(evt); - }); - this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) { - _this.search_results_mousewheel(evt); - }); - this.search_results.bind('touchstart.chosen', function(evt) { - _this.search_results_touchstart(evt); - }); - this.search_results.bind('touchmove.chosen', function(evt) { - _this.search_results_touchmove(evt); - }); - this.search_results.bind('touchend.chosen', function(evt) { - _this.search_results_touchend(evt); - }); - this.form_field_jq.bind("chosen:updated.chosen", function(evt) { - _this.results_update_field(evt); - }); - this.form_field_jq.bind("chosen:activate.chosen", function(evt) { - _this.activate_field(evt); - }); - this.form_field_jq.bind("chosen:open.chosen", function(evt) { - _this.container_mousedown(evt); - }); - this.form_field_jq.bind("chosen:close.chosen", function(evt) { - _this.input_blur(evt); - }); - this.search_field.bind('blur.chosen', function(evt) { - _this.input_blur(evt); - }); - this.search_field.bind('keyup.chosen', function(evt) { - _this.keyup_checker(evt); - }); - this.search_field.bind('keydown.chosen', function(evt) { - _this.keydown_checker(evt); - }); - this.search_field.bind('focus.chosen', function(evt) { - _this.input_focus(evt); - }); - this.search_field.bind('cut.chosen', function(evt) { - _this.clipboard_event_checker(evt); - }); - this.search_field.bind('paste.chosen', function(evt) { - _this.clipboard_event_checker(evt); - }); - if (this.is_multiple) { - return this.search_choices.bind('click.chosen', function(evt) { - _this.choices_click(evt); - }); - } else { - return this.container.bind('click.chosen', function(evt) { - evt.preventDefault(); - }); - } - }; - - Chosen.prototype.destroy = function() { - $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action); - if (this.search_field[0].tabIndex) { - this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex; - } - this.container.remove(); - this.form_field_jq.removeData('chosen'); - return this.form_field_jq.show(); - }; - - Chosen.prototype.search_field_disabled = function() { - this.is_disabled = this.form_field_jq[0].disabled; - if (this.is_disabled) { - this.container.addClass('chosen-disabled'); - this.search_field[0].disabled = true; - if (!this.is_multiple) { - this.selected_item.unbind("focus.chosen", this.activate_action); - } - return this.close_field(); - } else { - this.container.removeClass('chosen-disabled'); - this.search_field[0].disabled = false; - if (!this.is_multiple) { - return this.selected_item.bind("focus.chosen", this.activate_action); - } - } - }; - - Chosen.prototype.container_mousedown = function(evt) { - if (!this.is_disabled) { - if (evt && evt.type === "mousedown" && !this.results_showing) { - evt.preventDefault(); - } - if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) { - if (!this.active_field) { - if (this.is_multiple) { - this.search_field.val(""); - } - $(this.container[0].ownerDocument).bind('click.chosen', this.click_test_action); - this.results_show(); - } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) { - evt.preventDefault(); - this.results_toggle(); - } - return this.activate_field(); - } - } - }; - - Chosen.prototype.container_mouseup = function(evt) { - if (evt.target.nodeName === "ABBR" && !this.is_disabled) { - return this.results_reset(evt); - } - }; - - Chosen.prototype.search_results_mousewheel = function(evt) { - var delta; - if (evt.originalEvent) { - delta = evt.originalEvent.deltaY || -evt.originalEvent.wheelDelta || evt.originalEvent.detail; - } - if (delta != null) { - evt.preventDefault(); - if (evt.type === 'DOMMouseScroll') { - delta = delta * 40; - } - return this.search_results.scrollTop(delta + this.search_results.scrollTop()); - } - }; - - Chosen.prototype.blur_test = function(evt) { - if (!this.active_field && this.container.hasClass("chosen-container-active")) { - return this.close_field(); - } - }; - - Chosen.prototype.close_field = function() { - $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action); - this.active_field = false; - this.results_hide(); - this.container.removeClass("chosen-container-active"); - this.clear_backstroke(); - this.show_search_field_default(); - return this.search_field_scale(); - }; - - Chosen.prototype.activate_field = function() { - this.container.addClass("chosen-container-active"); - this.active_field = true; - this.search_field.val(this.search_field.val()); - return this.search_field.focus(); - }; - - Chosen.prototype.test_active_click = function(evt) { - var active_container; - active_container = $(evt.target).closest('.chosen-container'); - if (active_container.length && this.container[0] === active_container[0]) { - return this.active_field = true; - } else { - return this.close_field(); - } - }; - - Chosen.prototype.results_build = function() { - this.parsing = true; - this.selected_option_count = null; - this.results_data = SelectParser.select_to_array(this.form_field); - if (this.is_multiple) { - this.search_choices.find("li.search-choice").remove(); - } else if (!this.is_multiple) { - this.single_set_selected_text(); - if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) { - this.search_field[0].readOnly = true; - this.container.addClass("chosen-container-single-nosearch"); - } else { - this.search_field[0].readOnly = false; - this.container.removeClass("chosen-container-single-nosearch"); - } - } - this.update_results_content(this.results_option_build({ - first: true - })); - this.search_field_disabled(); - this.show_search_field_default(); - this.search_field_scale(); - return this.parsing = false; - }; - - Chosen.prototype.result_do_highlight = function(el) { - var high_bottom, high_top, maxHeight, visible_bottom, visible_top; - if (el.length) { - this.result_clear_highlight(); - this.result_highlight = el; - this.result_highlight.addClass("highlighted"); - maxHeight = parseInt(this.search_results.css("maxHeight"), 10); - visible_top = this.search_results.scrollTop(); - visible_bottom = maxHeight + visible_top; - high_top = this.result_highlight.position().top + this.search_results.scrollTop(); - high_bottom = high_top + this.result_highlight.outerHeight(); - if (high_bottom >= visible_bottom) { - return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0); - } else if (high_top < visible_top) { - return this.search_results.scrollTop(high_top); - } - } - }; - - Chosen.prototype.result_clear_highlight = function() { - if (this.result_highlight) { - this.result_highlight.removeClass("highlighted"); - } - return this.result_highlight = null; - }; - - Chosen.prototype.results_show = function() { - if (this.is_multiple && this.max_selected_options <= this.choices_count()) { - this.form_field_jq.trigger("chosen:maxselected", { - chosen: this - }); - return false; - } - this.container.addClass("chosen-with-drop"); - this.results_showing = true; - this.search_field.focus(); - this.search_field.val(this.search_field.val()); - this.winnow_results(); - return this.form_field_jq.trigger("chosen:showing_dropdown", { - chosen: this - }); - }; - - Chosen.prototype.update_results_content = function(content) { - return this.search_results.html(content); - }; - - Chosen.prototype.results_hide = function() { - if (this.results_showing) { - this.result_clear_highlight(); - this.container.removeClass("chosen-with-drop"); - this.form_field_jq.trigger("chosen:hiding_dropdown", { - chosen: this - }); - } - return this.results_showing = false; - }; - - Chosen.prototype.set_tab_index = function(el) { - var ti; - if (this.form_field.tabIndex) { - ti = this.form_field.tabIndex; - this.form_field.tabIndex = -1; - return this.search_field[0].tabIndex = ti; - } - }; - - Chosen.prototype.set_label_behavior = function() { - var _this = this; - this.form_field_label = this.form_field_jq.parents("label"); - if (!this.form_field_label.length && this.form_field.id.length) { - this.form_field_label = $("label[for='" + this.form_field.id + "']"); - } - if (this.form_field_label.length > 0) { - return this.form_field_label.bind('click.chosen', function(evt) { - if (_this.is_multiple) { - return _this.container_mousedown(evt); - } else { - return _this.activate_field(); - } - }); - } - }; - - Chosen.prototype.show_search_field_default = function() { - if (this.is_multiple && this.choices_count() < 1 && !this.active_field) { - this.search_field.val(this.default_text); - return this.search_field.addClass("default"); - } else { - this.search_field.val(""); - return this.search_field.removeClass("default"); - } - }; - - Chosen.prototype.search_results_mouseup = function(evt) { - var target; - target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); - if (target.length) { - this.result_highlight = target; - this.result_select(evt); - return this.search_field.focus(); - } - }; - - Chosen.prototype.search_results_mouseover = function(evt) { - var target; - target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); - if (target) { - return this.result_do_highlight(target); - } - }; - - Chosen.prototype.search_results_mouseout = function(evt) { - if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) { - return this.result_clear_highlight(); - } - }; - - Chosen.prototype.choice_build = function(item) { - var choice, close_link, - _this = this; - choice = $('
    • ', { - "class": "search-choice" - }).html("" + (this.choice_label(item)) + ""); - if (item.disabled) { - choice.addClass('search-choice-disabled'); - } else { - close_link = $('', { - "class": 'search-choice-close', - 'data-option-array-index': item.array_index - }); - close_link.bind('click.chosen', function(evt) { - return _this.choice_destroy_link_click(evt); - }); - choice.append(close_link); - } - return this.search_container.before(choice); - }; - - Chosen.prototype.choice_destroy_link_click = function(evt) { - evt.preventDefault(); - evt.stopPropagation(); - if (!this.is_disabled) { - return this.choice_destroy($(evt.target)); - } - }; - - Chosen.prototype.choice_destroy = function(link) { - if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) { - this.show_search_field_default(); - if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) { - this.results_hide(); - } - link.parents('li').first().remove(); - return this.search_field_scale(); - } - }; - - Chosen.prototype.results_reset = function() { - this.reset_single_select_options(); - this.form_field.options[0].selected = true; - this.single_set_selected_text(); - this.show_search_field_default(); - this.results_reset_cleanup(); - this.form_field_jq.trigger("change"); - if (this.active_field) { - return this.results_hide(); - } - }; - - Chosen.prototype.results_reset_cleanup = function() { - this.current_selectedIndex = this.form_field.selectedIndex; - return this.selected_item.find("abbr").remove(); - }; - - Chosen.prototype.result_select = function(evt) { - var high, item; - if (this.result_highlight) { - high = this.result_highlight; - this.result_clear_highlight(); - if (this.is_multiple && this.max_selected_options <= this.choices_count()) { - this.form_field_jq.trigger("chosen:maxselected", { - chosen: this - }); - return false; - } - if (this.is_multiple) { - high.removeClass("active-result"); - } else { - this.reset_single_select_options(); - } - high.addClass("result-selected"); - item = this.results_data[high[0].getAttribute("data-option-array-index")]; - item.selected = true; - this.form_field.options[item.options_index].selected = true; - this.selected_option_count = null; - if (this.is_multiple) { - this.choice_build(item); - } else { - this.single_set_selected_text(this.choice_label(item)); - } - if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) { - this.results_hide(); - } - this.show_search_field_default(); - if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) { - this.form_field_jq.trigger("change", { - 'selected': this.form_field.options[item.options_index].value - }); - } - this.current_selectedIndex = this.form_field.selectedIndex; - evt.preventDefault(); - return this.search_field_scale(); - } - }; - - Chosen.prototype.single_set_selected_text = function(text) { - if (text == null) { - text = this.default_text; - } - if (text === this.default_text) { - this.selected_item.addClass("chosen-default"); - } else { - this.single_deselect_control_build(); - this.selected_item.removeClass("chosen-default"); - } - return this.selected_item.find("span").html(text); - }; - - Chosen.prototype.result_deselect = function(pos) { - var result_data; - result_data = this.results_data[pos]; - if (!this.form_field.options[result_data.options_index].disabled) { - result_data.selected = false; - this.form_field.options[result_data.options_index].selected = false; - this.selected_option_count = null; - this.result_clear_highlight(); - if (this.results_showing) { - this.winnow_results(); - } - this.form_field_jq.trigger("change", { - deselected: this.form_field.options[result_data.options_index].value - }); - this.search_field_scale(); - return true; - } else { - return false; - } - }; - - Chosen.prototype.single_deselect_control_build = function() { - if (!this.allow_single_deselect) { - return; - } - if (!this.selected_item.find("abbr").length) { - this.selected_item.find("span").first().after(""); - } - return this.selected_item.addClass("chosen-single-with-deselect"); - }; - - Chosen.prototype.get_search_text = function() { - return $('
      ').text($.trim(this.search_field.val())).html(); - }; - - Chosen.prototype.winnow_results_set_highlight = function() { - var do_high, selected_results; - selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : []; - do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first(); - if (do_high != null) { - return this.result_do_highlight(do_high); - } - }; - - Chosen.prototype.no_results = function(terms) { - var no_results_html; - no_results_html = $('
    • ' + this.results_none_found + ' ""
    • '); - no_results_html.find("span").first().html(terms); - this.search_results.append(no_results_html); - return this.form_field_jq.trigger("chosen:no_results", { - chosen: this - }); - }; - - Chosen.prototype.no_results_clear = function() { - return this.search_results.find(".no-results").remove(); - }; - - Chosen.prototype.keydown_arrow = function() { - var next_sib; - if (this.results_showing && this.result_highlight) { - next_sib = this.result_highlight.nextAll("li.active-result").first(); - if (next_sib) { - return this.result_do_highlight(next_sib); - } - } else { - return this.results_show(); - } - }; - - Chosen.prototype.keyup_arrow = function() { - var prev_sibs; - if (!this.results_showing && !this.is_multiple) { - return this.results_show(); - } else if (this.result_highlight) { - prev_sibs = this.result_highlight.prevAll("li.active-result"); - if (prev_sibs.length) { - return this.result_do_highlight(prev_sibs.first()); - } else { - if (this.choices_count() > 0) { - this.results_hide(); - } - return this.result_clear_highlight(); - } - } - }; - - Chosen.prototype.keydown_backstroke = function() { - var next_available_destroy; - if (this.pending_backstroke) { - this.choice_destroy(this.pending_backstroke.find("a").first()); - return this.clear_backstroke(); - } else { - next_available_destroy = this.search_container.siblings("li.search-choice").last(); - if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) { - this.pending_backstroke = next_available_destroy; - if (this.single_backstroke_delete) { - return this.keydown_backstroke(); - } else { - return this.pending_backstroke.addClass("search-choice-focus"); - } - } - } - }; - - Chosen.prototype.clear_backstroke = function() { - if (this.pending_backstroke) { - this.pending_backstroke.removeClass("search-choice-focus"); - } - return this.pending_backstroke = null; - }; - - Chosen.prototype.keydown_checker = function(evt) { - var stroke, _ref1; - stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode; - this.search_field_scale(); - if (stroke !== 8 && this.pending_backstroke) { - this.clear_backstroke(); - } - switch (stroke) { - case 8: - this.backstroke_length = this.search_field.val().length; - break; - case 9: - if (this.results_showing && !this.is_multiple) { - this.result_select(evt); - } - this.mouse_on_container = false; - break; - case 13: - if (this.results_showing) { - evt.preventDefault(); - } - break; - case 32: - if (this.disable_search) { - evt.preventDefault(); - } - break; - case 38: - evt.preventDefault(); - this.keyup_arrow(); - break; - case 40: - evt.preventDefault(); - this.keydown_arrow(); - break; - } - }; - - Chosen.prototype.search_field_scale = function() { - var div, f_width, h, style, style_block, styles, w, _i, _len; - if (this.is_multiple) { - h = 0; - w = 0; - style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"; - styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing']; - for (_i = 0, _len = styles.length; _i < _len; _i++) { - style = styles[_i]; - style_block += style + ":" + this.search_field.css(style) + ";"; - } - div = $('
      ', { - 'style': style_block - }); - div.text(this.search_field.val()); - $('body').append(div); - w = div.width() + 25; - div.remove(); - f_width = this.container.outerWidth(); - if (w > f_width - 10) { - w = f_width - 10; - } - return this.search_field.css({ - 'width': w + 'px' - }); - } - }; - - return Chosen; - - })(AbstractChosen); - -}).call(this); diff --git a/vendor/assets/stylesheets/chosen.css.scss b/vendor/assets/stylesheets/chosen.css.scss deleted file mode 100755 index 5627b3578b..0000000000 --- a/vendor/assets/stylesheets/chosen.css.scss +++ /dev/null @@ -1,452 +0,0 @@ -/*! -Chosen, a Select Box Enhancer for jQuery and Prototype -by Patrick Filler for Harvest, http://getharvest.com - -Version 1.6.2 -Full source at https://github.com/harvesthq/chosen -Copyright (c) 2011-2016 Harvest http://getharvest.com - -MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md -This file is generated by `grunt build`, do not edit it by hand. -*/ - -/* @group Base */ -.chosen-container { - position: relative; - display: inline-block; - vertical-align: middle; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - width: 100%; - /* height: calc(2.25rem + 2px); */ - padding: 0.375rem 0.75rem; - font-size: 1rem; - line-height: 1.5; - color: #495057; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ced4da; - border-radius: 0.25rem; - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -.chosen-container * { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.chosen-container .chosen-drop { - position: absolute; - top: 100%; - left: -9999px; - z-index: 1010; - width: 100%; - border: 1px solid #aaa; - border-top: 0; - background: #fff; - box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15); -} -.chosen-container.chosen-with-drop .chosen-drop { - left: 0; -} -.chosen-container a { - cursor: pointer; -} -.chosen-container .search-choice .group-name, .chosen-container .chosen-single .group-name { - margin-right: 4px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - font-weight: normal; - color: #999999; -} -.chosen-container .search-choice .group-name:after, .chosen-container .chosen-single .group-name:after { - content: ":"; - padding-left: 2px; - vertical-align: top; -} - -/* @end */ -/* @group Single Chosen */ -.chosen-container-single .chosen-single { - position: relative; - display: block; - overflow: hidden; - padding: 0 0 0 8px; - height: 25px; - border: 1px solid #aaa; - border-radius: 5px; - background-color: #fff; - background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4)); - background: -webkit-linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); - background: -moz-linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); - background: -o-linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); - background: linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); - background-clip: padding-box; - box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1); - color: #444; - text-decoration: none; - white-space: nowrap; - line-height: 24px; -} -.chosen-container-single .chosen-default { - color: #999; -} -.chosen-container-single .chosen-single span { - display: block; - overflow: hidden; - margin-right: 26px; - text-overflow: ellipsis; - white-space: nowrap; -} -.chosen-container-single .chosen-single-with-deselect span { - margin-right: 38px; -} -.chosen-container-single .chosen-single abbr { - position: absolute; - top: 6px; - right: 26px; - display: block; - width: 12px; - height: 12px; - background: image-url('chosen/chosen-sprite.png') -42px 1px no-repeat; - font-size: 1px; -} -.chosen-container-single .chosen-single abbr:hover { - background-position: -42px -10px; -} -.chosen-container-single.chosen-disabled .chosen-single abbr:hover { - background-position: -42px -10px; -} -.chosen-container-single .chosen-single div { - position: absolute; - top: 0; - right: 0; - display: block; - width: 18px; - height: 100%; -} -.chosen-container-single .chosen-single div b { - display: block; - width: 100%; - height: 100%; - background: image-url('chosen/chosen-sprite.png') no-repeat 0px 2px; -} -.chosen-container-single .chosen-search { - position: relative; - z-index: 1010; - margin: 0; - padding: 3px 4px; - white-space: nowrap; -} -.chosen-container-single .chosen-search input[type="text"] { - margin: 1px 0; - padding: 4px 20px 4px 5px; - width: 100%; - height: auto; - outline: 0; - border: 1px solid #aaa; - background: white image-url('chosen/chosen-sprite.png') no-repeat 100% -20px; - background: image-url('chosen/chosen-sprite.png') no-repeat 100% -20px; - font-size: 1em; - font-family: sans-serif; - line-height: normal; - border-radius: 0; -} -.chosen-container-single .chosen-drop { - margin-top: -1px; - border-radius: 0 0 4px 4px; - background-clip: padding-box; -} -.chosen-container-single.chosen-container-single-nosearch .chosen-search { - position: absolute; - left: -9999px; -} - -/* @end */ -/* @group Results */ -.chosen-container .chosen-results { - color: #444; - position: relative; - overflow-x: hidden; - overflow-y: auto; - margin: 0 4px 4px 0; - padding: 0 0 0 4px; - max-height: 240px; - -webkit-overflow-scrolling: touch; -} -.chosen-container .chosen-results li { - display: none; - margin: 0; - padding: 5px 6px; - list-style: none; - line-height: 15px; - word-wrap: break-word; - -webkit-touch-callout: none; -} -.chosen-container .chosen-results li.active-result { - display: list-item; - cursor: pointer; -} -.chosen-container .chosen-results li.disabled-result { - display: list-item; - color: #ccc; - cursor: default; -} -.chosen-container .chosen-results li.highlighted { - background-color: #3875d7; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc)); - background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%); - background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%); - background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%); - background-image: linear-gradient(#3875d7 20%, #2a62bc 90%); - color: #fff; -} -.chosen-container .chosen-results li.no-results { - color: #777; - display: list-item; - background: #f4f4f4; -} -.chosen-container .chosen-results li.group-result { - display: list-item; - font-weight: bold; - cursor: default; -} -.chosen-container .chosen-results li.group-option { - padding-left: 15px; -} -.chosen-container .chosen-results li em { - font-style: normal; - text-decoration: underline; -} - -/* @end */ -/* @group Multi Chosen */ -.chosen-container-multi .chosen-choices { - position: relative; - overflow: hidden; - margin: 0; - padding: 0 5px; - width: 100%; - height: auto; - cursor: text; - -} -.chosen-container-multi .chosen-choices li { - float: left; - list-style: none; -} -.chosen-container-multi .chosen-choices li.search-field { - margin: 0; - padding: 0; - white-space: nowrap; - display: contents; -} -.chosen-container-multi .chosen-choices li.search-field input[type="text"] { - margin: 1px 0; - padding: 0; - height: 25px; - outline: 0; - border: 0 !important; - background: transparent !important; - box-shadow: none; - color: #999; - font-size: 100%; - font-family: sans-serif; - line-height: normal; - border-radius: 0; -} -.chosen-container-multi .chosen-choices li.search-choice { - position: relative; - margin: 3px 5px 3px 0; - padding: 3px 20px 3px 5px; - border: 1px solid #aaa; - max-width: 100%; - border-radius: 3px; - background-color: #eeeeee; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); - background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); - background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); - background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); - background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); - background-size: 100% 19px; - background-repeat: repeat-x; - background-clip: padding-box; - box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05); - color: #333; - line-height: 13px; - cursor: default; -} -.chosen-container-multi .chosen-choices li.search-choice span { - word-wrap: break-word; -} -.chosen-container-multi .chosen-choices li.search-choice .search-choice-close { - position: absolute; - top: 4px; - right: 3px; - display: block; - width: 12px; - height: 12px; - background: image-url('chosen/chosen-sprite.png') -42px 1px no-repeat; - font-size: 1px; -} -.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover { - background-position: -42px -10px; -} -.chosen-container-multi .chosen-choices li.search-choice-disabled { - padding-right: 5px; - border: 1px solid #ccc; - background-color: #e4e4e4; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); - background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); - background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); - background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); - background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); - color: #666; -} -.chosen-container-multi .chosen-choices li.search-choice-focus { - background: #d4d4d4; -} -.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close { - background-position: -42px -10px; -} -.chosen-container-multi .chosen-results { - margin: 0; - padding: 0; -} -.chosen-container-multi .chosen-drop .result-selected { - display: list-item; - color: #ccc; - cursor: default; -} - -/* @end */ -/* @group Active */ -.chosen-container-active .chosen-single { - border: 1px solid #5897fb; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); -} -.chosen-container-active.chosen-with-drop .chosen-single { - border: 1px solid #aaa; - -moz-border-radius-bottomright: 0; - border-bottom-right-radius: 0; - -moz-border-radius-bottomleft: 0; - border-bottom-left-radius: 0; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff)); - background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%); - background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%); - background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%); - background-image: linear-gradient(#eeeeee 20%, #ffffff 80%); - box-shadow: 0 1px 0 #fff inset; -} -.chosen-container-active.chosen-with-drop .chosen-single div { - border-left: none; - background: transparent; -} -.chosen-container-active.chosen-with-drop .chosen-single div b { - background-position: -18px 2px; -} -.chosen-container-active .chosen-choices { - border: 1px solid #5897fb; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); -} -.chosen-container-active .chosen-choices li.search-field input[type="text"] { - color: #222 !important; -} - -/* @end */ -/* @group Disabled Support */ -.chosen-disabled { - opacity: 0.5 !important; - cursor: default; -} -.chosen-disabled .chosen-single { - cursor: default; -} -.chosen-disabled .chosen-choices .search-choice .search-choice-close { - cursor: default; -} - -/* @end */ -/* @group Right to Left */ -.chosen-rtl { - text-align: right; -} -.chosen-rtl .chosen-single { - overflow: visible; - padding: 0 8px 0 0; -} -.chosen-rtl .chosen-single span { - margin-right: 0; - margin-left: 26px; - direction: rtl; -} -.chosen-rtl .chosen-single-with-deselect span { - margin-left: 38px; -} -.chosen-rtl .chosen-single div { - right: auto; - left: 3px; -} -.chosen-rtl .chosen-single abbr { - right: auto; - left: 26px; -} -.chosen-rtl .chosen-choices li { - float: right; -} -.chosen-rtl .chosen-choices li.search-field input[type="text"] { - direction: rtl; -} -.chosen-rtl .chosen-choices li.search-choice { - margin: 3px 5px 3px 0; - padding: 3px 5px 3px 19px; -} -.chosen-rtl .chosen-choices li.search-choice .search-choice-close { - right: auto; - left: 4px; -} -.chosen-rtl.chosen-container-single-nosearch .chosen-search, -.chosen-rtl .chosen-drop { - left: 9999px; -} -.chosen-rtl.chosen-container-single .chosen-results { - margin: 0 0 4px 4px; - padding: 0 4px 0 0; -} -.chosen-rtl .chosen-results li.group-option { - padding-right: 15px; - padding-left: 0; -} -.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div { - border-right: none; -} -.chosen-rtl .chosen-search input[type="text"] { - padding: 4px 5px 4px 20px; - background: white image-url('chosen/chosen-sprite.png') no-repeat -30px -20px; - background: image-url('chosen/chosen-sprite.png') no-repeat -30px -20px; - direction: rtl; -} -.chosen-rtl.chosen-container-single .chosen-single div b { - background-position: 6px 2px; -} -.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b { - background-position: -12px 2px; -} - -/* @end */ -/* @group Retina compatibility */ -@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 144dpi), only screen and (min-resolution: 1.5dppx) { - .chosen-rtl .chosen-search input[type="text"], - .chosen-container-single .chosen-single abbr, - .chosen-container-single .chosen-single div b, - .chosen-container-single .chosen-search input[type="text"], - .chosen-container-multi .chosen-choices .search-choice .search-choice-close, - .chosen-container .chosen-results-scroll-down span, - .chosen-container .chosen-results-scroll-up span { - background-image: image-url('chosen/chosen-sprite@2x.png') !important; - background-size: 52px 37px !important; - background-repeat: no-repeat !important; - } -} -/* @end */