zizia 4.0.3.alpha.01 → 4.0.4.alpha.01

Sign up to get free protection for your applications and to get access to all the features.
Files changed (868) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +45 -0
  3. data/.gitignore +17 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +80 -0
  6. data/.rubocop_todo.yml +21 -0
  7. data/.solr_wrapper +8 -0
  8. data/.travis.yml +12 -0
  9. data/Gemfile +12 -0
  10. data/Rakefile +38 -0
  11. data/app/assets/config/zizia_manifest.js +2 -0
  12. data/app/assets/images/zizia/.keep +0 -0
  13. data/app/assets/javascripts/zizia/DisplayUploadedFile.es6 +43 -0
  14. data/app/assets/javascripts/zizia/application.js +13 -0
  15. data/app/assets/javascripts/zizia/zizia.js +6 -0
  16. data/app/assets/stylesheets/zizia/_file_upload.scss +17 -0
  17. data/app/assets/stylesheets/zizia/application.css +15 -0
  18. data/app/assets/stylesheets/zizia/zizia.scss +1 -0
  19. data/app/controllers/zizia/application_controller.rb +6 -0
  20. data/app/controllers/zizia/csv_imports_controller.rb +54 -0
  21. data/app/controllers/zizia/importer_documentation_controller.rb +11 -0
  22. data/app/helpers/importer_documentation_helper.rb +13 -0
  23. data/app/helpers/zizia/application_helper.rb +14 -0
  24. data/app/importers/modular_importer.rb +52 -0
  25. data/app/jobs/zizia/application_job.rb +5 -0
  26. data/app/jobs/zizia/start_csv_import_job.rb +14 -0
  27. data/app/models/zizia/application_record.rb +6 -0
  28. data/app/models/zizia/csv_import.rb +21 -0
  29. data/app/models/zizia/csv_import_detail.rb +20 -0
  30. data/app/models/zizia/pre_ingest_file.rb +6 -0
  31. data/app/models/zizia/pre_ingest_work.rb +6 -0
  32. data/app/uploaders/zizia/csv_manifest_uploader.rb +62 -0
  33. data/app/uploaders/zizia/csv_manifest_validator.rb +163 -0
  34. data/app/views/layouts/zizia/application.html.erb +14 -0
  35. data/app/views/zizia/csv_imports/_actions.html.erb +3 -0
  36. data/app/views/zizia/csv_imports/_collection_selection.html.erb +3 -0
  37. data/app/views/zizia/csv_imports/_error.html.erb +10 -0
  38. data/app/views/zizia/csv_imports/_file_upload.html.erb +3 -0
  39. data/app/views/zizia/csv_imports/_form.html.erb +83 -0
  40. data/app/views/zizia/csv_imports/_no_collection.html.erb +7 -0
  41. data/app/views/zizia/csv_imports/_record_count.html.erb +8 -0
  42. data/app/views/zizia/csv_imports/_start_import_form.html.erb +10 -0
  43. data/app/views/zizia/csv_imports/_update_actor_stack.html.erb +5 -0
  44. data/app/views/zizia/csv_imports/index.html.erb +21 -0
  45. data/app/views/zizia/csv_imports/new.html.erb +2 -0
  46. data/app/views/zizia/csv_imports/preview.html.erb +76 -0
  47. data/app/views/zizia/csv_imports/show.html.erb +31 -0
  48. data/app/views/zizia/importer_documentation/guide.html.erb +1 -0
  49. data/bin/rails +15 -0
  50. data/config/routes.rb +9 -0
  51. data/db/migrate/201901162141281_create_zizia_csv_imports.rb +9 -0
  52. data/db/migrate/201901162203121_add_manifest_to_zizia_csv_imports.rb +6 -0
  53. data/db/migrate/201901241536541_add_fedora_collection_id_to_zizia_csv_imports.rb +5 -0
  54. data/db/migrate/201901241536542_add_update_actor_stack_to_zizia_csv_imports.rb +5 -0
  55. data/db/migrate/20190911133657_create_zizia_pre_ingest_files.rb +12 -0
  56. data/db/migrate/20190911134002_create_zizia_pre_ingest_works.rb +9 -0
  57. data/db/migrate/20190911142616_create_zizia_csv_import_details.rb +8 -0
  58. data/db/migrate/20190918214137_drop_users.rb +11 -0
  59. data/db/migrate/20190919145012_user_roles.rb +18 -0
  60. data/db/migrate/20190921153802_add_depositor_id_to_csv_import_detail.rb +5 -0
  61. data/db/migrate/20190921153851_add_collection_id_to_csv_import_detail.rb +5 -0
  62. data/db/migrate/20190921153933_add_batch_id_to_csv_import_detail.rb +5 -0
  63. data/db/migrate/20190921154009_add_success_count_to_csv_import_detail.rb +5 -0
  64. data/db/migrate/20190921154038_add_failure_count_to_csv_import_detail.rb +5 -0
  65. data/db/migrate/20190921154221_add_deduplication_field_to_csv_import_detail.rb +5 -0
  66. data/db/migrate/20190923182946_add_update_actor_stack_to_csv_import_detail.rb +5 -0
  67. data/docs/_config.yml +1 -0
  68. data/docs/customizing_metadata.md +41 -0
  69. data/docs/index.md +113 -0
  70. data/lib/zizia/always_invalid_validator.rb +17 -0
  71. data/lib/zizia/csv_template.rb +9 -0
  72. data/lib/zizia/engine.rb +32 -0
  73. data/lib/zizia/hash_mapper.rb +44 -0
  74. data/lib/zizia/hyrax/hyrax_basic_metadata_mapper.rb +149 -0
  75. data/lib/zizia/hyrax/hyrax_default_updater.rb +11 -0
  76. data/lib/zizia/hyrax/hyrax_delete_files_updater.rb +16 -0
  77. data/lib/zizia/hyrax/hyrax_metadata_only_updater.rb +58 -0
  78. data/lib/zizia/hyrax/hyrax_record_importer.rb +247 -0
  79. data/lib/zizia/hyrax/metadata_only_stack.rb +70 -0
  80. data/lib/zizia/importer.rb +58 -0
  81. data/lib/zizia/input_record.rb +65 -0
  82. data/lib/zizia/metadata_mapper.rb +83 -0
  83. data/lib/zizia/parser.rb +132 -0
  84. data/lib/zizia/parsers/csv_parser.rb +45 -0
  85. data/lib/zizia/record_importer.rb +44 -0
  86. data/lib/zizia/spec/fakes/fake_parser.rb +22 -0
  87. data/lib/zizia/spec/shared_examples/a_mapper.rb +32 -0
  88. data/lib/zizia/spec/shared_examples/a_parser.rb +73 -0
  89. data/lib/zizia/spec/shared_examples/a_validator.rb +29 -0
  90. data/lib/zizia/spec.rb +14 -0
  91. data/lib/zizia/validator.rb +106 -0
  92. data/lib/zizia/validators/csv_format_validator.rb +26 -0
  93. data/lib/zizia/validators/title_validator.rb +30 -0
  94. data/lib/zizia/version.rb +5 -0
  95. data/lib/zizia.rb +66 -0
  96. data/log/.keep +0 -0
  97. data/solr/config/_rest_managed.json +3 -0
  98. data/solr/config/admin-extra.html +31 -0
  99. data/solr/config/elevate.xml +36 -0
  100. data/solr/config/mapping-ISOLatin1Accent.txt +246 -0
  101. data/solr/config/protwords.txt +21 -0
  102. data/solr/config/routes.rb +9 -0
  103. data/solr/config/schema.xml +366 -0
  104. data/solr/config/scripts.conf +24 -0
  105. data/solr/config/solrconfig.xml +322 -0
  106. data/solr/config/spellings.txt +2 -0
  107. data/solr/config/stopwords.txt +58 -0
  108. data/solr/config/stopwords_en.txt +58 -0
  109. data/solr/config/synonyms.txt +31 -0
  110. data/solr/config/xslt/example.xsl +132 -0
  111. data/solr/config/xslt/example_atom.xsl +67 -0
  112. data/solr/config/xslt/example_rss.xsl +66 -0
  113. data/solr/config/xslt/luke.xsl +337 -0
  114. data/spec/controllers/importer_documentation_controller_spec.rb +14 -0
  115. data/spec/dummy/.fcrepo_wrapper +4 -0
  116. data/spec/dummy/.gitignore +23 -0
  117. data/spec/dummy/.rspec +1 -0
  118. data/spec/dummy/.ruby-version +1 -0
  119. data/spec/dummy/.solr_wrapper +8 -0
  120. data/spec/dummy/.solr_wrapper.yml +5 -0
  121. data/spec/dummy/Gemfile +75 -0
  122. data/spec/dummy/README.md +24 -0
  123. data/spec/dummy/Rakefile +8 -0
  124. data/spec/dummy/app/actors/hyrax/actors/work_actor.rb +8 -0
  125. data/spec/dummy/app/assets/config/manifest.js +3 -0
  126. data/spec/dummy/app/assets/images/.keep +0 -0
  127. data/spec/dummy/app/assets/images/unauthorized.png +0 -0
  128. data/spec/dummy/app/assets/images/us_404.svg +91 -0
  129. data/spec/dummy/app/assets/javascripts/application.js +25 -0
  130. data/spec/dummy/app/assets/javascripts/blacklight_gallery.js +1 -0
  131. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  132. data/spec/dummy/app/assets/javascripts/channels/.keep +0 -0
  133. data/spec/dummy/app/assets/javascripts/openseadragon.js +2 -0
  134. data/spec/dummy/app/assets/stylesheets/application.css +16 -0
  135. data/spec/dummy/app/assets/stylesheets/hyrax.scss +16 -0
  136. data/spec/dummy/app/assets/stylesheets/openseadragon.css +3 -0
  137. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  138. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  139. data/spec/dummy/app/controllers/application_controller.rb +16 -0
  140. data/spec/dummy/app/controllers/catalog_controller.rb +298 -0
  141. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  142. data/spec/dummy/app/controllers/hyrax/works_controller.rb +14 -0
  143. data/spec/dummy/app/forms/hyrax/work_form.rb +9 -0
  144. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  145. data/spec/dummy/app/helpers/hyrax_helper.rb +5 -0
  146. data/spec/dummy/app/indexers/work_indexer.rb +18 -0
  147. data/spec/dummy/app/jobs/application_job.rb +2 -0
  148. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  149. data/spec/dummy/app/models/ability.rb +23 -0
  150. data/spec/dummy/app/models/application_record.rb +3 -0
  151. data/spec/dummy/app/models/collection.rb +7 -0
  152. data/spec/dummy/app/models/concerns/.keep +0 -0
  153. data/spec/dummy/app/models/file_set.rb +4 -0
  154. data/spec/dummy/app/models/qa/local_authority.rb +2 -0
  155. data/spec/dummy/app/models/qa/local_authority_entry.rb +3 -0
  156. data/spec/dummy/app/models/qa.rb +5 -0
  157. data/spec/dummy/app/models/search_builder.rb +16 -0
  158. data/spec/dummy/app/models/solr_document.rb +28 -0
  159. data/spec/dummy/app/models/user.rb +29 -0
  160. data/spec/dummy/app/models/work.rb +14 -0
  161. data/spec/dummy/app/presenters/hyrax/work_presenter.rb +6 -0
  162. data/spec/dummy/app/views/hyrax/works/_work.html.erb +2 -0
  163. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  164. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  165. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  166. data/spec/dummy/bin/bundle +3 -0
  167. data/spec/dummy/bin/rails +9 -0
  168. data/spec/dummy/bin/rake +9 -0
  169. data/spec/dummy/bin/setup +38 -0
  170. data/spec/dummy/bin/spring +17 -0
  171. data/spec/dummy/bin/update +29 -0
  172. data/spec/dummy/bin/yarn +11 -0
  173. data/spec/dummy/config/analytics.yml +9 -0
  174. data/spec/dummy/config/application.rb +18 -0
  175. data/spec/dummy/config/authorities/licenses.yml +46 -0
  176. data/spec/dummy/config/authorities/resource_types.yml +41 -0
  177. data/spec/dummy/config/authorities/rights_statements.yml +37 -0
  178. data/spec/dummy/config/blacklight.yml +9 -0
  179. data/spec/dummy/config/boot.rb +3 -0
  180. data/spec/dummy/config/cable.yml +10 -0
  181. data/spec/dummy/config/credentials.yml.enc +1 -0
  182. data/spec/dummy/config/database.yml +25 -0
  183. data/spec/dummy/config/environment.rb +5 -0
  184. data/spec/dummy/config/environments/development.rb +54 -0
  185. data/spec/dummy/config/environments/production.rb +91 -0
  186. data/spec/dummy/config/environments/test.rb +44 -0
  187. data/spec/dummy/config/fcrepo_wrapper_test.yml +4 -0
  188. data/spec/dummy/config/fedora.yml +15 -0
  189. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  190. data/spec/dummy/config/initializers/assets.rb +14 -0
  191. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  192. data/spec/dummy/config/initializers/bundler.rb +1 -0
  193. data/spec/dummy/config/initializers/clamav.rb +1 -0
  194. data/spec/dummy/config/initializers/content_security_policy.rb +25 -0
  195. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  196. data/spec/dummy/config/initializers/devise.rb +299 -0
  197. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  198. data/spec/dummy/config/initializers/hydra_config.rb +24 -0
  199. data/spec/dummy/config/initializers/hyrax.rb +283 -0
  200. data/spec/dummy/config/initializers/inflections.rb +16 -0
  201. data/spec/dummy/config/initializers/mailboxer.rb +22 -0
  202. data/spec/dummy/config/initializers/mime_types.rb +8 -0
  203. data/spec/dummy/config/initializers/mini_magick.rb +5 -0
  204. data/spec/dummy/config/initializers/redis_config.rb +3 -0
  205. data/spec/dummy/config/initializers/riiif.rb +26 -0
  206. data/spec/dummy/config/initializers/simple_form.rb +170 -0
  207. data/spec/dummy/config/initializers/simple_form_bootstrap.rb +150 -0
  208. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  209. data/spec/dummy/config/locales/blacklight.en.yml +3 -0
  210. data/spec/dummy/config/locales/devise.en.yml +65 -0
  211. data/spec/dummy/config/locales/en.yml +33 -0
  212. data/spec/dummy/config/locales/hyrax.de.yml +58 -0
  213. data/spec/dummy/config/locales/hyrax.en.yml +58 -0
  214. data/spec/dummy/config/locales/hyrax.es.yml +58 -0
  215. data/spec/dummy/config/locales/hyrax.fr.yml +58 -0
  216. data/spec/dummy/config/locales/hyrax.it.yml +58 -0
  217. data/spec/dummy/config/locales/hyrax.pt-BR.yml +58 -0
  218. data/spec/dummy/config/locales/hyrax.zh.yml +58 -0
  219. data/spec/dummy/config/master.key +1 -0
  220. data/spec/dummy/config/puma.rb +56 -0
  221. data/spec/dummy/config/redis.yml +9 -0
  222. data/spec/dummy/config/role_map.yml +23 -0
  223. data/spec/dummy/config/routes.rb +33 -0
  224. data/spec/dummy/config/secrets.yml +32 -0
  225. data/spec/dummy/config/solr.yml +7 -0
  226. data/spec/dummy/config/solr_wrapper_test.yml +8 -0
  227. data/spec/dummy/config/spring.rb +6 -0
  228. data/spec/dummy/config/storage.yml +34 -0
  229. data/spec/dummy/config/tinymce.yml +12 -0
  230. data/spec/dummy/config/workflows/default_workflow.json +21 -0
  231. data/spec/dummy/config/workflows/mediated_deposit_workflow.json +76 -0
  232. data/spec/dummy/config.ru +5 -0
  233. data/spec/dummy/db/migrate/20190918192626_create_searches.blacklight.rb +17 -0
  234. data/spec/dummy/db/migrate/20190918192627_create_bookmarks.blacklight.rb +19 -0
  235. data/spec/dummy/db/migrate/20190918192628_add_polymorphic_type_to_bookmarks.blacklight.rb +9 -0
  236. data/spec/dummy/db/migrate/20190918192704_devise_create_users.rb +44 -0
  237. data/spec/dummy/db/migrate/20190918192715_add_devise_guests_to_users.rb +15 -0
  238. data/spec/dummy/db/migrate/20190918192840_create_version_committers.hyrax.rb +15 -0
  239. data/spec/dummy/db/migrate/20190918192841_create_checksum_audit_logs.hyrax.rb +19 -0
  240. data/spec/dummy/db/migrate/20190918192842_create_single_use_links.hyrax.rb +12 -0
  241. data/spec/dummy/db/migrate/20190918192843_add_social_to_users.hyrax.rb +13 -0
  242. data/spec/dummy/db/migrate/20190918192844_add_ldap_attrs_to_user.hyrax.rb +27 -0
  243. data/spec/dummy/db/migrate/20190918192845_add_avatars_to_users.hyrax.rb +15 -0
  244. data/spec/dummy/db/migrate/20190918192846_create_trophies.hyrax.rb +10 -0
  245. data/spec/dummy/db/migrate/20190918192847_add_linkedin_to_users.hyrax.rb +5 -0
  246. data/spec/dummy/db/migrate/20190918192848_create_tinymce_assets.hyrax.rb +8 -0
  247. data/spec/dummy/db/migrate/20190918192849_create_content_blocks.hyrax.rb +10 -0
  248. data/spec/dummy/db/migrate/20190918192850_create_featured_works.hyrax.rb +12 -0
  249. data/spec/dummy/db/migrate/20190918192851_add_external_key_to_content_blocks.hyrax.rb +6 -0
  250. data/spec/dummy/db/migrate/20190918192852_create_proxy_deposit_rights.hyrax.rb +10 -0
  251. data/spec/dummy/db/migrate/20190918192853_create_proxy_deposit_requests.hyrax.rb +15 -0
  252. data/spec/dummy/db/migrate/20190918192854_create_file_view_stats.hyrax.rb +12 -0
  253. data/spec/dummy/db/migrate/20190918192855_create_file_download_stats.hyrax.rb +12 -0
  254. data/spec/dummy/db/migrate/20190918192856_add_orcid_to_users.hyrax.rb +5 -0
  255. data/spec/dummy/db/migrate/20190918192857_create_user_stats.hyrax.rb +19 -0
  256. data/spec/dummy/db/migrate/20190918192858_create_work_view_stats.hyrax.rb +12 -0
  257. data/spec/dummy/db/migrate/20190918192859_add_works_to_user_stats.hyrax.rb +13 -0
  258. data/spec/dummy/db/migrate/20190918192860_change_trophy_generic_file_id_to_work_id.hyrax.rb +5 -0
  259. data/spec/dummy/db/migrate/20190918192861_change_proxy_deposit_generic_file_id_to_work_id.hyrax.rb +5 -0
  260. data/spec/dummy/db/migrate/20190918192862_change_audit_log_generic_file_id_to_file_set_id.hyrax.rb +5 -0
  261. data/spec/dummy/db/migrate/20190918192863_change_proxy_deposit_request_generic_file_id_to_work_id.hyrax.rb +5 -0
  262. data/spec/dummy/db/migrate/20190918192864_create_uploaded_files.hyrax.rb +10 -0
  263. data/spec/dummy/db/migrate/20190918192865_create_features.hyrax.rb +10 -0
  264. data/spec/dummy/db/migrate/20190918192866_create_operations.hyrax.rb +23 -0
  265. data/spec/dummy/db/migrate/20190918192867_change_featured_work_generic_file_id_to_work_id.hyrax.rb +6 -0
  266. data/spec/dummy/db/migrate/20190918192868_add_arkivo_to_users.hyrax.rb +8 -0
  267. data/spec/dummy/db/migrate/20190918192869_create_sipity.hyrax.rb +163 -0
  268. data/spec/dummy/db/migrate/20190918192870_create_sipity_workflow_methods.hyrax.rb +10 -0
  269. data/spec/dummy/db/migrate/20190918192871_create_permission_template.hyrax.rb +11 -0
  270. data/spec/dummy/db/migrate/20190918192872_create_permission_template_access.hyrax.rb +11 -0
  271. data/spec/dummy/db/migrate/20190918192873_add_release_to_permission_templates.hyrax.rb +6 -0
  272. data/spec/dummy/db/migrate/20190918192874_add_permission_template_to_sipity_workflow.hyrax.rb +26 -0
  273. data/spec/dummy/db/migrate/20190918192875_tidy_up_because_of_bad_exception.hyrax.rb +13 -0
  274. data/spec/dummy/db/migrate/20190918192876_add_allows_access_grant_to_workflow.hyrax.rb +5 -0
  275. data/spec/dummy/db/migrate/20190918192877_change_checksum_audit_log.hyrax.rb +18 -0
  276. data/spec/dummy/db/migrate/20190918192878_create_job_io_wrappers.hyrax.rb +15 -0
  277. data/spec/dummy/db/migrate/20190918192879_create_collection_types.hyrax.rb +17 -0
  278. data/spec/dummy/db/migrate/20190918192880_update_collection_type_column_names.hyrax.rb +9 -0
  279. data/spec/dummy/db/migrate/20190918192881_update_collection_type_column_options.hyrax.rb +17 -0
  280. data/spec/dummy/db/migrate/20190918192882_create_collection_branding_infos.hyrax.rb +15 -0
  281. data/spec/dummy/db/migrate/20190918192883_create_collection_type_participants.hyrax.rb +11 -0
  282. data/spec/dummy/db/migrate/20190918192884_rename_admin_set_id_to_source_id.hyrax.rb +5 -0
  283. data/spec/dummy/db/migrate/20190918192885_add_preferred_locale_to_users.hyrax.rb +5 -0
  284. data/spec/dummy/db/migrate/20190918192886_add_collection_type_sharing_options.hyrax.rb +5 -0
  285. data/spec/dummy/db/migrate/20190918192887_add_unique_constraint_to_permission_template_accesses.hyrax.rb +8 -0
  286. data/spec/dummy/db/migrate/20190918192888_add_branding_to_collection_type.hyrax.rb +5 -0
  287. data/spec/dummy/db/migrate/20190918192889_add_badge_color_to_collection_types.hyrax.rb +5 -0
  288. data/spec/dummy/db/migrate/20190918192914_create_mailboxer.mailboxer_engine.rb +65 -0
  289. data/spec/dummy/db/migrate/20190918192915_add_conversation_optout.mailboxer_engine.rb +15 -0
  290. data/spec/dummy/db/migrate/20190918192916_add_missing_indices.mailboxer_engine.rb +20 -0
  291. data/spec/dummy/db/migrate/20190918192917_add_delivery_tracking_info_to_mailboxer_receipts.mailboxer_engine.rb +8 -0
  292. data/spec/dummy/db/migrate/20190918192937_create_qa_local_authorities.rb +10 -0
  293. data/spec/dummy/db/migrate/20190918192948_create_qa_local_authority_entries.rb +12 -0
  294. data/spec/dummy/db/migrate/20190918193045_create_minter_states.noid_rails_engine.rb +17 -0
  295. data/spec/dummy/db/migrate/20190918193046_rename_minter_state_random_to_rand.noid_rails_engine.rb +8 -0
  296. data/spec/dummy/db/schema.rb +608 -0
  297. data/spec/dummy/db/seeds.rb +7 -0
  298. data/spec/dummy/lib/assets/.keep +0 -0
  299. data/spec/dummy/lib/tasks/.keep +0 -0
  300. data/spec/dummy/log/.keep +0 -0
  301. data/spec/dummy/package.json +5 -0
  302. data/spec/dummy/public/404.html +67 -0
  303. data/spec/dummy/public/422.html +67 -0
  304. data/spec/dummy/public/500.html +66 -0
  305. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  306. data/spec/dummy/public/apple-touch-icon.png +0 -0
  307. data/spec/dummy/public/assets/.sprockets-manifest-6a791b26afc0064d45ad6c9c7834c971.json +1 -0
  308. data/spec/dummy/public/assets/application-19a48f32b51ff0cbcf36875591de326026d5594d66e05aa640bd3ad61cc96f9e.js +91588 -0
  309. data/spec/dummy/public/assets/application-19a48f32b51ff0cbcf36875591de326026d5594d66e05aa640bd3ad61cc96f9e.js.gz +0 -0
  310. data/spec/dummy/public/assets/application-c66e5ddf197c4624336180640f7928a84eece4ef5868c26d430e6e45c9a83ae3.css +19965 -0
  311. data/spec/dummy/public/assets/application-c66e5ddf197c4624336180640f7928a84eece4ef5868c26d430e6e45c9a83ae3.css.gz +0 -0
  312. data/spec/dummy/public/assets/audio-5133b642ee875760dbd85bfab48649d009efd4bd29db1165f891b48a90b4f37e.png +0 -0
  313. data/spec/dummy/public/assets/blacklight/gallery/view-icon-masonry-94cb2f417ca00047d6e4603644bebaa67037ef9b3efcc9c95b42229c1c571345.png +0 -0
  314. data/spec/dummy/public/assets/blacklight/gallery/view-icon-masonry@2x-da61b9e430c6b3f007aaa8073c062b147c909746c254f0adb81eaf476dc1a26d.png +0 -0
  315. data/spec/dummy/public/assets/blacklight/logo-e368f4faad4c5310352e175e1fba8220b57aab2e29cbe0f3ca1189a2ef085f9b.png +0 -0
  316. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407.eot +0 -0
  317. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407.eot.gz +0 -0
  318. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5.svg +288 -0
  319. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5.svg.gz +0 -0
  320. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-a26394f7ede100ca118eff2eda08596275a9839b959c226e15439557a5a80742.woff +0 -0
  321. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf +0 -0
  322. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf.gz +0 -0
  323. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c.woff2 +0 -0
  324. data/spec/dummy/public/assets/browse_everything-0bc39e0e4f7158f7de0b75f0bf1cffee0dc75901e8a0d1ab62fe57615ae92903.css +12766 -0
  325. data/spec/dummy/public/assets/browse_everything-0bc39e0e4f7158f7de0b75f0bf1cffee0dc75901e8a0d1ab62fe57615ae92903.css.gz +0 -0
  326. data/spec/dummy/public/assets/browse_everything-771abc13184782ddcdb092a916b42013516bb8d172351e1c6415c293c556118f.js +3648 -0
  327. data/spec/dummy/public/assets/browse_everything-771abc13184782ddcdb092a916b42013516bb8d172351e1c6415c293c556118f.js.gz +0 -0
  328. data/spec/dummy/public/assets/collection-a38b932554788aa578debf2319e8c4ba8a7db06b3ba57ecda1391a548a4b6e0a.png +0 -0
  329. data/spec/dummy/public/assets/dataTables/back_disabled-6950463a4f9db9435b8df01fa276eaf88aa65b8913b82e979317d741305bb5d6.png +0 -0
  330. data/spec/dummy/public/assets/dataTables/back_enabled-9fd6f47b90ca92e855bdf80a0d57178af3a59c307e5c0246bb24dc781d3ae69b.png +0 -0
  331. data/spec/dummy/public/assets/dataTables/back_enabled_hover-b3a398bdb9afa40edff875c14c972ac9329e018e2e5e175ebb8e104c59be37e1.png +0 -0
  332. data/spec/dummy/public/assets/dataTables/extras/background-c15341923393fd36f738e5240b31c86b30da3c1e13438cc65a325f58e255074a.png +0 -0
  333. data/spec/dummy/public/assets/dataTables/extras/button-4b15f6f40d20396a3a485d7f3a587138a9d68da923ce9a48ec40e25b8d2391f8.png +0 -0
  334. data/spec/dummy/public/assets/dataTables/extras/collection-bbd8b7d27060bd17a10af4143f1e716ffaee2f652af70381bf71057aefa5e0f4.png +0 -0
  335. data/spec/dummy/public/assets/dataTables/extras/collection_hover-eaab9c30ceead4610031a39b77a08d80c87f8c97bdfa6e52aa7e6e1dcaaeb4e1.png +0 -0
  336. data/spec/dummy/public/assets/dataTables/extras/copy-a0feeab39e2b27cd966f77ebac68be4b3638eae7b51b61431bf860a1bb6da929.png +0 -0
  337. data/spec/dummy/public/assets/dataTables/extras/copy_hover-cde411862f25c1f66a2f54da665968e4b5be58e5eb6ef5769fc69fde1cf8915e.png +0 -0
  338. data/spec/dummy/public/assets/dataTables/extras/csv-d1ddfd7d80b19736d956c00dbe6a9dde454e0b48e732975a89f0d9ec8ca5646c.png +0 -0
  339. data/spec/dummy/public/assets/dataTables/extras/csv_hover-671101bdd0b393cd51c28b34fb5fa24c08932e654c75b47df2d7ef8b021ce289.png +0 -0
  340. data/spec/dummy/public/assets/dataTables/extras/filler-641b9f55bbce36baf21b2611ba7a6373a8a23727b111590129d411f24b5d4559.png +0 -0
  341. data/spec/dummy/public/assets/dataTables/extras/insert-945e4b99b340f6622d545081443a10871345105c14d009cd6c4d0536d790032f.png +0 -0
  342. data/spec/dummy/public/assets/dataTables/extras/loading-background-ea6b39e733ae4ef8b41540bb3052a5715d1293bd3506582a9f001441f41445a0.png +0 -0
  343. data/spec/dummy/public/assets/dataTables/extras/pdf-178bccf4fa6246c4e983e1b45bd521c929fa197321ccafdc0c8c0dce799699b2.png +0 -0
  344. data/spec/dummy/public/assets/dataTables/extras/pdf_hover-a0c883c30bf77280618eba2ce08de7e1377bff15955ebf024deee72819f33945.png +0 -0
  345. data/spec/dummy/public/assets/dataTables/extras/print-56efc7161f8c36454f011542fd51c4c515fd8a64e4e499834daaf0415bc55bd1.png +0 -0
  346. data/spec/dummy/public/assets/dataTables/extras/print_hover-dfd041e39e9342f1706335301e65b2fe1bbed3ecce90aeed1b6880b3177dc5c9.png +0 -0
  347. data/spec/dummy/public/assets/dataTables/extras/xls-7995e42ff963255fb782c1b858e7d01be93f204befade7e7a41961e42d285d44.png +0 -0
  348. data/spec/dummy/public/assets/dataTables/extras/xls_hover-4aeef987c05055d78ff769f7ad4d871b897fced597d77fcc92ace6945d99f5bd.png +0 -0
  349. data/spec/dummy/public/assets/dataTables/favicon-6e1bbb9a62636471771c683fc0589a487f74296503c9e4b6d2d92e7fda3faff6.ico +0 -0
  350. data/spec/dummy/public/assets/dataTables/favicon-6e1bbb9a62636471771c683fc0589a487f74296503c9e4b6d2d92e7fda3faff6.ico.gz +0 -0
  351. data/spec/dummy/public/assets/dataTables/forward_disabled-ede9f1003cef25add5cc2b13f531a014ed9bea78154d4fba008b21f353030295.png +0 -0
  352. data/spec/dummy/public/assets/dataTables/forward_enabled-bcb3b13b5aaf9015767aff77d621f1f9557adcd8eb8284d06f0b51e2475556b0.png +0 -0
  353. data/spec/dummy/public/assets/dataTables/forward_enabled_hover-4fa2d689a633713d9fb8900611a646c5df0ba24deb9597ab955c62cba77ae3b4.png +0 -0
  354. data/spec/dummy/public/assets/dataTables/foundation/sort_asc-ee6010bb0a8d17e58307136a0fbf0b196d949ab6c50eb66d1ff8f0a7d2a4d48b.png +0 -0
  355. data/spec/dummy/public/assets/dataTables/foundation/sort_asc_disabled-fd53b2df2d10bac2af507450a9d89c1283acbb6be750a02b401aa3f6c38a350d.png +0 -0
  356. data/spec/dummy/public/assets/dataTables/foundation/sort_both-624f0a471a2535c4754e1f6974b0e64ee70d6907738346e2a11d0bff20258b8c.png +0 -0
  357. data/spec/dummy/public/assets/dataTables/foundation/sort_desc-26da8e7eaf746a08dec2928977be21aa67212484540a12042b86aa2d904b80e8.png +0 -0
  358. data/spec/dummy/public/assets/dataTables/foundation/sort_desc_disabled-3450cc1e5a1585690226a713a726753b3fa2d177e41338a36e0a3188e3f02663.png +0 -0
  359. data/spec/dummy/public/assets/dataTables/minus-334c4ab08c4bfdbed5a82bdeaa7fb3f240c730b04dee5206184dc8067a5d0e6b.png +0 -0
  360. data/spec/dummy/public/assets/dataTables/plus-eb27ce978b61a3763680c02c1f8c9bc92c2fc86ebb8cc3aef6a5e538e9562265.png +0 -0
  361. data/spec/dummy/public/assets/dataTables/sort_asc-ee6010bb0a8d17e58307136a0fbf0b196d949ab6c50eb66d1ff8f0a7d2a4d48b.png +0 -0
  362. data/spec/dummy/public/assets/dataTables/sort_asc_disabled-50f0e16f8289b1f09eb0d0494d0eee7ae4717e857a4ed77997bb06cefecb2528.png +0 -0
  363. data/spec/dummy/public/assets/dataTables/sort_both-624f0a471a2535c4754e1f6974b0e64ee70d6907738346e2a11d0bff20258b8c.png +0 -0
  364. data/spec/dummy/public/assets/dataTables/sort_desc-26da8e7eaf746a08dec2928977be21aa67212484540a12042b86aa2d904b80e8.png +0 -0
  365. data/spec/dummy/public/assets/dataTables/sort_desc_disabled-3450cc1e5a1585690226a713a726753b3fa2d177e41338a36e0a3188e3f02663.png +0 -0
  366. data/spec/dummy/public/assets/default-f936e9c3ea7a38e2c2092099586a71380b11258697b37fb4df376704495a849a.png +0 -0
  367. data/spec/dummy/public/assets/favicon-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.ico +0 -0
  368. data/spec/dummy/public/assets/favicon-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.ico.gz +0 -0
  369. data/spec/dummy/public/assets/font-awesome/fontawesome-webfont-1b7f3de49d68b01f415574ebb82e6110a1d09cda2071ad8451bdb5124131a292.ttf +0 -0
  370. data/spec/dummy/public/assets/font-awesome/fontawesome-webfont-1b7f3de49d68b01f415574ebb82e6110a1d09cda2071ad8451bdb5124131a292.ttf.gz +0 -0
  371. data/spec/dummy/public/assets/font-awesome/fontawesome-webfont-3c4a1bb7ce3234407184f0d80cc4dec075e4ad616b44dcc5778e1cfb1bc24019.woff2 +0 -0
  372. data/spec/dummy/public/assets/font-awesome/fontawesome-webfont-7414288c272f6cc10304aa18e89bf24fb30f40afd644623f425c2c3d71fbe06a.svg +640 -0
  373. data/spec/dummy/public/assets/font-awesome/fontawesome-webfont-7414288c272f6cc10304aa18e89bf24fb30f40afd644623f425c2c3d71fbe06a.svg.gz +0 -0
  374. data/spec/dummy/public/assets/font-awesome/fontawesome-webfont-a7c7e4930090e038a280fd61d88f0dc03dad4aeaedbd8c9be3dd9aa4c3b6f8d1.woff +0 -0
  375. data/spec/dummy/public/assets/font-awesome/fontawesome-webfont-d4f5a99224154f2a808e42a441ddc9248ffe78b7a4083684ce159270b30b912a.eot +0 -0
  376. data/spec/dummy/public/assets/font-awesome/fontawesome-webfont-d4f5a99224154f2a808e42a441ddc9248ffe78b7a4083684ce159270b30b912a.eot.gz +0 -0
  377. data/spec/dummy/public/assets/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2 +0 -0
  378. data/spec/dummy/public/assets/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot +0 -0
  379. data/spec/dummy/public/assets/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot.gz +0 -0
  380. data/spec/dummy/public/assets/fontawesome-webfont-9428f8b023ac16cd31335614569668ccc199588550d1d1f274873da8211a9fcd.ttf +0 -0
  381. data/spec/dummy/public/assets/fontawesome-webfont-9428f8b023ac16cd31335614569668ccc199588550d1d1f274873da8211a9fcd.ttf.gz +0 -0
  382. data/spec/dummy/public/assets/fontawesome-webfont-c49e830da6dd1917d752afc4947bcf0bae316b14f81a27395993d6e66b1d2853.svg +255 -0
  383. data/spec/dummy/public/assets/fontawesome-webfont-c49e830da6dd1917d752afc4947bcf0bae316b14f81a27395993d6e66b1d2853.svg.gz +0 -0
  384. data/spec/dummy/public/assets/fontawesome-webfont-d45f5fb1fb4e1a101a8ad8722af443272f6c3d409d912e8175e6268d48e0b091.woff +0 -0
  385. data/spec/dummy/public/assets/hydra/powered_by_hydra-df621100d14d209a52ec4d645e81a6c84fcbd503bfafa1c6d6d6937984d81c98.png +0 -0
  386. data/spec/dummy/public/assets/jquery-ui/ui-bg_flat_0_aaaaaa_40x100-ae65a7ae22c4c23115948fdeb5c05c9137dbd13ca2d426b3c4c3c4183451e410.png +0 -0
  387. data/spec/dummy/public/assets/jquery-ui/ui-icons_444444_256x240-31d988765b4e6f56553c29588c500381dc3e6f0aa2980c8212202e5644aefd5d.png +0 -0
  388. data/spec/dummy/public/assets/jquery-ui/ui-icons_555555_256x240-32175261daee76c82bb0edf0eea16a56421866fbc31e94f3c1d570aa114502f5.png +0 -0
  389. data/spec/dummy/public/assets/jquery-ui/ui-icons_777620_256x240-0b020fc6e696d88d296e7bb1f61f1eb2ad827848e2c7382a4c3e0999e702dd9b.png +0 -0
  390. data/spec/dummy/public/assets/jquery-ui/ui-icons_777777_256x240-faf32007ae120c302213557626e660dd10e711c5dd4f1113d35f26dc05b78d2f.png +0 -0
  391. data/spec/dummy/public/assets/jquery-ui/ui-icons_cc0000_256x240-40985a64b4d5dd213fba27fcd862a1bd1b337a97674f6ff0b9ec20abcee4bc69.png +0 -0
  392. data/spec/dummy/public/assets/jquery-ui/ui-icons_ffffff_256x240-350df1b7131037de20e83c5c0f3a41a770d2ac48b5762ea772b3f4a8a7b9d47a.png +0 -0
  393. data/spec/dummy/public/assets/loading-b84750cc5a395288fcfd0cf42e3a60d6135e2f14db83fce05e97e5abacc2f9b4.gif +0 -0
  394. data/spec/dummy/public/assets/openseadragon/button_grouphover-2e64df18c27b1a51955c47cbe7535fa2a25548cefb7d1a2de625b59f31853cb6.png +0 -0
  395. data/spec/dummy/public/assets/openseadragon/button_hover-b1086485b0d055d468a729f5a6a79f78fc06fdfa814710dedb7021a7d6206fde.png +0 -0
  396. data/spec/dummy/public/assets/openseadragon/button_pressed-01f1c05bdee216ec417e3475552cd053ce3199bfd2c9e1660f2c7cdc60d0be11.png +0 -0
  397. data/spec/dummy/public/assets/openseadragon/button_rest-5c693c3b03e6efc5c491ab2e8e1ba81800de423a16da8c7f348c19ae8924d142.png +0 -0
  398. data/spec/dummy/public/assets/openseadragon/fullpage_grouphover-f96415fcf86eff56b664f2328ffd61972b98738874d995e077091344f59fc26b.png +0 -0
  399. data/spec/dummy/public/assets/openseadragon/fullpage_hover-3cc954037484edb4a74d97a374605301b4da04c034981af70ec0ec3e1bb509a8.png +0 -0
  400. data/spec/dummy/public/assets/openseadragon/fullpage_pressed-7b3d188695ec59993a09cf27dde280b1da93fd43360f721642b42229b9e5e817.png +0 -0
  401. data/spec/dummy/public/assets/openseadragon/fullpage_rest-1b7ae93b3fe5d0df99e196bfe22b93c7f05d2d5e0fdf97b8b8e957e5476ff586.png +0 -0
  402. data/spec/dummy/public/assets/openseadragon/home_grouphover-2f2dfd6ed6fd11c1aec5491c36f071cf51a96712ddac54b803a8fee917ce27d8.png +0 -0
  403. data/spec/dummy/public/assets/openseadragon/home_hover-170fc906037fe8707d3757775ea4ccb3ebbf883329c44473cd247d0f22c320d9.png +0 -0
  404. data/spec/dummy/public/assets/openseadragon/home_pressed-e8a08eb8d9862e63c8df96fbe508956ae031b09d85533adf83e094c5b187833c.png +0 -0
  405. data/spec/dummy/public/assets/openseadragon/home_rest-6fd27483f507bf8b4a15d6c60d43e9bb3bd14b84959973d61a622bbb4777dfc9.png +0 -0
  406. data/spec/dummy/public/assets/openseadragon/next_grouphover-e7c76fb2c8a792a63efe2ad76da276fd079f50ec0df2b03b04bfc36cfc217103.png +0 -0
  407. data/spec/dummy/public/assets/openseadragon/next_hover-67210c1194693f480cfe9935281fd447a86c46b65e67ce182632cb518dfd2bb9.png +0 -0
  408. data/spec/dummy/public/assets/openseadragon/next_pressed-95afb05783b4c599eec66a21a2b98ea09d6b0be41cce42ed512239cede37a1ab.png +0 -0
  409. data/spec/dummy/public/assets/openseadragon/next_rest-d9b1965f3bcddd3db23e63037a27152c1b7528811582c68b7b4bf25b8673fe07.png +0 -0
  410. data/spec/dummy/public/assets/openseadragon/previous_grouphover-c7e82a94049ff615a7dc6f78ae3758d7d33eab41a69093d9c1101c164c07fe8b.png +0 -0
  411. data/spec/dummy/public/assets/openseadragon/previous_hover-94126f0047e7901b3d2e408abb58b20744a7251786746d7508624db5b4c81bce.png +0 -0
  412. data/spec/dummy/public/assets/openseadragon/previous_pressed-b80145c436ff5cd94c3f672eed9f1723fcd13077870337874171e99dee9f9929.png +0 -0
  413. data/spec/dummy/public/assets/openseadragon/previous_rest-56999fcbe41a0ebb5d701fb463caea0e3850478d1f869e2e7a73b7dc363ca2e2.png +0 -0
  414. data/spec/dummy/public/assets/openseadragon/rotateleft_grouphover-35d3cf9efe958bd88ae0c532648403824df252fa6835aa586301b19c80c264e3.png +0 -0
  415. data/spec/dummy/public/assets/openseadragon/rotateleft_hover-59fee051c2aff4c8491255be664f87671c089db4863f933989b10263818cf435.png +0 -0
  416. data/spec/dummy/public/assets/openseadragon/rotateleft_pressed-97d28095eb471109d0aee65f9f4dc5ee6dba6d7fed433e3a910dcda69ca4a977.png +0 -0
  417. data/spec/dummy/public/assets/openseadragon/rotateleft_rest-ab4731e3c7d7a4b40ea07c16269e8117ce58506177dc438cc00cdf837f513f09.png +0 -0
  418. data/spec/dummy/public/assets/openseadragon/rotateright_grouphover-ebdaf54f82601db210a5ac2e0a54790c0decd8dea5bd115f7d6d0d2bf04c5e00.png +0 -0
  419. data/spec/dummy/public/assets/openseadragon/rotateright_hover-a9124016ebe30ec16f3691a16cc57997174652f480f3002d45beaf918b1230c1.png +0 -0
  420. data/spec/dummy/public/assets/openseadragon/rotateright_pressed-a75e74dab723a0587d365e4b076572d1440df9f31c424ef4a6be62f3a45d472b.png +0 -0
  421. data/spec/dummy/public/assets/openseadragon/rotateright_rest-c201ce35f6651e824eee3eb5ca3e42fc40035d2070eec9ce1261c8b7bc126526.png +0 -0
  422. data/spec/dummy/public/assets/openseadragon/zoomin_grouphover-ecd40589890cdfd81911752c4af02c691a201c21d74bbad5f3d9336463b52604.png +0 -0
  423. data/spec/dummy/public/assets/openseadragon/zoomin_hover-6a2c08cf07b12162f73e80417d6e49e7da4b219981c9929abf89fbd1a18b58a2.png +0 -0
  424. data/spec/dummy/public/assets/openseadragon/zoomin_pressed-b9eb902ca333aaabd8cf77c1184a6aa24311bcba0d836dc6ebded4c5d7146475.png +0 -0
  425. data/spec/dummy/public/assets/openseadragon/zoomin_rest-674258f78d924bfe2454a637ecf912fe7069105ab68980f69674ff5c25521ed9.png +0 -0
  426. data/spec/dummy/public/assets/openseadragon/zoomout_grouphover-b582631f7ede7c640c46a29d74728814d3b7332b14748054ae460aa9be929e77.png +0 -0
  427. data/spec/dummy/public/assets/openseadragon/zoomout_hover-b752facaf76d197e235dd789929e86577339ffa280b6a51621388f2cad9900e1.png +0 -0
  428. data/spec/dummy/public/assets/openseadragon/zoomout_pressed-99ce17d25e10d07ebe3a21642eb350bfd80c603cbb6a4b0af705fbcdf8ca57dc.png +0 -0
  429. data/spec/dummy/public/assets/openseadragon/zoomout_rest-a4ff50ab46d8de87c720cb9cbccc9b4bef1cdda1394b9c8a2b4e6fb2f63e13aa.png +0 -0
  430. data/spec/dummy/public/assets/orcid-cb273c1ff10d304ce1b6108a172bfd1660561e7fd8133b083cd66ee0f4a0a944.png +0 -0
  431. data/spec/dummy/public/assets/progressbar-a45ab53b619988cefd45f49cfacc604dd499b93f53a96927cf7b2d965f421f48.gif +0 -0
  432. data/spec/dummy/public/assets/qa/application-f9e7c1541e1b8783561468c59162bd896007380f5a3799ef2169d3a3fdf40bed.css +14 -0
  433. data/spec/dummy/public/assets/qa/application-f9e7c1541e1b8783561468c59162bd896007380f5a3799ef2169d3a3fdf40bed.css.gz +0 -0
  434. data/spec/dummy/public/assets/qa/application-fed7594354f41c527f9e8dab7f766cd780129ed1fd04e8c0646a72b825ad8e8b.js +14 -0
  435. data/spec/dummy/public/assets/qa/application-fed7594354f41c527f9e8dab7f766cd780129ed1fd04e8c0646a72b825ad8e8b.js.gz +0 -0
  436. data/spec/dummy/public/assets/select2-d6b5d8d83dbc18fb8d77c8761d331cd9e5123c9684950bab0406e98a24ac5ae8.png +0 -0
  437. data/spec/dummy/public/assets/select2-spinner-f6ecff617ec2ba7f559e6f535cad9b70a3f91120737535dab4d4548a6c83576c.gif +0 -0
  438. data/spec/dummy/public/assets/select2x2-6fe28d687dc0ed4d96016238c608ba1e7198c9c9accfa0b360b78018b9fb9bc2.png +0 -0
  439. data/spec/dummy/public/assets/tinymce/jquery.tinymce-db2bc0a724d3123cc432dc4d9d8029736b4afc8c8502967e359dce2ed3170c16.js +1 -0
  440. data/spec/dummy/public/assets/tinymce/jquery.tinymce-db2bc0a724d3123cc432dc4d9d8029736b4afc8c8502967e359dce2ed3170c16.js.gz +0 -0
  441. data/spec/dummy/public/assets/tinymce/jquery.tinymce.js +1 -0
  442. data/spec/dummy/public/assets/tinymce/jquery.tinymce.js.gz +1 -0
  443. data/spec/dummy/public/assets/tinymce/langs/readme-5a8b6a04d57b5c88e3fb7f2a870b8e2d3a48ec03ce6474206c41df78c155b2de.md +3 -0
  444. data/spec/dummy/public/assets/tinymce/langs/readme.md +1 -0
  445. data/spec/dummy/public/assets/tinymce/license-47a9dcd2574891a5a465112fd9dfcebcc7e61844edec27fa936a64642008fe66.txt +504 -0
  446. data/spec/dummy/public/assets/tinymce/license-47a9dcd2574891a5a465112fd9dfcebcc7e61844edec27fa936a64642008fe66.txt.gz +0 -0
  447. data/spec/dummy/public/assets/tinymce/license.txt +1 -0
  448. data/spec/dummy/public/assets/tinymce/license.txt.gz +1 -0
  449. data/spec/dummy/public/assets/tinymce/plugins/advlist/plugin-7b5bed8c5b41dbabee490dca68a3fc215c6c2d08ad1174d20fd4ebc27feb9b18.js +1 -0
  450. data/spec/dummy/public/assets/tinymce/plugins/advlist/plugin-7b5bed8c5b41dbabee490dca68a3fc215c6c2d08ad1174d20fd4ebc27feb9b18.js.gz +0 -0
  451. data/spec/dummy/public/assets/tinymce/plugins/advlist/plugin.js +1 -0
  452. data/spec/dummy/public/assets/tinymce/plugins/advlist/plugin.js.gz +1 -0
  453. data/spec/dummy/public/assets/tinymce/plugins/anchor/plugin-8fc6aac86dcfda2df29f3e402541e9f5ed45743f0dce76b80bc4e3c6a16be585.js +1 -0
  454. data/spec/dummy/public/assets/tinymce/plugins/anchor/plugin-8fc6aac86dcfda2df29f3e402541e9f5ed45743f0dce76b80bc4e3c6a16be585.js.gz +0 -0
  455. data/spec/dummy/public/assets/tinymce/plugins/anchor/plugin.js +1 -0
  456. data/spec/dummy/public/assets/tinymce/plugins/anchor/plugin.js.gz +1 -0
  457. data/spec/dummy/public/assets/tinymce/plugins/autolink/plugin-aacef7388395131adb8a2d04e3d130c13150b04a39ba15bfebdd8b5673e74b56.js +1 -0
  458. data/spec/dummy/public/assets/tinymce/plugins/autolink/plugin-aacef7388395131adb8a2d04e3d130c13150b04a39ba15bfebdd8b5673e74b56.js.gz +0 -0
  459. data/spec/dummy/public/assets/tinymce/plugins/autolink/plugin.js +1 -0
  460. data/spec/dummy/public/assets/tinymce/plugins/autolink/plugin.js.gz +1 -0
  461. data/spec/dummy/public/assets/tinymce/plugins/autoresize/plugin-79ff6671020ca454d50be43a8cd68e51bbbab80f6f11d3ef1afc29df593a9cc0.js +1 -0
  462. data/spec/dummy/public/assets/tinymce/plugins/autoresize/plugin-79ff6671020ca454d50be43a8cd68e51bbbab80f6f11d3ef1afc29df593a9cc0.js.gz +0 -0
  463. data/spec/dummy/public/assets/tinymce/plugins/autoresize/plugin.js +1 -0
  464. data/spec/dummy/public/assets/tinymce/plugins/autoresize/plugin.js.gz +1 -0
  465. data/spec/dummy/public/assets/tinymce/plugins/autosave/plugin-0d17bcbc8383db5d592ca5e213dd898106273274ff07ede506b8f8b6ff1f6ac0.js +1 -0
  466. data/spec/dummy/public/assets/tinymce/plugins/autosave/plugin-0d17bcbc8383db5d592ca5e213dd898106273274ff07ede506b8f8b6ff1f6ac0.js.gz +0 -0
  467. data/spec/dummy/public/assets/tinymce/plugins/autosave/plugin.js +1 -0
  468. data/spec/dummy/public/assets/tinymce/plugins/autosave/plugin.js.gz +1 -0
  469. data/spec/dummy/public/assets/tinymce/plugins/bbcode/plugin-8acda51f6565daa44af5423768602b2296eff9cbc3b2355f82a1ae4490428833.js +1 -0
  470. data/spec/dummy/public/assets/tinymce/plugins/bbcode/plugin-8acda51f6565daa44af5423768602b2296eff9cbc3b2355f82a1ae4490428833.js.gz +0 -0
  471. data/spec/dummy/public/assets/tinymce/plugins/bbcode/plugin.js +1 -0
  472. data/spec/dummy/public/assets/tinymce/plugins/bbcode/plugin.js.gz +1 -0
  473. data/spec/dummy/public/assets/tinymce/plugins/charmap/plugin-f0d451ae7fcfa1f30f73c2d9185c58173e1a8e44d893d752778b226b665f020b.js +1 -0
  474. data/spec/dummy/public/assets/tinymce/plugins/charmap/plugin-f0d451ae7fcfa1f30f73c2d9185c58173e1a8e44d893d752778b226b665f020b.js.gz +0 -0
  475. data/spec/dummy/public/assets/tinymce/plugins/charmap/plugin.js +1 -0
  476. data/spec/dummy/public/assets/tinymce/plugins/charmap/plugin.js.gz +1 -0
  477. data/spec/dummy/public/assets/tinymce/plugins/code/plugin-46957c79ea5f5757444d628fdb90bac81f078d87bc9601df76cc087d4976564b.js +1 -0
  478. data/spec/dummy/public/assets/tinymce/plugins/code/plugin-46957c79ea5f5757444d628fdb90bac81f078d87bc9601df76cc087d4976564b.js.gz +0 -0
  479. data/spec/dummy/public/assets/tinymce/plugins/code/plugin.js +1 -0
  480. data/spec/dummy/public/assets/tinymce/plugins/code/plugin.js.gz +1 -0
  481. data/spec/dummy/public/assets/tinymce/plugins/codesample/css/prism-29127f13286ec42e411a82279280ccbb6c62d70a68a388b42fa34d8929d87995.css +139 -0
  482. data/spec/dummy/public/assets/tinymce/plugins/codesample/css/prism-29127f13286ec42e411a82279280ccbb6c62d70a68a388b42fa34d8929d87995.css.gz +0 -0
  483. data/spec/dummy/public/assets/tinymce/plugins/codesample/css/prism.css +1 -0
  484. data/spec/dummy/public/assets/tinymce/plugins/codesample/css/prism.css.gz +1 -0
  485. data/spec/dummy/public/assets/tinymce/plugins/codesample/plugin-e477d85104bf7a6119ebe07bb02feb290325074ff222bf526a563151177d1b9d.js +1 -0
  486. data/spec/dummy/public/assets/tinymce/plugins/codesample/plugin-e477d85104bf7a6119ebe07bb02feb290325074ff222bf526a563151177d1b9d.js.gz +0 -0
  487. data/spec/dummy/public/assets/tinymce/plugins/codesample/plugin.js +1 -0
  488. data/spec/dummy/public/assets/tinymce/plugins/codesample/plugin.js.gz +1 -0
  489. data/spec/dummy/public/assets/tinymce/plugins/colorpicker/plugin-48d6719fa10b7bc1b3982d9d9f952d320ebba056102701e49e3945ce3bf8911d.js +1 -0
  490. data/spec/dummy/public/assets/tinymce/plugins/colorpicker/plugin-48d6719fa10b7bc1b3982d9d9f952d320ebba056102701e49e3945ce3bf8911d.js.gz +0 -0
  491. data/spec/dummy/public/assets/tinymce/plugins/colorpicker/plugin.js +1 -0
  492. data/spec/dummy/public/assets/tinymce/plugins/colorpicker/plugin.js.gz +1 -0
  493. data/spec/dummy/public/assets/tinymce/plugins/contextmenu/plugin-1b3d07a3487dbbf4eb7f0ce2252bdfc13cb849d1e8749b75c3523b22ea8f4761.js +1 -0
  494. data/spec/dummy/public/assets/tinymce/plugins/contextmenu/plugin-1b3d07a3487dbbf4eb7f0ce2252bdfc13cb849d1e8749b75c3523b22ea8f4761.js.gz +0 -0
  495. data/spec/dummy/public/assets/tinymce/plugins/contextmenu/plugin.js +1 -0
  496. data/spec/dummy/public/assets/tinymce/plugins/contextmenu/plugin.js.gz +1 -0
  497. data/spec/dummy/public/assets/tinymce/plugins/directionality/plugin-0893c42f76c330cbae77ee849d287028e03574dcf50b6a0770d4b771f7324f1c.js +1 -0
  498. data/spec/dummy/public/assets/tinymce/plugins/directionality/plugin-0893c42f76c330cbae77ee849d287028e03574dcf50b6a0770d4b771f7324f1c.js.gz +0 -0
  499. data/spec/dummy/public/assets/tinymce/plugins/directionality/plugin.js +1 -0
  500. data/spec/dummy/public/assets/tinymce/plugins/directionality/plugin.js.gz +1 -0
  501. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-cool-bb0e93a050a32df7913e4026b3c88a176998e0e3e073ba06e9b73f6c24227c9c.gif +0 -0
  502. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-cool.gif +1 -0
  503. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-cry-a0c5f3e7a682449c973c9d9f7c46342081c46920686d2353f57aff91ab907f68.gif +0 -0
  504. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-cry.gif +1 -0
  505. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-embarassed-d3cafcb50b335672cb5e9f4600ea9ea261dac7828dd28844d4927c393a25618f.gif +0 -0
  506. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-embarassed.gif +1 -0
  507. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-foot-in-mouth-03fe04d3ed533423ac81f05146584b0c451be3d4a30e76687ceef283ed07071f.gif +0 -0
  508. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif +1 -0
  509. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-frown-1b984bf98931dd1debb54461eb9d83e985f2b2999fe14bcb556d6c0921bc83b0.gif +0 -0
  510. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-frown.gif +1 -0
  511. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-innocent-8db353ef102196f2c6ddf5c4666446de955d7b14fc0957c806c9dbfb48fb0c29.gif +0 -0
  512. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-innocent.gif +1 -0
  513. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-kiss-3154c3665356c13ab10fefdbac1fe187fff978a0052037c99cdc4a97103413f2.gif +0 -0
  514. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-kiss.gif +1 -0
  515. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-laughing-8f6adedcd091975ffead171867a6304d908bb6541a6ccb4919286ec6b7d4551e.gif +0 -0
  516. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-laughing.gif +1 -0
  517. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-money-mouth-f0b9f4f22e237f5dbc851f900fed8d7eca4c954ae6fbc606c0cd8be431d0ac80.gif +0 -0
  518. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-money-mouth.gif +1 -0
  519. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-sealed-9933b442636b6e537df7b564e2c3f7a2873526eea6b022a98eb1e468e5204c32.gif +0 -0
  520. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-sealed.gif +1 -0
  521. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-smile-fd89cd460ffcacb7e725e00c0275ef5b3924ce468248e5ff4fb43545571cfa65.gif +0 -0
  522. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-smile.gif +1 -0
  523. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-surprised-3871f356cb41976d7ae8a5f005e8739e4d014352a8adef9b33f773d81b6e6c01.gif +0 -0
  524. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-surprised.gif +1 -0
  525. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-tongue-out-5843c85667a8226dc43be83749fd9fbbc5d20b1577de2b763915d99815d37d47.gif +0 -0
  526. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-tongue-out.gif +1 -0
  527. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-undecided-d8b9bcbb433951ff3c4ca8dd959ac3844239b98e6d52218833e1485a91f67347.gif +0 -0
  528. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-undecided.gif +1 -0
  529. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-wink-2af75ad7b1c08488505513503e34b15f40005e04a2a9568f698f0945d2d8ba1f.gif +0 -0
  530. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-wink.gif +1 -0
  531. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-yell-bba903fbcb46fce8c68b9e01863fd095b3b1d0e6aa72161f3a88d762a5f90a79.gif +0 -0
  532. data/spec/dummy/public/assets/tinymce/plugins/emoticons/img/smiley-yell.gif +1 -0
  533. data/spec/dummy/public/assets/tinymce/plugins/emoticons/plugin-287cc5d2f0fba168841d0d0dab3c6f8f958fb0e80adada67cc1e64d88a69704e.js +1 -0
  534. data/spec/dummy/public/assets/tinymce/plugins/emoticons/plugin-287cc5d2f0fba168841d0d0dab3c6f8f958fb0e80adada67cc1e64d88a69704e.js.gz +0 -0
  535. data/spec/dummy/public/assets/tinymce/plugins/emoticons/plugin.js +1 -0
  536. data/spec/dummy/public/assets/tinymce/plugins/emoticons/plugin.js.gz +1 -0
  537. data/spec/dummy/public/assets/tinymce/plugins/fullpage/plugin-0bd712ddf83de5ad37a6822dc4c5832d82a5e2cd1da918d5b0e41bd09f65e1f6.js +1 -0
  538. data/spec/dummy/public/assets/tinymce/plugins/fullpage/plugin-0bd712ddf83de5ad37a6822dc4c5832d82a5e2cd1da918d5b0e41bd09f65e1f6.js.gz +0 -0
  539. data/spec/dummy/public/assets/tinymce/plugins/fullpage/plugin.js +1 -0
  540. data/spec/dummy/public/assets/tinymce/plugins/fullpage/plugin.js.gz +1 -0
  541. data/spec/dummy/public/assets/tinymce/plugins/fullscreen/plugin-715b77a6ec2a2bade5ea0cc1658f4ab9fff89bd9a00619deb3e73145d0ada00e.js +1 -0
  542. data/spec/dummy/public/assets/tinymce/plugins/fullscreen/plugin-715b77a6ec2a2bade5ea0cc1658f4ab9fff89bd9a00619deb3e73145d0ada00e.js.gz +0 -0
  543. data/spec/dummy/public/assets/tinymce/plugins/fullscreen/plugin.js +1 -0
  544. data/spec/dummy/public/assets/tinymce/plugins/fullscreen/plugin.js.gz +1 -0
  545. data/spec/dummy/public/assets/tinymce/plugins/help/img/logo-95b06f8538b11c4c30170075a09f93cf5871f74dd2541e95ad3d9da31976fcac.png +0 -0
  546. data/spec/dummy/public/assets/tinymce/plugins/help/img/logo.png +1 -0
  547. data/spec/dummy/public/assets/tinymce/plugins/help/plugin-09c06aa8a6b13eb5aef6dfc2f25abb4b86f8c27accb396cee254b116cc99b6c7.js +1 -0
  548. data/spec/dummy/public/assets/tinymce/plugins/help/plugin-09c06aa8a6b13eb5aef6dfc2f25abb4b86f8c27accb396cee254b116cc99b6c7.js.gz +0 -0
  549. data/spec/dummy/public/assets/tinymce/plugins/help/plugin.js +1 -0
  550. data/spec/dummy/public/assets/tinymce/plugins/help/plugin.js.gz +1 -0
  551. data/spec/dummy/public/assets/tinymce/plugins/hr/plugin-7efaeee8fa1f71745d5726205bbb4fd8c0f4eba1edf2baf5a31a3b59bb677622.js +1 -0
  552. data/spec/dummy/public/assets/tinymce/plugins/hr/plugin-7efaeee8fa1f71745d5726205bbb4fd8c0f4eba1edf2baf5a31a3b59bb677622.js.gz +0 -0
  553. data/spec/dummy/public/assets/tinymce/plugins/hr/plugin.js +1 -0
  554. data/spec/dummy/public/assets/tinymce/plugins/hr/plugin.js.gz +1 -0
  555. data/spec/dummy/public/assets/tinymce/plugins/image/plugin-f228bcf7f9653e4c6ff1aae2bd06faeb46fcabc598ce4bb27a77bc174ed68ff3.js +1 -0
  556. data/spec/dummy/public/assets/tinymce/plugins/image/plugin-f228bcf7f9653e4c6ff1aae2bd06faeb46fcabc598ce4bb27a77bc174ed68ff3.js.gz +0 -0
  557. data/spec/dummy/public/assets/tinymce/plugins/image/plugin.js +1 -0
  558. data/spec/dummy/public/assets/tinymce/plugins/image/plugin.js.gz +1 -0
  559. data/spec/dummy/public/assets/tinymce/plugins/imagetools/plugin-c39a78da27870681a7187f91831de204769c4b64708d167164443769c8c8fcdf.js +1 -0
  560. data/spec/dummy/public/assets/tinymce/plugins/imagetools/plugin-c39a78da27870681a7187f91831de204769c4b64708d167164443769c8c8fcdf.js.gz +0 -0
  561. data/spec/dummy/public/assets/tinymce/plugins/imagetools/plugin.js +1 -0
  562. data/spec/dummy/public/assets/tinymce/plugins/imagetools/plugin.js.gz +1 -0
  563. data/spec/dummy/public/assets/tinymce/plugins/importcss/plugin-381b078db51fcc021a6220cf9f57609ed35ee67dd932669abafa5e5837460bbc.js +1 -0
  564. data/spec/dummy/public/assets/tinymce/plugins/importcss/plugin-381b078db51fcc021a6220cf9f57609ed35ee67dd932669abafa5e5837460bbc.js.gz +0 -0
  565. data/spec/dummy/public/assets/tinymce/plugins/importcss/plugin.js +1 -0
  566. data/spec/dummy/public/assets/tinymce/plugins/importcss/plugin.js.gz +1 -0
  567. data/spec/dummy/public/assets/tinymce/plugins/insertdatetime/plugin-246b2dd91f69e2b7d268c35c6aaca0569b0366bc18e85c15eca000564683b71d.js +1 -0
  568. data/spec/dummy/public/assets/tinymce/plugins/insertdatetime/plugin-246b2dd91f69e2b7d268c35c6aaca0569b0366bc18e85c15eca000564683b71d.js.gz +0 -0
  569. data/spec/dummy/public/assets/tinymce/plugins/insertdatetime/plugin.js +1 -0
  570. data/spec/dummy/public/assets/tinymce/plugins/insertdatetime/plugin.js.gz +1 -0
  571. data/spec/dummy/public/assets/tinymce/plugins/legacyoutput/plugin-e8c2876525a55671c4ee55a2c298d3ba0eff6a8307c057893e42558eba637652.js +1 -0
  572. data/spec/dummy/public/assets/tinymce/plugins/legacyoutput/plugin-e8c2876525a55671c4ee55a2c298d3ba0eff6a8307c057893e42558eba637652.js.gz +0 -0
  573. data/spec/dummy/public/assets/tinymce/plugins/legacyoutput/plugin.js +1 -0
  574. data/spec/dummy/public/assets/tinymce/plugins/legacyoutput/plugin.js.gz +1 -0
  575. data/spec/dummy/public/assets/tinymce/plugins/link/plugin-3429067e3c88378ddedc39f2bb42ea630e7ceb9dffa5f1a07d5b0e04180f94c4.js +1 -0
  576. data/spec/dummy/public/assets/tinymce/plugins/link/plugin-3429067e3c88378ddedc39f2bb42ea630e7ceb9dffa5f1a07d5b0e04180f94c4.js.gz +0 -0
  577. data/spec/dummy/public/assets/tinymce/plugins/link/plugin.js +1 -0
  578. data/spec/dummy/public/assets/tinymce/plugins/link/plugin.js.gz +1 -0
  579. data/spec/dummy/public/assets/tinymce/plugins/lists/plugin-05b3aac526219ee583f49151d587f89a5002261d7dfb1663d5200c77894a48f9.js +1 -0
  580. data/spec/dummy/public/assets/tinymce/plugins/lists/plugin-05b3aac526219ee583f49151d587f89a5002261d7dfb1663d5200c77894a48f9.js.gz +0 -0
  581. data/spec/dummy/public/assets/tinymce/plugins/lists/plugin.js +1 -0
  582. data/spec/dummy/public/assets/tinymce/plugins/lists/plugin.js.gz +1 -0
  583. data/spec/dummy/public/assets/tinymce/plugins/media/plugin-570acbace4fda902012c1c0596a586b521dc75cc89a4742f1bb2ecb15680b809.js +1 -0
  584. data/spec/dummy/public/assets/tinymce/plugins/media/plugin-570acbace4fda902012c1c0596a586b521dc75cc89a4742f1bb2ecb15680b809.js.gz +0 -0
  585. data/spec/dummy/public/assets/tinymce/plugins/media/plugin.js +1 -0
  586. data/spec/dummy/public/assets/tinymce/plugins/media/plugin.js.gz +1 -0
  587. data/spec/dummy/public/assets/tinymce/plugins/nonbreaking/plugin-6438a2f260ffa4724f0d13e99fe8fb1a85c00f16df416468ccd0bf6f722aaee6.js +1 -0
  588. data/spec/dummy/public/assets/tinymce/plugins/nonbreaking/plugin-6438a2f260ffa4724f0d13e99fe8fb1a85c00f16df416468ccd0bf6f722aaee6.js.gz +0 -0
  589. data/spec/dummy/public/assets/tinymce/plugins/nonbreaking/plugin.js +1 -0
  590. data/spec/dummy/public/assets/tinymce/plugins/nonbreaking/plugin.js.gz +1 -0
  591. data/spec/dummy/public/assets/tinymce/plugins/noneditable/plugin-f3be489845e7a724465d7a2bcf8f033b8b91eda2c29193b354e634da697d2f27.js +1 -0
  592. data/spec/dummy/public/assets/tinymce/plugins/noneditable/plugin-f3be489845e7a724465d7a2bcf8f033b8b91eda2c29193b354e634da697d2f27.js.gz +0 -0
  593. data/spec/dummy/public/assets/tinymce/plugins/noneditable/plugin.js +1 -0
  594. data/spec/dummy/public/assets/tinymce/plugins/noneditable/plugin.js.gz +1 -0
  595. data/spec/dummy/public/assets/tinymce/plugins/pagebreak/plugin-f4c2fa4074a982fc576ea586ee09e99091bc52d14597223c533e0967188d3a2d.js +1 -0
  596. data/spec/dummy/public/assets/tinymce/plugins/pagebreak/plugin-f4c2fa4074a982fc576ea586ee09e99091bc52d14597223c533e0967188d3a2d.js.gz +0 -0
  597. data/spec/dummy/public/assets/tinymce/plugins/pagebreak/plugin.js +1 -0
  598. data/spec/dummy/public/assets/tinymce/plugins/pagebreak/plugin.js.gz +1 -0
  599. data/spec/dummy/public/assets/tinymce/plugins/paste/plugin-e5d9b3d8e7d071e74b7cfc90c3b1c85e7ed5e4245d805194f9f79fb872d39d3d.js +1 -0
  600. data/spec/dummy/public/assets/tinymce/plugins/paste/plugin-e5d9b3d8e7d071e74b7cfc90c3b1c85e7ed5e4245d805194f9f79fb872d39d3d.js.gz +0 -0
  601. data/spec/dummy/public/assets/tinymce/plugins/paste/plugin.js +1 -0
  602. data/spec/dummy/public/assets/tinymce/plugins/paste/plugin.js.gz +1 -0
  603. data/spec/dummy/public/assets/tinymce/plugins/preview/plugin-bdf1d10d1e637f00598d3f482895e276933c1e16b1b543d2120fb70c4fbf3d18.js +1 -0
  604. data/spec/dummy/public/assets/tinymce/plugins/preview/plugin-bdf1d10d1e637f00598d3f482895e276933c1e16b1b543d2120fb70c4fbf3d18.js.gz +0 -0
  605. data/spec/dummy/public/assets/tinymce/plugins/preview/plugin.js +1 -0
  606. data/spec/dummy/public/assets/tinymce/plugins/preview/plugin.js.gz +1 -0
  607. data/spec/dummy/public/assets/tinymce/plugins/print/plugin-1ba88c314fa4c0c47ab0af0aa908c03d7906a77fef6a319a302ffff44099fe26.js +1 -0
  608. data/spec/dummy/public/assets/tinymce/plugins/print/plugin-1ba88c314fa4c0c47ab0af0aa908c03d7906a77fef6a319a302ffff44099fe26.js.gz +0 -0
  609. data/spec/dummy/public/assets/tinymce/plugins/print/plugin.js +1 -0
  610. data/spec/dummy/public/assets/tinymce/plugins/print/plugin.js.gz +1 -0
  611. data/spec/dummy/public/assets/tinymce/plugins/save/plugin-a944096bba3f8519c898163008a334509d0f4efdbcd9500d752170fdbef570b3.js +1 -0
  612. data/spec/dummy/public/assets/tinymce/plugins/save/plugin-a944096bba3f8519c898163008a334509d0f4efdbcd9500d752170fdbef570b3.js.gz +0 -0
  613. data/spec/dummy/public/assets/tinymce/plugins/save/plugin.js +1 -0
  614. data/spec/dummy/public/assets/tinymce/plugins/save/plugin.js.gz +1 -0
  615. data/spec/dummy/public/assets/tinymce/plugins/searchreplace/plugin-f92c077beef380fec6358458a27442d22eaca83a81fb3c4d71d9103e2f8b9c7a.js +1 -0
  616. data/spec/dummy/public/assets/tinymce/plugins/searchreplace/plugin-f92c077beef380fec6358458a27442d22eaca83a81fb3c4d71d9103e2f8b9c7a.js.gz +0 -0
  617. data/spec/dummy/public/assets/tinymce/plugins/searchreplace/plugin.js +1 -0
  618. data/spec/dummy/public/assets/tinymce/plugins/searchreplace/plugin.js.gz +1 -0
  619. data/spec/dummy/public/assets/tinymce/plugins/spellchecker/plugin-2421bc7102c088705c6d524c402aa8091adced77d046c2e6a210a431314f9b39.js +1 -0
  620. data/spec/dummy/public/assets/tinymce/plugins/spellchecker/plugin-2421bc7102c088705c6d524c402aa8091adced77d046c2e6a210a431314f9b39.js.gz +0 -0
  621. data/spec/dummy/public/assets/tinymce/plugins/spellchecker/plugin.js +1 -0
  622. data/spec/dummy/public/assets/tinymce/plugins/spellchecker/plugin.js.gz +1 -0
  623. data/spec/dummy/public/assets/tinymce/plugins/tabfocus/plugin-8222fce64dd367dccf3262baa1b881f2664d17704cc77e7bea991f2a2ef277e5.js +1 -0
  624. data/spec/dummy/public/assets/tinymce/plugins/tabfocus/plugin-8222fce64dd367dccf3262baa1b881f2664d17704cc77e7bea991f2a2ef277e5.js.gz +0 -0
  625. data/spec/dummy/public/assets/tinymce/plugins/tabfocus/plugin.js +1 -0
  626. data/spec/dummy/public/assets/tinymce/plugins/tabfocus/plugin.js.gz +1 -0
  627. data/spec/dummy/public/assets/tinymce/plugins/table/plugin-9a47d6e1a247fa9d364bbbd3f4369c008a90b8dc3ca58dccc078d96e35c309ff.js +1 -0
  628. data/spec/dummy/public/assets/tinymce/plugins/table/plugin-9a47d6e1a247fa9d364bbbd3f4369c008a90b8dc3ca58dccc078d96e35c309ff.js.gz +0 -0
  629. data/spec/dummy/public/assets/tinymce/plugins/table/plugin.js +1 -0
  630. data/spec/dummy/public/assets/tinymce/plugins/table/plugin.js.gz +1 -0
  631. data/spec/dummy/public/assets/tinymce/plugins/template/plugin-c8d1a75d3ed920d3a8c5a1de1a154fde85dad3540521734f7226f8ab7fa9a83f.js +1 -0
  632. data/spec/dummy/public/assets/tinymce/plugins/template/plugin-c8d1a75d3ed920d3a8c5a1de1a154fde85dad3540521734f7226f8ab7fa9a83f.js.gz +0 -0
  633. data/spec/dummy/public/assets/tinymce/plugins/template/plugin.js +1 -0
  634. data/spec/dummy/public/assets/tinymce/plugins/template/plugin.js.gz +1 -0
  635. data/spec/dummy/public/assets/tinymce/plugins/textcolor/plugin-ebf778e6028f2d073e3ff9219c8d49ae5f066d4819cfe7fd72bcf6be84e0f014.js +1 -0
  636. data/spec/dummy/public/assets/tinymce/plugins/textcolor/plugin-ebf778e6028f2d073e3ff9219c8d49ae5f066d4819cfe7fd72bcf6be84e0f014.js.gz +0 -0
  637. data/spec/dummy/public/assets/tinymce/plugins/textcolor/plugin.js +1 -0
  638. data/spec/dummy/public/assets/tinymce/plugins/textcolor/plugin.js.gz +1 -0
  639. data/spec/dummy/public/assets/tinymce/plugins/textpattern/plugin-0e4e48f87210d9b6e23c4dc597d9eea97b6496c30cc5bcbddab76bb8c8bfc464.js +1 -0
  640. data/spec/dummy/public/assets/tinymce/plugins/textpattern/plugin-0e4e48f87210d9b6e23c4dc597d9eea97b6496c30cc5bcbddab76bb8c8bfc464.js.gz +0 -0
  641. data/spec/dummy/public/assets/tinymce/plugins/textpattern/plugin.js +1 -0
  642. data/spec/dummy/public/assets/tinymce/plugins/textpattern/plugin.js.gz +1 -0
  643. data/spec/dummy/public/assets/tinymce/plugins/toc/plugin-a73e6c327940360e18736b041e3345c9b678ecf553c9a1540f1c6f5275589b34.js +1 -0
  644. data/spec/dummy/public/assets/tinymce/plugins/toc/plugin-a73e6c327940360e18736b041e3345c9b678ecf553c9a1540f1c6f5275589b34.js.gz +0 -0
  645. data/spec/dummy/public/assets/tinymce/plugins/toc/plugin.js +1 -0
  646. data/spec/dummy/public/assets/tinymce/plugins/toc/plugin.js.gz +1 -0
  647. data/spec/dummy/public/assets/tinymce/plugins/visualblocks/css/visualblocks-38af77cad34b0cc4beed256e10d7f2a6dfdde074c25d27d7e147505e5fd334ba.css +154 -0
  648. data/spec/dummy/public/assets/tinymce/plugins/visualblocks/css/visualblocks-38af77cad34b0cc4beed256e10d7f2a6dfdde074c25d27d7e147505e5fd334ba.css.gz +0 -0
  649. data/spec/dummy/public/assets/tinymce/plugins/visualblocks/css/visualblocks.css +1 -0
  650. data/spec/dummy/public/assets/tinymce/plugins/visualblocks/css/visualblocks.css.gz +1 -0
  651. data/spec/dummy/public/assets/tinymce/plugins/visualblocks/plugin-0b55625bb357cb6113a43de563efa3b6142f7502534ebc705315ef785d052c44.js +1 -0
  652. data/spec/dummy/public/assets/tinymce/plugins/visualblocks/plugin-0b55625bb357cb6113a43de563efa3b6142f7502534ebc705315ef785d052c44.js.gz +0 -0
  653. data/spec/dummy/public/assets/tinymce/plugins/visualblocks/plugin.js +1 -0
  654. data/spec/dummy/public/assets/tinymce/plugins/visualblocks/plugin.js.gz +1 -0
  655. data/spec/dummy/public/assets/tinymce/plugins/visualchars/plugin-ae2a936285b3d920eb3ff184d8502811cbfb59cf6b1c06c81343a57505fd9f84.js +1 -0
  656. data/spec/dummy/public/assets/tinymce/plugins/visualchars/plugin-ae2a936285b3d920eb3ff184d8502811cbfb59cf6b1c06c81343a57505fd9f84.js.gz +0 -0
  657. data/spec/dummy/public/assets/tinymce/plugins/visualchars/plugin.js +1 -0
  658. data/spec/dummy/public/assets/tinymce/plugins/visualchars/plugin.js.gz +1 -0
  659. data/spec/dummy/public/assets/tinymce/plugins/wordcount/plugin-c1c8b0a36661e2d8ea847cefbaac2dfd95a16bea714c7dbd3d65f51e25311a65.js +1 -0
  660. data/spec/dummy/public/assets/tinymce/plugins/wordcount/plugin-c1c8b0a36661e2d8ea847cefbaac2dfd95a16bea714c7dbd3d65f51e25311a65.js.gz +0 -0
  661. data/spec/dummy/public/assets/tinymce/plugins/wordcount/plugin.js +1 -0
  662. data/spec/dummy/public/assets/tinymce/plugins/wordcount/plugin.js.gz +1 -0
  663. data/spec/dummy/public/assets/tinymce/preinit-84328a53e798df12f891eb49871773fd9f925439c8630e9e22423a82ef9e6f89.js +4 -0
  664. data/spec/dummy/public/assets/tinymce/preinit-84328a53e798df12f891eb49871773fd9f925439c8630e9e22423a82ef9e6f89.js.gz +0 -0
  665. data/spec/dummy/public/assets/tinymce/preinit.js +1 -0
  666. data/spec/dummy/public/assets/tinymce/preinit.js.gz +1 -0
  667. data/spec/dummy/public/assets/tinymce/rails-bf7fd5c952f25481010758dde6a2681498074f9509230f601b317356a6a54fca.js +52 -0
  668. data/spec/dummy/public/assets/tinymce/rails-bf7fd5c952f25481010758dde6a2681498074f9509230f601b317356a6a54fca.js.gz +0 -0
  669. data/spec/dummy/public/assets/tinymce/rails.js +1 -0
  670. data/spec/dummy/public/assets/tinymce/rails.js.gz +1 -0
  671. data/spec/dummy/public/assets/tinymce/skins/lightgray/content.inline.min-b62ea4e65ad6c87cbfedf3897b59eb30ec3972c410070d8ee2c0f5bececc4cce.css +1 -0
  672. data/spec/dummy/public/assets/tinymce/skins/lightgray/content.inline.min-b62ea4e65ad6c87cbfedf3897b59eb30ec3972c410070d8ee2c0f5bececc4cce.css.gz +0 -0
  673. data/spec/dummy/public/assets/tinymce/skins/lightgray/content.inline.min.css +1 -0
  674. data/spec/dummy/public/assets/tinymce/skins/lightgray/content.inline.min.css.gz +1 -0
  675. data/spec/dummy/public/assets/tinymce/skins/lightgray/content.min-d72493ca5cc1caca93db665b284fd12fe396a245c3e82cc2d6cf4fca83702cb9.css +1 -0
  676. data/spec/dummy/public/assets/tinymce/skins/lightgray/content.min-d72493ca5cc1caca93db665b284fd12fe396a245c3e82cc2d6cf4fca83702cb9.css.gz +0 -0
  677. data/spec/dummy/public/assets/tinymce/skins/lightgray/content.min.css +1 -0
  678. data/spec/dummy/public/assets/tinymce/skins/lightgray/content.min.css.gz +1 -0
  679. data/spec/dummy/public/assets/tinymce/skins/lightgray/content.mobile.min-230c31f65356c7cb1799244a34f7a722c92a6d614e06e59d48db0ebccd7f2346.css +1 -0
  680. data/spec/dummy/public/assets/tinymce/skins/lightgray/content.mobile.min-230c31f65356c7cb1799244a34f7a722c92a6d614e06e59d48db0ebccd7f2346.css.gz +0 -0
  681. data/spec/dummy/public/assets/tinymce/skins/lightgray/content.mobile.min.css +1 -0
  682. data/spec/dummy/public/assets/tinymce/skins/lightgray/content.mobile.min.css.gz +1 -0
  683. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-84d35201689d08969a92a8ccdc5a0002da01eac30651fef23e79e1993ace2ebf.woff +0 -0
  684. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-8c8effbf1b373e7bd3f8f291264eaefeed933fea8fe91637d81f3fc9574c3592.ttf +0 -0
  685. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-8c8effbf1b373e7bd3f8f291264eaefeed933fea8fe91637d81f3fc9574c3592.ttf.gz +0 -0
  686. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-d7d36b21dc4b2dd2e4252b2b71f7b57d2d828359f2936af6e3fe8e2f913a0498.eot +0 -0
  687. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-d7d36b21dc4b2dd2e4252b2b71f7b57d2d828359f2936af6e3fe8e2f913a0498.eot.gz +0 -0
  688. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-e17f0683d5785645d10307971450b94e62b86f062e92fcea6a055c2443bdef5f.svg +132 -0
  689. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-e17f0683d5785645d10307971450b94e62b86f062e92fcea6a055c2443bdef5f.svg.gz +0 -0
  690. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-mobile-e64bf156a432d63f5b34b4567b513dc0d351b49161c7f608fb82574bfdd9d213.woff +0 -0
  691. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-mobile.woff +1 -0
  692. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small-2f657502906d6f5c3fc8df3a82969114ebe030addfdc061c60c974b0f515fd09.ttf +0 -0
  693. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small-2f657502906d6f5c3fc8df3a82969114ebe030addfdc061c60c974b0f515fd09.ttf.gz +0 -0
  694. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small-a10fc4343d95b716c16d77463d475be5c079599ea67e1cd2bd3a94d5e7f508f9.eot +0 -0
  695. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small-a10fc4343d95b716c16d77463d475be5c079599ea67e1cd2bd3a94d5e7f508f9.eot.gz +0 -0
  696. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small-d3efbb678ca6de5632902bd93772746ba2f8e4e2322b953936e12694a183aa31.woff +0 -0
  697. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small-e7773001446ab937e1d8d4bd5e8dbd9b31d112037353a14b319e36dd010ed8ee.svg +63 -0
  698. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small-e7773001446ab937e1d8d4bd5e8dbd9b31d112037353a14b319e36dd010ed8ee.svg.gz +0 -0
  699. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small.eot +1 -0
  700. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small.eot.gz +1 -0
  701. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small.svg +1 -0
  702. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small.svg.gz +1 -0
  703. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small.ttf +1 -0
  704. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small.ttf.gz +1 -0
  705. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce-small.woff +1 -0
  706. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce.eot +1 -0
  707. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce.eot.gz +1 -0
  708. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce.svg +1 -0
  709. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce.svg.gz +1 -0
  710. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce.ttf +1 -0
  711. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce.ttf.gz +1 -0
  712. data/spec/dummy/public/assets/tinymce/skins/lightgray/fonts/tinymce.woff +1 -0
  713. data/spec/dummy/public/assets/tinymce/skins/lightgray/img/anchor-2861666fd107d278d4449970615136d06d7f746be9bb19072cf9c8f30e565e1e.gif +0 -0
  714. data/spec/dummy/public/assets/tinymce/skins/lightgray/img/anchor.gif +1 -0
  715. data/spec/dummy/public/assets/tinymce/skins/lightgray/img/loader-eb7cfd3d959b2e09c170f532e29f8b825f9bc770b2279fde58e595617753e244.gif +0 -0
  716. data/spec/dummy/public/assets/tinymce/skins/lightgray/img/loader.gif +1 -0
  717. data/spec/dummy/public/assets/tinymce/skins/lightgray/img/object-e6a15e52bc4a17b085073ba8debd4708ead6ae3d4cbeb3880c65cb7afc489777.gif +0 -0
  718. data/spec/dummy/public/assets/tinymce/skins/lightgray/img/object.gif +1 -0
  719. data/spec/dummy/public/assets/tinymce/skins/lightgray/img/trans-9cf020d7c3bba7f5ab10cda54aabef934f906d4f9a3acf99e9e7dc6c98579635.gif +0 -0
  720. data/spec/dummy/public/assets/tinymce/skins/lightgray/img/trans.gif +1 -0
  721. data/spec/dummy/public/assets/tinymce/skins/lightgray/skin.min-a79be2481d2a4ff94eb1149ead0747a75242ac8aaea9fb04511983009979e999.css +1 -0
  722. data/spec/dummy/public/assets/tinymce/skins/lightgray/skin.min-a79be2481d2a4ff94eb1149ead0747a75242ac8aaea9fb04511983009979e999.css.gz +0 -0
  723. data/spec/dummy/public/assets/tinymce/skins/lightgray/skin.min.css +1 -0
  724. data/spec/dummy/public/assets/tinymce/skins/lightgray/skin.min.css.gz +1 -0
  725. data/spec/dummy/public/assets/tinymce/skins/lightgray/skin.mobile.min-3bad5bf37eeca619d0f3250813b5489d7095b88f0cfe28bd1dc31b27f49b7d1c.css +2 -0
  726. data/spec/dummy/public/assets/tinymce/skins/lightgray/skin.mobile.min-3bad5bf37eeca619d0f3250813b5489d7095b88f0cfe28bd1dc31b27f49b7d1c.css.gz +0 -0
  727. data/spec/dummy/public/assets/tinymce/skins/lightgray/skin.mobile.min.css +1 -0
  728. data/spec/dummy/public/assets/tinymce/skins/lightgray/skin.mobile.min.css.gz +1 -0
  729. data/spec/dummy/public/assets/tinymce/themes/inlite/theme-9b7dacf28bd56f89d0484dc1026baf70b99b19ae6e6b73e05508617cab4ce9fd.js +1 -0
  730. data/spec/dummy/public/assets/tinymce/themes/inlite/theme-9b7dacf28bd56f89d0484dc1026baf70b99b19ae6e6b73e05508617cab4ce9fd.js.gz +0 -0
  731. data/spec/dummy/public/assets/tinymce/themes/inlite/theme.js +1 -0
  732. data/spec/dummy/public/assets/tinymce/themes/inlite/theme.js.gz +1 -0
  733. data/spec/dummy/public/assets/tinymce/themes/mobile/theme-b2dd6f36e4d9b3e1c7db2e6eeca066fafe23c83d4edcb864435e8db5c75693a2.js +1 -0
  734. data/spec/dummy/public/assets/tinymce/themes/mobile/theme-b2dd6f36e4d9b3e1c7db2e6eeca066fafe23c83d4edcb864435e8db5c75693a2.js.gz +0 -0
  735. data/spec/dummy/public/assets/tinymce/themes/mobile/theme.js +1 -0
  736. data/spec/dummy/public/assets/tinymce/themes/mobile/theme.js.gz +1 -0
  737. data/spec/dummy/public/assets/tinymce/themes/modern/theme-902ab1a0d92d3c98813a758b5f2f1fa256c1d0f4d272071db3dd25f198e726e1.js +1 -0
  738. data/spec/dummy/public/assets/tinymce/themes/modern/theme-902ab1a0d92d3c98813a758b5f2f1fa256c1d0f4d272071db3dd25f198e726e1.js.gz +0 -0
  739. data/spec/dummy/public/assets/tinymce/themes/modern/theme.js +1 -0
  740. data/spec/dummy/public/assets/tinymce/themes/modern/theme.js.gz +1 -0
  741. data/spec/dummy/public/assets/tinymce/tinymce-4bbe7bdb1002044cd23496cc97b23a2fe25aefe0f130c9d6508877ffb9fd862e.js +26829 -0
  742. data/spec/dummy/public/assets/tinymce/tinymce-4bbe7bdb1002044cd23496cc97b23a2fe25aefe0f130c9d6508877ffb9fd862e.js.gz +0 -0
  743. data/spec/dummy/public/assets/tinymce/tinymce.js +1 -0
  744. data/spec/dummy/public/assets/tinymce/tinymce.js.gz +1 -0
  745. data/spec/dummy/public/assets/tinymce-18aa7e0c99c3802cce9257c706c337e2bc8f998d1f8ebfd00309592dffdade05.js +26888 -0
  746. data/spec/dummy/public/assets/tinymce-18aa7e0c99c3802cce9257c706c337e2bc8f998d1f8ebfd00309592dffdade05.js.gz +0 -0
  747. data/spec/dummy/public/assets/unauthorized-f936e9c3ea7a38e2c2092099586a71380b11258697b37fb4df376704495a849a.png +0 -0
  748. data/spec/dummy/public/assets/us_404-97e5b45f27bdb92b864434b6bfe96c248456caea17e9a18b4b671c803ea7db4d.svg +91 -0
  749. data/spec/dummy/public/assets/us_404-97e5b45f27bdb92b864434b6bfe96c248456caea17e9a18b4b671c803ea7db4d.svg.gz +0 -0
  750. data/spec/dummy/public/assets/work-ff055336041c3f7d310ad69109eda4a887b16ec501f35afc0a547c4adb97ee72.png +0 -0
  751. data/spec/dummy/public/assets/zizia/application-506279a2a8261b6dfdd8753ef894af0a53a1a04c7a71036110ed2ba9f437da99.js +71 -0
  752. data/spec/dummy/public/assets/zizia/application-506279a2a8261b6dfdd8753ef894af0a53a1a04c7a71036110ed2ba9f437da99.js.gz +0 -0
  753. data/spec/dummy/public/assets/zizia/application-a61ffbc929539843842d2e6e212160fa843847f8ae69f706ca83535eddc24737.css +36 -0
  754. data/spec/dummy/public/assets/zizia/application-a61ffbc929539843842d2e6e212160fa843847f8ae69f706ca83535eddc24737.css.gz +0 -0
  755. data/spec/dummy/public/assets/zotero-d6a884dbda40a61ac3a10f27c39592de33ec305bdb035859db6fd5dd2f47fc73.png +0 -0
  756. data/spec/dummy/public/favicon.ico +0 -0
  757. data/spec/dummy/public/robots.txt +1 -0
  758. data/spec/dummy/solr/conf/_rest_managed.json +3 -0
  759. data/spec/dummy/solr/conf/admin-extra.html +31 -0
  760. data/spec/dummy/solr/conf/elevate.xml +36 -0
  761. data/spec/dummy/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  762. data/spec/dummy/solr/conf/protwords.txt +21 -0
  763. data/spec/dummy/solr/conf/schema.xml +629 -0
  764. data/spec/dummy/solr/conf/scripts.conf +24 -0
  765. data/spec/dummy/solr/conf/solrconfig.xml +411 -0
  766. data/spec/dummy/solr/conf/spellings.txt +2 -0
  767. data/spec/dummy/solr/conf/stopwords.txt +58 -0
  768. data/spec/dummy/solr/conf/stopwords_en.txt +58 -0
  769. data/spec/dummy/solr/conf/synonyms.txt +31 -0
  770. data/spec/dummy/solr/conf/xslt/example.xsl +132 -0
  771. data/spec/dummy/solr/conf/xslt/example_atom.xsl +67 -0
  772. data/spec/dummy/solr/conf/xslt/example_rss.xsl +66 -0
  773. data/spec/dummy/solr/conf/xslt/luke.xsl +337 -0
  774. data/spec/dummy/solr/config/_rest_managed.json +3 -0
  775. data/spec/dummy/solr/config/admin-extra.html +31 -0
  776. data/spec/dummy/solr/config/elevate.xml +36 -0
  777. data/spec/dummy/solr/config/mapping-ISOLatin1Accent.txt +246 -0
  778. data/spec/dummy/solr/config/protwords.txt +21 -0
  779. data/spec/dummy/solr/config/schema.xml +366 -0
  780. data/spec/dummy/solr/config/scripts.conf +24 -0
  781. data/spec/dummy/solr/config/solrconfig.xml +322 -0
  782. data/spec/dummy/solr/config/spellings.txt +2 -0
  783. data/spec/dummy/solr/config/stopwords.txt +58 -0
  784. data/spec/dummy/solr/config/stopwords_en.txt +58 -0
  785. data/spec/dummy/solr/config/synonyms.txt +31 -0
  786. data/spec/dummy/solr/config/xslt/example.xsl +132 -0
  787. data/spec/dummy/solr/config/xslt/example_atom.xsl +67 -0
  788. data/spec/dummy/solr/config/xslt/example_rss.xsl +66 -0
  789. data/spec/dummy/solr/config/xslt/luke.xsl +337 -0
  790. data/spec/dummy/solr/sample_solr_documents.yml +2692 -0
  791. data/spec/dummy/spec/fixtures/csv_import/csv_files_with_problems/extra - headers.csv +4 -0
  792. data/spec/dummy/spec/fixtures/csv_import/csv_files_with_problems/missing_headers.csv +2 -0
  793. data/spec/dummy/spec/fixtures/csv_import/good/all_fields.csv +2 -0
  794. data/spec/dummy/spec/fixtures/csv_import/good/all_fields_complete_update.csv +2 -0
  795. data/spec/dummy/spec/fixtures/csv_import/good/all_fields_metadata_update.csv +2 -0
  796. data/spec/dummy/spec/fixtures/csv_import/good/all_fields_only_new.csv +3 -0
  797. data/spec/dummy/spec/fixtures/images/animals/cat.png +0 -0
  798. data/spec/dummy/spec/fixtures/images/birds.jpg +0 -0
  799. data/spec/dummy/spec/fixtures/images/cat.jpg +0 -0
  800. data/spec/dummy/spec/fixtures/images/dog.jpg +0 -0
  801. data/spec/dummy/spec/fixtures/images/zizia.png +0 -0
  802. data/spec/dummy/spec/integration/import_csv_spec.rb +24 -0
  803. data/spec/dummy/spec/models/collection_spec.rb +7 -0
  804. data/spec/dummy/spec/models/file_set_spec.rb +7 -0
  805. data/spec/dummy/spec/models/qa/local_authority_entry_spec.rb +5 -0
  806. data/spec/dummy/spec/models/qa/local_authority_spec.rb +5 -0
  807. data/spec/dummy/spec/rails_helper.rb +62 -0
  808. data/spec/dummy/spec/spec_helper.rb +96 -0
  809. data/spec/dummy/spec/system/import_csv_with_warnings_spec.rb +51 -0
  810. data/spec/dummy/spec/system/import_from_csv_spec.rb +242 -0
  811. data/spec/dummy/spec/system/import_from_csv_with_errors_spec.rb +35 -0
  812. data/spec/dummy/spec/system/import_with_no_collection_spec.rb +18 -0
  813. data/spec/dummy/spec/system/importer_documentation_spec.rb +17 -0
  814. data/spec/dummy/spec/system/view_hyrax_home_page_spec.rb +9 -0
  815. data/spec/dummy/storage/.keep +0 -0
  816. data/spec/dummy/test/application_system_test_case.rb +5 -0
  817. data/spec/dummy/test/controllers/.keep +0 -0
  818. data/spec/dummy/test/fixtures/.keep +0 -0
  819. data/spec/dummy/test/fixtures/files/.keep +0 -0
  820. data/spec/dummy/test/fixtures/users.yml +11 -0
  821. data/spec/dummy/test/helpers/.keep +0 -0
  822. data/spec/dummy/test/integration/.keep +0 -0
  823. data/spec/dummy/test/mailers/.keep +0 -0
  824. data/spec/dummy/test/models/.keep +0 -0
  825. data/spec/dummy/test/models/user_test.rb +7 -0
  826. data/spec/dummy/test/system/.keep +0 -0
  827. data/spec/dummy/test/test_helper.rb +9 -0
  828. data/spec/dummy/vendor/.keep +0 -0
  829. data/spec/factories/collection.rb +13 -0
  830. data/spec/factories/user.rb +34 -0
  831. data/spec/fixtures/bad_example.csv +2 -0
  832. data/spec/fixtures/csv_import/csv_files_with_problems/extra - headers.csv +4 -0
  833. data/spec/fixtures/csv_import/csv_files_with_problems/missing_headers.csv +2 -0
  834. data/spec/fixtures/csv_import/good/all_fields.csv +2 -0
  835. data/spec/fixtures/dog.jpg +0 -0
  836. data/spec/fixtures/example.csv +4 -0
  837. data/spec/fixtures/hyrax/example.csv +3 -0
  838. data/spec/fixtures/images/animals/cat.png +0 -0
  839. data/spec/fixtures/images/birds.jpg +0 -0
  840. data/spec/fixtures/images/cat.jpg +0 -0
  841. data/spec/fixtures/images/dog.jpg +0 -0
  842. data/spec/fixtures/images/zizia.png +0 -0
  843. data/spec/fixtures/zizia.png +0 -0
  844. data/spec/integration/csv_import_detail_spec.rb +48 -0
  845. data/spec/integration/import_hyrax_csv.rb +71 -0
  846. data/spec/models/csv_import_spec.rb +18 -0
  847. data/spec/rails_helper.rb +80 -0
  848. data/spec/spec_helper.rb +28 -0
  849. data/spec/support/capybara.rb +28 -0
  850. data/spec/support/hyrax/basic_metadata.rb +30 -0
  851. data/spec/support/hyrax/core_metadata.rb +15 -0
  852. data/spec/support/shared_contexts/with_work_type.rb +109 -0
  853. data/spec/uploaders/csv_manifest_uploader_spec.rb +30 -0
  854. data/spec/views/zizia/importer_documentation/guide.html.erb_spec.rb +13 -0
  855. data/spec/zizia/csv_format_validator_spec.rb +38 -0
  856. data/spec/zizia/csv_parser_spec.rb +73 -0
  857. data/spec/zizia/csv_template_spec.rb +15 -0
  858. data/spec/zizia/hash_mapper_spec.rb +8 -0
  859. data/spec/zizia/hyrax/hyrax_basic_metadata_mapper_spec.rb +191 -0
  860. data/spec/zizia/importer_spec.rb +46 -0
  861. data/spec/zizia/input_record_spec.rb +71 -0
  862. data/spec/zizia/record_importer_spec.rb +53 -0
  863. data/spec/zizia/title_validator_spec.rb +23 -0
  864. data/spec/zizia/validator_spec.rb +9 -0
  865. data/spec/zizia/version_spec.rb +7 -0
  866. data/spec/zizia_spec.rb +20 -0
  867. data/zizia.gemspec +62 -0
  868. metadata +868 -2
@@ -0,0 +1,3648 @@
1
+ /*
2
+ * jQuery treetable Plugin 3.2.0
3
+ * http://ludo.cubicphuse.nl/jquery-treetable
4
+ *
5
+ * Copyright 2013, Ludo van den Boom
6
+ * Dual licensed under the MIT or GPL Version 2 licenses.
7
+ */
8
+
9
+ (function($) {
10
+ var Node, Tree, methods;
11
+
12
+ Node = (function() {
13
+ function Node(row, tree, settings) {
14
+ var parentId;
15
+
16
+ this.row = row;
17
+ this.tree = tree;
18
+ this.settings = settings;
19
+
20
+ // TODO Ensure id/parentId is always a string (not int)
21
+ this.id = this.row.data(this.settings.nodeIdAttr);
22
+
23
+ // TODO Move this to a setParentId function?
24
+ parentId = this.row.data(this.settings.parentIdAttr);
25
+ if (parentId != null && parentId !== "") {
26
+ this.parentId = parentId;
27
+ }
28
+
29
+ this.treeCell = $(this.row.children(this.settings.columnElType)[this.settings.column]);
30
+ this.expander = $(this.settings.expanderTemplate);
31
+ this.indenter = $(this.settings.indenterTemplate);
32
+ this.children = [];
33
+ this.initialized = false;
34
+ this.treeCell.prepend(this.indenter);
35
+ }
36
+
37
+ Node.prototype.addChild = function(child) {
38
+ return this.children.push(child);
39
+ };
40
+
41
+ Node.prototype.ancestors = function() {
42
+ var ancestors, node;
43
+ node = this;
44
+ ancestors = [];
45
+ while (node = node.parentNode()) {
46
+ ancestors.push(node);
47
+ }
48
+ return ancestors;
49
+ };
50
+
51
+ Node.prototype.collapse = function() {
52
+ if (this.collapsed()) {
53
+ return this;
54
+ }
55
+
56
+ this.row.removeClass("expanded").addClass("collapsed");
57
+
58
+ this._hideChildren();
59
+ this.expander.attr("title", this.settings.stringExpand);
60
+
61
+ if (this.initialized && this.settings.onNodeCollapse != null) {
62
+ this.settings.onNodeCollapse.apply(this);
63
+ }
64
+
65
+ return this;
66
+ };
67
+
68
+ Node.prototype.collapsed = function() {
69
+ return this.row.hasClass("collapsed");
70
+ };
71
+
72
+ // TODO destroy: remove event handlers, expander, indenter, etc.
73
+
74
+ Node.prototype.expand = function() {
75
+ if (this.expanded()) {
76
+ return this;
77
+ }
78
+
79
+ this.row.removeClass("collapsed").addClass("expanded");
80
+
81
+ if (this.initialized && this.settings.onNodeExpand != null) {
82
+ this.settings.onNodeExpand.apply(this);
83
+ }
84
+
85
+ if ($(this.row).is(":visible")) {
86
+ this._showChildren();
87
+ }
88
+
89
+ this.expander.attr("title", this.settings.stringCollapse);
90
+
91
+ return this;
92
+ };
93
+
94
+ Node.prototype.expanded = function() {
95
+ return this.row.hasClass("expanded");
96
+ };
97
+
98
+ Node.prototype.hide = function() {
99
+ this._hideChildren();
100
+ this.row.hide();
101
+ return this;
102
+ };
103
+
104
+ Node.prototype.isBranchNode = function() {
105
+ if(this.children.length > 0 || this.row.data(this.settings.branchAttr) === true) {
106
+ return true;
107
+ } else {
108
+ return false;
109
+ }
110
+ };
111
+
112
+ Node.prototype.updateBranchLeafClass = function(){
113
+ this.row.removeClass('branch');
114
+ this.row.removeClass('leaf');
115
+ this.row.addClass(this.isBranchNode() ? 'branch' : 'leaf');
116
+ };
117
+
118
+ Node.prototype.level = function() {
119
+ return this.ancestors().length;
120
+ };
121
+
122
+ Node.prototype.parentNode = function() {
123
+ if (this.parentId != null) {
124
+ return this.tree[this.parentId];
125
+ } else {
126
+ return null;
127
+ }
128
+ };
129
+
130
+ Node.prototype.removeChild = function(child) {
131
+ var i = $.inArray(child, this.children);
132
+ return this.children.splice(i, 1)
133
+ };
134
+
135
+ Node.prototype.render = function() {
136
+ var handler,
137
+ settings = this.settings,
138
+ target;
139
+
140
+ if (settings.expandable === true && this.isBranchNode()) {
141
+ handler = function(e) {
142
+ $(this).parents("table").treetable("node", $(this).parents("tr").data(settings.nodeIdAttr)).toggle();
143
+ return e.preventDefault();
144
+ };
145
+
146
+ this.indenter.html(this.expander);
147
+ target = settings.clickableNodeNames === true ? this.treeCell : this.expander;
148
+
149
+ target.off("click.treetable").on("click.treetable", handler);
150
+ target.off("keydown.treetable").on("keydown.treetable", function(e) {
151
+ if (e.keyCode == 13) {
152
+ handler.apply(this, [e]);
153
+ }
154
+ });
155
+ }
156
+
157
+ this.indenter[0].style.paddingLeft = "" + (this.level() * settings.indent) + "px";
158
+
159
+ return this;
160
+ };
161
+
162
+ Node.prototype.reveal = function() {
163
+ if (this.parentId != null) {
164
+ this.parentNode().reveal();
165
+ }
166
+ return this.expand();
167
+ };
168
+
169
+ Node.prototype.setParent = function(node) {
170
+ if (this.parentId != null) {
171
+ this.tree[this.parentId].removeChild(this);
172
+ }
173
+ this.parentId = node.id;
174
+ this.row.data(this.settings.parentIdAttr, node.id);
175
+ return node.addChild(this);
176
+ };
177
+
178
+ Node.prototype.show = function() {
179
+ if (!this.initialized) {
180
+ this._initialize();
181
+ }
182
+ this.row.show();
183
+ if (this.expanded()) {
184
+ this._showChildren();
185
+ }
186
+ return this;
187
+ };
188
+
189
+ Node.prototype.toggle = function() {
190
+ if (this.expanded()) {
191
+ this.collapse();
192
+ } else {
193
+ this.expand();
194
+ }
195
+ return this;
196
+ };
197
+
198
+ Node.prototype._hideChildren = function() {
199
+ var child, _i, _len, _ref, _results;
200
+ _ref = this.children;
201
+ _results = [];
202
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
203
+ child = _ref[_i];
204
+ _results.push(child.hide());
205
+ }
206
+ return _results;
207
+ };
208
+
209
+ Node.prototype._initialize = function() {
210
+ var settings = this.settings;
211
+
212
+ this.render();
213
+
214
+ if (settings.expandable === true && settings.initialState === "collapsed") {
215
+ this.collapse();
216
+ } else {
217
+ this.expand();
218
+ }
219
+
220
+ if (settings.onNodeInitialized != null) {
221
+ settings.onNodeInitialized.apply(this);
222
+ }
223
+
224
+ return this.initialized = true;
225
+ };
226
+
227
+ Node.prototype._showChildren = function() {
228
+ var child, _i, _len, _ref, _results;
229
+ _ref = this.children;
230
+ _results = [];
231
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
232
+ child = _ref[_i];
233
+ _results.push(child.show());
234
+ }
235
+ return _results;
236
+ };
237
+
238
+ return Node;
239
+ })();
240
+
241
+ Tree = (function() {
242
+ function Tree(table, settings) {
243
+ this.table = table;
244
+ this.settings = settings;
245
+ this.tree = {};
246
+
247
+ // Cache the nodes and roots in simple arrays for quick access/iteration
248
+ this.nodes = [];
249
+ this.roots = [];
250
+ }
251
+
252
+ Tree.prototype.collapseAll = function() {
253
+ var node, _i, _len, _ref, _results;
254
+ _ref = this.nodes;
255
+ _results = [];
256
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
257
+ node = _ref[_i];
258
+ _results.push(node.collapse());
259
+ }
260
+ return _results;
261
+ };
262
+
263
+ Tree.prototype.expandAll = function() {
264
+ var node, _i, _len, _ref, _results;
265
+ _ref = this.nodes;
266
+ _results = [];
267
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
268
+ node = _ref[_i];
269
+ _results.push(node.expand());
270
+ }
271
+ return _results;
272
+ };
273
+
274
+ Tree.prototype.findLastNode = function (node) {
275
+ if (node.children.length > 0) {
276
+ return this.findLastNode(node.children[node.children.length - 1]);
277
+ } else {
278
+ return node;
279
+ }
280
+ };
281
+
282
+ Tree.prototype.loadRows = function(rows) {
283
+ var node, row, i;
284
+
285
+ if (rows != null) {
286
+ for (i = 0; i < rows.length; i++) {
287
+ row = $(rows[i]);
288
+
289
+ if (row.data(this.settings.nodeIdAttr) != null) {
290
+ node = new Node(row, this.tree, this.settings);
291
+ this.nodes.push(node);
292
+ this.tree[node.id] = node;
293
+
294
+ if (node.parentId != null && this.tree[node.parentId]) {
295
+ this.tree[node.parentId].addChild(node);
296
+ } else {
297
+ this.roots.push(node);
298
+ }
299
+ }
300
+ }
301
+ }
302
+
303
+ for (i = 0; i < this.nodes.length; i++) {
304
+ node = this.nodes[i].updateBranchLeafClass();
305
+ }
306
+
307
+ return this;
308
+ };
309
+
310
+ Tree.prototype.move = function(node, destination) {
311
+ // Conditions:
312
+ // 1: +node+ should not be inserted as a child of +node+ itself.
313
+ // 2: +destination+ should not be the same as +node+'s current parent (this
314
+ // prevents +node+ from being moved to the same location where it already
315
+ // is).
316
+ // 3: +node+ should not be inserted in a location in a branch if this would
317
+ // result in +node+ being an ancestor of itself.
318
+ var nodeParent = node.parentNode();
319
+ if (node !== destination && destination.id !== node.parentId && $.inArray(node, destination.ancestors()) === -1) {
320
+ node.setParent(destination);
321
+ this._moveRows(node, destination);
322
+
323
+ // Re-render parentNode if this is its first child node, and therefore
324
+ // doesn't have the expander yet.
325
+ if (node.parentNode().children.length === 1) {
326
+ node.parentNode().render();
327
+ }
328
+ }
329
+
330
+ if(nodeParent){
331
+ nodeParent.updateBranchLeafClass();
332
+ }
333
+ if(node.parentNode()){
334
+ node.parentNode().updateBranchLeafClass();
335
+ }
336
+ node.updateBranchLeafClass();
337
+ return this;
338
+ };
339
+
340
+ Tree.prototype.removeNode = function(node) {
341
+ // Recursively remove all descendants of +node+
342
+ this.unloadBranch(node);
343
+
344
+ // Remove node from DOM (<tr>)
345
+ node.row.remove();
346
+
347
+ // Remove node from parent children list
348
+ if (node.parentId != null) {
349
+ node.parentNode().removeChild(node);
350
+ }
351
+
352
+ // Clean up Tree object (so Node objects are GC-ed)
353
+ delete this.tree[node.id];
354
+ this.nodes.splice($.inArray(node, this.nodes), 1);
355
+
356
+ return this;
357
+ }
358
+
359
+ Tree.prototype.render = function() {
360
+ var root, _i, _len, _ref;
361
+ _ref = this.roots;
362
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
363
+ root = _ref[_i];
364
+
365
+ // Naming is confusing (show/render). I do not call render on node from
366
+ // here.
367
+ root.show();
368
+ }
369
+ return this;
370
+ };
371
+
372
+ Tree.prototype.sortBranch = function(node, sortFun) {
373
+ // First sort internal array of children
374
+ node.children.sort(sortFun);
375
+
376
+ // Next render rows in correct order on page
377
+ this._sortChildRows(node);
378
+
379
+ return this;
380
+ };
381
+
382
+ Tree.prototype.unloadBranch = function(node) {
383
+ // Use a copy of the children array to not have other functions interfere
384
+ // with this function if they manipulate the children array
385
+ // (eg removeNode).
386
+ var children = node.children.slice(0),
387
+ i;
388
+
389
+ for (i = 0; i < children.length; i++) {
390
+ this.removeNode(children[i]);
391
+ }
392
+
393
+ // Reset node's collection of children
394
+ node.children = [];
395
+
396
+ node.updateBranchLeafClass();
397
+
398
+ return this;
399
+ };
400
+
401
+ Tree.prototype._moveRows = function(node, destination) {
402
+ var children = node.children, i;
403
+
404
+ node.row.insertAfter(destination.row);
405
+ node.render();
406
+
407
+ // Loop backwards through children to have them end up on UI in correct
408
+ // order (see #112)
409
+ for (i = children.length - 1; i >= 0; i--) {
410
+ this._moveRows(children[i], node);
411
+ }
412
+ };
413
+
414
+ // Special _moveRows case, move children to itself to force sorting
415
+ Tree.prototype._sortChildRows = function(parentNode) {
416
+ return this._moveRows(parentNode, parentNode);
417
+ };
418
+
419
+ return Tree;
420
+ })();
421
+
422
+ // jQuery Plugin
423
+ methods = {
424
+ init: function(options, force) {
425
+ var settings;
426
+
427
+ settings = $.extend({
428
+ branchAttr: "ttBranch",
429
+ clickableNodeNames: false,
430
+ column: 0,
431
+ columnElType: "td", // i.e. 'td', 'th' or 'td,th'
432
+ expandable: false,
433
+ expanderTemplate: "<a href='#'>&nbsp;</a>",
434
+ indent: 19,
435
+ indenterTemplate: "<span class='indenter'></span>",
436
+ initialState: "collapsed",
437
+ nodeIdAttr: "ttId", // maps to data-tt-id
438
+ parentIdAttr: "ttParentId", // maps to data-tt-parent-id
439
+ stringExpand: "Expand",
440
+ stringCollapse: "Collapse",
441
+
442
+ // Events
443
+ onInitialized: null,
444
+ onNodeCollapse: null,
445
+ onNodeExpand: null,
446
+ onNodeInitialized: null
447
+ }, options);
448
+
449
+ return this.each(function() {
450
+ var el = $(this), tree;
451
+
452
+ if (force || el.data("treetable") === undefined) {
453
+ tree = new Tree(this, settings);
454
+ tree.loadRows(this.rows).render();
455
+
456
+ el.addClass("treetable").data("treetable", tree);
457
+
458
+ if (settings.onInitialized != null) {
459
+ settings.onInitialized.apply(tree);
460
+ }
461
+ }
462
+
463
+ return el;
464
+ });
465
+ },
466
+
467
+ destroy: function() {
468
+ return this.each(function() {
469
+ return $(this).removeData("treetable").removeClass("treetable");
470
+ });
471
+ },
472
+
473
+ collapseAll: function() {
474
+ this.data("treetable").collapseAll();
475
+ return this;
476
+ },
477
+
478
+ collapseNode: function(id) {
479
+ var node = this.data("treetable").tree[id];
480
+
481
+ if (node) {
482
+ node.collapse();
483
+ } else {
484
+ throw new Error("Unknown node '" + id + "'");
485
+ }
486
+
487
+ return this;
488
+ },
489
+
490
+ expandAll: function() {
491
+ this.data("treetable").expandAll();
492
+ return this;
493
+ },
494
+
495
+ expandNode: function(id) {
496
+ var node = this.data("treetable").tree[id];
497
+
498
+ if (node) {
499
+ if (!node.initialized) {
500
+ node._initialize();
501
+ }
502
+
503
+ node.expand();
504
+ } else {
505
+ throw new Error("Unknown node '" + id + "'");
506
+ }
507
+
508
+ return this;
509
+ },
510
+
511
+ loadBranch: function(node, rows) {
512
+ var settings = this.data("treetable").settings,
513
+ tree = this.data("treetable").tree;
514
+
515
+ // TODO Switch to $.parseHTML
516
+ rows = $(rows);
517
+
518
+ if (node == null) { // Inserting new root nodes
519
+ this.append(rows);
520
+ } else {
521
+ var lastNode = this.data("treetable").findLastNode(node);
522
+ rows.insertAfter(lastNode.row);
523
+ }
524
+
525
+ this.data("treetable").loadRows(rows);
526
+
527
+ // Make sure nodes are properly initialized
528
+ rows.filter("tr").each(function() {
529
+ tree[$(this).data(settings.nodeIdAttr)].show();
530
+ });
531
+
532
+ if (node != null) {
533
+ // Re-render parent to ensure expander icon is shown (#79)
534
+ node.render().expand();
535
+ }
536
+
537
+ return this;
538
+ },
539
+
540
+ move: function(nodeId, destinationId) {
541
+ var destination, node;
542
+
543
+ node = this.data("treetable").tree[nodeId];
544
+ destination = this.data("treetable").tree[destinationId];
545
+ this.data("treetable").move(node, destination);
546
+
547
+ return this;
548
+ },
549
+
550
+ node: function(id) {
551
+ return this.data("treetable").tree[id];
552
+ },
553
+
554
+ removeNode: function(id) {
555
+ var node = this.data("treetable").tree[id];
556
+
557
+ if (node) {
558
+ this.data("treetable").removeNode(node);
559
+ } else {
560
+ throw new Error("Unknown node '" + id + "'");
561
+ }
562
+
563
+ return this;
564
+ },
565
+
566
+ reveal: function(id) {
567
+ var node = this.data("treetable").tree[id];
568
+
569
+ if (node) {
570
+ node.reveal();
571
+ } else {
572
+ throw new Error("Unknown node '" + id + "'");
573
+ }
574
+
575
+ return this;
576
+ },
577
+
578
+ sortBranch: function(node, columnOrFunction) {
579
+ var settings = this.data("treetable").settings,
580
+ prepValue,
581
+ sortFun;
582
+
583
+ columnOrFunction = columnOrFunction || settings.column;
584
+ sortFun = columnOrFunction;
585
+
586
+ if ($.isNumeric(columnOrFunction)) {
587
+ sortFun = function(a, b) {
588
+ var extractValue, valA, valB;
589
+
590
+ extractValue = function(node) {
591
+ var val = node.row.find("td:eq(" + columnOrFunction + ")").text();
592
+ // Ignore trailing/leading whitespace and use uppercase values for
593
+ // case insensitive ordering
594
+ return $.trim(val).toUpperCase();
595
+ }
596
+
597
+ valA = extractValue(a);
598
+ valB = extractValue(b);
599
+
600
+ if (valA < valB) return -1;
601
+ if (valA > valB) return 1;
602
+ return 0;
603
+ };
604
+ }
605
+
606
+ this.data("treetable").sortBranch(node, sortFun);
607
+ return this;
608
+ },
609
+
610
+ unloadBranch: function(node) {
611
+ this.data("treetable").unloadBranch(node);
612
+ return this;
613
+ }
614
+ };
615
+
616
+ $.fn.treetable = function(method) {
617
+ if (methods[method]) {
618
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
619
+ } else if (typeof method === 'object' || !method) {
620
+ return methods.init.apply(this, arguments);
621
+ } else {
622
+ return $.error("Method " + method + " does not exist on jQuery.treetable");
623
+ }
624
+ };
625
+
626
+ // Expose classes to world
627
+ this.TreeTable || (this.TreeTable = {});
628
+ this.TreeTable.Node = Node;
629
+ this.TreeTable.Tree = Tree;
630
+ })(jQuery);
631
+ /* ========================================================================
632
+ * Bootstrap: affix.js v3.4.1
633
+ * https://getbootstrap.com/docs/3.4/javascript/#affix
634
+ * ========================================================================
635
+ * Copyright 2011-2019 Twitter, Inc.
636
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
637
+ * ======================================================================== */
638
+
639
+
640
+
641
+ +function ($) {
642
+ 'use strict';
643
+
644
+ // AFFIX CLASS DEFINITION
645
+ // ======================
646
+
647
+ var Affix = function (element, options) {
648
+ this.options = $.extend({}, Affix.DEFAULTS, options)
649
+
650
+ var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target)
651
+
652
+ this.$target = target
653
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
654
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
655
+
656
+ this.$element = $(element)
657
+ this.affixed = null
658
+ this.unpin = null
659
+ this.pinnedOffset = null
660
+
661
+ this.checkPosition()
662
+ }
663
+
664
+ Affix.VERSION = '3.4.1'
665
+
666
+ Affix.RESET = 'affix affix-top affix-bottom'
667
+
668
+ Affix.DEFAULTS = {
669
+ offset: 0,
670
+ target: window
671
+ }
672
+
673
+ Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
674
+ var scrollTop = this.$target.scrollTop()
675
+ var position = this.$element.offset()
676
+ var targetHeight = this.$target.height()
677
+
678
+ if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
679
+
680
+ if (this.affixed == 'bottom') {
681
+ if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
682
+ return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
683
+ }
684
+
685
+ var initializing = this.affixed == null
686
+ var colliderTop = initializing ? scrollTop : position.top
687
+ var colliderHeight = initializing ? targetHeight : height
688
+
689
+ if (offsetTop != null && scrollTop <= offsetTop) return 'top'
690
+ if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
691
+
692
+ return false
693
+ }
694
+
695
+ Affix.prototype.getPinnedOffset = function () {
696
+ if (this.pinnedOffset) return this.pinnedOffset
697
+ this.$element.removeClass(Affix.RESET).addClass('affix')
698
+ var scrollTop = this.$target.scrollTop()
699
+ var position = this.$element.offset()
700
+ return (this.pinnedOffset = position.top - scrollTop)
701
+ }
702
+
703
+ Affix.prototype.checkPositionWithEventLoop = function () {
704
+ setTimeout($.proxy(this.checkPosition, this), 1)
705
+ }
706
+
707
+ Affix.prototype.checkPosition = function () {
708
+ if (!this.$element.is(':visible')) return
709
+
710
+ var height = this.$element.height()
711
+ var offset = this.options.offset
712
+ var offsetTop = offset.top
713
+ var offsetBottom = offset.bottom
714
+ var scrollHeight = Math.max($(document).height(), $(document.body).height())
715
+
716
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
717
+ if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
718
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
719
+
720
+ var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
721
+
722
+ if (this.affixed != affix) {
723
+ if (this.unpin != null) this.$element.css('top', '')
724
+
725
+ var affixType = 'affix' + (affix ? '-' + affix : '')
726
+ var e = $.Event(affixType + '.bs.affix')
727
+
728
+ this.$element.trigger(e)
729
+
730
+ if (e.isDefaultPrevented()) return
731
+
732
+ this.affixed = affix
733
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
734
+
735
+ this.$element
736
+ .removeClass(Affix.RESET)
737
+ .addClass(affixType)
738
+ .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
739
+ }
740
+
741
+ if (affix == 'bottom') {
742
+ this.$element.offset({
743
+ top: scrollHeight - height - offsetBottom
744
+ })
745
+ }
746
+ }
747
+
748
+
749
+ // AFFIX PLUGIN DEFINITION
750
+ // =======================
751
+
752
+ function Plugin(option) {
753
+ return this.each(function () {
754
+ var $this = $(this)
755
+ var data = $this.data('bs.affix')
756
+ var options = typeof option == 'object' && option
757
+
758
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
759
+ if (typeof option == 'string') data[option]()
760
+ })
761
+ }
762
+
763
+ var old = $.fn.affix
764
+
765
+ $.fn.affix = Plugin
766
+ $.fn.affix.Constructor = Affix
767
+
768
+
769
+ // AFFIX NO CONFLICT
770
+ // =================
771
+
772
+ $.fn.affix.noConflict = function () {
773
+ $.fn.affix = old
774
+ return this
775
+ }
776
+
777
+
778
+ // AFFIX DATA-API
779
+ // ==============
780
+
781
+ $(window).on('load', function () {
782
+ $('[data-spy="affix"]').each(function () {
783
+ var $spy = $(this)
784
+ var data = $spy.data()
785
+
786
+ data.offset = data.offset || {}
787
+
788
+ if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
789
+ if (data.offsetTop != null) data.offset.top = data.offsetTop
790
+
791
+ Plugin.call($spy, data)
792
+ })
793
+ })
794
+
795
+ }(jQuery);
796
+ /* ========================================================================
797
+ * Bootstrap: alert.js v3.4.1
798
+ * https://getbootstrap.com/docs/3.4/javascript/#alerts
799
+ * ========================================================================
800
+ * Copyright 2011-2019 Twitter, Inc.
801
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
802
+ * ======================================================================== */
803
+
804
+
805
+
806
+ +function ($) {
807
+ 'use strict';
808
+
809
+ // ALERT CLASS DEFINITION
810
+ // ======================
811
+
812
+ var dismiss = '[data-dismiss="alert"]'
813
+ var Alert = function (el) {
814
+ $(el).on('click', dismiss, this.close)
815
+ }
816
+
817
+ Alert.VERSION = '3.4.1'
818
+
819
+ Alert.TRANSITION_DURATION = 150
820
+
821
+ Alert.prototype.close = function (e) {
822
+ var $this = $(this)
823
+ var selector = $this.attr('data-target')
824
+
825
+ if (!selector) {
826
+ selector = $this.attr('href')
827
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
828
+ }
829
+
830
+ selector = selector === '#' ? [] : selector
831
+ var $parent = $(document).find(selector)
832
+
833
+ if (e) e.preventDefault()
834
+
835
+ if (!$parent.length) {
836
+ $parent = $this.closest('.alert')
837
+ }
838
+
839
+ $parent.trigger(e = $.Event('close.bs.alert'))
840
+
841
+ if (e.isDefaultPrevented()) return
842
+
843
+ $parent.removeClass('in')
844
+
845
+ function removeElement() {
846
+ // detach from parent, fire event then clean up data
847
+ $parent.detach().trigger('closed.bs.alert').remove()
848
+ }
849
+
850
+ $.support.transition && $parent.hasClass('fade') ?
851
+ $parent
852
+ .one('bsTransitionEnd', removeElement)
853
+ .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
854
+ removeElement()
855
+ }
856
+
857
+
858
+ // ALERT PLUGIN DEFINITION
859
+ // =======================
860
+
861
+ function Plugin(option) {
862
+ return this.each(function () {
863
+ var $this = $(this)
864
+ var data = $this.data('bs.alert')
865
+
866
+ if (!data) $this.data('bs.alert', (data = new Alert(this)))
867
+ if (typeof option == 'string') data[option].call($this)
868
+ })
869
+ }
870
+
871
+ var old = $.fn.alert
872
+
873
+ $.fn.alert = Plugin
874
+ $.fn.alert.Constructor = Alert
875
+
876
+
877
+ // ALERT NO CONFLICT
878
+ // =================
879
+
880
+ $.fn.alert.noConflict = function () {
881
+ $.fn.alert = old
882
+ return this
883
+ }
884
+
885
+
886
+ // ALERT DATA-API
887
+ // ==============
888
+
889
+ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
890
+
891
+ }(jQuery);
892
+ /* ========================================================================
893
+ * Bootstrap: button.js v3.4.1
894
+ * https://getbootstrap.com/docs/3.4/javascript/#buttons
895
+ * ========================================================================
896
+ * Copyright 2011-2019 Twitter, Inc.
897
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
898
+ * ======================================================================== */
899
+
900
+
901
+
902
+ +function ($) {
903
+ 'use strict';
904
+
905
+ // BUTTON PUBLIC CLASS DEFINITION
906
+ // ==============================
907
+
908
+ var Button = function (element, options) {
909
+ this.$element = $(element)
910
+ this.options = $.extend({}, Button.DEFAULTS, options)
911
+ this.isLoading = false
912
+ }
913
+
914
+ Button.VERSION = '3.4.1'
915
+
916
+ Button.DEFAULTS = {
917
+ loadingText: 'loading...'
918
+ }
919
+
920
+ Button.prototype.setState = function (state) {
921
+ var d = 'disabled'
922
+ var $el = this.$element
923
+ var val = $el.is('input') ? 'val' : 'html'
924
+ var data = $el.data()
925
+
926
+ state += 'Text'
927
+
928
+ if (data.resetText == null) $el.data('resetText', $el[val]())
929
+
930
+ // push to event loop to allow forms to submit
931
+ setTimeout($.proxy(function () {
932
+ $el[val](data[state] == null ? this.options[state] : data[state])
933
+
934
+ if (state == 'loadingText') {
935
+ this.isLoading = true
936
+ $el.addClass(d).attr(d, d).prop(d, true)
937
+ } else if (this.isLoading) {
938
+ this.isLoading = false
939
+ $el.removeClass(d).removeAttr(d).prop(d, false)
940
+ }
941
+ }, this), 0)
942
+ }
943
+
944
+ Button.prototype.toggle = function () {
945
+ var changed = true
946
+ var $parent = this.$element.closest('[data-toggle="buttons"]')
947
+
948
+ if ($parent.length) {
949
+ var $input = this.$element.find('input')
950
+ if ($input.prop('type') == 'radio') {
951
+ if ($input.prop('checked')) changed = false
952
+ $parent.find('.active').removeClass('active')
953
+ this.$element.addClass('active')
954
+ } else if ($input.prop('type') == 'checkbox') {
955
+ if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
956
+ this.$element.toggleClass('active')
957
+ }
958
+ $input.prop('checked', this.$element.hasClass('active'))
959
+ if (changed) $input.trigger('change')
960
+ } else {
961
+ this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
962
+ this.$element.toggleClass('active')
963
+ }
964
+ }
965
+
966
+
967
+ // BUTTON PLUGIN DEFINITION
968
+ // ========================
969
+
970
+ function Plugin(option) {
971
+ return this.each(function () {
972
+ var $this = $(this)
973
+ var data = $this.data('bs.button')
974
+ var options = typeof option == 'object' && option
975
+
976
+ if (!data) $this.data('bs.button', (data = new Button(this, options)))
977
+
978
+ if (option == 'toggle') data.toggle()
979
+ else if (option) data.setState(option)
980
+ })
981
+ }
982
+
983
+ var old = $.fn.button
984
+
985
+ $.fn.button = Plugin
986
+ $.fn.button.Constructor = Button
987
+
988
+
989
+ // BUTTON NO CONFLICT
990
+ // ==================
991
+
992
+ $.fn.button.noConflict = function () {
993
+ $.fn.button = old
994
+ return this
995
+ }
996
+
997
+
998
+ // BUTTON DATA-API
999
+ // ===============
1000
+
1001
+ $(document)
1002
+ .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
1003
+ var $btn = $(e.target).closest('.btn')
1004
+ Plugin.call($btn, 'toggle')
1005
+ if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
1006
+ // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
1007
+ e.preventDefault()
1008
+ // The target component still receive the focus
1009
+ if ($btn.is('input,button')) $btn.trigger('focus')
1010
+ else $btn.find('input:visible,button:visible').first().trigger('focus')
1011
+ }
1012
+ })
1013
+ .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
1014
+ $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
1015
+ })
1016
+
1017
+ }(jQuery);
1018
+ /* ========================================================================
1019
+ * Bootstrap: carousel.js v3.4.1
1020
+ * https://getbootstrap.com/docs/3.4/javascript/#carousel
1021
+ * ========================================================================
1022
+ * Copyright 2011-2019 Twitter, Inc.
1023
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1024
+ * ======================================================================== */
1025
+
1026
+
1027
+
1028
+ +function ($) {
1029
+ 'use strict';
1030
+
1031
+ // CAROUSEL CLASS DEFINITION
1032
+ // =========================
1033
+
1034
+ var Carousel = function (element, options) {
1035
+ this.$element = $(element)
1036
+ this.$indicators = this.$element.find('.carousel-indicators')
1037
+ this.options = options
1038
+ this.paused = null
1039
+ this.sliding = null
1040
+ this.interval = null
1041
+ this.$active = null
1042
+ this.$items = null
1043
+
1044
+ this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
1045
+
1046
+ this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
1047
+ .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
1048
+ .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
1049
+ }
1050
+
1051
+ Carousel.VERSION = '3.4.1'
1052
+
1053
+ Carousel.TRANSITION_DURATION = 600
1054
+
1055
+ Carousel.DEFAULTS = {
1056
+ interval: 5000,
1057
+ pause: 'hover',
1058
+ wrap: true,
1059
+ keyboard: true
1060
+ }
1061
+
1062
+ Carousel.prototype.keydown = function (e) {
1063
+ if (/input|textarea/i.test(e.target.tagName)) return
1064
+ switch (e.which) {
1065
+ case 37: this.prev(); break
1066
+ case 39: this.next(); break
1067
+ default: return
1068
+ }
1069
+
1070
+ e.preventDefault()
1071
+ }
1072
+
1073
+ Carousel.prototype.cycle = function (e) {
1074
+ e || (this.paused = false)
1075
+
1076
+ this.interval && clearInterval(this.interval)
1077
+
1078
+ this.options.interval
1079
+ && !this.paused
1080
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
1081
+
1082
+ return this
1083
+ }
1084
+
1085
+ Carousel.prototype.getItemIndex = function (item) {
1086
+ this.$items = item.parent().children('.item')
1087
+ return this.$items.index(item || this.$active)
1088
+ }
1089
+
1090
+ Carousel.prototype.getItemForDirection = function (direction, active) {
1091
+ var activeIndex = this.getItemIndex(active)
1092
+ var willWrap = (direction == 'prev' && activeIndex === 0)
1093
+ || (direction == 'next' && activeIndex == (this.$items.length - 1))
1094
+ if (willWrap && !this.options.wrap) return active
1095
+ var delta = direction == 'prev' ? -1 : 1
1096
+ var itemIndex = (activeIndex + delta) % this.$items.length
1097
+ return this.$items.eq(itemIndex)
1098
+ }
1099
+
1100
+ Carousel.prototype.to = function (pos) {
1101
+ var that = this
1102
+ var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
1103
+
1104
+ if (pos > (this.$items.length - 1) || pos < 0) return
1105
+
1106
+ if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
1107
+ if (activeIndex == pos) return this.pause().cycle()
1108
+
1109
+ return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
1110
+ }
1111
+
1112
+ Carousel.prototype.pause = function (e) {
1113
+ e || (this.paused = true)
1114
+
1115
+ if (this.$element.find('.next, .prev').length && $.support.transition) {
1116
+ this.$element.trigger($.support.transition.end)
1117
+ this.cycle(true)
1118
+ }
1119
+
1120
+ this.interval = clearInterval(this.interval)
1121
+
1122
+ return this
1123
+ }
1124
+
1125
+ Carousel.prototype.next = function () {
1126
+ if (this.sliding) return
1127
+ return this.slide('next')
1128
+ }
1129
+
1130
+ Carousel.prototype.prev = function () {
1131
+ if (this.sliding) return
1132
+ return this.slide('prev')
1133
+ }
1134
+
1135
+ Carousel.prototype.slide = function (type, next) {
1136
+ var $active = this.$element.find('.item.active')
1137
+ var $next = next || this.getItemForDirection(type, $active)
1138
+ var isCycling = this.interval
1139
+ var direction = type == 'next' ? 'left' : 'right'
1140
+ var that = this
1141
+
1142
+ if ($next.hasClass('active')) return (this.sliding = false)
1143
+
1144
+ var relatedTarget = $next[0]
1145
+ var slideEvent = $.Event('slide.bs.carousel', {
1146
+ relatedTarget: relatedTarget,
1147
+ direction: direction
1148
+ })
1149
+ this.$element.trigger(slideEvent)
1150
+ if (slideEvent.isDefaultPrevented()) return
1151
+
1152
+ this.sliding = true
1153
+
1154
+ isCycling && this.pause()
1155
+
1156
+ if (this.$indicators.length) {
1157
+ this.$indicators.find('.active').removeClass('active')
1158
+ var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
1159
+ $nextIndicator && $nextIndicator.addClass('active')
1160
+ }
1161
+
1162
+ var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
1163
+ if ($.support.transition && this.$element.hasClass('slide')) {
1164
+ $next.addClass(type)
1165
+ if (typeof $next === 'object' && $next.length) {
1166
+ $next[0].offsetWidth // force reflow
1167
+ }
1168
+ $active.addClass(direction)
1169
+ $next.addClass(direction)
1170
+ $active
1171
+ .one('bsTransitionEnd', function () {
1172
+ $next.removeClass([type, direction].join(' ')).addClass('active')
1173
+ $active.removeClass(['active', direction].join(' '))
1174
+ that.sliding = false
1175
+ setTimeout(function () {
1176
+ that.$element.trigger(slidEvent)
1177
+ }, 0)
1178
+ })
1179
+ .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
1180
+ } else {
1181
+ $active.removeClass('active')
1182
+ $next.addClass('active')
1183
+ this.sliding = false
1184
+ this.$element.trigger(slidEvent)
1185
+ }
1186
+
1187
+ isCycling && this.cycle()
1188
+
1189
+ return this
1190
+ }
1191
+
1192
+
1193
+ // CAROUSEL PLUGIN DEFINITION
1194
+ // ==========================
1195
+
1196
+ function Plugin(option) {
1197
+ return this.each(function () {
1198
+ var $this = $(this)
1199
+ var data = $this.data('bs.carousel')
1200
+ var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
1201
+ var action = typeof option == 'string' ? option : options.slide
1202
+
1203
+ if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
1204
+ if (typeof option == 'number') data.to(option)
1205
+ else if (action) data[action]()
1206
+ else if (options.interval) data.pause().cycle()
1207
+ })
1208
+ }
1209
+
1210
+ var old = $.fn.carousel
1211
+
1212
+ $.fn.carousel = Plugin
1213
+ $.fn.carousel.Constructor = Carousel
1214
+
1215
+
1216
+ // CAROUSEL NO CONFLICT
1217
+ // ====================
1218
+
1219
+ $.fn.carousel.noConflict = function () {
1220
+ $.fn.carousel = old
1221
+ return this
1222
+ }
1223
+
1224
+
1225
+ // CAROUSEL DATA-API
1226
+ // =================
1227
+
1228
+ var clickHandler = function (e) {
1229
+ var $this = $(this)
1230
+ var href = $this.attr('href')
1231
+ if (href) {
1232
+ href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
1233
+ }
1234
+
1235
+ var target = $this.attr('data-target') || href
1236
+ var $target = $(document).find(target)
1237
+
1238
+ if (!$target.hasClass('carousel')) return
1239
+
1240
+ var options = $.extend({}, $target.data(), $this.data())
1241
+ var slideIndex = $this.attr('data-slide-to')
1242
+ if (slideIndex) options.interval = false
1243
+
1244
+ Plugin.call($target, options)
1245
+
1246
+ if (slideIndex) {
1247
+ $target.data('bs.carousel').to(slideIndex)
1248
+ }
1249
+
1250
+ e.preventDefault()
1251
+ }
1252
+
1253
+ $(document)
1254
+ .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
1255
+ .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
1256
+
1257
+ $(window).on('load', function () {
1258
+ $('[data-ride="carousel"]').each(function () {
1259
+ var $carousel = $(this)
1260
+ Plugin.call($carousel, $carousel.data())
1261
+ })
1262
+ })
1263
+
1264
+ }(jQuery);
1265
+ /* ========================================================================
1266
+ * Bootstrap: collapse.js v3.4.1
1267
+ * https://getbootstrap.com/docs/3.4/javascript/#collapse
1268
+ * ========================================================================
1269
+ * Copyright 2011-2019 Twitter, Inc.
1270
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1271
+ * ======================================================================== */
1272
+
1273
+ /* jshint latedef: false */
1274
+
1275
+
1276
+ +function ($) {
1277
+ 'use strict';
1278
+
1279
+ // COLLAPSE PUBLIC CLASS DEFINITION
1280
+ // ================================
1281
+
1282
+ var Collapse = function (element, options) {
1283
+ this.$element = $(element)
1284
+ this.options = $.extend({}, Collapse.DEFAULTS, options)
1285
+ this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
1286
+ '[data-toggle="collapse"][data-target="#' + element.id + '"]')
1287
+ this.transitioning = null
1288
+
1289
+ if (this.options.parent) {
1290
+ this.$parent = this.getParent()
1291
+ } else {
1292
+ this.addAriaAndCollapsedClass(this.$element, this.$trigger)
1293
+ }
1294
+
1295
+ if (this.options.toggle) this.toggle()
1296
+ }
1297
+
1298
+ Collapse.VERSION = '3.4.1'
1299
+
1300
+ Collapse.TRANSITION_DURATION = 350
1301
+
1302
+ Collapse.DEFAULTS = {
1303
+ toggle: true
1304
+ }
1305
+
1306
+ Collapse.prototype.dimension = function () {
1307
+ var hasWidth = this.$element.hasClass('width')
1308
+ return hasWidth ? 'width' : 'height'
1309
+ }
1310
+
1311
+ Collapse.prototype.show = function () {
1312
+ if (this.transitioning || this.$element.hasClass('in')) return
1313
+
1314
+ var activesData
1315
+ var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
1316
+
1317
+ if (actives && actives.length) {
1318
+ activesData = actives.data('bs.collapse')
1319
+ if (activesData && activesData.transitioning) return
1320
+ }
1321
+
1322
+ var startEvent = $.Event('show.bs.collapse')
1323
+ this.$element.trigger(startEvent)
1324
+ if (startEvent.isDefaultPrevented()) return
1325
+
1326
+ if (actives && actives.length) {
1327
+ Plugin.call(actives, 'hide')
1328
+ activesData || actives.data('bs.collapse', null)
1329
+ }
1330
+
1331
+ var dimension = this.dimension()
1332
+
1333
+ this.$element
1334
+ .removeClass('collapse')
1335
+ .addClass('collapsing')[dimension](0)
1336
+ .attr('aria-expanded', true)
1337
+
1338
+ this.$trigger
1339
+ .removeClass('collapsed')
1340
+ .attr('aria-expanded', true)
1341
+
1342
+ this.transitioning = 1
1343
+
1344
+ var complete = function () {
1345
+ this.$element
1346
+ .removeClass('collapsing')
1347
+ .addClass('collapse in')[dimension]('')
1348
+ this.transitioning = 0
1349
+ this.$element
1350
+ .trigger('shown.bs.collapse')
1351
+ }
1352
+
1353
+ if (!$.support.transition) return complete.call(this)
1354
+
1355
+ var scrollSize = $.camelCase(['scroll', dimension].join('-'))
1356
+
1357
+ this.$element
1358
+ .one('bsTransitionEnd', $.proxy(complete, this))
1359
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
1360
+ }
1361
+
1362
+ Collapse.prototype.hide = function () {
1363
+ if (this.transitioning || !this.$element.hasClass('in')) return
1364
+
1365
+ var startEvent = $.Event('hide.bs.collapse')
1366
+ this.$element.trigger(startEvent)
1367
+ if (startEvent.isDefaultPrevented()) return
1368
+
1369
+ var dimension = this.dimension()
1370
+
1371
+ this.$element[dimension](this.$element[dimension]())[0].offsetHeight
1372
+
1373
+ this.$element
1374
+ .addClass('collapsing')
1375
+ .removeClass('collapse in')
1376
+ .attr('aria-expanded', false)
1377
+
1378
+ this.$trigger
1379
+ .addClass('collapsed')
1380
+ .attr('aria-expanded', false)
1381
+
1382
+ this.transitioning = 1
1383
+
1384
+ var complete = function () {
1385
+ this.transitioning = 0
1386
+ this.$element
1387
+ .removeClass('collapsing')
1388
+ .addClass('collapse')
1389
+ .trigger('hidden.bs.collapse')
1390
+ }
1391
+
1392
+ if (!$.support.transition) return complete.call(this)
1393
+
1394
+ this.$element
1395
+ [dimension](0)
1396
+ .one('bsTransitionEnd', $.proxy(complete, this))
1397
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
1398
+ }
1399
+
1400
+ Collapse.prototype.toggle = function () {
1401
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
1402
+ }
1403
+
1404
+ Collapse.prototype.getParent = function () {
1405
+ return $(document).find(this.options.parent)
1406
+ .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
1407
+ .each($.proxy(function (i, element) {
1408
+ var $element = $(element)
1409
+ this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
1410
+ }, this))
1411
+ .end()
1412
+ }
1413
+
1414
+ Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
1415
+ var isOpen = $element.hasClass('in')
1416
+
1417
+ $element.attr('aria-expanded', isOpen)
1418
+ $trigger
1419
+ .toggleClass('collapsed', !isOpen)
1420
+ .attr('aria-expanded', isOpen)
1421
+ }
1422
+
1423
+ function getTargetFromTrigger($trigger) {
1424
+ var href
1425
+ var target = $trigger.attr('data-target')
1426
+ || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
1427
+
1428
+ return $(document).find(target)
1429
+ }
1430
+
1431
+
1432
+ // COLLAPSE PLUGIN DEFINITION
1433
+ // ==========================
1434
+
1435
+ function Plugin(option) {
1436
+ return this.each(function () {
1437
+ var $this = $(this)
1438
+ var data = $this.data('bs.collapse')
1439
+ var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
1440
+
1441
+ if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
1442
+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
1443
+ if (typeof option == 'string') data[option]()
1444
+ })
1445
+ }
1446
+
1447
+ var old = $.fn.collapse
1448
+
1449
+ $.fn.collapse = Plugin
1450
+ $.fn.collapse.Constructor = Collapse
1451
+
1452
+
1453
+ // COLLAPSE NO CONFLICT
1454
+ // ====================
1455
+
1456
+ $.fn.collapse.noConflict = function () {
1457
+ $.fn.collapse = old
1458
+ return this
1459
+ }
1460
+
1461
+
1462
+ // COLLAPSE DATA-API
1463
+ // =================
1464
+
1465
+ $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
1466
+ var $this = $(this)
1467
+
1468
+ if (!$this.attr('data-target')) e.preventDefault()
1469
+
1470
+ var $target = getTargetFromTrigger($this)
1471
+ var data = $target.data('bs.collapse')
1472
+ var option = data ? 'toggle' : $this.data()
1473
+
1474
+ Plugin.call($target, option)
1475
+ })
1476
+
1477
+ }(jQuery);
1478
+ /* ========================================================================
1479
+ * Bootstrap: dropdown.js v3.4.1
1480
+ * https://getbootstrap.com/docs/3.4/javascript/#dropdowns
1481
+ * ========================================================================
1482
+ * Copyright 2011-2019 Twitter, Inc.
1483
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1484
+ * ======================================================================== */
1485
+
1486
+
1487
+
1488
+ +function ($) {
1489
+ 'use strict';
1490
+
1491
+ // DROPDOWN CLASS DEFINITION
1492
+ // =========================
1493
+
1494
+ var backdrop = '.dropdown-backdrop'
1495
+ var toggle = '[data-toggle="dropdown"]'
1496
+ var Dropdown = function (element) {
1497
+ $(element).on('click.bs.dropdown', this.toggle)
1498
+ }
1499
+
1500
+ Dropdown.VERSION = '3.4.1'
1501
+
1502
+ function getParent($this) {
1503
+ var selector = $this.attr('data-target')
1504
+
1505
+ if (!selector) {
1506
+ selector = $this.attr('href')
1507
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
1508
+ }
1509
+
1510
+ var $parent = selector !== '#' ? $(document).find(selector) : null
1511
+
1512
+ return $parent && $parent.length ? $parent : $this.parent()
1513
+ }
1514
+
1515
+ function clearMenus(e) {
1516
+ if (e && e.which === 3) return
1517
+ $(backdrop).remove()
1518
+ $(toggle).each(function () {
1519
+ var $this = $(this)
1520
+ var $parent = getParent($this)
1521
+ var relatedTarget = { relatedTarget: this }
1522
+
1523
+ if (!$parent.hasClass('open')) return
1524
+
1525
+ if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
1526
+
1527
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
1528
+
1529
+ if (e.isDefaultPrevented()) return
1530
+
1531
+ $this.attr('aria-expanded', 'false')
1532
+ $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
1533
+ })
1534
+ }
1535
+
1536
+ Dropdown.prototype.toggle = function (e) {
1537
+ var $this = $(this)
1538
+
1539
+ if ($this.is('.disabled, :disabled')) return
1540
+
1541
+ var $parent = getParent($this)
1542
+ var isActive = $parent.hasClass('open')
1543
+
1544
+ clearMenus()
1545
+
1546
+ if (!isActive) {
1547
+ if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
1548
+ // if mobile we use a backdrop because click events don't delegate
1549
+ $(document.createElement('div'))
1550
+ .addClass('dropdown-backdrop')
1551
+ .insertAfter($(this))
1552
+ .on('click', clearMenus)
1553
+ }
1554
+
1555
+ var relatedTarget = { relatedTarget: this }
1556
+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
1557
+
1558
+ if (e.isDefaultPrevented()) return
1559
+
1560
+ $this
1561
+ .trigger('focus')
1562
+ .attr('aria-expanded', 'true')
1563
+
1564
+ $parent
1565
+ .toggleClass('open')
1566
+ .trigger($.Event('shown.bs.dropdown', relatedTarget))
1567
+ }
1568
+
1569
+ return false
1570
+ }
1571
+
1572
+ Dropdown.prototype.keydown = function (e) {
1573
+ if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
1574
+
1575
+ var $this = $(this)
1576
+
1577
+ e.preventDefault()
1578
+ e.stopPropagation()
1579
+
1580
+ if ($this.is('.disabled, :disabled')) return
1581
+
1582
+ var $parent = getParent($this)
1583
+ var isActive = $parent.hasClass('open')
1584
+
1585
+ if (!isActive && e.which != 27 || isActive && e.which == 27) {
1586
+ if (e.which == 27) $parent.find(toggle).trigger('focus')
1587
+ return $this.trigger('click')
1588
+ }
1589
+
1590
+ var desc = ' li:not(.disabled):visible a'
1591
+ var $items = $parent.find('.dropdown-menu' + desc)
1592
+
1593
+ if (!$items.length) return
1594
+
1595
+ var index = $items.index(e.target)
1596
+
1597
+ if (e.which == 38 && index > 0) index-- // up
1598
+ if (e.which == 40 && index < $items.length - 1) index++ // down
1599
+ if (!~index) index = 0
1600
+
1601
+ $items.eq(index).trigger('focus')
1602
+ }
1603
+
1604
+
1605
+ // DROPDOWN PLUGIN DEFINITION
1606
+ // ==========================
1607
+
1608
+ function Plugin(option) {
1609
+ return this.each(function () {
1610
+ var $this = $(this)
1611
+ var data = $this.data('bs.dropdown')
1612
+
1613
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
1614
+ if (typeof option == 'string') data[option].call($this)
1615
+ })
1616
+ }
1617
+
1618
+ var old = $.fn.dropdown
1619
+
1620
+ $.fn.dropdown = Plugin
1621
+ $.fn.dropdown.Constructor = Dropdown
1622
+
1623
+
1624
+ // DROPDOWN NO CONFLICT
1625
+ // ====================
1626
+
1627
+ $.fn.dropdown.noConflict = function () {
1628
+ $.fn.dropdown = old
1629
+ return this
1630
+ }
1631
+
1632
+
1633
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
1634
+ // ===================================
1635
+
1636
+ $(document)
1637
+ .on('click.bs.dropdown.data-api', clearMenus)
1638
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
1639
+ .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
1640
+ .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
1641
+ .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
1642
+
1643
+ }(jQuery);
1644
+ /* ========================================================================
1645
+ * Bootstrap: modal.js v3.4.1
1646
+ * https://getbootstrap.com/docs/3.4/javascript/#modals
1647
+ * ========================================================================
1648
+ * Copyright 2011-2019 Twitter, Inc.
1649
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1650
+ * ======================================================================== */
1651
+
1652
+
1653
+
1654
+ +function ($) {
1655
+ 'use strict';
1656
+
1657
+ // MODAL CLASS DEFINITION
1658
+ // ======================
1659
+
1660
+ var Modal = function (element, options) {
1661
+ this.options = options
1662
+ this.$body = $(document.body)
1663
+ this.$element = $(element)
1664
+ this.$dialog = this.$element.find('.modal-dialog')
1665
+ this.$backdrop = null
1666
+ this.isShown = null
1667
+ this.originalBodyPad = null
1668
+ this.scrollbarWidth = 0
1669
+ this.ignoreBackdropClick = false
1670
+ this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom'
1671
+
1672
+ if (this.options.remote) {
1673
+ this.$element
1674
+ .find('.modal-content')
1675
+ .load(this.options.remote, $.proxy(function () {
1676
+ this.$element.trigger('loaded.bs.modal')
1677
+ }, this))
1678
+ }
1679
+ }
1680
+
1681
+ Modal.VERSION = '3.4.1'
1682
+
1683
+ Modal.TRANSITION_DURATION = 300
1684
+ Modal.BACKDROP_TRANSITION_DURATION = 150
1685
+
1686
+ Modal.DEFAULTS = {
1687
+ backdrop: true,
1688
+ keyboard: true,
1689
+ show: true
1690
+ }
1691
+
1692
+ Modal.prototype.toggle = function (_relatedTarget) {
1693
+ return this.isShown ? this.hide() : this.show(_relatedTarget)
1694
+ }
1695
+
1696
+ Modal.prototype.show = function (_relatedTarget) {
1697
+ var that = this
1698
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
1699
+
1700
+ this.$element.trigger(e)
1701
+
1702
+ if (this.isShown || e.isDefaultPrevented()) return
1703
+
1704
+ this.isShown = true
1705
+
1706
+ this.checkScrollbar()
1707
+ this.setScrollbar()
1708
+ this.$body.addClass('modal-open')
1709
+
1710
+ this.escape()
1711
+ this.resize()
1712
+
1713
+ this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
1714
+
1715
+ this.$dialog.on('mousedown.dismiss.bs.modal', function () {
1716
+ that.$element.one('mouseup.dismiss.bs.modal', function (e) {
1717
+ if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
1718
+ })
1719
+ })
1720
+
1721
+ this.backdrop(function () {
1722
+ var transition = $.support.transition && that.$element.hasClass('fade')
1723
+
1724
+ if (!that.$element.parent().length) {
1725
+ that.$element.appendTo(that.$body) // don't move modals dom position
1726
+ }
1727
+
1728
+ that.$element
1729
+ .show()
1730
+ .scrollTop(0)
1731
+
1732
+ that.adjustDialog()
1733
+
1734
+ if (transition) {
1735
+ that.$element[0].offsetWidth // force reflow
1736
+ }
1737
+
1738
+ that.$element.addClass('in')
1739
+
1740
+ that.enforceFocus()
1741
+
1742
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
1743
+
1744
+ transition ?
1745
+ that.$dialog // wait for modal to slide in
1746
+ .one('bsTransitionEnd', function () {
1747
+ that.$element.trigger('focus').trigger(e)
1748
+ })
1749
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
1750
+ that.$element.trigger('focus').trigger(e)
1751
+ })
1752
+ }
1753
+
1754
+ Modal.prototype.hide = function (e) {
1755
+ if (e) e.preventDefault()
1756
+
1757
+ e = $.Event('hide.bs.modal')
1758
+
1759
+ this.$element.trigger(e)
1760
+
1761
+ if (!this.isShown || e.isDefaultPrevented()) return
1762
+
1763
+ this.isShown = false
1764
+
1765
+ this.escape()
1766
+ this.resize()
1767
+
1768
+ $(document).off('focusin.bs.modal')
1769
+
1770
+ this.$element
1771
+ .removeClass('in')
1772
+ .off('click.dismiss.bs.modal')
1773
+ .off('mouseup.dismiss.bs.modal')
1774
+
1775
+ this.$dialog.off('mousedown.dismiss.bs.modal')
1776
+
1777
+ $.support.transition && this.$element.hasClass('fade') ?
1778
+ this.$element
1779
+ .one('bsTransitionEnd', $.proxy(this.hideModal, this))
1780
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
1781
+ this.hideModal()
1782
+ }
1783
+
1784
+ Modal.prototype.enforceFocus = function () {
1785
+ $(document)
1786
+ .off('focusin.bs.modal') // guard against infinite focus loop
1787
+ .on('focusin.bs.modal', $.proxy(function (e) {
1788
+ if (document !== e.target &&
1789
+ this.$element[0] !== e.target &&
1790
+ !this.$element.has(e.target).length) {
1791
+ this.$element.trigger('focus')
1792
+ }
1793
+ }, this))
1794
+ }
1795
+
1796
+ Modal.prototype.escape = function () {
1797
+ if (this.isShown && this.options.keyboard) {
1798
+ this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
1799
+ e.which == 27 && this.hide()
1800
+ }, this))
1801
+ } else if (!this.isShown) {
1802
+ this.$element.off('keydown.dismiss.bs.modal')
1803
+ }
1804
+ }
1805
+
1806
+ Modal.prototype.resize = function () {
1807
+ if (this.isShown) {
1808
+ $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
1809
+ } else {
1810
+ $(window).off('resize.bs.modal')
1811
+ }
1812
+ }
1813
+
1814
+ Modal.prototype.hideModal = function () {
1815
+ var that = this
1816
+ this.$element.hide()
1817
+ this.backdrop(function () {
1818
+ that.$body.removeClass('modal-open')
1819
+ that.resetAdjustments()
1820
+ that.resetScrollbar()
1821
+ that.$element.trigger('hidden.bs.modal')
1822
+ })
1823
+ }
1824
+
1825
+ Modal.prototype.removeBackdrop = function () {
1826
+ this.$backdrop && this.$backdrop.remove()
1827
+ this.$backdrop = null
1828
+ }
1829
+
1830
+ Modal.prototype.backdrop = function (callback) {
1831
+ var that = this
1832
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
1833
+
1834
+ if (this.isShown && this.options.backdrop) {
1835
+ var doAnimate = $.support.transition && animate
1836
+
1837
+ this.$backdrop = $(document.createElement('div'))
1838
+ .addClass('modal-backdrop ' + animate)
1839
+ .appendTo(this.$body)
1840
+
1841
+ this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
1842
+ if (this.ignoreBackdropClick) {
1843
+ this.ignoreBackdropClick = false
1844
+ return
1845
+ }
1846
+ if (e.target !== e.currentTarget) return
1847
+ this.options.backdrop == 'static'
1848
+ ? this.$element[0].focus()
1849
+ : this.hide()
1850
+ }, this))
1851
+
1852
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
1853
+
1854
+ this.$backdrop.addClass('in')
1855
+
1856
+ if (!callback) return
1857
+
1858
+ doAnimate ?
1859
+ this.$backdrop
1860
+ .one('bsTransitionEnd', callback)
1861
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
1862
+ callback()
1863
+
1864
+ } else if (!this.isShown && this.$backdrop) {
1865
+ this.$backdrop.removeClass('in')
1866
+
1867
+ var callbackRemove = function () {
1868
+ that.removeBackdrop()
1869
+ callback && callback()
1870
+ }
1871
+ $.support.transition && this.$element.hasClass('fade') ?
1872
+ this.$backdrop
1873
+ .one('bsTransitionEnd', callbackRemove)
1874
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
1875
+ callbackRemove()
1876
+
1877
+ } else if (callback) {
1878
+ callback()
1879
+ }
1880
+ }
1881
+
1882
+ // these following methods are used to handle overflowing modals
1883
+
1884
+ Modal.prototype.handleUpdate = function () {
1885
+ this.adjustDialog()
1886
+ }
1887
+
1888
+ Modal.prototype.adjustDialog = function () {
1889
+ var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
1890
+
1891
+ this.$element.css({
1892
+ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
1893
+ paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
1894
+ })
1895
+ }
1896
+
1897
+ Modal.prototype.resetAdjustments = function () {
1898
+ this.$element.css({
1899
+ paddingLeft: '',
1900
+ paddingRight: ''
1901
+ })
1902
+ }
1903
+
1904
+ Modal.prototype.checkScrollbar = function () {
1905
+ var fullWindowWidth = window.innerWidth
1906
+ if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
1907
+ var documentElementRect = document.documentElement.getBoundingClientRect()
1908
+ fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
1909
+ }
1910
+ this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
1911
+ this.scrollbarWidth = this.measureScrollbar()
1912
+ }
1913
+
1914
+ Modal.prototype.setScrollbar = function () {
1915
+ var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
1916
+ this.originalBodyPad = document.body.style.paddingRight || ''
1917
+ var scrollbarWidth = this.scrollbarWidth
1918
+ if (this.bodyIsOverflowing) {
1919
+ this.$body.css('padding-right', bodyPad + scrollbarWidth)
1920
+ $(this.fixedContent).each(function (index, element) {
1921
+ var actualPadding = element.style.paddingRight
1922
+ var calculatedPadding = $(element).css('padding-right')
1923
+ $(element)
1924
+ .data('padding-right', actualPadding)
1925
+ .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px')
1926
+ })
1927
+ }
1928
+ }
1929
+
1930
+ Modal.prototype.resetScrollbar = function () {
1931
+ this.$body.css('padding-right', this.originalBodyPad)
1932
+ $(this.fixedContent).each(function (index, element) {
1933
+ var padding = $(element).data('padding-right')
1934
+ $(element).removeData('padding-right')
1935
+ element.style.paddingRight = padding ? padding : ''
1936
+ })
1937
+ }
1938
+
1939
+ Modal.prototype.measureScrollbar = function () { // thx walsh
1940
+ var scrollDiv = document.createElement('div')
1941
+ scrollDiv.className = 'modal-scrollbar-measure'
1942
+ this.$body.append(scrollDiv)
1943
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
1944
+ this.$body[0].removeChild(scrollDiv)
1945
+ return scrollbarWidth
1946
+ }
1947
+
1948
+
1949
+ // MODAL PLUGIN DEFINITION
1950
+ // =======================
1951
+
1952
+ function Plugin(option, _relatedTarget) {
1953
+ return this.each(function () {
1954
+ var $this = $(this)
1955
+ var data = $this.data('bs.modal')
1956
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
1957
+
1958
+ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
1959
+ if (typeof option == 'string') data[option](_relatedTarget)
1960
+ else if (options.show) data.show(_relatedTarget)
1961
+ })
1962
+ }
1963
+
1964
+ var old = $.fn.modal
1965
+
1966
+ $.fn.modal = Plugin
1967
+ $.fn.modal.Constructor = Modal
1968
+
1969
+
1970
+ // MODAL NO CONFLICT
1971
+ // =================
1972
+
1973
+ $.fn.modal.noConflict = function () {
1974
+ $.fn.modal = old
1975
+ return this
1976
+ }
1977
+
1978
+
1979
+ // MODAL DATA-API
1980
+ // ==============
1981
+
1982
+ $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
1983
+ var $this = $(this)
1984
+ var href = $this.attr('href')
1985
+ var target = $this.attr('data-target') ||
1986
+ (href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
1987
+
1988
+ var $target = $(document).find(target)
1989
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1990
+
1991
+ if ($this.is('a')) e.preventDefault()
1992
+
1993
+ $target.one('show.bs.modal', function (showEvent) {
1994
+ if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
1995
+ $target.one('hidden.bs.modal', function () {
1996
+ $this.is(':visible') && $this.trigger('focus')
1997
+ })
1998
+ })
1999
+ Plugin.call($target, option, this)
2000
+ })
2001
+
2002
+ }(jQuery);
2003
+ /* ========================================================================
2004
+ * Bootstrap: scrollspy.js v3.4.1
2005
+ * https://getbootstrap.com/docs/3.4/javascript/#scrollspy
2006
+ * ========================================================================
2007
+ * Copyright 2011-2019 Twitter, Inc.
2008
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2009
+ * ======================================================================== */
2010
+
2011
+
2012
+
2013
+ +function ($) {
2014
+ 'use strict';
2015
+
2016
+ // SCROLLSPY CLASS DEFINITION
2017
+ // ==========================
2018
+
2019
+ function ScrollSpy(element, options) {
2020
+ this.$body = $(document.body)
2021
+ this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
2022
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
2023
+ this.selector = (this.options.target || '') + ' .nav li > a'
2024
+ this.offsets = []
2025
+ this.targets = []
2026
+ this.activeTarget = null
2027
+ this.scrollHeight = 0
2028
+
2029
+ this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
2030
+ this.refresh()
2031
+ this.process()
2032
+ }
2033
+
2034
+ ScrollSpy.VERSION = '3.4.1'
2035
+
2036
+ ScrollSpy.DEFAULTS = {
2037
+ offset: 10
2038
+ }
2039
+
2040
+ ScrollSpy.prototype.getScrollHeight = function () {
2041
+ return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
2042
+ }
2043
+
2044
+ ScrollSpy.prototype.refresh = function () {
2045
+ var that = this
2046
+ var offsetMethod = 'offset'
2047
+ var offsetBase = 0
2048
+
2049
+ this.offsets = []
2050
+ this.targets = []
2051
+ this.scrollHeight = this.getScrollHeight()
2052
+
2053
+ if (!$.isWindow(this.$scrollElement[0])) {
2054
+ offsetMethod = 'position'
2055
+ offsetBase = this.$scrollElement.scrollTop()
2056
+ }
2057
+
2058
+ this.$body
2059
+ .find(this.selector)
2060
+ .map(function () {
2061
+ var $el = $(this)
2062
+ var href = $el.data('target') || $el.attr('href')
2063
+ var $href = /^#./.test(href) && $(href)
2064
+
2065
+ return ($href
2066
+ && $href.length
2067
+ && $href.is(':visible')
2068
+ && [[$href[offsetMethod]().top + offsetBase, href]]) || null
2069
+ })
2070
+ .sort(function (a, b) { return a[0] - b[0] })
2071
+ .each(function () {
2072
+ that.offsets.push(this[0])
2073
+ that.targets.push(this[1])
2074
+ })
2075
+ }
2076
+
2077
+ ScrollSpy.prototype.process = function () {
2078
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
2079
+ var scrollHeight = this.getScrollHeight()
2080
+ var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
2081
+ var offsets = this.offsets
2082
+ var targets = this.targets
2083
+ var activeTarget = this.activeTarget
2084
+ var i
2085
+
2086
+ if (this.scrollHeight != scrollHeight) {
2087
+ this.refresh()
2088
+ }
2089
+
2090
+ if (scrollTop >= maxScroll) {
2091
+ return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
2092
+ }
2093
+
2094
+ if (activeTarget && scrollTop < offsets[0]) {
2095
+ this.activeTarget = null
2096
+ return this.clear()
2097
+ }
2098
+
2099
+ for (i = offsets.length; i--;) {
2100
+ activeTarget != targets[i]
2101
+ && scrollTop >= offsets[i]
2102
+ && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
2103
+ && this.activate(targets[i])
2104
+ }
2105
+ }
2106
+
2107
+ ScrollSpy.prototype.activate = function (target) {
2108
+ this.activeTarget = target
2109
+
2110
+ this.clear()
2111
+
2112
+ var selector = this.selector +
2113
+ '[data-target="' + target + '"],' +
2114
+ this.selector + '[href="' + target + '"]'
2115
+
2116
+ var active = $(selector)
2117
+ .parents('li')
2118
+ .addClass('active')
2119
+
2120
+ if (active.parent('.dropdown-menu').length) {
2121
+ active = active
2122
+ .closest('li.dropdown')
2123
+ .addClass('active')
2124
+ }
2125
+
2126
+ active.trigger('activate.bs.scrollspy')
2127
+ }
2128
+
2129
+ ScrollSpy.prototype.clear = function () {
2130
+ $(this.selector)
2131
+ .parentsUntil(this.options.target, '.active')
2132
+ .removeClass('active')
2133
+ }
2134
+
2135
+
2136
+ // SCROLLSPY PLUGIN DEFINITION
2137
+ // ===========================
2138
+
2139
+ function Plugin(option) {
2140
+ return this.each(function () {
2141
+ var $this = $(this)
2142
+ var data = $this.data('bs.scrollspy')
2143
+ var options = typeof option == 'object' && option
2144
+
2145
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
2146
+ if (typeof option == 'string') data[option]()
2147
+ })
2148
+ }
2149
+
2150
+ var old = $.fn.scrollspy
2151
+
2152
+ $.fn.scrollspy = Plugin
2153
+ $.fn.scrollspy.Constructor = ScrollSpy
2154
+
2155
+
2156
+ // SCROLLSPY NO CONFLICT
2157
+ // =====================
2158
+
2159
+ $.fn.scrollspy.noConflict = function () {
2160
+ $.fn.scrollspy = old
2161
+ return this
2162
+ }
2163
+
2164
+
2165
+ // SCROLLSPY DATA-API
2166
+ // ==================
2167
+
2168
+ $(window).on('load.bs.scrollspy.data-api', function () {
2169
+ $('[data-spy="scroll"]').each(function () {
2170
+ var $spy = $(this)
2171
+ Plugin.call($spy, $spy.data())
2172
+ })
2173
+ })
2174
+
2175
+ }(jQuery);
2176
+ /* ========================================================================
2177
+ * Bootstrap: tab.js v3.4.1
2178
+ * https://getbootstrap.com/docs/3.4/javascript/#tabs
2179
+ * ========================================================================
2180
+ * Copyright 2011-2019 Twitter, Inc.
2181
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2182
+ * ======================================================================== */
2183
+
2184
+
2185
+
2186
+ +function ($) {
2187
+ 'use strict';
2188
+
2189
+ // TAB CLASS DEFINITION
2190
+ // ====================
2191
+
2192
+ var Tab = function (element) {
2193
+ // jscs:disable requireDollarBeforejQueryAssignment
2194
+ this.element = $(element)
2195
+ // jscs:enable requireDollarBeforejQueryAssignment
2196
+ }
2197
+
2198
+ Tab.VERSION = '3.4.1'
2199
+
2200
+ Tab.TRANSITION_DURATION = 150
2201
+
2202
+ Tab.prototype.show = function () {
2203
+ var $this = this.element
2204
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
2205
+ var selector = $this.data('target')
2206
+
2207
+ if (!selector) {
2208
+ selector = $this.attr('href')
2209
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
2210
+ }
2211
+
2212
+ if ($this.parent('li').hasClass('active')) return
2213
+
2214
+ var $previous = $ul.find('.active:last a')
2215
+ var hideEvent = $.Event('hide.bs.tab', {
2216
+ relatedTarget: $this[0]
2217
+ })
2218
+ var showEvent = $.Event('show.bs.tab', {
2219
+ relatedTarget: $previous[0]
2220
+ })
2221
+
2222
+ $previous.trigger(hideEvent)
2223
+ $this.trigger(showEvent)
2224
+
2225
+ if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
2226
+
2227
+ var $target = $(document).find(selector)
2228
+
2229
+ this.activate($this.closest('li'), $ul)
2230
+ this.activate($target, $target.parent(), function () {
2231
+ $previous.trigger({
2232
+ type: 'hidden.bs.tab',
2233
+ relatedTarget: $this[0]
2234
+ })
2235
+ $this.trigger({
2236
+ type: 'shown.bs.tab',
2237
+ relatedTarget: $previous[0]
2238
+ })
2239
+ })
2240
+ }
2241
+
2242
+ Tab.prototype.activate = function (element, container, callback) {
2243
+ var $active = container.find('> .active')
2244
+ var transition = callback
2245
+ && $.support.transition
2246
+ && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
2247
+
2248
+ function next() {
2249
+ $active
2250
+ .removeClass('active')
2251
+ .find('> .dropdown-menu > .active')
2252
+ .removeClass('active')
2253
+ .end()
2254
+ .find('[data-toggle="tab"]')
2255
+ .attr('aria-expanded', false)
2256
+
2257
+ element
2258
+ .addClass('active')
2259
+ .find('[data-toggle="tab"]')
2260
+ .attr('aria-expanded', true)
2261
+
2262
+ if (transition) {
2263
+ element[0].offsetWidth // reflow for transition
2264
+ element.addClass('in')
2265
+ } else {
2266
+ element.removeClass('fade')
2267
+ }
2268
+
2269
+ if (element.parent('.dropdown-menu').length) {
2270
+ element
2271
+ .closest('li.dropdown')
2272
+ .addClass('active')
2273
+ .end()
2274
+ .find('[data-toggle="tab"]')
2275
+ .attr('aria-expanded', true)
2276
+ }
2277
+
2278
+ callback && callback()
2279
+ }
2280
+
2281
+ $active.length && transition ?
2282
+ $active
2283
+ .one('bsTransitionEnd', next)
2284
+ .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
2285
+ next()
2286
+
2287
+ $active.removeClass('in')
2288
+ }
2289
+
2290
+
2291
+ // TAB PLUGIN DEFINITION
2292
+ // =====================
2293
+
2294
+ function Plugin(option) {
2295
+ return this.each(function () {
2296
+ var $this = $(this)
2297
+ var data = $this.data('bs.tab')
2298
+
2299
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
2300
+ if (typeof option == 'string') data[option]()
2301
+ })
2302
+ }
2303
+
2304
+ var old = $.fn.tab
2305
+
2306
+ $.fn.tab = Plugin
2307
+ $.fn.tab.Constructor = Tab
2308
+
2309
+
2310
+ // TAB NO CONFLICT
2311
+ // ===============
2312
+
2313
+ $.fn.tab.noConflict = function () {
2314
+ $.fn.tab = old
2315
+ return this
2316
+ }
2317
+
2318
+
2319
+ // TAB DATA-API
2320
+ // ============
2321
+
2322
+ var clickHandler = function (e) {
2323
+ e.preventDefault()
2324
+ Plugin.call($(this), 'show')
2325
+ }
2326
+
2327
+ $(document)
2328
+ .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
2329
+ .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
2330
+
2331
+ }(jQuery);
2332
+ /* ========================================================================
2333
+ * Bootstrap: transition.js v3.4.1
2334
+ * https://getbootstrap.com/docs/3.4/javascript/#transitions
2335
+ * ========================================================================
2336
+ * Copyright 2011-2019 Twitter, Inc.
2337
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2338
+ * ======================================================================== */
2339
+
2340
+
2341
+
2342
+ +function ($) {
2343
+ 'use strict';
2344
+
2345
+ // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/)
2346
+ // ============================================================
2347
+
2348
+ function transitionEnd() {
2349
+ var el = document.createElement('bootstrap')
2350
+
2351
+ var transEndEventNames = {
2352
+ WebkitTransition : 'webkitTransitionEnd',
2353
+ MozTransition : 'transitionend',
2354
+ OTransition : 'oTransitionEnd otransitionend',
2355
+ transition : 'transitionend'
2356
+ }
2357
+
2358
+ for (var name in transEndEventNames) {
2359
+ if (el.style[name] !== undefined) {
2360
+ return { end: transEndEventNames[name] }
2361
+ }
2362
+ }
2363
+
2364
+ return false // explicit for ie8 ( ._.)
2365
+ }
2366
+
2367
+ // https://blog.alexmaccaw.com/css-transitions
2368
+ $.fn.emulateTransitionEnd = function (duration) {
2369
+ var called = false
2370
+ var $el = this
2371
+ $(this).one('bsTransitionEnd', function () { called = true })
2372
+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
2373
+ setTimeout(callback, duration)
2374
+ return this
2375
+ }
2376
+
2377
+ $(function () {
2378
+ $.support.transition = transitionEnd()
2379
+
2380
+ if (!$.support.transition) return
2381
+
2382
+ $.event.special.bsTransitionEnd = {
2383
+ bindType: $.support.transition.end,
2384
+ delegateType: $.support.transition.end,
2385
+ handle: function (e) {
2386
+ if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
2387
+ }
2388
+ }
2389
+ })
2390
+
2391
+ }(jQuery);
2392
+ /* ========================================================================
2393
+ * Bootstrap: tooltip.js v3.4.1
2394
+ * https://getbootstrap.com/docs/3.4/javascript/#tooltip
2395
+ * Inspired by the original jQuery.tipsy by Jason Frame
2396
+ * ========================================================================
2397
+ * Copyright 2011-2019 Twitter, Inc.
2398
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2399
+ * ======================================================================== */
2400
+
2401
+
2402
+ +function ($) {
2403
+ 'use strict';
2404
+
2405
+ var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']
2406
+
2407
+ var uriAttrs = [
2408
+ 'background',
2409
+ 'cite',
2410
+ 'href',
2411
+ 'itemtype',
2412
+ 'longdesc',
2413
+ 'poster',
2414
+ 'src',
2415
+ 'xlink:href'
2416
+ ]
2417
+
2418
+ var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
2419
+
2420
+ var DefaultWhitelist = {
2421
+ // Global attributes allowed on any supplied element below.
2422
+ '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
2423
+ a: ['target', 'href', 'title', 'rel'],
2424
+ area: [],
2425
+ b: [],
2426
+ br: [],
2427
+ col: [],
2428
+ code: [],
2429
+ div: [],
2430
+ em: [],
2431
+ hr: [],
2432
+ h1: [],
2433
+ h2: [],
2434
+ h3: [],
2435
+ h4: [],
2436
+ h5: [],
2437
+ h6: [],
2438
+ i: [],
2439
+ img: ['src', 'alt', 'title', 'width', 'height'],
2440
+ li: [],
2441
+ ol: [],
2442
+ p: [],
2443
+ pre: [],
2444
+ s: [],
2445
+ small: [],
2446
+ span: [],
2447
+ sub: [],
2448
+ sup: [],
2449
+ strong: [],
2450
+ u: [],
2451
+ ul: []
2452
+ }
2453
+
2454
+ /**
2455
+ * A pattern that recognizes a commonly useful subset of URLs that are safe.
2456
+ *
2457
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
2458
+ */
2459
+ var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi
2460
+
2461
+ /**
2462
+ * A pattern that matches safe data URLs. Only matches image, video and audio types.
2463
+ *
2464
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
2465
+ */
2466
+ var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i
2467
+
2468
+ function allowedAttribute(attr, allowedAttributeList) {
2469
+ var attrName = attr.nodeName.toLowerCase()
2470
+
2471
+ if ($.inArray(attrName, allowedAttributeList) !== -1) {
2472
+ if ($.inArray(attrName, uriAttrs) !== -1) {
2473
+ return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))
2474
+ }
2475
+
2476
+ return true
2477
+ }
2478
+
2479
+ var regExp = $(allowedAttributeList).filter(function (index, value) {
2480
+ return value instanceof RegExp
2481
+ })
2482
+
2483
+ // Check if a regular expression validates the attribute.
2484
+ for (var i = 0, l = regExp.length; i < l; i++) {
2485
+ if (attrName.match(regExp[i])) {
2486
+ return true
2487
+ }
2488
+ }
2489
+
2490
+ return false
2491
+ }
2492
+
2493
+ function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
2494
+ if (unsafeHtml.length === 0) {
2495
+ return unsafeHtml
2496
+ }
2497
+
2498
+ if (sanitizeFn && typeof sanitizeFn === 'function') {
2499
+ return sanitizeFn(unsafeHtml)
2500
+ }
2501
+
2502
+ // IE 8 and below don't support createHTMLDocument
2503
+ if (!document.implementation || !document.implementation.createHTMLDocument) {
2504
+ return unsafeHtml
2505
+ }
2506
+
2507
+ var createdDocument = document.implementation.createHTMLDocument('sanitization')
2508
+ createdDocument.body.innerHTML = unsafeHtml
2509
+
2510
+ var whitelistKeys = $.map(whiteList, function (el, i) { return i })
2511
+ var elements = $(createdDocument.body).find('*')
2512
+
2513
+ for (var i = 0, len = elements.length; i < len; i++) {
2514
+ var el = elements[i]
2515
+ var elName = el.nodeName.toLowerCase()
2516
+
2517
+ if ($.inArray(elName, whitelistKeys) === -1) {
2518
+ el.parentNode.removeChild(el)
2519
+
2520
+ continue
2521
+ }
2522
+
2523
+ var attributeList = $.map(el.attributes, function (el) { return el })
2524
+ var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])
2525
+
2526
+ for (var j = 0, len2 = attributeList.length; j < len2; j++) {
2527
+ if (!allowedAttribute(attributeList[j], whitelistedAttributes)) {
2528
+ el.removeAttribute(attributeList[j].nodeName)
2529
+ }
2530
+ }
2531
+ }
2532
+
2533
+ return createdDocument.body.innerHTML
2534
+ }
2535
+
2536
+ // TOOLTIP PUBLIC CLASS DEFINITION
2537
+ // ===============================
2538
+
2539
+ var Tooltip = function (element, options) {
2540
+ this.type = null
2541
+ this.options = null
2542
+ this.enabled = null
2543
+ this.timeout = null
2544
+ this.hoverState = null
2545
+ this.$element = null
2546
+ this.inState = null
2547
+
2548
+ this.init('tooltip', element, options)
2549
+ }
2550
+
2551
+ Tooltip.VERSION = '3.4.1'
2552
+
2553
+ Tooltip.TRANSITION_DURATION = 150
2554
+
2555
+ Tooltip.DEFAULTS = {
2556
+ animation: true,
2557
+ placement: 'top',
2558
+ selector: false,
2559
+ template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
2560
+ trigger: 'hover focus',
2561
+ title: '',
2562
+ delay: 0,
2563
+ html: false,
2564
+ container: false,
2565
+ viewport: {
2566
+ selector: 'body',
2567
+ padding: 0
2568
+ },
2569
+ sanitize : true,
2570
+ sanitizeFn : null,
2571
+ whiteList : DefaultWhitelist
2572
+ }
2573
+
2574
+ Tooltip.prototype.init = function (type, element, options) {
2575
+ this.enabled = true
2576
+ this.type = type
2577
+ this.$element = $(element)
2578
+ this.options = this.getOptions(options)
2579
+ this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
2580
+ this.inState = { click: false, hover: false, focus: false }
2581
+
2582
+ if (this.$element[0] instanceof document.constructor && !this.options.selector) {
2583
+ throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
2584
+ }
2585
+
2586
+ var triggers = this.options.trigger.split(' ')
2587
+
2588
+ for (var i = triggers.length; i--;) {
2589
+ var trigger = triggers[i]
2590
+
2591
+ if (trigger == 'click') {
2592
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
2593
+ } else if (trigger != 'manual') {
2594
+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
2595
+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
2596
+
2597
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
2598
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
2599
+ }
2600
+ }
2601
+
2602
+ this.options.selector ?
2603
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
2604
+ this.fixTitle()
2605
+ }
2606
+
2607
+ Tooltip.prototype.getDefaults = function () {
2608
+ return Tooltip.DEFAULTS
2609
+ }
2610
+
2611
+ Tooltip.prototype.getOptions = function (options) {
2612
+ var dataAttributes = this.$element.data()
2613
+
2614
+ for (var dataAttr in dataAttributes) {
2615
+ if (dataAttributes.hasOwnProperty(dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) {
2616
+ delete dataAttributes[dataAttr]
2617
+ }
2618
+ }
2619
+
2620
+ options = $.extend({}, this.getDefaults(), dataAttributes, options)
2621
+
2622
+ if (options.delay && typeof options.delay == 'number') {
2623
+ options.delay = {
2624
+ show: options.delay,
2625
+ hide: options.delay
2626
+ }
2627
+ }
2628
+
2629
+ if (options.sanitize) {
2630
+ options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn)
2631
+ }
2632
+
2633
+ return options
2634
+ }
2635
+
2636
+ Tooltip.prototype.getDelegateOptions = function () {
2637
+ var options = {}
2638
+ var defaults = this.getDefaults()
2639
+
2640
+ this._options && $.each(this._options, function (key, value) {
2641
+ if (defaults[key] != value) options[key] = value
2642
+ })
2643
+
2644
+ return options
2645
+ }
2646
+
2647
+ Tooltip.prototype.enter = function (obj) {
2648
+ var self = obj instanceof this.constructor ?
2649
+ obj : $(obj.currentTarget).data('bs.' + this.type)
2650
+
2651
+ if (!self) {
2652
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
2653
+ $(obj.currentTarget).data('bs.' + this.type, self)
2654
+ }
2655
+
2656
+ if (obj instanceof $.Event) {
2657
+ self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
2658
+ }
2659
+
2660
+ if (self.tip().hasClass('in') || self.hoverState == 'in') {
2661
+ self.hoverState = 'in'
2662
+ return
2663
+ }
2664
+
2665
+ clearTimeout(self.timeout)
2666
+
2667
+ self.hoverState = 'in'
2668
+
2669
+ if (!self.options.delay || !self.options.delay.show) return self.show()
2670
+
2671
+ self.timeout = setTimeout(function () {
2672
+ if (self.hoverState == 'in') self.show()
2673
+ }, self.options.delay.show)
2674
+ }
2675
+
2676
+ Tooltip.prototype.isInStateTrue = function () {
2677
+ for (var key in this.inState) {
2678
+ if (this.inState[key]) return true
2679
+ }
2680
+
2681
+ return false
2682
+ }
2683
+
2684
+ Tooltip.prototype.leave = function (obj) {
2685
+ var self = obj instanceof this.constructor ?
2686
+ obj : $(obj.currentTarget).data('bs.' + this.type)
2687
+
2688
+ if (!self) {
2689
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
2690
+ $(obj.currentTarget).data('bs.' + this.type, self)
2691
+ }
2692
+
2693
+ if (obj instanceof $.Event) {
2694
+ self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
2695
+ }
2696
+
2697
+ if (self.isInStateTrue()) return
2698
+
2699
+ clearTimeout(self.timeout)
2700
+
2701
+ self.hoverState = 'out'
2702
+
2703
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
2704
+
2705
+ self.timeout = setTimeout(function () {
2706
+ if (self.hoverState == 'out') self.hide()
2707
+ }, self.options.delay.hide)
2708
+ }
2709
+
2710
+ Tooltip.prototype.show = function () {
2711
+ var e = $.Event('show.bs.' + this.type)
2712
+
2713
+ if (this.hasContent() && this.enabled) {
2714
+ this.$element.trigger(e)
2715
+
2716
+ var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
2717
+ if (e.isDefaultPrevented() || !inDom) return
2718
+ var that = this
2719
+
2720
+ var $tip = this.tip()
2721
+
2722
+ var tipId = this.getUID(this.type)
2723
+
2724
+ this.setContent()
2725
+ $tip.attr('id', tipId)
2726
+ this.$element.attr('aria-describedby', tipId)
2727
+
2728
+ if (this.options.animation) $tip.addClass('fade')
2729
+
2730
+ var placement = typeof this.options.placement == 'function' ?
2731
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
2732
+ this.options.placement
2733
+
2734
+ var autoToken = /\s?auto?\s?/i
2735
+ var autoPlace = autoToken.test(placement)
2736
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
2737
+
2738
+ $tip
2739
+ .detach()
2740
+ .css({ top: 0, left: 0, display: 'block' })
2741
+ .addClass(placement)
2742
+ .data('bs.' + this.type, this)
2743
+
2744
+ this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element)
2745
+ this.$element.trigger('inserted.bs.' + this.type)
2746
+
2747
+ var pos = this.getPosition()
2748
+ var actualWidth = $tip[0].offsetWidth
2749
+ var actualHeight = $tip[0].offsetHeight
2750
+
2751
+ if (autoPlace) {
2752
+ var orgPlacement = placement
2753
+ var viewportDim = this.getPosition(this.$viewport)
2754
+
2755
+ placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :
2756
+ placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :
2757
+ placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :
2758
+ placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :
2759
+ placement
2760
+
2761
+ $tip
2762
+ .removeClass(orgPlacement)
2763
+ .addClass(placement)
2764
+ }
2765
+
2766
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
2767
+
2768
+ this.applyPlacement(calculatedOffset, placement)
2769
+
2770
+ var complete = function () {
2771
+ var prevHoverState = that.hoverState
2772
+ that.$element.trigger('shown.bs.' + that.type)
2773
+ that.hoverState = null
2774
+
2775
+ if (prevHoverState == 'out') that.leave(that)
2776
+ }
2777
+
2778
+ $.support.transition && this.$tip.hasClass('fade') ?
2779
+ $tip
2780
+ .one('bsTransitionEnd', complete)
2781
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
2782
+ complete()
2783
+ }
2784
+ }
2785
+
2786
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
2787
+ var $tip = this.tip()
2788
+ var width = $tip[0].offsetWidth
2789
+ var height = $tip[0].offsetHeight
2790
+
2791
+ // manually read margins because getBoundingClientRect includes difference
2792
+ var marginTop = parseInt($tip.css('margin-top'), 10)
2793
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
2794
+
2795
+ // we must check for NaN for ie 8/9
2796
+ if (isNaN(marginTop)) marginTop = 0
2797
+ if (isNaN(marginLeft)) marginLeft = 0
2798
+
2799
+ offset.top += marginTop
2800
+ offset.left += marginLeft
2801
+
2802
+ // $.fn.offset doesn't round pixel values
2803
+ // so we use setOffset directly with our own function B-0
2804
+ $.offset.setOffset($tip[0], $.extend({
2805
+ using: function (props) {
2806
+ $tip.css({
2807
+ top: Math.round(props.top),
2808
+ left: Math.round(props.left)
2809
+ })
2810
+ }
2811
+ }, offset), 0)
2812
+
2813
+ $tip.addClass('in')
2814
+
2815
+ // check to see if placing tip in new offset caused the tip to resize itself
2816
+ var actualWidth = $tip[0].offsetWidth
2817
+ var actualHeight = $tip[0].offsetHeight
2818
+
2819
+ if (placement == 'top' && actualHeight != height) {
2820
+ offset.top = offset.top + height - actualHeight
2821
+ }
2822
+
2823
+ var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
2824
+
2825
+ if (delta.left) offset.left += delta.left
2826
+ else offset.top += delta.top
2827
+
2828
+ var isVertical = /top|bottom/.test(placement)
2829
+ var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
2830
+ var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
2831
+
2832
+ $tip.offset(offset)
2833
+ this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
2834
+ }
2835
+
2836
+ Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
2837
+ this.arrow()
2838
+ .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
2839
+ .css(isVertical ? 'top' : 'left', '')
2840
+ }
2841
+
2842
+ Tooltip.prototype.setContent = function () {
2843
+ var $tip = this.tip()
2844
+ var title = this.getTitle()
2845
+
2846
+ if (this.options.html) {
2847
+ if (this.options.sanitize) {
2848
+ title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn)
2849
+ }
2850
+
2851
+ $tip.find('.tooltip-inner').html(title)
2852
+ } else {
2853
+ $tip.find('.tooltip-inner').text(title)
2854
+ }
2855
+
2856
+ $tip.removeClass('fade in top bottom left right')
2857
+ }
2858
+
2859
+ Tooltip.prototype.hide = function (callback) {
2860
+ var that = this
2861
+ var $tip = $(this.$tip)
2862
+ var e = $.Event('hide.bs.' + this.type)
2863
+
2864
+ function complete() {
2865
+ if (that.hoverState != 'in') $tip.detach()
2866
+ if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
2867
+ that.$element
2868
+ .removeAttr('aria-describedby')
2869
+ .trigger('hidden.bs.' + that.type)
2870
+ }
2871
+ callback && callback()
2872
+ }
2873
+
2874
+ this.$element.trigger(e)
2875
+
2876
+ if (e.isDefaultPrevented()) return
2877
+
2878
+ $tip.removeClass('in')
2879
+
2880
+ $.support.transition && $tip.hasClass('fade') ?
2881
+ $tip
2882
+ .one('bsTransitionEnd', complete)
2883
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
2884
+ complete()
2885
+
2886
+ this.hoverState = null
2887
+
2888
+ return this
2889
+ }
2890
+
2891
+ Tooltip.prototype.fixTitle = function () {
2892
+ var $e = this.$element
2893
+ if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
2894
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
2895
+ }
2896
+ }
2897
+
2898
+ Tooltip.prototype.hasContent = function () {
2899
+ return this.getTitle()
2900
+ }
2901
+
2902
+ Tooltip.prototype.getPosition = function ($element) {
2903
+ $element = $element || this.$element
2904
+
2905
+ var el = $element[0]
2906
+ var isBody = el.tagName == 'BODY'
2907
+
2908
+ var elRect = el.getBoundingClientRect()
2909
+ if (elRect.width == null) {
2910
+ // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
2911
+ elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
2912
+ }
2913
+ var isSvg = window.SVGElement && el instanceof window.SVGElement
2914
+ // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
2915
+ // See https://github.com/twbs/bootstrap/issues/20280
2916
+ var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
2917
+ var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
2918
+ var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
2919
+
2920
+ return $.extend({}, elRect, scroll, outerDims, elOffset)
2921
+ }
2922
+
2923
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
2924
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
2925
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
2926
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
2927
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
2928
+
2929
+ }
2930
+
2931
+ Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
2932
+ var delta = { top: 0, left: 0 }
2933
+ if (!this.$viewport) return delta
2934
+
2935
+ var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
2936
+ var viewportDimensions = this.getPosition(this.$viewport)
2937
+
2938
+ if (/right|left/.test(placement)) {
2939
+ var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
2940
+ var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
2941
+ if (topEdgeOffset < viewportDimensions.top) { // top overflow
2942
+ delta.top = viewportDimensions.top - topEdgeOffset
2943
+ } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
2944
+ delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
2945
+ }
2946
+ } else {
2947
+ var leftEdgeOffset = pos.left - viewportPadding
2948
+ var rightEdgeOffset = pos.left + viewportPadding + actualWidth
2949
+ if (leftEdgeOffset < viewportDimensions.left) { // left overflow
2950
+ delta.left = viewportDimensions.left - leftEdgeOffset
2951
+ } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
2952
+ delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
2953
+ }
2954
+ }
2955
+
2956
+ return delta
2957
+ }
2958
+
2959
+ Tooltip.prototype.getTitle = function () {
2960
+ var title
2961
+ var $e = this.$element
2962
+ var o = this.options
2963
+
2964
+ title = $e.attr('data-original-title')
2965
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
2966
+
2967
+ return title
2968
+ }
2969
+
2970
+ Tooltip.prototype.getUID = function (prefix) {
2971
+ do prefix += ~~(Math.random() * 1000000)
2972
+ while (document.getElementById(prefix))
2973
+ return prefix
2974
+ }
2975
+
2976
+ Tooltip.prototype.tip = function () {
2977
+ if (!this.$tip) {
2978
+ this.$tip = $(this.options.template)
2979
+ if (this.$tip.length != 1) {
2980
+ throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
2981
+ }
2982
+ }
2983
+ return this.$tip
2984
+ }
2985
+
2986
+ Tooltip.prototype.arrow = function () {
2987
+ return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
2988
+ }
2989
+
2990
+ Tooltip.prototype.enable = function () {
2991
+ this.enabled = true
2992
+ }
2993
+
2994
+ Tooltip.prototype.disable = function () {
2995
+ this.enabled = false
2996
+ }
2997
+
2998
+ Tooltip.prototype.toggleEnabled = function () {
2999
+ this.enabled = !this.enabled
3000
+ }
3001
+
3002
+ Tooltip.prototype.toggle = function (e) {
3003
+ var self = this
3004
+ if (e) {
3005
+ self = $(e.currentTarget).data('bs.' + this.type)
3006
+ if (!self) {
3007
+ self = new this.constructor(e.currentTarget, this.getDelegateOptions())
3008
+ $(e.currentTarget).data('bs.' + this.type, self)
3009
+ }
3010
+ }
3011
+
3012
+ if (e) {
3013
+ self.inState.click = !self.inState.click
3014
+ if (self.isInStateTrue()) self.enter(self)
3015
+ else self.leave(self)
3016
+ } else {
3017
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
3018
+ }
3019
+ }
3020
+
3021
+ Tooltip.prototype.destroy = function () {
3022
+ var that = this
3023
+ clearTimeout(this.timeout)
3024
+ this.hide(function () {
3025
+ that.$element.off('.' + that.type).removeData('bs.' + that.type)
3026
+ if (that.$tip) {
3027
+ that.$tip.detach()
3028
+ }
3029
+ that.$tip = null
3030
+ that.$arrow = null
3031
+ that.$viewport = null
3032
+ that.$element = null
3033
+ })
3034
+ }
3035
+
3036
+ Tooltip.prototype.sanitizeHtml = function (unsafeHtml) {
3037
+ return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn)
3038
+ }
3039
+
3040
+ // TOOLTIP PLUGIN DEFINITION
3041
+ // =========================
3042
+
3043
+ function Plugin(option) {
3044
+ return this.each(function () {
3045
+ var $this = $(this)
3046
+ var data = $this.data('bs.tooltip')
3047
+ var options = typeof option == 'object' && option
3048
+
3049
+ if (!data && /destroy|hide/.test(option)) return
3050
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
3051
+ if (typeof option == 'string') data[option]()
3052
+ })
3053
+ }
3054
+
3055
+ var old = $.fn.tooltip
3056
+
3057
+ $.fn.tooltip = Plugin
3058
+ $.fn.tooltip.Constructor = Tooltip
3059
+
3060
+
3061
+ // TOOLTIP NO CONFLICT
3062
+ // ===================
3063
+
3064
+ $.fn.tooltip.noConflict = function () {
3065
+ $.fn.tooltip = old
3066
+ return this
3067
+ }
3068
+
3069
+ }(jQuery);
3070
+ /* ========================================================================
3071
+ * Bootstrap: popover.js v3.4.1
3072
+ * https://getbootstrap.com/docs/3.4/javascript/#popovers
3073
+ * ========================================================================
3074
+ * Copyright 2011-2019 Twitter, Inc.
3075
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
3076
+ * ======================================================================== */
3077
+
3078
+
3079
+
3080
+ +function ($) {
3081
+ 'use strict';
3082
+
3083
+ // POPOVER PUBLIC CLASS DEFINITION
3084
+ // ===============================
3085
+
3086
+ var Popover = function (element, options) {
3087
+ this.init('popover', element, options)
3088
+ }
3089
+
3090
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
3091
+
3092
+ Popover.VERSION = '3.4.1'
3093
+
3094
+ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
3095
+ placement: 'right',
3096
+ trigger: 'click',
3097
+ content: '',
3098
+ template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
3099
+ })
3100
+
3101
+
3102
+ // NOTE: POPOVER EXTENDS tooltip.js
3103
+ // ================================
3104
+
3105
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
3106
+
3107
+ Popover.prototype.constructor = Popover
3108
+
3109
+ Popover.prototype.getDefaults = function () {
3110
+ return Popover.DEFAULTS
3111
+ }
3112
+
3113
+ Popover.prototype.setContent = function () {
3114
+ var $tip = this.tip()
3115
+ var title = this.getTitle()
3116
+ var content = this.getContent()
3117
+
3118
+ if (this.options.html) {
3119
+ var typeContent = typeof content
3120
+
3121
+ if (this.options.sanitize) {
3122
+ title = this.sanitizeHtml(title)
3123
+
3124
+ if (typeContent === 'string') {
3125
+ content = this.sanitizeHtml(content)
3126
+ }
3127
+ }
3128
+
3129
+ $tip.find('.popover-title').html(title)
3130
+ $tip.find('.popover-content').children().detach().end()[
3131
+ typeContent === 'string' ? 'html' : 'append'
3132
+ ](content)
3133
+ } else {
3134
+ $tip.find('.popover-title').text(title)
3135
+ $tip.find('.popover-content').children().detach().end().text(content)
3136
+ }
3137
+
3138
+ $tip.removeClass('fade top bottom left right in')
3139
+
3140
+ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
3141
+ // this manually by checking the contents.
3142
+ if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
3143
+ }
3144
+
3145
+ Popover.prototype.hasContent = function () {
3146
+ return this.getTitle() || this.getContent()
3147
+ }
3148
+
3149
+ Popover.prototype.getContent = function () {
3150
+ var $e = this.$element
3151
+ var o = this.options
3152
+
3153
+ return $e.attr('data-content')
3154
+ || (typeof o.content == 'function' ?
3155
+ o.content.call($e[0]) :
3156
+ o.content)
3157
+ }
3158
+
3159
+ Popover.prototype.arrow = function () {
3160
+ return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
3161
+ }
3162
+
3163
+
3164
+ // POPOVER PLUGIN DEFINITION
3165
+ // =========================
3166
+
3167
+ function Plugin(option) {
3168
+ return this.each(function () {
3169
+ var $this = $(this)
3170
+ var data = $this.data('bs.popover')
3171
+ var options = typeof option == 'object' && option
3172
+
3173
+ if (!data && /destroy|hide/.test(option)) return
3174
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
3175
+ if (typeof option == 'string') data[option]()
3176
+ })
3177
+ }
3178
+
3179
+ var old = $.fn.popover
3180
+
3181
+ $.fn.popover = Plugin
3182
+ $.fn.popover.Constructor = Popover
3183
+
3184
+
3185
+ // POPOVER NO CONFLICT
3186
+ // ===================
3187
+
3188
+ $.fn.popover.noConflict = function () {
3189
+ $.fn.popover = old
3190
+ return this
3191
+ }
3192
+
3193
+ }(jQuery);
3194
+
3195
+
3196
+
3197
+
3198
+
3199
+
3200
+
3201
+
3202
+
3203
+
3204
+
3205
+
3206
+ (function() {
3207
+ var auto_toggle;
3208
+
3209
+ $(function() {
3210
+ var dialog, fileIsSelected, indicateSelected, initialize, loadFiles, refreshFiles, selectAll, selectChildRows, selectFile, setProgress, sizeColumns, startWait, stopWait, tableSetup, toHiddenFields, toggleBranchSelect, toggleFileSelect, unselectFile, updateFileCount;
3211
+ dialog = $('div#browse-everything');
3212
+ initialize = function(obj, options) {
3213
+ var ctx;
3214
+ if ($('div#browse-everything').length === 0) {
3215
+ dialog = $('<div tabindex="-1" id="browse-everything" class="ev-browser modal fade" aria-live="polite" role="dialog" aria-labelledby="beModalLabel"></div>').hide().appendTo('body');
3216
+ }
3217
+ dialog.modal({
3218
+ backdrop: 'static',
3219
+ show: false
3220
+ });
3221
+ ctx = {
3222
+ opts: $.extend(true, {}, options),
3223
+ callbacks: {
3224
+ show: $.Callbacks(),
3225
+ done: $.Callbacks(),
3226
+ cancel: $.Callbacks(),
3227
+ fail: $.Callbacks()
3228
+ }
3229
+ };
3230
+ ctx.callback_proxy = {
3231
+ show: function(func) {
3232
+ ctx.callbacks.show.add(func);
3233
+ return this;
3234
+ },
3235
+ done: function(func) {
3236
+ ctx.callbacks.done.add(func);
3237
+ return this;
3238
+ },
3239
+ cancel: function(func) {
3240
+ ctx.callbacks.cancel.add(func);
3241
+ return this;
3242
+ },
3243
+ fail: function(func) {
3244
+ ctx.callbacks.fail.add(func);
3245
+ return this;
3246
+ }
3247
+ };
3248
+ $(obj).data('ev-state', ctx);
3249
+ return ctx;
3250
+ };
3251
+ toHiddenFields = function(data) {
3252
+ var elements, fields;
3253
+ fields = $.param(data).split('&').map(function(t) {
3254
+ return t.replace(/\+/g, ' ').split('=', 2);
3255
+ });
3256
+ elements = $(fields).map(function() {
3257
+ return $("<input type='hidden'/>").attr('name', decodeURIComponent(this[0])).val(decodeURIComponent(this[1]))[0].outerHTML;
3258
+ });
3259
+ return $(elements.toArray().join("\n"));
3260
+ };
3261
+ indicateSelected = function() {
3262
+ return $('input.ev-url').each(function() {
3263
+ return $("*[data-ev-location='" + ($(this).val()) + "']").addClass('ev-selected');
3264
+ });
3265
+ };
3266
+ fileIsSelected = function(row) {
3267
+ var result;
3268
+ result = false;
3269
+ $('input.ev-url').each(function() {
3270
+ if (this.value === $(row).data('ev-location')) {
3271
+ return result = true;
3272
+ }
3273
+ });
3274
+ return result;
3275
+ };
3276
+ toggleFileSelect = function(row) {
3277
+ row.toggleClass('ev-selected');
3278
+ if (row.hasClass('ev-selected')) {
3279
+ selectFile(row);
3280
+ } else {
3281
+ unselectFile(row);
3282
+ }
3283
+ return updateFileCount();
3284
+ };
3285
+ selectFile = function(row) {
3286
+ var file_location, hidden_input, target_form;
3287
+ target_form = $('form.ev-submit-form');
3288
+ file_location = row.data('ev-location');
3289
+ hidden_input = $("<input type='hidden' class='ev-url' name='selected_files[]'/>").val(file_location);
3290
+ target_form.append(hidden_input);
3291
+ if (!$(row).find('.ev-select-file').prop('checked')) {
3292
+ return $(row).find('.ev-select-file').prop('checked', true);
3293
+ }
3294
+ };
3295
+ unselectFile = function(row) {
3296
+ var file_location, target_form;
3297
+ target_form = $('form.ev-submit-form');
3298
+ file_location = row.data('ev-location');
3299
+ $("form.ev-submit-form input[value='" + file_location + "']").remove();
3300
+ if ($(row).find('.ev-select-file').prop('checked')) {
3301
+ return $(row).find('.ev-select-file').prop('checked', false);
3302
+ }
3303
+ };
3304
+ updateFileCount = function() {
3305
+ var count, files;
3306
+ count = $('input.ev-url').length;
3307
+ files = count === 1 ? "file" : "files";
3308
+ return $('.ev-status').html(count + " " + files + " selected");
3309
+ };
3310
+ toggleBranchSelect = function(row) {
3311
+ var node_id;
3312
+ if (row.hasClass('collapsed')) {
3313
+ node_id = row.find('td.ev-file-name a.ev-link').attr('href');
3314
+ return $('table#file-list').treetable('expandNode', node_id);
3315
+ }
3316
+ };
3317
+ selectAll = function(rows) {
3318
+ return rows.each(function() {
3319
+ var box;
3320
+ if ($(this).data('tt-branch')) {
3321
+ box = $(this).find('#select_all')[0];
3322
+ $(box).prop('checked', true);
3323
+ $(box).prop('value', "1");
3324
+ return toggleBranchSelect($(this));
3325
+ } else {
3326
+ if (!fileIsSelected($(this))) {
3327
+ return toggleFileSelect($(this));
3328
+ }
3329
+ }
3330
+ });
3331
+ };
3332
+ selectChildRows = function(row, action) {
3333
+ return $('table#file-list tr').each(function() {
3334
+ var box, node_id, re;
3335
+ if ($(this).data('tt-parent-id')) {
3336
+ re = RegExp($(row).data('tt-id'), 'i');
3337
+ if ($(this).data('tt-parent-id').match(re)) {
3338
+ if ($(this).data('tt-branch')) {
3339
+ box = $(this).find('#select_all')[0];
3340
+ $(box).prop('value', action);
3341
+ if (action === "1") {
3342
+ $(box).prop("checked", true);
3343
+ node_id = $(this).find('td.ev-file-name a.ev-link').attr('href');
3344
+ return $('table#file-list').treetable('expandNode', node_id);
3345
+ } else {
3346
+ return $(box).prop("checked", false);
3347
+ }
3348
+ } else {
3349
+ if (action === "1") {
3350
+ $(this).addClass('ev-selected');
3351
+ if (!fileIsSelected($(this))) {
3352
+ selectFile($(this));
3353
+ }
3354
+ } else {
3355
+ $(this).removeClass('ev-selected');
3356
+ unselectFile($(this));
3357
+ }
3358
+ return updateFileCount();
3359
+ }
3360
+ }
3361
+ }
3362
+ });
3363
+ };
3364
+ tableSetup = function(table) {
3365
+ table.treetable({
3366
+ expandable: true,
3367
+ onNodeCollapse: function() {
3368
+ var node;
3369
+ node = this;
3370
+ return table.treetable("unloadBranch", node);
3371
+ },
3372
+ onNodeExpand: function() {
3373
+ var increment, node, progressIntervalID, size, start;
3374
+ node = this;
3375
+ startWait();
3376
+ size = $(node.row).find('td.ev-file-size').text().trim();
3377
+ start = 1;
3378
+ increment = 1;
3379
+ if (size.indexOf("MB") > -1) {
3380
+ start = 10;
3381
+ increment = 5;
3382
+ }
3383
+ if (size.indexOf("KB") > -1) {
3384
+ start = 50;
3385
+ increment = 10;
3386
+ }
3387
+ setProgress(start);
3388
+ progressIntervalID = setInterval((function() {
3389
+ start = start + increment;
3390
+ if (start > 99) {
3391
+ start = 99;
3392
+ }
3393
+ return setProgress(start);
3394
+ }), 2000);
3395
+ return setTimeout((function() {
3396
+ return loadFiles(node, table, progressIntervalID);
3397
+ }), 10);
3398
+ }
3399
+ });
3400
+ $("#file-list tr:first").focus();
3401
+ return sizeColumns(table);
3402
+ };
3403
+ sizeColumns = function(table) {
3404
+ var full_width, set_size;
3405
+ full_width = $('.ev-files').width();
3406
+ table.width(full_width);
3407
+ set_size = function(selector, pct) {
3408
+ return $(selector, table).width(full_width * pct).css('width', full_width * pct).css('max-width', full_width * pct);
3409
+ };
3410
+ set_size('.ev-file', 0.4);
3411
+ set_size('.ev-container', 0.4);
3412
+ set_size('.ev-size', 0.1);
3413
+ set_size('.ev-kind', 0.3);
3414
+ return set_size('.ev-date', 0.2);
3415
+ };
3416
+ loadFiles = function(node, table, progressIntervalID) {
3417
+ return $.ajax({
3418
+ async: true,
3419
+ url: $('a.ev-link', node.row).attr('href'),
3420
+ data: {
3421
+ parent: node.row.data('tt-id'),
3422
+ accept: dialog.data('ev-state').opts.accept,
3423
+ context: dialog.data('ev-state').opts.context
3424
+ }
3425
+ }).done(function(html) {
3426
+ var rows;
3427
+ setProgress('100');
3428
+ clearInterval(progressIntervalID);
3429
+ rows = $('tbody tr', $(html));
3430
+ table.treetable("loadBranch", node, rows);
3431
+ $(node).show();
3432
+ sizeColumns(table);
3433
+ indicateSelected();
3434
+ if ($(node.row).find('#select_all')[0].checked) {
3435
+ return selectAll(rows);
3436
+ }
3437
+ }).always(function() {
3438
+ clearInterval(progressIntervalID);
3439
+ return stopWait();
3440
+ });
3441
+ };
3442
+ setProgress = function(done) {
3443
+ return $('.loading-text').text(done + '% complete');
3444
+ };
3445
+ refreshFiles = function() {
3446
+ return $('.ev-providers select').change();
3447
+ };
3448
+ startWait = function() {
3449
+ $('.loading-progress').removeClass("hidden");
3450
+ $('body').css('cursor', 'wait');
3451
+ $("html").addClass("wait");
3452
+ $(".ev-browser").addClass("loading");
3453
+ return $('.ev-submit').attr('disabled', true);
3454
+ };
3455
+ stopWait = function() {
3456
+ $('.loading-progress').addClass("hidden");
3457
+ $('body').css('cursor', 'default');
3458
+ $("html").removeClass("wait");
3459
+ $(".ev-browser").removeClass("loading");
3460
+ return $('.ev-submit').attr('disabled', false);
3461
+ };
3462
+ $(window).on('resize', function() {
3463
+ return sizeColumns($('table#file-list'));
3464
+ });
3465
+ $.fn.browseEverything = function(options) {
3466
+ var ctx;
3467
+ ctx = $(this).data('ev-state');
3468
+ if (!((ctx != null) || (options != null))) {
3469
+ options = $(this).data();
3470
+ }
3471
+ if (options != null) {
3472
+ ctx = initialize(this[0], options);
3473
+ $(this).click(function() {
3474
+ dialog.data('ev-state', ctx);
3475
+ return dialog.load(ctx.opts.route, function() {
3476
+ setTimeout(refreshFiles, 500);
3477
+ ctx.callbacks.show.fire();
3478
+ return dialog.modal('show');
3479
+ });
3480
+ });
3481
+ }
3482
+ if (ctx) {
3483
+ return ctx.callback_proxy;
3484
+ } else {
3485
+ return {
3486
+ show: function() {
3487
+ return this;
3488
+ },
3489
+ done: function() {
3490
+ return this;
3491
+ },
3492
+ cancel: function() {
3493
+ return this;
3494
+ },
3495
+ fail: function() {
3496
+ return this;
3497
+ }
3498
+ };
3499
+ }
3500
+ };
3501
+ $.fn.browseEverything.toggleCheckbox = function(box) {
3502
+ if (box.value === "0") {
3503
+ return $(box).prop('value', "1");
3504
+ } else {
3505
+ return $(box).prop('value', "0");
3506
+ }
3507
+ };
3508
+ $(document).on('ev.refresh', function(event) {
3509
+ return refreshFiles();
3510
+ });
3511
+ $(document).on('click', 'button.ev-cancel', function(event) {
3512
+ event.preventDefault();
3513
+ dialog.data('ev-state').callbacks.cancel.fire();
3514
+ return $('.ev-browser').modal('hide');
3515
+ });
3516
+ $(document).on('click', 'button.ev-submit', function(event) {
3517
+ var ctx, main_form, resolver_url;
3518
+ event.preventDefault();
3519
+ $(this).button('loading');
3520
+ startWait();
3521
+ main_form = $(this).closest('form');
3522
+ resolver_url = main_form.data('resolver');
3523
+ ctx = dialog.data('ev-state');
3524
+ $(main_form).find('input[name=context]').val(ctx.opts.context);
3525
+ return $.ajax(resolver_url, {
3526
+ type: 'POST',
3527
+ dataType: 'json',
3528
+ data: main_form.serialize()
3529
+ }).done(function(data) {
3530
+ var fields;
3531
+ if (ctx.opts.target != null) {
3532
+ fields = toHiddenFields({
3533
+ selected_files: data
3534
+ });
3535
+ $(ctx.opts.target).append($(fields));
3536
+ }
3537
+ return ctx.callbacks.done.fire(data);
3538
+ }).fail(function(xhr, status, error) {
3539
+ return ctx.callbacks.fail.fire(status, error, xhr.responseText);
3540
+ }).always(function() {
3541
+ $('body').css('cursor', 'default');
3542
+ $('.ev-browser').modal('hide');
3543
+ return $('#browse-btn').focus();
3544
+ });
3545
+ });
3546
+ $(document).on('click', '.ev-files .ev-container a.ev-link', function(event) {
3547
+ var action, node_id, row;
3548
+ event.stopPropagation();
3549
+ event.preventDefault();
3550
+ row = $(this).closest('tr');
3551
+ action = row.hasClass('expanded') ? 'collapseNode' : 'expandNode';
3552
+ node_id = $(this).attr('href');
3553
+ return $('table#file-list').treetable(action, node_id);
3554
+ });
3555
+ $(document).on('change', '.ev-providers select', function(event) {
3556
+ event.preventDefault();
3557
+ startWait();
3558
+ return $.ajax({
3559
+ url: $(this).val(),
3560
+ data: {
3561
+ accept: dialog.data('ev-state').opts.accept,
3562
+ context: dialog.data('ev-state').opts.context
3563
+ }
3564
+ }).done(function(data) {
3565
+ $('.ev-files').html(data);
3566
+ indicateSelected();
3567
+ $('#provider_auth').focus();
3568
+ return tableSetup($('table#file-list'));
3569
+ }).fail(function(xhr, status, error) {
3570
+ if (xhr.responseText.indexOf("Refresh token has expired") > -1) {
3571
+ return $('.ev-files').html("Your sessison has expired please clear your cookies.");
3572
+ } else {
3573
+ return $('.ev-files').html(xhr.responseText);
3574
+ }
3575
+ }).always(function() {
3576
+ return stopWait();
3577
+ });
3578
+ });
3579
+ $(document).on('click', '.ev-providers a', function(event) {
3580
+ $('.ev-providers li').removeClass('ev-selected');
3581
+ return $(this).closest('li').addClass('ev-selected');
3582
+ });
3583
+ $(document).on('click', '.ev-file a', function(event) {
3584
+ var target;
3585
+ event.preventDefault();
3586
+ target = $(this).closest('*[data-ev-location]');
3587
+ return toggleFileSelect(target);
3588
+ });
3589
+ $(document).on('click', '.ev-auth', function(event) {
3590
+ var auth_win, check_func;
3591
+ event.preventDefault();
3592
+ auth_win = window.open($(this).attr('href'));
3593
+ check_func = function() {
3594
+ if (auth_win.closed) {
3595
+ return $('.ev-providers .ev-selected a').click();
3596
+ } else {
3597
+ return window.setTimeout(check_func, 1000);
3598
+ }
3599
+ };
3600
+ return check_func();
3601
+ });
3602
+ $(document).on('change', 'input.ev-select-all', function(event) {
3603
+ var action, node_id, row;
3604
+ event.stopPropagation();
3605
+ event.preventDefault();
3606
+ $.fn.browseEverything.toggleCheckbox(this);
3607
+ action = this.value;
3608
+ row = $(this).closest('tr');
3609
+ node_id = row.find('td.ev-file-name a.ev-link').attr('href');
3610
+ if (row.hasClass('collapsed')) {
3611
+ return $('table#file-list').treetable('expandNode', node_id);
3612
+ } else {
3613
+ return selectChildRows(row, action);
3614
+ }
3615
+ });
3616
+ return $(document).on('change', 'input.ev-select-file', function(event) {
3617
+ event.stopPropagation();
3618
+ event.preventDefault();
3619
+ return toggleFileSelect($(this).closest('tr'));
3620
+ });
3621
+ });
3622
+
3623
+ auto_toggle = function() {
3624
+ var triggers;
3625
+ triggers = $('*[data-toggle=browse-everything]');
3626
+ return triggers.each(function() {
3627
+ var ctx;
3628
+ ctx = $(this).data('ev-state');
3629
+ if (ctx == null) {
3630
+ return $(this).browseEverything($(this).data());
3631
+ }
3632
+ });
3633
+ };
3634
+
3635
+ if ((typeof Turbolinks !== "undefined" && Turbolinks !== null) && Turbolinks.supported) {
3636
+ if (Turbolinks.BrowserAdapter) {
3637
+ $(document).on('turbolinks:load', auto_toggle);
3638
+ } else {
3639
+ $(document).on('page:change', auto_toggle);
3640
+ }
3641
+ } else {
3642
+ $(document).ready(auto_toggle);
3643
+ }
3644
+
3645
+ }).call(this);
3646
+
3647
+
3648
+