Download Monitor - Version 4.4.5

Version Description

  • 20.10.2021 = Fixed: PHP 8 bug - slow query ( https://github.com/WPChill/download-monitor/issues/685 ) Fixed: Deprecated PHP 8 notice (https://github.com/WPChill/download-monitor/issues/682 thanks to @ashleyfae ) Fixed: PHP templates errors ( https://github.com/WPChill/download-monitor/issues/691 ) Fixed: Single shop download error ( https://github.com/WPChill/download-monitor/issues/690 ) Fixed: Permalink errors - retrieved permalinks on archives didn't show the correct URL ( https://github.com/WPChill/download-monitor/issues/689 ) Fixed : [downloads] shortcode now displays both featured and not featured downloads when left as is ( thanks to @kadimi https://github.com/WPChill/download-monitor/pull/526 ) Added : Size filter in the placeholder image ( thanks to @jamesgol https://github.com/WPChill/download-monitor/pull/507 ) Fixed : Sha256 support added when new files are added ( thanks to @jamesgol https://github.com/WPChill/download-monitor/pull/633 ) Added: Upsells Fixed: Fix download from CDN where uploads folder is replaced ( https://github.com/WPChill/download-monitor/issues/698 ) Fixed: Fatal error on URL with version param ( https://github.com/WPChill/download-monitor/issues/709 ) Changed: Notice display Changed: Tab reconstruction and settings structure Changed: TinyMCE interface for short description ( https://github.com/WPChill/download-monitor/issues/708 ) Fixed : Added layer of security against certain SQL Injections
Download this release

Release Info

Developer giucu91
Plugin Icon 128x128 Download Monitor
Version 4.4.5
Comparing to
See all releases

Code changes from version 4.4.4 to 4.4.5

Files changed (107) hide show
  1. README.md +0 -20
  2. assets/css/admin.css +1609 -1
  3. assets/css/admin.less +182 -2
  4. assets/css/dlm-uninstall.css +1 -0
  5. assets/images/filetypes/document-code.png +0 -0
  6. assets/images/filetypes/document-excel.png +0 -0
  7. assets/images/filetypes/document-film.png +0 -0
  8. assets/images/filetypes/document-flash-movie.png +0 -0
  9. assets/images/filetypes/document-illustrator.png +0 -0
  10. assets/images/filetypes/document-image.png +0 -0
  11. assets/images/filetypes/document-music.png +0 -0
  12. assets/images/filetypes/document-pdf.png +0 -0
  13. assets/images/filetypes/document-photoshop.png +0 -0
  14. assets/images/filetypes/document-powerpoint.png +0 -0
  15. assets/images/filetypes/document-text-image.png +0 -0
  16. assets/images/filetypes/document-text.png +0 -0
  17. assets/images/filetypes/document-word-text.png +0 -0
  18. assets/images/filetypes/document-zipper.png +0 -0
  19. assets/images/filetypes/document.png +0 -0
  20. assets/images/filetypes/readme.txt +0 -0
  21. assets/js/chosen/chosen-sprite.png +0 -0
  22. assets/js/chosen/chosen-sprite@2x.png +0 -0
  23. assets/js/chosen/chosen.css +0 -0
  24. assets/js/chosen/chosen.jquery.js +0 -0
  25. assets/js/chosen/chosen.jquery.min.js +0 -0
  26. assets/js/dlm-uninstall.js +70 -0
  27. assets/js/dlm-uninstall.min.js +1 -0
  28. assets/js/edit-download.js +1 -1
  29. assets/js/edit-download.min.js +1 -1
  30. assets/js/legacy-upgrader/.babelrc +0 -11
  31. assets/js/legacy-upgrader/build/assets/.gitkeep +0 -0
  32. assets/js/legacy-upgrader/src/assets/.gitkeep +0 -0
  33. assets/js/legacy-upgrader/src/index.js +0 -0
  34. assets/js/legacy-upgrader/src/lib/.gitkeep +0 -0
  35. assets/js/legacy-upgrader/src/style/index.less +0 -0
  36. assets/js/reports/charts.min.js +13 -0
  37. assets/js/reports/reports.js +99 -37
  38. assets/views/meta-box/version.php +2 -1
  39. download-monitor.php +43 -2
  40. includes/admin/class-dlm-upsells.php +642 -0
  41. includes/admin/uninstall/class-dlm-uninstall.php +271 -0
  42. includes/bootstrap.php +3 -0
  43. includes/deprecated.php +5 -5
  44. includes/tracking/class-download-monitor-usage-tracker.php +1303 -0
  45. package-lock.json +0 -6791
  46. readme.txt +19 -2
  47. src/Admin/Admin.php +43 -11
  48. src/Admin/AdminScripts.php +14 -12
  49. src/Admin/Extensions.php +416 -106
  50. src/Admin/MediaInsert.php +1 -0
  51. src/Admin/Reports/Ajax.php +6 -46
  52. src/Admin/Reports/Chart.php +1 -1
  53. src/Admin/Reports/Page.php +19 -18
  54. src/Admin/Settings/Page.php +174 -146
  55. src/Admin/Settings/Settings.php +247 -187
  56. src/Admin/WritePanels.php +59 -18
  57. src/Admin/class-dlm-admin-helper.php +110 -0
  58. src/DLM.php +31 -0
  59. src/Download/Download.php +9 -2
  60. src/Download/WordPressDownloadRepository.php +10 -3
  61. src/DownloadHandler.php +9 -5
  62. src/FileManager.php +6 -0
  63. src/Gutenberg.php +25 -15
  64. src/Libs/uaparser/CHANGELOG +0 -169
  65. src/Libs/uaparser/LICENSE +0 -11
  66. src/Libs/uaparser/README.md +0 -125
  67. src/Libs/uaparser/lib/spyc-0.5/COPYING +0 -21
  68. src/Libs/uaparser/lib/spyc-0.5/README +0 -159
  69. src/Libs/uaparser/lib/spyc-0.5/examples/yaml-dump.php +0 -25
  70. src/Libs/uaparser/lib/spyc-0.5/examples/yaml-load.php +0 -21
  71. src/Libs/uaparser/lib/spyc-0.5/spyc.php +0 -1046
  72. src/Libs/uaparser/lib/spyc-0.5/spyc.yaml +0 -203
  73. src/Libs/uaparser/lib/spyc-0.5/tests/DumpTest.php +0 -130
  74. src/Libs/uaparser/lib/spyc-0.5/tests/IndentTest.php +0 -65
  75. src/Libs/uaparser/lib/spyc-0.5/tests/ParseTest.php +0 -322
  76. src/Libs/uaparser/lib/spyc-0.5/tests/RoundTripTest.php +0 -61
  77. src/Libs/uaparser/lib/spyc-0.5/tests/failing1.yaml +0 -2
  78. src/Libs/uaparser/lib/spyc-0.5/tests/indent_1.yaml +0 -59
  79. src/Libs/uaparser/lib/spyc-0.5/tests/quotes.yaml +0 -8
  80. src/Libs/uaparser/log/.gitignore +0 -2
  81. src/Libs/uaparser/log/README.md +0 -1
  82. src/Libs/uaparser/resources/regexes.json +0 -1205
  83. src/Libs/uaparser/uaparser.php +0 -308
  84. src/Logs/LogPage.php +15 -6
  85. src/Logs/LoggingListTable.php +2 -14
  86. src/PostTypeManager.php +50 -0
  87. src/Product/Product.php +51 -48
  88. src/Product/ProductManager.php +12 -43
  89. src/Shop/Admin/OrderTable.php +2 -2
  90. src/Shop/Admin/Pages/Orders.php +14 -7
  91. src/Shop/Checkout/PaymentGateway/PayPal/ExecutePaymentListener.php +2 -2
  92. src/Shop/Product/Product.php +19 -7
  93. src/Shop/Shortcode/Checkout.php +2 -2
  94. src/Shortcodes.php +9 -10
  95. templates/content-download-box.php +1 -2
  96. templates/content-download-button.php +1 -1
  97. templates/content-download-filename.php +0 -1
  98. templates/content-download-no-version.php +0 -1
  99. templates/content-download-title.php +0 -1
  100. templates/content-download-version-list.php +0 -2
  101. templates/content-download.php +2 -2
  102. templates/no-access.php +2 -0
  103. templates/shop/button/add-to-cart-box.php +1 -1
  104. templates/shop/button/add-to-cart.php +1 -1
  105. templates/shop/content-single-product.php +4 -6
  106. vendor/composer/autoload_classmap.php +2 -6
  107. vendor/composer/autoload_static.php +2 -6
README.md DELETED
@@ -1,20 +0,0 @@
1
- # [Download Monitor](https://www.download-monitor.com/)
2
- [![Build Status](https://travis-ci.org/download-monitor/download-monitor.svg?branch=master)](https://travis-ci.org/download-monitor/download-monitor)
3
- [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/download-monitor/download-monitor/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/download-monitor/download-monitor/?branch=master)
4
- [![codecov](https://codecov.io/gh/download-monitor/download-monitor/branch/master/graph/badge.svg)](https://codecov.io/gh/download-monitor/download-monitor)
5
-
6
- Welcome to the Download Monitor repository on GitHub. Here you can browse the source, look at open issues and keep track of development.
7
-
8
- If you are not a developer, please use the [Download Monitor plugin page](https://wordpress.org/plugins/download-monitor/) on WordPress.org.
9
-
10
- ## Reporting Security Issues
11
- To disclose a security issue to our team, [please submit a report via our website here](https://www.download-monitor.com/contact/).
12
-
13
- ## Support
14
- This repository is not suitable for support. Please don't use our issue tracker for support requests, but for core Download Monitor issues only. Support can take place through the appropriate channels:
15
-
16
- * The [Download Monitor premium support](https://www.download-monitor.com/contact/) for customers who have purchased extensions.
17
- * [Our community forum on wp.org](https://wordpress.org/support/plugin/download-monitor) which is available for all Download Monitor users.
18
- * [Download Monitor Documentation Page](https://www.download-monitor.com/kb/)
19
-
20
- Support requests in issues on this repository will be closed.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/css/admin.css CHANGED
@@ -1 +1,1609 @@
1
- .post-type-dlm_download h1 a.dlm-delete-logs{color:#a00}.post-type-dlm_download h1 a.dlm-delete-logs:hover{color:#fff;background:#a00;border-color:#7c0900}#dlm_logs td{padding:7px 7px;vertical-align:middle}#dlm_logs .check-column{width:1.5em;padding:0;vertical-align:middle}#dlm_logs .column-status{width:2em}#dlm_logs td.column-status{font-size:10px;vertical-align:middle;text-align:center}#dlm_logs td.column-status span{color:#fff;font-weight:400;-moz-border-radius:50%;-webkit-border-radius:50%;border-radius:50%;height:18px;line-height:18px;width:18px;display:inline-block;background:url(../images/log-status-icons.png) top left no-repeat}#dlm_logs td.column-status .completed{background-color:#6cc644}#dlm_logs td.column-status .failed{background-color:#bd2c00;background-position-y:-18px}#dlm_logs td.column-status .redirected{background-color:#1c769b;background-position-y:-36px}#dlm_logs td.column-user_agent,#dlm_logs td.column-user_ip{font-family:monospace;font-weight:400}#dlm_logs span.dlm-description{font-weight:400}#dlm_logs .column-download,#dlm_logs .column-file,#dlm_logs .column-user,#dlm_logs .column-user_ua{width:16%!important}#dlm_logs .column-date,#dlm_logs .column-user_ip{width:6%!important}.post-type-dlm_download .inline-edit-row .inline-edit-col-dlm .inline-edit-col-dlm-inner{margin-top:10px}.nav-section-wrapper{padding:0;margin:0}.nav-section-wrapper li{display:inline-block;padding:0 0 0 2px;margin:0 2px}.nav-section-wrapper li a{text-decoration:none}.nav-section-wrapper li.active-section a{font-weight:700;color:#000}.nav-section-wrapper li:after{content:"|";padding-left:7px}.nav-section-wrapper li:last-child:after{content:"";padding:0}.dlm-admin-settings #setting-dlm_decimal_separator,.dlm-admin-settings #setting-dlm_thousand_separator{width:50px}.dlm-admin-settings table td{padding:15px 0}.dlm-admin-settings h3{margin:2em 0 0}ul.download_monitor_file_browser{list-style:none outside;margin:0;border:1px solid #ddd;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:#f9f9f9;padding:5px 5px;-moz-box-shadow:inset 0 0 0 1px #fff;-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}ul.download_monitor_file_browser li{padding:0;margin:0}ul.download_monitor_file_browser li a{color:#21759b;display:block;padding:4px 0 4px 4px;text-decoration:none}ul.download_monitor_file_browser li a:hover{background-color:#eaf2fa}ul.download_monitor_file_browser li a:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f123";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}ul.download_monitor_file_browser li a.folder:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f318";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}ul.download_monitor_file_browser li a.filetype-3g2:before,ul.download_monitor_file_browser li a.filetype-3gp:before,ul.download_monitor_file_browser li a.filetype-asf:before,ul.download_monitor_file_browser li a.filetype-asx:before,ul.download_monitor_file_browser li a.filetype-avi:before,ul.download_monitor_file_browser li a.filetype-mov:before,ul.download_monitor_file_browser li a.filetype-mp4:before,ul.download_monitor_file_browser li a.filetype-mpg:before,ul.download_monitor_file_browser li a.filetype-rm:before,ul.download_monitor_file_browser li a.filetype-srt:before,ul.download_monitor_file_browser li a.filetype-vob:before,ul.download_monitor_file_browser li a.filetype-wmv:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f126";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}ul.download_monitor_file_browser li a.filetype-aif:before,ul.download_monitor_file_browser li a.filetype-iff:before,ul.download_monitor_file_browser li a.filetype-m3u:before,ul.download_monitor_file_browser li a.filetype-m4a:before,ul.download_monitor_file_browser li a.filetype-mid:before,ul.download_monitor_file_browser li a.filetype-midi:before,ul.download_monitor_file_browser li a.filetype-mp3:before,ul.download_monitor_file_browser li a.filetype-mpa:before,ul.download_monitor_file_browser li a.filetype-ra:before,ul.download_monitor_file_browser li a.filetype-wav:before,ul.download_monitor_file_browser li a.filetype-wma:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f127";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}ul.download_monitor_file_browser li a.filetype-ai:before,ul.download_monitor_file_browser li a.filetype-bmp:before,ul.download_monitor_file_browser li a.filetype-dds:before,ul.download_monitor_file_browser li a.filetype-eps:before,ul.download_monitor_file_browser li a.filetype-gif:before,ul.download_monitor_file_browser li a.filetype-ico:before,ul.download_monitor_file_browser li a.filetype-jpeg:before,ul.download_monitor_file_browser li a.filetype-jpg:before,ul.download_monitor_file_browser li a.filetype-png:before,ul.download_monitor_file_browser li a.filetype-ps:before,ul.download_monitor_file_browser li a.filetype-psd:before,ul.download_monitor_file_browser li a.filetype-pspimage:before,ul.download_monitor_file_browser li a.filetype-svg:before,ul.download_monitor_file_browser li a.filetype-tga:before,ul.download_monitor_file_browser li a.filetype-thm:before,ul.download_monitor_file_browser li a.filetype-tif:before,ul.download_monitor_file_browser li a.filetype-yuv:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f128";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}ul.download_monitor_file_browser li.nofiles{color:#999;font-style:italic;padding:4px 0}ul.download_monitor_file_browser li ul{list-style:none outside;margin:0;padding:0 0 0 28px}ul.download_monitor_file_browser li ul.loading{background:url(../images/ajax-loader.gif) no-repeat 24px 0;height:32px}table.wp-list-table .column-thumb{width:44px;text-align:center;white-space:nowrap}table.wp-list-table .column-dlm_download_cat,table.wp-list-table .column-dlm_download_tag,table.wp-list-table .column-file{width:11%!important}table.wp-list-table .column-file,table.wp-list-table .column-title{width:17%!important}table.wp-list-table .column-download_id,table.wp-list-table .column-version{width:5em}table.wp-list-table th.column-download_count span:first-child,table.wp-list-table th.column-featured span:first-child,table.wp-list-table th.column-members_only span:first-child,table.wp-list-table th.column-redirect_only span:first-child,table.wp-list-table th.column-thumb span:first-child{float:none;display:inline-block;width:1em;height:1em;line-height:1em;padding:2px 0 0 0;overflow:hidden}table.wp-list-table th.column-download_count .sorting-indicator,table.wp-list-table th.column-featured .sorting-indicator,table.wp-list-table th.column-members_only .sorting-indicator,table.wp-list-table th.column-redirect_only .sorting-indicator,table.wp-list-table th.column-thumb .sorting-indicator{float:right}table.wp-list-table th.column-thumb{width:52px;text-align:center}table.wp-list-table th.column-thumb span:first-child:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f128";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}table.wp-list-table th.column-download_count{width:5em}table.wp-list-table th.column-download_count span:first-child:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f346";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}table.wp-list-table th.column-members_only{width:3.5em}table.wp-list-table th.column-members_only span:first-child:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f338";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}table.wp-list-table th.column-redirect_only{width:3.5em}table.wp-list-table th.column-redirect_only span:first-child:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f103";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}table.wp-list-table th.column-featured{width:3.5em}table.wp-list-table th.column-featured span:first-child:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f155";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}table.wp-list-table td.column-download_count,table.wp-list-table td.column-featured,table.wp-list-table td.column-members_only,table.wp-list-table td.column-redirect_only{text-align:left;padding-left:11px}table.wp-list-table td.column-download_count span.na,table.wp-list-table td.column-featured span.na,table.wp-list-table td.column-members_only span.na,table.wp-list-table td.column-redirect_only span.na{color:#999;width:1em;height:1em;line-height:1em;display:inline-block;overflow:hidden;vertical-align:middle}table.wp-list-table td.column-download_count span.na:before,table.wp-list-table td.column-featured span.na:before,table.wp-list-table td.column-members_only span.na:before,table.wp-list-table td.column-redirect_only span.na:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f460";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}table.wp-list-table td.column-download_count span.yes,table.wp-list-table td.column-featured span.yes,table.wp-list-table td.column-members_only span.yes,table.wp-list-table td.column-redirect_only span.yes{width:1em;height:1em;line-height:1em;display:inline-block;overflow:hidden;vertical-align:middle}table.wp-list-table td.column-download_count span.yes:before,table.wp-list-table td.column-featured span.yes:before,table.wp-list-table td.column-members_only span.yes:before,table.wp-list-table td.column-redirect_only span.yes:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f147";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}table.wp-list-table .column-thumb img{padding:2px;margin:0;border:1px solid #dfdfdf;vertical-align:middle;width:32px;height:32px}#download-monitor-file .inside{padding:0;margin:0}#download-monitor-file .dlm-metaboxes-wrapper .close_all,#download-monitor-file .dlm-metaboxes-wrapper .expand_all{float:right;margin-left:1em;line-height:22px;text-decoration:none}#download-monitor-file .dlm-metaboxes-wrapper .expand_all:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f168";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}#download-monitor-file .dlm-metaboxes-wrapper .close_all:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f460";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}#download-monitor-file .dlm-metaboxes-wrapper p.toolbar{margin:0!important;border-top:1px solid #fff;border-bottom:1px solid #dfdfdf;padding:7px 12px!important;overflow:hidden;zoom:1}#download-monitor-file .dlm-metaboxes-wrapper p.toolbar a.button{float:left;margin:0}#download-monitor-file .dlm-metaboxes-wrapper .fr,#download-monitor-file .dlm-metaboxes-wrapper button.add_attribute,#download-monitor-file .dlm-metaboxes-wrapper button.add_variable_attribute,#download-monitor-file .dlm-metaboxes-wrapper select.attribute_taxonomy{float:right;margin:0 0 0 6px}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metaboxes{padding:0 12px 0}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox-sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;margin:9px 0;border-width:1px;border-style:dashed}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox{background:#ececec;border:1px solid #ececec;margin:9px 0!important}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox h3{margin:0!important;padding:6px!important;font-size:1em!important;overflow:hidden;zoom:1;cursor:move}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox h3 button{float:right}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox h3 strong{font-weight:400;line-height:24px}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox h3 select{font-family:sans-serif}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox h3 .handlediv{background-position:6px 5px!important;display:none;height:24px}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox:hover h3 .handlediv{display:block}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table{width:100%;position:relative;background:#fff;padding:3px}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td{text-align:left;padding:6px 6px;vertical-align:top;border:0;line-height:26px}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td label{text-align:left;display:block;line-height:21px}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input{float:left;min-width:200px}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input,#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td textarea{width:100%;margin:0;display:block;font-size:14px;padding:4px;color:#555}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td textarea{height:7.5em}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td select{width:100%}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input.short{width:200px}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input.checkbox{width:auto;min-width:inherit;vertical-align:middle;display:inline;float:none}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input.date-picker-field{width:50%;min-width:inherit;float:none;display:inline}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input.hour,#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input.minute{width:2em;min-width:inherit;float:none;display:inline}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td.attribute_name{width:200px}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table .minus,#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table .plus{margin-top:6px}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table .fl{float:left}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table .fr{float:right}#download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox:first-child h3{background:#eaf2fa;background-image:linear-gradient(bottom,#dae6f2 0,#eaf2fa 100%);background-image:-o-linear-gradient(bottom,#dae6f2 0,#eaf2fa 100%);background-image:-moz-linear-gradient(bottom,#dae6f2 0,#eaf2fa 100%);background-image:-webkit-linear-gradient(bottom,#dae6f2 0,#eaf2fa 100%);background-image:-ms-linear-gradient(bottom,#dae6f2 0,#eaf2fa 100%);background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#dae6f2),color-stop(1,#eaf2fa));border-color:#d3deea;color:#21759b}#download-monitor-file .dlm-metaboxes-wrapper .plus:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f132";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}#download-monitor-file .dlm-metaboxes-wrapper .minus:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f460";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}#download-monitor-file .dlm-metaboxes-wrapper .dlm_upload_file:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f317";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}#download-monitor-file .dlm-metaboxes-wrapper .dlm_browse_for_file:before{font-family:dashicons!important;speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0 4px 0 0;content:"\f322";top:1px;left:-1px;font-size:1em;line-height:inherit;position:relative;vertical-align:top}#download-monitor-information p{overflow:hidden}#download-monitor-information p label{width:100%;font-weight:700;box-sizing:border-box;line-height:28px;float:left}#download-monitor-information p label input{width:65%;padding:5px;font-size:11px;font-weight:400;background:#eaeaea;border:0;box-shadow:none;box-sizing:border-box;float:right}#download-monitor-options .inside{padding:0;margin:0}#download-monitor-options .form-field-checkbox label{display:inline;padding:0 0 4px}#download-monitor-options .form-field-checkbox input{display:inline-block;width:auto;vertical-align:middle}#download-monitor-options .form-field-checkbox .dlm-description{padding:4px 0 0 0;display:block}#download-monitor-options .access_permissions{margin:0!important;border-top:1px solid #fff;border-bottom:1px solid #dfdfdf;padding:7px 12px!important;overflow:hidden;zoom:1}#download-monitor-options .access_permissions h4{margin-bottom:.5em;margin:0 0 .5em}#download-monitor-options .access_permissions ul{background:#fff;border:1px solid #dfdfdf;height:110px;overflow:auto;padding:.5em .9em;margin:0}#download-monitor-options p{margin:0!important;border-top:1px solid #fff;border-bottom:1px solid #dfdfdf;padding:7px 12px!important;overflow:hidden;zoom:1}#insert-download{padding:20px 20px}#insert-download #drag-drop-area,#insert-download #insert-shortcode{margin:1em 0}#insert-download .error,#insert-download .updated{margin-left:0;margin-right:0}#insert-download h2{margin-top:0}#insert-download label{margin:0 0 .25em 0;display:block;font-size:1.1em}#insert-download span.description{display:block}#insert-download input.input{margin:0 0 .25em 0;display:block;width:100%;font-size:1.1em}#insert-download .add_link{float:right}#insert-download ul.page-numbers{overflow:hidden;zoom:1;margin:0 auto;padding:0;text-align:center}#insert-download ul.page-numbers li{display:inline-block;margin:0;list-style:none outside;line-height:1em}#insert-download ul.page-numbers li a,#insert-download ul.page-numbers li span{text-decoration:none;border:1px solid #ddd;-webkit-border-radius:4px;border-radius:4px;padding:8px;display:block}#insert-download ul.page-numbers li span{border-color:#eee}#insert-download legend{font-weight:700;display:block;margin:0 0 1em}#insert-download fieldset label{display:block;margin:0 0 .5em}.dlm-code-nginx-rules{display:block}.settings_panel .form-table td{padding-left:0}.settings_panel .dlm-lazy-select-loader{display:inline-block;vertical-align:middle;padding:0 0 0 3px}.settings_panel .dlm-lazy-select-loader img{display:inline-block;height:25px;width:25px;margin-top:1px}.dlm-reports h1 .dlm-reports-actions{float:right}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector,.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-period,.dlm-reports h1 .dlm-reports-actions a.dlm-reports-header-chart-switcher{margin:0 5px;float:left}.dlm-reports h1 .dlm-reports-actions>:last-child{margin-right:0}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector{position:relative;font-size:14px;padding:0 .5em 0 1em;background:#fff;border:1px solid #ccc;border-radius:3px;user-select:none;cursor:pointer}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm-arrow:before{font-family:dashicons!important;content:"\f140";font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;font-size:1.6em;vertical-align:middle;margin-top:-2px}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay{display:block;width:466px;padding:10px;background:#fff;border:1px solid #ccc;position:absolute;top:30px;right:0;z-index:10;overflow:hidden}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date{font-size:70%;margin-right:5px;float:left;z-index:11}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline{border:0}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline .ui-state-highlight{background:#e6e6e6 url(../images/jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;color:#555;border:1px solid #d3d3d3}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline .ui-state-active{border:1px solid #aaa;background:#fff url(../images/jquery-ui/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline td,.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline th{padding:0;margin:0;line-height:2em}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline td a,.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline th a{text-align:center!important}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_actions{width:70px;padding-left:10px;text-align:center;float:left}.dlm-reports h1 .dlm-reports-actions a.dlm-reports-header-chart-switcher{display:block;margin-top:1px;padding-top:4px;color:#23282d;text-decoration:none}.dlm-reports h1 .dlm-reports-actions a.dlm-reports-header-chart-switcher:before{font-family:dashicons!important;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;font-size:1.4em}.dlm-reports h1 .dlm-reports-actions a.dlm-reports-header-chart-switcher.dlm-line:before{content:"\f238"}.dlm-reports h1 .dlm-reports-actions a.dlm-reports-header-chart-switcher.dlm-bar:before{content:"\f185"}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-period a{border-color:#ccc!important}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-period a:first-child{border-bottom-right-radius:0;border-top-right-radius:0;border-right:0}.dlm-reports h1 .dlm-reports-actions .dlm-reports-header-period a:last-child{border-bottom-left-radius:0;border-top-left-radius:0;border-left:0}.dlm-reports .dlm_reports_loader{position:absolute;width:32px;height:32px;top:50%;left:50%;margin:-16px 0 0 -16px}.dlm-reports .dlm-reports-block-chart{width:100%;height:300px;margin-top:20px;background:#fff;border:1px solid #e5e5e5;overflow:hidden}.dlm-reports .dlm-reports-block-chart .chart-container h6{display:none}.dlm-reports .dlm-reports-block-summary #popular span{line-height:1em}.dlm-reports .dlm-reports-block{position:relative;box-sizing:border-box;width:100%;padding:20px 10px;margin-top:20px;background:#fff;border:1px solid #e5e5e5;overflow:hidden;float:left}.dlm-reports .dlm-reports-block.dlm-reports-block-half{width:49%;margin-right:1%}.dlm-reports .dlm-reports-block.dlm-reports-block-half-right{width:49%;margin-left:1%}.dlm-reports .dlm-reports-block .dlm-reports-placeholder-no-data{display:inline-block;width:100%;font-size:1.5em;color:#b4b9be;font-style:italic;text-align:center}.dlm-reports .dlm-reports-block ul{box-sizing:border-box;width:100%;padding:0;margin:0}.dlm-reports .dlm-reports-block ul li{display:inline-block;width:33%;padding:5px 0}.dlm-reports .dlm-reports-block ul li label,.dlm-reports .dlm-reports-block ul li span{display:block;width:100%;text-align:center}.dlm-reports .dlm-reports-block ul li span{font-size:2.5em;font-weight:700;padding:.5em 0 0}.dlm-reports .dlm-reports-block table{width:100%}.dlm-reports .dlm-reports-block table td,.dlm-reports .dlm-reports-block table th{text-align:center;padding:10px 0;border-bottom:1px solid #e5e5e5}.dlm-reports .dlm-reports-block table td:first-child,.dlm-reports .dlm-reports-block table th:first-child{text-align:left}.dlm-reports .dlm-reports-block table th{padding-bottom:20px}.post-type-dlm_product table.wp-list-table .column-title{width:65%!important}.dlm_mb_shop_product_information .dlm_shop_field_row{width:100%;overflow:hidden}.dlm_mb_shop_product_information .dlm_shop_field_row label.dlm_shop_field_label{display:inline-block;width:20%;height:100%;line-height:2.2em;float:left}.dlm_mb_shop_product_information .dlm_shop_field_row span.dlm_shop_field_input{display:inline-block;width:50%;float:left}.dlm_mb_shop_product_information .dlm_shop_field_row span.dlm_shop_field_input .dlm_shop_input{width:100%;padding:5px 7px}.dlm_mb_shop_product_information .dlm_shop_field_row span.dlm_shop_field_input .select2-selection--multiple{border:1px solid #ddd}.dlm_mb_shop_product_information .dlm_shop_field_row span.dlm_shop_field_input .select2-search,.dlm_mb_shop_product_information .dlm_shop_field_row span.dlm_shop_field_input .select2-selection__choice{margin-bottom:0}.dlm_mb_shop_product_information .dlm_shop_field_row span.dlm_shop_field_input .select2-search__field{padding-top:3px}.dlm-order-overview #dlm_empty_trash{margin-left:3px}.dlm-order-overview .wp-list-table td .column-id{width:25%}.dlm-order-details{max-width:1250px;margin-left:auto;margin-right:auto;padding-right:20px}.dlm-order-details h1{padding-bottom:25px}.dlm-order-details .dlm-order-details-main,.dlm-order-details .dlm-order-details-side{width:100%;float:left}.dlm-order-details .dlm-order-details-block{padding:0;margin-bottom:20px;line-height:1;border:1px solid #e5e5e5;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,.04)}.dlm-order-details .dlm-order-details-block h2.dlm-order-details-block-title{font-size:14px;padding:8px 12px;margin:0;line-height:1.4;border-bottom:1px solid #eee}.dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside{margin:6px 0 0 0;padding:6px 12px 12px;line-height:1.4em;font-size:13px}.dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside label{display:block;font-weight:700;padding-bottom:6px}.dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside p{padding:0;margin:0}.dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside ul,.dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside ul li{list-style:none;padding:0;margin:0}.dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside ul li{padding:6px 0}.dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside .dlm-order-details-current-state{width:70%;height:30px}.dlm-order-details .dlm-order-details-block.dlm-order-details-customer .dlm-order-details-customer-image{float:right}.dlm-order-details .dlm-order-details-block.dlm-order-details-customer ul li{margin-bottom:4px;padding:0}.dlm-order-details .dlm-order-details-block.dlm-order-details-customer ul li:first-child{font-weight:700}.dlm-order-details .dlm-order-details-block.dlm-order-details-order-items{overflow:hidden}.dlm-order-details .dlm-order-details-block.dlm-order-details-order-items .dlm-order-details-overview{width:25%;float:right}.dlm-order-details .dlm-order-details-block.dlm-order-details-order-items .dlm-order-details-overview td,.dlm-order-details .dlm-order-details-block.dlm-order-details-order-items .dlm-order-details-overview th{padding-top:1.5em;padding-bottom:1.5em;text-align:right}.dlm-order-details .dlm-order-details-block.dlm-order-details-order-items .dlm-order-details-overview th{width:50%;font-weight:400}.dlm-order-details .dlm-order-details-block.dlm-order-details-order-items .dlm-order-details-overview td{padding-right:1em;font-weight:700}.dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table{width:100%}.dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table td,.dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table th{text-align:center}.dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table td:first-child,.dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table th:first-child{text-align:left;padding-left:.5em}.dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table th{padding-top:.5em;padding-bottom:.5em;border-bottom:2px solid #c3c1bc}.dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table td{padding-top:1.5em;padding-bottom:1.5em;border-bottom:1px solid #c3c1bc}.dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table td.dlm-order-details-order-items-item-total,.dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table th.dlm-order-details-order-items-item-total{text-align:right;padding-right:1em}.dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table td.dlm-order-transaction-processor-id,.dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table th.dlm-order-transaction-processor-id{display:none}.dlm-order-details .dlm-order-details-block .dlm-order-details-update-successful{font-size:2em;padding:.2em .3em;color:#46b450}@media (min-width:768px){.dlm-order-details .dlm-order-details-main{width:62%;float:left}.dlm-order-details .dlm-order-details-side{width:35%;float:right}.dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table td.dlm-order-transaction-processor-id,.dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table th.dlm-order-transaction-processor-id{display:table-cell}}.dlm-onboarding .dlm-onboarding-section.dlm-onboarding-section-one-col{margin:0 auto;max-width:680px}.dlm-onboarding .dlm-onboarding-section.dlm-onboarding-section-cta{margin-top:40px;text-align:center}.dlm-onboarding .dlm-onboarding-section.dlm-onboarding-section-three-col{max-width:680px;margin:40px auto 0;overflow:hidden;display:flex;justify-content:space-between;flex-wrap:wrap}.dlm-onboarding .dlm-onboarding-section.dlm-onboarding-section-three-col .dlm-onboarding-col{padding-top:2.5em;flex:1;align-self:flex-start;min-width:100%;max-width:100%}.dlm-onboarding .dlm-onboarding-section.dlm-onboarding-section-three-col .dlm-onboarding-col img{width:100%}.dlm-onboarding .dlm-onboarding-section h2{margin:60px 0 .6em;font-size:2.7em;line-height:1.3;font-weight:300;text-align:center}.dlm-onboarding .dlm-onboarding-section p{max-width:55em;margin:.6em auto 0 auto}.dlm-onboarding .dlm-onboarding-section a.button-hero{height:46px;font-size:14px;line-height:44px;padding:0 36px;font-weight:700;text-align:center}.dlm-onboarding .dlm-onboarding-pages{max-width:55em;margin:0 auto;padding:2em 0 0}.dlm-onboarding .dlm-onboarding-pages a.button-hero{width:170px}.dlm-onboarding .dlm-onboarding-pages a.button-hero.dlm-page-exists{background:#46b450;border-color:#46b450 #4a8442 #467a3f;box-shadow:0 2px 0 #467a3f;text-shadow:0 -1px 1px #4a8442,1px 0 1px #4a8442,0 1px 1px #4a8442,-1px 0 1px #4a8442}.dlm-onboarding .dlm-onboarding-pages a.button-hero.dlm-page-exists:active{box-shadow:0 2px 0 #467a3f}.dlm-onboarding .dlm-onboarding-pages td,.dlm-onboarding .dlm-onboarding-pages th{padding:1em 0;border-bottom:1px solid #ccc}.dlm-onboarding .dlm-onboarding-pages th{width:13%;min-width:6em;text-align:left}.dlm-onboarding .dlm-onboarding-pages td{padding-right:.5em;padding-left:.5em}.dlm-onboarding .dlm-onboarding-pages td.dlm-onboarding-pages-page-title{font-weight:700}@media (min-width:768px){.dlm-onboarding .dlm-onboarding-section .dlm-onboarding-pages{width:55em}.dlm-onboarding .dlm-onboarding-section.dlm-onboarding-section-three-col .dlm-onboarding-col{padding-top:0;min-width:31%;max-width:31%}}.dlm_extensions_wrap h1 a.dlm-reload-button{float:right}.dlm_extensions_wrap .dlm_extensions{padding:15px 0;overflow:hidden}.dlm_extensions_wrap .dlm_extensions div.dlm_extension{cursor:auto!important}.dlm_extensions_wrap .dlm_extensions div.dlm_extension a{color:#444;text-decoration:none}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .dlm_extension_img_wrapper{width:100%;background:#419ccb;text-align:center}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .dlm_extension_img_wrapper img{max-width:100%;margin:0 auto}.dlm_extensions_wrap .dlm_extensions div.dlm_extension h3{padding:0 20px}.dlm_extensions_wrap .dlm_extensions div.dlm_extension p.extension-desc{min-height:85px;padding:0 20px}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .product_footer{padding:0 20px 15px}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .product_footer .loop_price{font-weight:700}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .product_footer .loop_price.sale{color:green}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .product_footer .loop_price.sale strike{color:#444}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .product_footer .loop_more{color:#459ac9;text-decoration:none;font-weight:700;float:right}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license{padding:0 20px 20px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license div.dlm_license_error{padding:.5em;margin-bottom:15px;background:#ffffe0}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license div.dlm_license_error a{color:#00f;text-decoration:underline}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license p.license-status{padding:5px 0;margin:5px 0;background:red;font-weight:700;font-size:1.2em;color:#fff;text-align:center}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license p.license-status.active{background:green}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license input{width:100%;margin:7px 0;padding:7px}.dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license a.button-primary{width:100%;margin:5px auto 0;color:#fff;text-align:center}#ui-datepicker-div{display:none}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Logs */
2
+ .post-type-dlm_download h1 a.dlm-delete-logs {
3
+ color: #a00;
4
+ }
5
+ .post-type-dlm_download h1 a.dlm-delete-logs:hover {
6
+ color: #fff;
7
+ background: #a00;
8
+ border-color: #7C0900;
9
+ }
10
+ #dlm_logs td {
11
+ padding: 7px 7px;
12
+ vertical-align: middle;
13
+ }
14
+ #dlm_logs .check-column {
15
+ width: 1.5em;
16
+ padding: 0;
17
+ vertical-align: middle;
18
+ }
19
+ #dlm_logs .column-status {
20
+ width: 2em;
21
+ }
22
+ #dlm_logs td.column-status {
23
+ font-size: 10px;
24
+ vertical-align: middle;
25
+ text-align: center;
26
+ }
27
+ #dlm_logs td.column-status span {
28
+ color: #fff;
29
+ font-weight: normal;
30
+ -moz-border-radius: 50%;
31
+ -webkit-border-radius: 50%;
32
+ border-radius: 50%;
33
+ height: 18px;
34
+ line-height: 18px;
35
+ width: 18px;
36
+ display: inline-block;
37
+ background: url('../images/log-status-icons.png') top left no-repeat;
38
+ }
39
+ #dlm_logs td.column-status .completed {
40
+ background-color: #6cc644;
41
+ }
42
+ #dlm_logs td.column-status .failed {
43
+ background-color: #bd2c00;
44
+ background-position-y: -18px;
45
+ }
46
+ #dlm_logs td.column-status .redirected {
47
+ background-color: #1c769b;
48
+ background-position-y: -36px;
49
+ }
50
+ #dlm_logs td.column-user_ip,
51
+ #dlm_logs td.column-user_agent {
52
+ font-family: monospace;
53
+ font-weight: normal;
54
+ }
55
+ #dlm_logs span.dlm-description {
56
+ font-weight: normal;
57
+ }
58
+ #dlm_logs .column-download,
59
+ #dlm_logs .column-file,
60
+ #dlm_logs .column-user,
61
+ #dlm_logs .column-user_ua {
62
+ width: 16% !important;
63
+ }
64
+ #dlm_logs .column-user_ip,
65
+ #dlm_logs .column-date {
66
+ width: 6% !important;
67
+ }
68
+ .post-type-dlm_download .inline-edit-row .inline-edit-col-dlm .inline-edit-col-dlm-inner {
69
+ margin-top: 10px;
70
+ }
71
+ /* Settings */
72
+ .nav-section-wrapper {
73
+ padding: 0;
74
+ margin: 0;
75
+ }
76
+ .nav-section-wrapper li {
77
+ display: inline-block;
78
+ padding: 0 0 0 2px;
79
+ margin: 0 2px;
80
+ }
81
+ .nav-section-wrapper li a {
82
+ text-decoration: none;
83
+ }
84
+ .nav-section-wrapper li.active-section a {
85
+ font-weight: bold;
86
+ color: #000;
87
+ }
88
+ .nav-section-wrapper li:after {
89
+ content: "|";
90
+ padding-left: 7px;
91
+ }
92
+ .nav-section-wrapper li:last-child:after {
93
+ content: "";
94
+ padding: 0;
95
+ }
96
+ /** Settings */
97
+ .dlm-admin-settings #setting-dlm_decimal_separator,
98
+ .dlm-admin-settings #setting-dlm_thousand_separator {
99
+ width: 50px;
100
+ }
101
+ .dlm-admin-settings table td {
102
+ padding: 15px 0;
103
+ }
104
+ .dlm-admin-settings h3 {
105
+ margin: 2em 0 0;
106
+ }
107
+ /* File lists */
108
+ ul.download_monitor_file_browser {
109
+ list-style: none outside;
110
+ margin: 0;
111
+ border: 1px solid #ddd;
112
+ -moz-border-radius: 3px;
113
+ -webkit-border-radius: 3px;
114
+ border-radius: 3px;
115
+ background: #f9f9f9;
116
+ padding: 5px 5px;
117
+ -moz-box-shadow: inset 0 0 0 1px #fff;
118
+ -webkit-box-shadow: inset 0 0 0 1px #fff;
119
+ box-shadow: inset 0 0 0 1px #fff;
120
+ }
121
+ ul.download_monitor_file_browser li {
122
+ padding: 0;
123
+ margin: 0;
124
+ }
125
+ ul.download_monitor_file_browser li a {
126
+ color: #21759B;
127
+ display: block;
128
+ padding: 4px 0 4px 4px;
129
+ text-decoration: none;
130
+ }
131
+ ul.download_monitor_file_browser li a:hover {
132
+ background-color: #eaf2fa;
133
+ }
134
+ ul.download_monitor_file_browser li a:before {
135
+ font-family: dashicons !important;
136
+ speak: none;
137
+ font-weight: normal;
138
+ font-variant: normal;
139
+ text-transform: none;
140
+ -webkit-font-smoothing: antialiased;
141
+ -moz-osx-font-smoothing: grayscale;
142
+ margin: 0 4px 0 0;
143
+ content: "\f123";
144
+ top: 1px;
145
+ left: -1px;
146
+ font-size: 1em;
147
+ line-height: inherit;
148
+ position: relative;
149
+ vertical-align: top;
150
+ }
151
+ ul.download_monitor_file_browser li a.folder:before {
152
+ font-family: dashicons !important;
153
+ speak: none;
154
+ font-weight: normal;
155
+ font-variant: normal;
156
+ text-transform: none;
157
+ -webkit-font-smoothing: antialiased;
158
+ -moz-osx-font-smoothing: grayscale;
159
+ margin: 0 4px 0 0;
160
+ content: "\f318";
161
+ top: 1px;
162
+ left: -1px;
163
+ font-size: 1em;
164
+ line-height: inherit;
165
+ position: relative;
166
+ vertical-align: top;
167
+ }
168
+ ul.download_monitor_file_browser li a.filetype-mov:before,
169
+ ul.download_monitor_file_browser li a.filetype-avi:before,
170
+ ul.download_monitor_file_browser li a.filetype-3g2:before,
171
+ ul.download_monitor_file_browser li a.filetype-3gp:before,
172
+ ul.download_monitor_file_browser li a.filetype-asf:before,
173
+ ul.download_monitor_file_browser li a.filetype-asx:before,
174
+ ul.download_monitor_file_browser li a.filetype-mp4:before,
175
+ ul.download_monitor_file_browser li a.filetype-mpg:before,
176
+ ul.download_monitor_file_browser li a.filetype-rm:before,
177
+ ul.download_monitor_file_browser li a.filetype-srt:before,
178
+ ul.download_monitor_file_browser li a.filetype-vob:before,
179
+ ul.download_monitor_file_browser li a.filetype-wmv:before {
180
+ font-family: dashicons !important;
181
+ speak: none;
182
+ font-weight: normal;
183
+ font-variant: normal;
184
+ text-transform: none;
185
+ -webkit-font-smoothing: antialiased;
186
+ -moz-osx-font-smoothing: grayscale;
187
+ margin: 0 4px 0 0;
188
+ content: "\f126";
189
+ top: 1px;
190
+ left: -1px;
191
+ font-size: 1em;
192
+ line-height: inherit;
193
+ position: relative;
194
+ vertical-align: top;
195
+ }
196
+ ul.download_monitor_file_browser li a.filetype-mp3:before,
197
+ ul.download_monitor_file_browser li a.filetype-aif:before,
198
+ ul.download_monitor_file_browser li a.filetype-iff:before,
199
+ ul.download_monitor_file_browser li a.filetype-m3u:before,
200
+ ul.download_monitor_file_browser li a.filetype-m4a:before,
201
+ ul.download_monitor_file_browser li a.filetype-mid:before,
202
+ ul.download_monitor_file_browser li a.filetype-midi:before,
203
+ ul.download_monitor_file_browser li a.filetype-mpa:before,
204
+ ul.download_monitor_file_browser li a.filetype-ra:before,
205
+ ul.download_monitor_file_browser li a.filetype-wav:before,
206
+ ul.download_monitor_file_browser li a.filetype-wma:before {
207
+ font-family: dashicons !important;
208
+ speak: none;
209
+ font-weight: normal;
210
+ font-variant: normal;
211
+ text-transform: none;
212
+ -webkit-font-smoothing: antialiased;
213
+ -moz-osx-font-smoothing: grayscale;
214
+ margin: 0 4px 0 0;
215
+ content: "\f127";
216
+ top: 1px;
217
+ left: -1px;
218
+ font-size: 1em;
219
+ line-height: inherit;
220
+ position: relative;
221
+ vertical-align: top;
222
+ }
223
+ ul.download_monitor_file_browser li a.filetype-psd:before,
224
+ ul.download_monitor_file_browser li a.filetype-ai:before,
225
+ ul.download_monitor_file_browser li a.filetype-eps:before,
226
+ ul.download_monitor_file_browser li a.filetype-ps:before,
227
+ ul.download_monitor_file_browser li a.filetype-svg:before,
228
+ ul.download_monitor_file_browser li a.filetype-bmp:before,
229
+ ul.download_monitor_file_browser li a.filetype-dds:before,
230
+ ul.download_monitor_file_browser li a.filetype-gif:before,
231
+ ul.download_monitor_file_browser li a.filetype-jpg:before,
232
+ ul.download_monitor_file_browser li a.filetype-jpeg:before,
233
+ ul.download_monitor_file_browser li a.filetype-png:before,
234
+ ul.download_monitor_file_browser li a.filetype-pspimage:before,
235
+ ul.download_monitor_file_browser li a.filetype-tga:before,
236
+ ul.download_monitor_file_browser li a.filetype-thm:before,
237
+ ul.download_monitor_file_browser li a.filetype-tif:before,
238
+ ul.download_monitor_file_browser li a.filetype-yuv:before,
239
+ ul.download_monitor_file_browser li a.filetype-ico:before {
240
+ font-family: dashicons !important;
241
+ speak: none;
242
+ font-weight: normal;
243
+ font-variant: normal;
244
+ text-transform: none;
245
+ -webkit-font-smoothing: antialiased;
246
+ -moz-osx-font-smoothing: grayscale;
247
+ margin: 0 4px 0 0;
248
+ content: "\f128";
249
+ top: 1px;
250
+ left: -1px;
251
+ font-size: 1em;
252
+ line-height: inherit;
253
+ position: relative;
254
+ vertical-align: top;
255
+ }
256
+ ul.download_monitor_file_browser li.nofiles {
257
+ color: #999;
258
+ font-style: italic;
259
+ padding: 4px 0;
260
+ }
261
+ ul.download_monitor_file_browser li ul {
262
+ list-style: none outside;
263
+ margin: 0;
264
+ padding: 0 0 0 28px;
265
+ }
266
+ ul.download_monitor_file_browser li ul.loading {
267
+ background: url(../images/ajax-loader.gif) no-repeat 24px 0;
268
+ height: 32px;
269
+ }
270
+ /* Download list */
271
+ table.wp-list-table .column-thumb {
272
+ width: 44px;
273
+ text-align: center;
274
+ white-space: nowrap;
275
+ }
276
+ table.wp-list-table .column-dlm_download_cat,
277
+ table.wp-list-table .column-dlm_download_tag,
278
+ table.wp-list-table .column-file {
279
+ width: 11% !important;
280
+ }
281
+ table.wp-list-table .column-title,
282
+ table.wp-list-table .column-file {
283
+ width: 17% !important;
284
+ }
285
+ table.wp-list-table .column-download_id,
286
+ table.wp-list-table .column-version {
287
+ width: 5em;
288
+ }
289
+ table.wp-list-table th.column-thumb span:first-child,
290
+ table.wp-list-table th.column-download_count span:first-child,
291
+ table.wp-list-table th.column-members_only span:first-child,
292
+ table.wp-list-table th.column-redirect_only span:first-child,
293
+ table.wp-list-table th.column-featured span:first-child {
294
+ float: none;
295
+ display: inline-block;
296
+ width: 1em;
297
+ height: 1em;
298
+ line-height: 1em;
299
+ padding: 2px 0 0 0;
300
+ overflow: hidden;
301
+ }
302
+ table.wp-list-table th.column-thumb .sorting-indicator,
303
+ table.wp-list-table th.column-download_count .sorting-indicator,
304
+ table.wp-list-table th.column-members_only .sorting-indicator,
305
+ table.wp-list-table th.column-redirect_only .sorting-indicator,
306
+ table.wp-list-table th.column-featured .sorting-indicator {
307
+ float: right;
308
+ }
309
+ table.wp-list-table th.column-thumb {
310
+ width: 52px;
311
+ text-align: center;
312
+ }
313
+ table.wp-list-table th.column-thumb span:first-child:before {
314
+ font-family: dashicons !important;
315
+ speak: none;
316
+ font-weight: normal;
317
+ font-variant: normal;
318
+ text-transform: none;
319
+ -webkit-font-smoothing: antialiased;
320
+ -moz-osx-font-smoothing: grayscale;
321
+ margin: 0 4px 0 0;
322
+ content: "\f128";
323
+ top: 1px;
324
+ left: -1px;
325
+ font-size: 1em;
326
+ line-height: inherit;
327
+ position: relative;
328
+ vertical-align: top;
329
+ }
330
+ table.wp-list-table th.column-download_count {
331
+ width: 5em;
332
+ }
333
+ table.wp-list-table th.column-download_count span:first-child:before {
334
+ font-family: dashicons !important;
335
+ speak: none;
336
+ font-weight: normal;
337
+ font-variant: normal;
338
+ text-transform: none;
339
+ -webkit-font-smoothing: antialiased;
340
+ -moz-osx-font-smoothing: grayscale;
341
+ margin: 0 4px 0 0;
342
+ content: "\f346";
343
+ top: 1px;
344
+ left: -1px;
345
+ font-size: 1em;
346
+ line-height: inherit;
347
+ position: relative;
348
+ vertical-align: top;
349
+ }
350
+ table.wp-list-table th.column-members_only {
351
+ width: 3.5em;
352
+ }
353
+ table.wp-list-table th.column-members_only span:first-child:before {
354
+ font-family: dashicons !important;
355
+ speak: none;
356
+ font-weight: normal;
357
+ font-variant: normal;
358
+ text-transform: none;
359
+ -webkit-font-smoothing: antialiased;
360
+ -moz-osx-font-smoothing: grayscale;
361
+ margin: 0 4px 0 0;
362
+ content: "\f338";
363
+ top: 1px;
364
+ left: -1px;
365
+ font-size: 1em;
366
+ line-height: inherit;
367
+ position: relative;
368
+ vertical-align: top;
369
+ }
370
+ table.wp-list-table th.column-redirect_only {
371
+ width: 3.5em;
372
+ }
373
+ table.wp-list-table th.column-redirect_only span:first-child:before {
374
+ font-family: dashicons !important;
375
+ speak: none;
376
+ font-weight: normal;
377
+ font-variant: normal;
378
+ text-transform: none;
379
+ -webkit-font-smoothing: antialiased;
380
+ -moz-osx-font-smoothing: grayscale;
381
+ margin: 0 4px 0 0;
382
+ content: "\f103";
383
+ top: 1px;
384
+ left: -1px;
385
+ font-size: 1em;
386
+ line-height: inherit;
387
+ position: relative;
388
+ vertical-align: top;
389
+ }
390
+ table.wp-list-table th.column-featured {
391
+ width: 3.5em;
392
+ }
393
+ table.wp-list-table th.column-featured span:first-child:before {
394
+ font-family: dashicons !important;
395
+ speak: none;
396
+ font-weight: normal;
397
+ font-variant: normal;
398
+ text-transform: none;
399
+ -webkit-font-smoothing: antialiased;
400
+ -moz-osx-font-smoothing: grayscale;
401
+ margin: 0 4px 0 0;
402
+ content: "\f155";
403
+ top: 1px;
404
+ left: -1px;
405
+ font-size: 1em;
406
+ line-height: inherit;
407
+ position: relative;
408
+ vertical-align: top;
409
+ }
410
+ table.wp-list-table td.column-download_count,
411
+ table.wp-list-table td.column-members_only,
412
+ table.wp-list-table td.column-redirect_only,
413
+ table.wp-list-table td.column-featured {
414
+ text-align: left;
415
+ padding-left: 11px;
416
+ }
417
+ table.wp-list-table td.column-download_count span.na,
418
+ table.wp-list-table td.column-members_only span.na,
419
+ table.wp-list-table td.column-redirect_only span.na,
420
+ table.wp-list-table td.column-featured span.na {
421
+ color: #999;
422
+ width: 1em;
423
+ height: 1em;
424
+ line-height: 1em;
425
+ display: inline-block;
426
+ overflow: hidden;
427
+ vertical-align: middle;
428
+ }
429
+ table.wp-list-table td.column-download_count span.na:before,
430
+ table.wp-list-table td.column-members_only span.na:before,
431
+ table.wp-list-table td.column-redirect_only span.na:before,
432
+ table.wp-list-table td.column-featured span.na:before {
433
+ font-family: dashicons !important;
434
+ speak: none;
435
+ font-weight: normal;
436
+ font-variant: normal;
437
+ text-transform: none;
438
+ -webkit-font-smoothing: antialiased;
439
+ -moz-osx-font-smoothing: grayscale;
440
+ margin: 0 4px 0 0;
441
+ content: "\f460";
442
+ top: 1px;
443
+ left: -1px;
444
+ font-size: 1em;
445
+ line-height: inherit;
446
+ position: relative;
447
+ vertical-align: top;
448
+ }
449
+ table.wp-list-table td.column-download_count span.yes,
450
+ table.wp-list-table td.column-members_only span.yes,
451
+ table.wp-list-table td.column-redirect_only span.yes,
452
+ table.wp-list-table td.column-featured span.yes {
453
+ width: 1em;
454
+ height: 1em;
455
+ line-height: 1em;
456
+ display: inline-block;
457
+ overflow: hidden;
458
+ vertical-align: middle;
459
+ }
460
+ table.wp-list-table td.column-download_count span.yes:before,
461
+ table.wp-list-table td.column-members_only span.yes:before,
462
+ table.wp-list-table td.column-redirect_only span.yes:before,
463
+ table.wp-list-table td.column-featured span.yes:before {
464
+ font-family: dashicons !important;
465
+ speak: none;
466
+ font-weight: normal;
467
+ font-variant: normal;
468
+ text-transform: none;
469
+ -webkit-font-smoothing: antialiased;
470
+ -moz-osx-font-smoothing: grayscale;
471
+ margin: 0 4px 0 0;
472
+ content: "\f147";
473
+ top: 1px;
474
+ left: -1px;
475
+ font-size: 1em;
476
+ line-height: inherit;
477
+ position: relative;
478
+ vertical-align: top;
479
+ }
480
+ table.wp-list-table .column-thumb img {
481
+ padding: 2px;
482
+ margin: 0;
483
+ border: 1px solid #dfdfdf;
484
+ vertical-align: middle;
485
+ width: 32px;
486
+ height: 32px;
487
+ }
488
+ /* Meta boxes */
489
+ #download-monitor-file .inside {
490
+ padding: 0;
491
+ margin: 0;
492
+ }
493
+ #download-monitor-file .dlm-metaboxes-wrapper .expand_all,
494
+ #download-monitor-file .dlm-metaboxes-wrapper .close_all {
495
+ float: right;
496
+ margin-left: 1em;
497
+ line-height: 22px;
498
+ text-decoration: none;
499
+ }
500
+ #download-monitor-file .dlm-metaboxes-wrapper .expand_all:before {
501
+ font-family: dashicons !important;
502
+ speak: none;
503
+ font-weight: normal;
504
+ font-variant: normal;
505
+ text-transform: none;
506
+ -webkit-font-smoothing: antialiased;
507
+ -moz-osx-font-smoothing: grayscale;
508
+ margin: 0 4px 0 0;
509
+ content: "\f168";
510
+ top: 1px;
511
+ left: -1px;
512
+ font-size: 1em;
513
+ line-height: inherit;
514
+ position: relative;
515
+ vertical-align: top;
516
+ }
517
+ #download-monitor-file .dlm-metaboxes-wrapper .close_all:before {
518
+ font-family: dashicons !important;
519
+ speak: none;
520
+ font-weight: normal;
521
+ font-variant: normal;
522
+ text-transform: none;
523
+ -webkit-font-smoothing: antialiased;
524
+ -moz-osx-font-smoothing: grayscale;
525
+ margin: 0 4px 0 0;
526
+ content: "\f460";
527
+ top: 1px;
528
+ left: -1px;
529
+ font-size: 1em;
530
+ line-height: inherit;
531
+ position: relative;
532
+ vertical-align: top;
533
+ }
534
+ #download-monitor-file .dlm-metaboxes-wrapper p.toolbar {
535
+ margin: 0 !important;
536
+ border-top: 1px solid white;
537
+ border-bottom: 1px solid #DFDFDF;
538
+ padding: 7px 12px !important;
539
+ overflow: hidden;
540
+ zoom: 1;
541
+ }
542
+ #download-monitor-file .dlm-metaboxes-wrapper p.toolbar a.button {
543
+ float: left;
544
+ margin: 0;
545
+ }
546
+ #download-monitor-file .dlm-metaboxes-wrapper select.attribute_taxonomy,
547
+ #download-monitor-file .dlm-metaboxes-wrapper button.add_attribute,
548
+ #download-monitor-file .dlm-metaboxes-wrapper button.add_variable_attribute,
549
+ #download-monitor-file .dlm-metaboxes-wrapper .fr {
550
+ float: right;
551
+ margin: 0 0 0 6px;
552
+ }
553
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metaboxes {
554
+ padding: 0 12px 0;
555
+ }
556
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox-sortable-placeholder {
557
+ border-color: #bbb;
558
+ background-color: #f5f5f5;
559
+ margin: 9px 0;
560
+ border-width: 1px;
561
+ border-style: dashed;
562
+ }
563
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox {
564
+ background: #ececec;
565
+ border: 1px solid #ececec;
566
+ margin: 9px 0 !important;
567
+ }
568
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox h3 {
569
+ margin: 0 !important;
570
+ padding: 6px !important;
571
+ font-size: 1em !important;
572
+ overflow: hidden;
573
+ zoom: 1;
574
+ cursor: move;
575
+ }
576
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox h3 button {
577
+ float: right;
578
+ }
579
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox h3 strong {
580
+ font-weight: normal;
581
+ line-height: 24px;
582
+ }
583
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox h3 select {
584
+ font-family: sans-serif;
585
+ }
586
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox h3 .handlediv {
587
+ background-position: 6px 5px !important;
588
+ display: none !important;
589
+ height: 24px;
590
+ }
591
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox:hover h3 .handlediv {
592
+ display: block;
593
+ }
594
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table {
595
+ width: 100%;
596
+ position: relative;
597
+ background: #fff;
598
+ padding: 3px;
599
+ }
600
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td {
601
+ text-align: left;
602
+ padding: 6px 6px;
603
+ vertical-align: top;
604
+ border: 0;
605
+ line-height: 26px;
606
+ }
607
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td label {
608
+ text-align: left;
609
+ display: block;
610
+ line-height: 21px;
611
+ }
612
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input {
613
+ float: left;
614
+ min-width: 200px;
615
+ }
616
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input,
617
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td textarea {
618
+ width: 100%;
619
+ margin: 0;
620
+ display: block;
621
+ font-size: 14px;
622
+ padding: 4px;
623
+ color: #555;
624
+ }
625
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td textarea {
626
+ height: 7.5em;
627
+ }
628
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td select {
629
+ width: 100%;
630
+ }
631
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input.short {
632
+ width: 200px;
633
+ }
634
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input.checkbox {
635
+ width: auto;
636
+ min-width: inherit;
637
+ vertical-align: middle;
638
+ display: inline;
639
+ float: none;
640
+ }
641
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input.date-picker-field {
642
+ width: 50%;
643
+ min-width: inherit;
644
+ float: none;
645
+ display: inline;
646
+ }
647
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input.minute,
648
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td input.hour {
649
+ width: 2em;
650
+ min-width: inherit;
651
+ float: none;
652
+ display: inline;
653
+ }
654
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table td.attribute_name {
655
+ width: 200px;
656
+ }
657
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table .plus,
658
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table .minus {
659
+ margin-top: 6px;
660
+ }
661
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table .fl {
662
+ float: left;
663
+ }
664
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox table .fr {
665
+ float: right;
666
+ }
667
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox:first-child {
668
+ /* main file */
669
+ }
670
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm-metabox:first-child h3 {
671
+ background: #EAF2FA;
672
+ background-image: linear-gradient(bottom, #dae6f2 0%, #eaf2fa 100%);
673
+ background-image: -o-linear-gradient(bottom, #dae6f2 0%, #eaf2fa 100%);
674
+ background-image: -moz-linear-gradient(bottom, #dae6f2 0%, #eaf2fa 100%);
675
+ background-image: -webkit-linear-gradient(bottom, #dae6f2 0%, #eaf2fa 100%);
676
+ background-image: -ms-linear-gradient(bottom, #dae6f2 0%, #eaf2fa 100%);
677
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #dae6f2), color-stop(1, #eaf2fa));
678
+ border-color: #d3deea;
679
+ color: #21759B;
680
+ }
681
+ #download-monitor-file .dlm-metaboxes-wrapper .plus:before {
682
+ font-family: dashicons !important;
683
+ speak: none;
684
+ font-weight: normal;
685
+ font-variant: normal;
686
+ text-transform: none;
687
+ -webkit-font-smoothing: antialiased;
688
+ -moz-osx-font-smoothing: grayscale;
689
+ margin: 0 4px 0 0;
690
+ content: "\f132";
691
+ top: 1px;
692
+ left: -1px;
693
+ font-size: 1em;
694
+ line-height: inherit;
695
+ position: relative;
696
+ vertical-align: top;
697
+ }
698
+ #download-monitor-file .dlm-metaboxes-wrapper .minus:before {
699
+ font-family: dashicons !important;
700
+ speak: none;
701
+ font-weight: normal;
702
+ font-variant: normal;
703
+ text-transform: none;
704
+ -webkit-font-smoothing: antialiased;
705
+ -moz-osx-font-smoothing: grayscale;
706
+ margin: 0 4px 0 0;
707
+ content: "\f460";
708
+ top: 1px;
709
+ left: -1px;
710
+ font-size: 1em;
711
+ line-height: inherit;
712
+ position: relative;
713
+ vertical-align: top;
714
+ }
715
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm_upload_file:before {
716
+ font-family: dashicons !important;
717
+ speak: none;
718
+ font-weight: normal;
719
+ font-variant: normal;
720
+ text-transform: none;
721
+ -webkit-font-smoothing: antialiased;
722
+ -moz-osx-font-smoothing: grayscale;
723
+ margin: 0 4px 0 0;
724
+ content: "\f317";
725
+ top: 1px;
726
+ left: -1px;
727
+ font-size: 1em;
728
+ line-height: inherit;
729
+ position: relative;
730
+ vertical-align: top;
731
+ }
732
+ #download-monitor-file .dlm-metaboxes-wrapper .dlm_browse_for_file:before {
733
+ font-family: dashicons !important;
734
+ speak: none;
735
+ font-weight: normal;
736
+ font-variant: normal;
737
+ text-transform: none;
738
+ -webkit-font-smoothing: antialiased;
739
+ -moz-osx-font-smoothing: grayscale;
740
+ margin: 0 4px 0 0;
741
+ content: "\f322";
742
+ top: 1px;
743
+ left: -1px;
744
+ font-size: 1em;
745
+ line-height: inherit;
746
+ position: relative;
747
+ vertical-align: top;
748
+ }
749
+ /* Writepanel forms */
750
+ #download-monitor-information p {
751
+ overflow: hidden;
752
+ }
753
+ #download-monitor-information p label {
754
+ width: 100%;
755
+ font-weight: bold;
756
+ box-sizing: border-box;
757
+ line-height: 28px;
758
+ float: left;
759
+ }
760
+ #download-monitor-information p label input {
761
+ width: 65%;
762
+ padding: 5px;
763
+ font-size: 11px;
764
+ font-weight: normal;
765
+ background: #eaeaea;
766
+ border: 0;
767
+ box-shadow: none;
768
+ box-sizing: border-box;
769
+ float: right;
770
+ }
771
+ #download-monitor-options .inside {
772
+ padding: 0;
773
+ margin: 0;
774
+ }
775
+ #download-monitor-options .form-field-checkbox label {
776
+ display: inline;
777
+ padding: 0 0 4px;
778
+ }
779
+ #download-monitor-options .form-field-checkbox input {
780
+ display: inline-block;
781
+ width: auto;
782
+ vertical-align: middle;
783
+ }
784
+ #download-monitor-options .form-field-checkbox .dlm-description {
785
+ padding: 4px 0 0 0;
786
+ display: block;
787
+ }
788
+ #download-monitor-options .access_permissions {
789
+ margin: 0 !important;
790
+ border-top: 1px solid white;
791
+ border-bottom: 1px solid #DFDFDF;
792
+ padding: 7px 12px !important;
793
+ overflow: hidden;
794
+ zoom: 1;
795
+ }
796
+ #download-monitor-options .access_permissions h4 {
797
+ margin-bottom: 0.5em;
798
+ margin: 0 0 0.5em;
799
+ }
800
+ #download-monitor-options .access_permissions ul {
801
+ background: #fff;
802
+ border: 1px solid #dfdfdf;
803
+ height: 110px;
804
+ overflow: auto;
805
+ padding: 0.5em 0.9em;
806
+ margin: 0;
807
+ }
808
+ #download-monitor-options p {
809
+ margin: 0 !important;
810
+ border-top: 1px solid white;
811
+ border-bottom: 1px solid #DFDFDF;
812
+ padding: 7px 12px !important;
813
+ overflow: hidden;
814
+ zoom: 1;
815
+ }
816
+ #insert-download {
817
+ padding: 20px 20px;
818
+ }
819
+ #insert-download #insert-shortcode,
820
+ #insert-download #drag-drop-area {
821
+ margin: 1em 0;
822
+ }
823
+ #insert-download .updated,
824
+ #insert-download .error {
825
+ margin-left: 0;
826
+ margin-right: 0;
827
+ }
828
+ #insert-download h2 {
829
+ margin-top: 0;
830
+ }
831
+ #insert-download label {
832
+ margin: 0 0 0.25em 0;
833
+ display: block;
834
+ font-size: 1.1em;
835
+ }
836
+ #insert-download span.description {
837
+ display: block;
838
+ }
839
+ #insert-download input.input {
840
+ margin: 0 0 0.25em 0;
841
+ display: block;
842
+ width: 100%;
843
+ font-size: 1.1em;
844
+ }
845
+ #insert-download .add_link {
846
+ float: right;
847
+ }
848
+ #insert-download ul.page-numbers {
849
+ overflow: hidden;
850
+ zoom: 1;
851
+ margin: 0 auto;
852
+ padding: 0;
853
+ text-align: center;
854
+ }
855
+ #insert-download ul.page-numbers li {
856
+ display: inline-block;
857
+ margin: 0;
858
+ list-style: none outside;
859
+ line-height: 1em;
860
+ }
861
+ #insert-download ul.page-numbers li a,
862
+ #insert-download ul.page-numbers li span {
863
+ text-decoration: none;
864
+ border: 1px solid #ddd;
865
+ -webkit-border-radius: 4px;
866
+ border-radius: 4px;
867
+ padding: 8px;
868
+ display: block;
869
+ }
870
+ #insert-download ul.page-numbers li span {
871
+ border-color: #eee;
872
+ }
873
+ #insert-download legend {
874
+ font-weight: bold;
875
+ display: block;
876
+ margin: 0 0 1em;
877
+ }
878
+ #insert-download fieldset label {
879
+ display: block;
880
+ margin: 0 0 0.5em;
881
+ }
882
+ /* Settings */
883
+ .dlm-code-nginx-rules {
884
+ display: block;
885
+ }
886
+ .settings_panel .form-table td {
887
+ padding-left: 0;
888
+ }
889
+ .settings_panel .dlm-lazy-select-loader {
890
+ display: inline-block;
891
+ vertical-align: middle;
892
+ padding: 0 0 0 3px;
893
+ }
894
+ .settings_panel .dlm-lazy-select-loader img {
895
+ display: inline-block;
896
+ height: 25px;
897
+ width: 25px;
898
+ margin-top: 1px;
899
+ }
900
+ /* Reports */
901
+ .dlm-reports h1 .dlm-reports-actions {
902
+ float: right;
903
+ }
904
+ .dlm-reports h1 .dlm-reports-actions a.dlm-reports-header-chart-switcher,
905
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector,
906
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-period {
907
+ margin: 0 5px;
908
+ float: left;
909
+ }
910
+ .dlm-reports h1 .dlm-reports-actions > :last-child {
911
+ margin-right: 0;
912
+ }
913
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector {
914
+ position: relative;
915
+ font-size: 14px;
916
+ padding: 0 0.5em 0 1em;
917
+ background: #fff;
918
+ border: 1px solid #cccccc;
919
+ border-radius: 3px;
920
+ user-select: none;
921
+ cursor: pointer;
922
+ }
923
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm-arrow:before {
924
+ font-family: "dashicons" !important;
925
+ content: "\f140";
926
+ font-style: normal;
927
+ font-weight: normal;
928
+ speak: none;
929
+ display: inline-block;
930
+ text-decoration: inherit;
931
+ width: 1em;
932
+ text-align: center;
933
+ font-variant: normal;
934
+ text-transform: none;
935
+ line-height: 1em;
936
+ font-size: 1.6em;
937
+ vertical-align: middle;
938
+ margin-top: -2px;
939
+ }
940
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay {
941
+ display: block;
942
+ width: 466px;
943
+ padding: 10px;
944
+ background: #fff;
945
+ border: 1px solid #cccccc;
946
+ position: absolute;
947
+ top: 30px;
948
+ right: 0;
949
+ z-index: 10;
950
+ overflow: hidden;
951
+ }
952
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date {
953
+ font-size: 70%;
954
+ margin-right: 5px;
955
+ float: left;
956
+ z-index: 11;
957
+ }
958
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline {
959
+ border: 0;
960
+ }
961
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline .ui-state-highlight {
962
+ background: #e6e6e6 url(../images/jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;
963
+ color: #555555;
964
+ border: 1px solid #D3D3D3;
965
+ }
966
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline .ui-state-active {
967
+ border: 1px solid #aaaaaa;
968
+ background: #ffffff url(../images/jquery-ui/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;
969
+ }
970
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline td,
971
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline th {
972
+ padding: 0;
973
+ margin: 0;
974
+ line-height: 2em;
975
+ }
976
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline td a,
977
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_date .ui-datepicker-inline th a {
978
+ text-align: center !important;
979
+ }
980
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-date-selector .dlm_rdrs_overlay .dlm_rdrs_actions {
981
+ width: 70px;
982
+ padding-left: 10px;
983
+ text-align: center;
984
+ float: left;
985
+ }
986
+ .dlm-reports h1 .dlm-reports-actions a.dlm-reports-header-chart-switcher {
987
+ display: block;
988
+ margin-top: 1px;
989
+ padding-top: 4px;
990
+ color: #23282d;
991
+ text-decoration: none;
992
+ }
993
+ .dlm-reports h1 .dlm-reports-actions a.dlm-reports-header-chart-switcher:before {
994
+ font-family: "dashicons" !important;
995
+ font-style: normal;
996
+ font-weight: normal;
997
+ speak: none;
998
+ display: inline-block;
999
+ text-decoration: inherit;
1000
+ width: 1em;
1001
+ text-align: center;
1002
+ font-variant: normal;
1003
+ text-transform: none;
1004
+ line-height: 1em;
1005
+ font-size: 1.4em;
1006
+ }
1007
+ .dlm-reports h1 .dlm-reports-actions a.dlm-reports-header-chart-switcher.dlm-line:before {
1008
+ content: "\f238";
1009
+ }
1010
+ .dlm-reports h1 .dlm-reports-actions a.dlm-reports-header-chart-switcher.dlm-bar:before {
1011
+ content: "\f185";
1012
+ }
1013
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-period a {
1014
+ border-color: #cccccc !important;
1015
+ }
1016
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-period a:first-child {
1017
+ border-bottom-right-radius: 0;
1018
+ border-top-right-radius: 0;
1019
+ border-right: 0;
1020
+ }
1021
+ .dlm-reports h1 .dlm-reports-actions .dlm-reports-header-period a:last-child {
1022
+ border-bottom-left-radius: 0;
1023
+ border-top-left-radius: 0;
1024
+ border-left: 0;
1025
+ }
1026
+ .dlm-reports .dlm_reports_loader {
1027
+ position: absolute;
1028
+ width: 32px;
1029
+ height: 32px;
1030
+ top: 50%;
1031
+ left: 50%;
1032
+ margin: -16px 0 0 -16px;
1033
+ }
1034
+ .dlm-reports .dlm-reports-block-chart {
1035
+ width: 100%;
1036
+ height: 300px;
1037
+ margin-top: 20px;
1038
+ background: #fff;
1039
+ border: 1px solid #e5e5e5;
1040
+ overflow: hidden;
1041
+ }
1042
+ .dlm-reports .dlm-reports-block-chart .chart-container h6 {
1043
+ display: none;
1044
+ }
1045
+ .dlm-reports .dlm-reports-block-summary #popular span {
1046
+ line-height: 1em;
1047
+ }
1048
+ .dlm-reports .dlm-reports-block {
1049
+ position: relative;
1050
+ box-sizing: border-box;
1051
+ width: 100%;
1052
+ padding: 20px 10px;
1053
+ margin-top: 20px;
1054
+ background: #fff;
1055
+ border: 1px solid #e5e5e5;
1056
+ overflow: hidden;
1057
+ float: left;
1058
+ }
1059
+ .dlm-reports .dlm-reports-block.dlm-reports-block-half {
1060
+ width: 49%;
1061
+ margin-right: 1%;
1062
+ }
1063
+ .dlm-reports .dlm-reports-block.dlm-reports-block-half-right {
1064
+ width: 49%;
1065
+ margin-left: 1%;
1066
+ }
1067
+ .dlm-reports .dlm-reports-block .dlm-reports-placeholder-no-data {
1068
+ display: inline-block;
1069
+ width: 100%;
1070
+ font-size: 1.5em;
1071
+ color: #b4b9be;
1072
+ font-style: italic;
1073
+ text-align: center;
1074
+ }
1075
+ .dlm-reports .dlm-reports-block ul {
1076
+ box-sizing: border-box;
1077
+ width: 100%;
1078
+ padding: 0;
1079
+ margin: 0;
1080
+ }
1081
+ .dlm-reports .dlm-reports-block ul li {
1082
+ display: inline-block;
1083
+ width: 33%;
1084
+ padding: 5px 0;
1085
+ }
1086
+ .dlm-reports .dlm-reports-block ul li label,
1087
+ .dlm-reports .dlm-reports-block ul li span {
1088
+ display: block;
1089
+ width: 100%;
1090
+ text-align: center;
1091
+ }
1092
+ .dlm-reports .dlm-reports-block ul li span {
1093
+ font-size: 2.5em;
1094
+ font-weight: bold;
1095
+ padding: 0.5em 0 0;
1096
+ }
1097
+ .dlm-reports .dlm-reports-block table {
1098
+ width: 100%;
1099
+ }
1100
+ .dlm-reports .dlm-reports-block table th,
1101
+ .dlm-reports .dlm-reports-block table td {
1102
+ text-align: center;
1103
+ padding: 10px 0;
1104
+ border-bottom: 1px solid #e5e5e5;
1105
+ }
1106
+ .dlm-reports .dlm-reports-block table th:first-child,
1107
+ .dlm-reports .dlm-reports-block table td:first-child {
1108
+ text-align: left;
1109
+ }
1110
+ .dlm-reports .dlm-reports-block table th {
1111
+ padding-bottom: 20px;
1112
+ }
1113
+ .dlm-reports-block-summary {
1114
+ background: #333 !important;
1115
+ color: white;
1116
+ }
1117
+ /** Products overview page */
1118
+ .post-type-dlm_product table.wp-list-table .column-title {
1119
+ width: 65% !important;
1120
+ }
1121
+ /** Products detail page */
1122
+ .dlm_mb_shop_product_information .dlm_shop_field_row {
1123
+ width: 100%;
1124
+ overflow: hidden;
1125
+ }
1126
+ .dlm_mb_shop_product_information .dlm_shop_field_row label.dlm_shop_field_label {
1127
+ display: inline-block;
1128
+ width: 20%;
1129
+ height: 100%;
1130
+ line-height: 2.2em;
1131
+ float: left;
1132
+ }
1133
+ .dlm_mb_shop_product_information .dlm_shop_field_row span.dlm_shop_field_input {
1134
+ display: inline-block;
1135
+ width: 50%;
1136
+ float: left;
1137
+ }
1138
+ .dlm_mb_shop_product_information .dlm_shop_field_row span.dlm_shop_field_input .dlm_shop_input {
1139
+ width: 100%;
1140
+ padding: 5px 7px;
1141
+ }
1142
+ .dlm_mb_shop_product_information .dlm_shop_field_row span.dlm_shop_field_input .select2-selection--multiple {
1143
+ border: 1px solid #dddddd;
1144
+ }
1145
+ .dlm_mb_shop_product_information .dlm_shop_field_row span.dlm_shop_field_input .select2-search,
1146
+ .dlm_mb_shop_product_information .dlm_shop_field_row span.dlm_shop_field_input .select2-selection__choice {
1147
+ margin-bottom: 0;
1148
+ }
1149
+ .dlm_mb_shop_product_information .dlm_shop_field_row span.dlm_shop_field_input .select2-search__field {
1150
+ padding-top: 3px;
1151
+ }
1152
+ /** Orders Overview */
1153
+ .dlm-order-overview #dlm_empty_trash {
1154
+ margin-left: 3px;
1155
+ }
1156
+ .dlm-order-overview .wp-list-table td .column-id {
1157
+ width: 25%;
1158
+ }
1159
+ /** Order details */
1160
+ .dlm-order-details {
1161
+ max-width: 1250px;
1162
+ margin-left: auto;
1163
+ margin-right: auto;
1164
+ padding-right: 20px;
1165
+ }
1166
+ .dlm-order-details h1 {
1167
+ padding-bottom: 25px;
1168
+ }
1169
+ .dlm-order-details .dlm-order-details-main,
1170
+ .dlm-order-details .dlm-order-details-side {
1171
+ width: 100%;
1172
+ float: left;
1173
+ }
1174
+ .dlm-order-details .dlm-order-details-block {
1175
+ padding: 0;
1176
+ margin-bottom: 20px;
1177
+ line-height: 1;
1178
+ border: 1px solid #e5e5e5;
1179
+ background: #fff;
1180
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
1181
+ }
1182
+ .dlm-order-details .dlm-order-details-block h2.dlm-order-details-block-title {
1183
+ font-size: 14px;
1184
+ padding: 8px 12px;
1185
+ margin: 0;
1186
+ line-height: 1.4;
1187
+ border-bottom: 1px solid #eee;
1188
+ }
1189
+ .dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside {
1190
+ margin: 6px 0 0 0;
1191
+ padding: 6px 12px 12px;
1192
+ line-height: 1.4em;
1193
+ font-size: 13px;
1194
+ }
1195
+ .dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside label {
1196
+ display: block;
1197
+ font-weight: bold;
1198
+ padding-bottom: 6px;
1199
+ }
1200
+ .dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside p {
1201
+ padding: 0;
1202
+ margin: 0;
1203
+ }
1204
+ .dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside ul,
1205
+ .dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside ul li {
1206
+ list-style: none;
1207
+ padding: 0;
1208
+ margin: 0;
1209
+ }
1210
+ .dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside ul li {
1211
+ padding: 6px 0;
1212
+ }
1213
+ .dlm-order-details .dlm-order-details-block .dlm-order-details-block-inside .dlm-order-details-current-state {
1214
+ width: 70%;
1215
+ height: 30px;
1216
+ }
1217
+ .dlm-order-details .dlm-order-details-block.dlm-order-details-customer .dlm-order-details-customer-image {
1218
+ float: right;
1219
+ }
1220
+ .dlm-order-details .dlm-order-details-block.dlm-order-details-customer ul li {
1221
+ margin-bottom: 4px;
1222
+ padding: 0;
1223
+ }
1224
+ .dlm-order-details .dlm-order-details-block.dlm-order-details-customer ul li:first-child {
1225
+ font-weight: bold;
1226
+ }
1227
+ .dlm-order-details .dlm-order-details-block.dlm-order-details-order-items {
1228
+ overflow: hidden;
1229
+ }
1230
+ .dlm-order-details .dlm-order-details-block.dlm-order-details-order-items .dlm-order-details-overview {
1231
+ width: 25%;
1232
+ float: right;
1233
+ }
1234
+ .dlm-order-details .dlm-order-details-block.dlm-order-details-order-items .dlm-order-details-overview th,
1235
+ .dlm-order-details .dlm-order-details-block.dlm-order-details-order-items .dlm-order-details-overview td {
1236
+ padding-top: 1.5em;
1237
+ padding-bottom: 1.5em;
1238
+ text-align: right;
1239
+ }
1240
+ .dlm-order-details .dlm-order-details-block.dlm-order-details-order-items .dlm-order-details-overview th {
1241
+ width: 50%;
1242
+ font-weight: normal;
1243
+ }
1244
+ .dlm-order-details .dlm-order-details-block.dlm-order-details-order-items .dlm-order-details-overview td {
1245
+ padding-right: 1em;
1246
+ font-weight: bold;
1247
+ }
1248
+ .dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table {
1249
+ width: 100%;
1250
+ }
1251
+ .dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table th,
1252
+ .dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table td {
1253
+ text-align: center;
1254
+ }
1255
+ .dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table th:first-child,
1256
+ .dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table td:first-child {
1257
+ text-align: left;
1258
+ padding-left: 0.5em;
1259
+ }
1260
+ .dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table th {
1261
+ padding-top: 0.5em;
1262
+ padding-bottom: 0.5em;
1263
+ border-bottom: 2px solid #c3c1bc;
1264
+ }
1265
+ .dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table td {
1266
+ padding-top: 1.5em;
1267
+ padding-bottom: 1.5em;
1268
+ border-bottom: 1px solid #c3c1bc;
1269
+ }
1270
+ .dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table th.dlm-order-details-order-items-item-total,
1271
+ .dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table td.dlm-order-details-order-items-item-total {
1272
+ text-align: right;
1273
+ padding-right: 1em;
1274
+ }
1275
+ .dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table th.dlm-order-transaction-processor-id,
1276
+ .dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table td.dlm-order-transaction-processor-id {
1277
+ display: none;
1278
+ }
1279
+ .dlm-order-details .dlm-order-details-block .dlm-order-details-update-successful {
1280
+ font-size: 2em;
1281
+ padding: 0.2em 0.3em;
1282
+ color: #46b450;
1283
+ }
1284
+ @media (min-width: 768px) {
1285
+ .dlm-order-details .dlm-order-details-main {
1286
+ width: 62%;
1287
+ float: left;
1288
+ }
1289
+ .dlm-order-details .dlm-order-details-side {
1290
+ width: 35%;
1291
+ float: right;
1292
+ }
1293
+ .dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table th.dlm-order-transaction-processor-id,
1294
+ .dlm-order-details .dlm-order-details-block table.dlm-order-details-data-table td.dlm-order-transaction-processor-id {
1295
+ display: table-cell;
1296
+ }
1297
+ }
1298
+ /** Onboarding */
1299
+ .dlm-onboarding .dlm-onboarding-section.dlm-onboarding-section-one-col {
1300
+ margin: 0 auto;
1301
+ max-width: 680px;
1302
+ }
1303
+ .dlm-onboarding .dlm-onboarding-section.dlm-onboarding-section-cta {
1304
+ margin-top: 40px;
1305
+ text-align: center;
1306
+ }
1307
+ .dlm-onboarding .dlm-onboarding-section.dlm-onboarding-section-three-col {
1308
+ max-width: 680px;
1309
+ margin: 40px auto 0;
1310
+ overflow: hidden;
1311
+ display: flex;
1312
+ justify-content: space-between;
1313
+ flex-wrap: wrap;
1314
+ }
1315
+ .dlm-onboarding .dlm-onboarding-section.dlm-onboarding-section-three-col .dlm-onboarding-col {
1316
+ padding-top: 2.5em;
1317
+ flex: 1;
1318
+ align-self: flex-start;
1319
+ min-width: 100%;
1320
+ max-width: 100%;
1321
+ }
1322
+ .dlm-onboarding .dlm-onboarding-section.dlm-onboarding-section-three-col .dlm-onboarding-col img {
1323
+ width: 100%;
1324
+ }
1325
+ .dlm-onboarding .dlm-onboarding-section h2 {
1326
+ margin: 60px 0 0.6em;
1327
+ font-size: 2.7em;
1328
+ line-height: 1.3;
1329
+ font-weight: 300;
1330
+ text-align: center;
1331
+ }
1332
+ .dlm-onboarding .dlm-onboarding-section p {
1333
+ max-width: 55em;
1334
+ margin: 0.6em auto 0 auto;
1335
+ }
1336
+ .dlm-onboarding .dlm-onboarding-section a.button-hero {
1337
+ height: 46px;
1338
+ font-size: 14px;
1339
+ line-height: 44px;
1340
+ padding: 0 36px;
1341
+ font-weight: bold;
1342
+ text-align: center;
1343
+ }
1344
+ .dlm-onboarding .dlm-onboarding-pages {
1345
+ max-width: 55em;
1346
+ margin: 0 auto;
1347
+ padding: 2em 0 0;
1348
+ }
1349
+ .dlm-onboarding .dlm-onboarding-pages a.button-hero {
1350
+ width: 170px;
1351
+ }
1352
+ .dlm-onboarding .dlm-onboarding-pages a.button-hero.dlm-page-exists {
1353
+ background: #46b450;
1354
+ border-color: #46b450 #4a8442 #467a3f;
1355
+ box-shadow: 0 2px 0 #467a3f;
1356
+ text-shadow: 0 -1px 1px #4a8442, 1px 0 1px #4a8442, 0 1px 1px #4a8442, -1px 0 1px #4a8442;
1357
+ }
1358
+ .dlm-onboarding .dlm-onboarding-pages a.button-hero.dlm-page-exists:active {
1359
+ box-shadow: 0 2px 0 #467a3f;
1360
+ }
1361
+ .dlm-onboarding .dlm-onboarding-pages th,
1362
+ .dlm-onboarding .dlm-onboarding-pages td {
1363
+ padding: 1em 0;
1364
+ border-bottom: 1px solid #ccc;
1365
+ }
1366
+ .dlm-onboarding .dlm-onboarding-pages th {
1367
+ width: 13%;
1368
+ min-width: 6em;
1369
+ text-align: left;
1370
+ }
1371
+ .dlm-onboarding .dlm-onboarding-pages td {
1372
+ padding-right: 0.5em;
1373
+ padding-left: 0.5em;
1374
+ }
1375
+ .dlm-onboarding .dlm-onboarding-pages td.dlm-onboarding-pages-page-title {
1376
+ font-weight: bold;
1377
+ }
1378
+ @media (min-width: 768px) {
1379
+ .dlm-onboarding .dlm-onboarding-section .dlm-onboarding-pages {
1380
+ width: 55em;
1381
+ }
1382
+ .dlm-onboarding .dlm-onboarding-section.dlm-onboarding-section-three-col .dlm-onboarding-col {
1383
+ padding-top: 0;
1384
+ min-width: 31%;
1385
+ max-width: 31%;
1386
+ }
1387
+ }
1388
+ /* Extensions */
1389
+ .dlm_extensions_wrap h1 a.dlm-reload-button {
1390
+ float: right;
1391
+ }
1392
+ .dlm_extensions_wrap .dlm_extensions {
1393
+ padding: 15px 0;
1394
+ overflow: hidden;
1395
+ }
1396
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension {
1397
+ cursor: auto !important;
1398
+ }
1399
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension a {
1400
+ color: #444;
1401
+ text-decoration: none;
1402
+ }
1403
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .dlm_extension_img_wrapper {
1404
+ width: 100%;
1405
+ background: #419CCB;
1406
+ text-align: center;
1407
+ }
1408
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .dlm_extension_img_wrapper img {
1409
+ max-width: 100%;
1410
+ margin: 0 auto;
1411
+ }
1412
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension h3 {
1413
+ padding: 0 20px;
1414
+ }
1415
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension p.extension-desc {
1416
+ min-height: 85px;
1417
+ padding: 0 20px;
1418
+ }
1419
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .product_footer {
1420
+ padding: 0 20px 15px;
1421
+ }
1422
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .product_footer .loop_price {
1423
+ font-weight: bold;
1424
+ }
1425
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .product_footer .loop_price.sale {
1426
+ color: #008000;
1427
+ }
1428
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .product_footer .loop_price.sale strike {
1429
+ color: #444;
1430
+ }
1431
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .product_footer .loop_more {
1432
+ color: #459ac9;
1433
+ text-decoration: none;
1434
+ font-weight: bold;
1435
+ float: right;
1436
+ }
1437
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license {
1438
+ padding: 0 20px 20px;
1439
+ -webkit-box-sizing: border-box;
1440
+ -moz-box-sizing: border-box;
1441
+ box-sizing: border-box;
1442
+ }
1443
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license div.dlm_license_error {
1444
+ padding: 0.5em;
1445
+ margin-bottom: 15px;
1446
+ background: lightYellow;
1447
+ }
1448
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license div.dlm_license_error a {
1449
+ color: blue;
1450
+ text-decoration: underline;
1451
+ }
1452
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license p.license-status {
1453
+ padding: 5px 0;
1454
+ margin: 5px 0;
1455
+ background: red;
1456
+ font-weight: bold;
1457
+ font-size: 1.2em;
1458
+ color: #fff;
1459
+ text-align: center;
1460
+ }
1461
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license p.license-status.active {
1462
+ background: #008000;
1463
+ }
1464
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license input {
1465
+ width: 100%;
1466
+ margin: 7px 0;
1467
+ padding: 7px;
1468
+ }
1469
+ .dlm_extensions_wrap .dlm_extensions div.dlm_extension .extension_license a.button-primary {
1470
+ width: 100%;
1471
+ margin: 5px auto 0;
1472
+ color: #fff;
1473
+ text-align: center;
1474
+ }
1475
+ /* Fix Datepicker's UI bug */
1476
+ #ui-datepicker-div {
1477
+ display: none;
1478
+ }
1479
+ /* Upsells */
1480
+ .wpchill-upsell {
1481
+ background: #fff;
1482
+ border: 0;
1483
+ padding: 15px;
1484
+ margin-top: 30px;
1485
+ }
1486
+ .wpchill-upsell .wpchill-upsell-features {
1487
+ text-align: left;
1488
+ display: flex;
1489
+ flex-wrap: wrap;
1490
+ padding: 20px 0;
1491
+ }
1492
+ .wpchill-upsell .wpchill-upsell-features li {
1493
+ width: 33%;
1494
+ }
1495
+ .wpchill-upsells-wrapper {
1496
+ width: 100%;
1497
+ }
1498
+ .wrap.dlm-admin-settings .form-table {
1499
+ width: 65%;
1500
+ float: left;
1501
+ }
1502
+ .wrap.dlm-admin-settings .form-table + .wpchill-upsells-wrapper {
1503
+ width: 30%;
1504
+ float: right;
1505
+ }
1506
+ .wrap.dlm-admin-settings .nav-tab-wrapper a.nav-tab {
1507
+ margin: 0 auto;
1508
+ border-right: 0;
1509
+ }
1510
+ .wrap.dlm-admin-settings .nav-tab-wrapper a.nav-tab:first-child {
1511
+ border-top-left-radius: 5px;
1512
+ }
1513
+ .wrap.dlm-admin-settings .nav-tab-wrapper a.nav-tab:last-child {
1514
+ border-top-right-radius: 5px;
1515
+ border-right: 1px solid #c3c4c7;
1516
+ }
1517
+ .wrap.dlm-admin-settings .dlm-upsell-badge {
1518
+ background: green;
1519
+ color: #fff;
1520
+ padding: 5px 10px;
1521
+ font-size: 11px;
1522
+ }
1523
+ #total_downloads_browser_table a.nav-tab {
1524
+ text-transform: capitalize;
1525
+ }
1526
+ .post-type-dlm_download .nav-tab-wrapper a.nav-tab {
1527
+ margin: 0 auto;
1528
+ border-right: 0;
1529
+ border-bottom: 0;
1530
+ }
1531
+ .post-type-dlm_download .nav-tab-wrapper a.nav-tab:first-child {
1532
+ border-top-left-radius: 5px;
1533
+ }
1534
+ .post-type-dlm_download .nav-tab-wrapper a.nav-tab:last-child,
1535
+ .post-type-dlm_download .nav-tab-wrapper a.nav-tab.last_tab {
1536
+ border-top-right-radius: 5px;
1537
+ border-right: 1px solid #c3c4c7;
1538
+ }
1539
+ #dlm-download-page-upsell .inside,
1540
+ #dlm-amazon-s3-upsell .inside,
1541
+ #dlm-google-drive-upsell .inside,
1542
+ #dlm-buttons-upsell .inside {
1543
+ display: flex;
1544
+ flex-wrap: wrap;
1545
+ background: #f1f1f1;
1546
+ }
1547
+ #dlm-download-page-upsell .inside .wpchill-upsell,
1548
+ #dlm-amazon-s3-upsell .inside .wpchill-upsell,
1549
+ #dlm-google-drive-upsell .inside .wpchill-upsell,
1550
+ #dlm-buttons-upsell .inside .wpchill-upsell {
1551
+ background: transparent;
1552
+ text-align: center;
1553
+ width: 100%;
1554
+ margin-top: 0;
1555
+ }
1556
+ #dlm-download-page-upsell .inside,
1557
+ #dlm-amazon-s3-upsell .inside,
1558
+ #dlm-google-drive-upsell .inside,
1559
+ #dlm-buttons-upsell .inside {
1560
+ margin: 0;
1561
+ padding: 0;
1562
+ }
1563
+ .upsells-columns {
1564
+ display: flex;
1565
+ flex-wrap: wrap;
1566
+ align-items: center;
1567
+ align-content: center;
1568
+ }
1569
+ .upsells-columns .upsells-columns-2 {
1570
+ width: 50%;
1571
+ text-align: center;
1572
+ display: flex;
1573
+ align-items: center;
1574
+ align-content: center;
1575
+ }
1576
+ .upsells-columns .upsells-column {
1577
+ width: 100%;
1578
+ text-align: center;
1579
+ display: flex;
1580
+ align-items: center;
1581
+ align-content: center;
1582
+ }
1583
+ .upsells-columns .upsells-column > * {
1584
+ display: inline-block;
1585
+ align-content: center;
1586
+ vertical-align: middle;
1587
+ margin: 0 15px;
1588
+ padding: 10px 0;
1589
+ }
1590
+ .upsells-columns .upsells-column > *.wpchill-upsell {
1591
+ position: relative;
1592
+ float: none;
1593
+ flex-grow: 1;
1594
+ display: flex;
1595
+ align-items: center;
1596
+ }
1597
+ .upsells-columns .upsells-column > *.wpchill-upsell .wpchill-upsell-description {
1598
+ margin: 0 auto;
1599
+ }
1600
+ .upsells-columns .upsells-column h3 {
1601
+ line-height: 1.3em;
1602
+ }
1603
+ .upsells-columns .upsells-column:last-child {
1604
+ border-top: 1px solid #c3c4c7;
1605
+ border-bottom: 1px solid #c3c4c7;
1606
+ }
1607
+ .upsells-columns .wpchill-upsell {
1608
+ margin-top: 0;
1609
+ }
assets/css/admin.less CHANGED
@@ -400,7 +400,7 @@ table.wp-list-table {
400
  }
401
  .handlediv {
402
  background-position: 6px 5px !important;
403
- display: none;
404
  height: 24px;
405
  }
406
  }
@@ -942,6 +942,11 @@ table.wp-list-table {
942
 
943
  }
944
 
 
 
 
 
 
945
  /** Products overview page */
946
  .post-type-dlm_product {
947
  table.wp-list-table {
@@ -1404,4 +1409,179 @@ table.wp-list-table {
1404
  /* Fix Datepicker's UI bug */
1405
  #ui-datepicker-div {
1406
  display: none;
1407
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
400
  }
401
  .handlediv {
402
  background-position: 6px 5px !important;
403
+ display: none !important;
404
  height: 24px;
405
  }
406
  }
942
 
943
  }
944
 
945
+ .dlm-reports-block-summary {
946
+ background: #333!important;
947
+ color: white;
948
+ }
949
+
950
  /** Products overview page */
951
  .post-type-dlm_product {
952
  table.wp-list-table {
1409
  /* Fix Datepicker's UI bug */
1410
  #ui-datepicker-div {
1411
  display: none;
1412
+ }
1413
+
1414
+ /* Upsells */
1415
+ .wpchill-upsell {
1416
+ background: #fff;
1417
+ border: 0;
1418
+ padding: 15px;
1419
+ margin-top: 30px;
1420
+
1421
+ .wpchill-upsell-features {
1422
+ text-align: left;
1423
+ display: flex;
1424
+ flex-wrap: wrap;
1425
+ padding: 20px 0;
1426
+
1427
+ li {
1428
+ width: 33%;
1429
+ }
1430
+ }
1431
+ }
1432
+
1433
+ .wpchill-upsells-wrapper {
1434
+ width: 100%;
1435
+ }
1436
+
1437
+ .wrap.dlm-admin-settings {
1438
+ .form-table {
1439
+ width: 65%;
1440
+ float: left;
1441
+
1442
+ & + .wpchill-upsells-wrapper {
1443
+ width: 30%;
1444
+ float: right;
1445
+ }
1446
+ }
1447
+
1448
+ .nav-tab-wrapper {
1449
+
1450
+ a.nav-tab {
1451
+ margin: 0 auto;
1452
+ border-right: 0;
1453
+
1454
+ &:first-child {
1455
+ border-top-left-radius: 5px;
1456
+ }
1457
+
1458
+ &:last-child {
1459
+ border-top-right-radius: 5px;
1460
+ border-right: 1px solid #c3c4c7;
1461
+ }
1462
+ }
1463
+ }
1464
+
1465
+ .dlm-upsell-badge {
1466
+ background:green;
1467
+ color:#fff;
1468
+ padding:5px 10px;
1469
+ font-size:11px;
1470
+ }
1471
+ }
1472
+
1473
+ #total_downloads_browser_table {
1474
+ a.nav-tab {
1475
+ text-transform:capitalize;
1476
+ }
1477
+ }
1478
+
1479
+ .post-type-dlm_download {
1480
+
1481
+ .nav-tab-wrapper {
1482
+
1483
+ a.nav-tab {
1484
+ margin: 0 auto;
1485
+ border-right: 0;
1486
+ border-bottom:0;
1487
+
1488
+ &:first-child {
1489
+ border-top-left-radius: 5px;
1490
+ }
1491
+
1492
+ &:last-child,
1493
+ &.last_tab{
1494
+ border-top-right-radius: 5px;
1495
+ border-right: 1px solid #c3c4c7;
1496
+ }
1497
+ }
1498
+ }
1499
+ }
1500
+
1501
+ #dlm-download-page-upsell,
1502
+ #dlm-amazon-s3-upsell ,
1503
+ #dlm-google-drive-upsell,
1504
+ #dlm-buttons-upsell {
1505
+ .inside {
1506
+ display: flex;
1507
+ flex-wrap: wrap;
1508
+ background: #f1f1f1;
1509
+
1510
+ .wpchill-upsell {
1511
+ background: transparent;
1512
+ text-align:center;
1513
+ width:100%;
1514
+ margin-top:0;
1515
+ }
1516
+ }
1517
+
1518
+ .inside {
1519
+ margin: 0;
1520
+ padding: 0;
1521
+ }
1522
+
1523
+ }
1524
+
1525
+ .upsells-columns {
1526
+ display: flex;
1527
+ flex-wrap: wrap;
1528
+ align-items: center;
1529
+ align-content: center;
1530
+
1531
+ .upsells-columns-2 {
1532
+ width: 50%;
1533
+ text-align: center;
1534
+ display:flex;
1535
+ align-items:center;
1536
+ align-content:center;
1537
+ }
1538
+
1539
+ .upsells-column {
1540
+ width: 100%;
1541
+ text-align: center;
1542
+ display: flex;
1543
+ align-items: center;
1544
+ align-content: center;
1545
+
1546
+ > * {
1547
+ display: inline-block;
1548
+ align-content: center;
1549
+ vertical-align: middle;
1550
+ margin: 0 15px;
1551
+ float: left;
1552
+ padding: 15px;
1553
+
1554
+ &.wpchill-upsell {
1555
+ width: 100%;
1556
+ position: relative;
1557
+ float: right;
1558
+
1559
+ .wpchill-upsell-description {
1560
+ margin:0 auto;
1561
+ max-width:calc(100% - 200px);
1562
+ }
1563
+
1564
+ a {
1565
+ position: absolute;
1566
+ right: 0;
1567
+ top: 50%;
1568
+ transform: translateY(-50%);
1569
+ }
1570
+ }
1571
+ }
1572
+
1573
+ h3 {
1574
+ line-height:1.3em;
1575
+ }
1576
+
1577
+ &:last-child {
1578
+ border-top: 1px solid #c3c4c7;
1579
+ border-bottom: 1px solid #c3c4c7;
1580
+ }
1581
+
1582
+ }
1583
+
1584
+ .wpchill-upsell {
1585
+ margin-top: 0;
1586
+ }
1587
+ }
assets/css/dlm-uninstall.css ADDED
@@ -0,0 +1 @@
 
1
+ .dlm-uninstall-form-active .dlm-uninstall-form-bg{background:rgba(0,0,0,.5);position:fixed;top:0;left:0;width:100%;height:100%}.dlm-uninstall-form-wrapper{position:fixed;z-index:999;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;margin:0 auto}.dlm-uninstall-form-wrapper .uninstall{text-align:center}.dlm-uninstall-form-active .dlm-uninstall-form-wrapper{display:block;z-index:999}.dlm-uninstall-form{display:none}.dlm-uninstall-form-active .dlm-uninstall-form{position:absolute;left:0;right:0;margin:0 auto;top:50%;transform:translateY(-50%);max-width:600px;background:#fff;white-space:normal}.dlm-uninstall-form-head{background:#774cce;padding:8px 18px;position:relative}.dlm-uninstall-form-head h3{color:#fff}.dlm-uninstall-form-body{padding:8px 18px;color:#444}.deactivating-spinner{display:none}.deactivating-spinner .spinner{float:none;margin:4px 4px 0 18px;vertical-align:bottom;visibility:visible}.toggle-spinner .deactivating-spinner{display:block!important}.dlm-uninstall-form-footer p{display:flex;align-items:center;justify-content:space-between}.dlm-uninstall-form.process-response .dlm-uninstall-form-body{position:relative}.dlm-uninstall-form.process-response .dlm-uninstall-form-body:after{content:"";display:block;position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,.5)}.dlm-uninstall-form-head .close-uninstall-form{position:absolute;right:15px;color:#fff;font-family:Arial;font-size:14px;display:inline-block;top:50%;transform:translateY(-50%);cursor:pointer}.dlm-red-text,.dlm-red-text:hover{color:red;font-weight:700}
assets/images/filetypes/document-code.png CHANGED
File without changes
assets/images/filetypes/document-excel.png CHANGED
File without changes
assets/images/filetypes/document-film.png CHANGED
File without changes
assets/images/filetypes/document-flash-movie.png CHANGED
File without changes
assets/images/filetypes/document-illustrator.png CHANGED
File without changes
assets/images/filetypes/document-image.png CHANGED
File without changes
assets/images/filetypes/document-music.png CHANGED
File without changes
assets/images/filetypes/document-pdf.png CHANGED
File without changes
assets/images/filetypes/document-photoshop.png CHANGED
File without changes
assets/images/filetypes/document-powerpoint.png CHANGED
File without changes
assets/images/filetypes/document-text-image.png CHANGED
File without changes
assets/images/filetypes/document-text.png CHANGED
File without changes
assets/images/filetypes/document-word-text.png CHANGED
File without changes
assets/images/filetypes/document-zipper.png CHANGED
File without changes
assets/images/filetypes/document.png CHANGED
File without changes
assets/images/filetypes/readme.txt CHANGED
File without changes
assets/js/chosen/chosen-sprite.png CHANGED
File without changes
assets/js/chosen/chosen-sprite@2x.png CHANGED
File without changes
assets/js/chosen/chosen.css CHANGED
File without changes
assets/js/chosen/chosen.jquery.js CHANGED
File without changes
assets/js/chosen/chosen.jquery.min.js CHANGED
File without changes
assets/js/dlm-uninstall.js ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(function ($) {
2
+
3
+ var uninstall = $("a.uninstall-dlm"),
4
+ formContainer = $('#dlm-uninstall-form');
5
+
6
+ formContainer.on('click', '#delete_all', function () {
7
+ if ( $('#delete_all').is(':checked') ) {
8
+ $('#delete_options').prop('checked', true);
9
+ $('#delete_transients').prop('checked', true);
10
+ $('#delete_cpt').prop('checked', true);
11
+ $('#delete_set_tables').prop('checked', true);
12
+ } else {
13
+ $('#delete_options').prop('checked', false);
14
+ $('#delete_transients').prop('checked', false);
15
+ $('#delete_cpt').prop('checked', false);
16
+ $('#delete_set_tables').prop('checked', false);
17
+ }
18
+ });
19
+
20
+ $(uninstall).on("click", function () {
21
+
22
+ $('body').toggleClass('dlm-uninstall-form-active');
23
+ formContainer.fadeIn();
24
+
25
+ formContainer.on('click', '#dlm-uninstall-submit-form', function (e) {
26
+ formContainer.addClass('toggle-spinner');
27
+ var selectedOptions = {
28
+ delete_options: ($('#delete_options').is(':checked')) ? 1 : 0,
29
+ delete_transients: ($('#delete_transients').is(':checked')) ? 1 : 0,
30
+ delete_cpt: ($('#delete_cpt').is(':checked')) ? 1 : 0,
31
+ delete_set_tables: ($('#delete_set_tables').is(':checked')) ? 1 : 0,
32
+ };
33
+
34
+ var data = {
35
+ 'action': 'dlm_uninstall_plugin',
36
+ 'security': wpDLMUninstall.nonce,
37
+ 'dataType': "json",
38
+ 'options': selectedOptions
39
+ };
40
+
41
+ $.post(
42
+ ajaxurl,
43
+ data,
44
+ function (response) {
45
+ // Redirect to plugins page
46
+ window.location.href = wpDLMUninstall.redirect_url;
47
+ }
48
+ );
49
+ });
50
+
51
+ // If we click outside the form, the form will close
52
+ // Stop propagation from form
53
+ formContainer.on('click', function (e) {
54
+ e.stopPropagation();
55
+ });
56
+
57
+ $('.dlm-uninstall-form-wrapper, .close-uninstall-form').on('click', function (e) {
58
+ e.stopPropagation();
59
+ formContainer.fadeOut();
60
+ $('body').removeClass('dlm-uninstall-form-active');
61
+ });
62
+
63
+ $(document).on("keyup", function (e) {
64
+ if ( e.key === "Escape" ) {
65
+ formContainer.fadeOut();
66
+ $('body').removeClass('dlm-uninstall-form-active');
67
+ }
68
+ });
69
+ });
70
+ });
assets/js/dlm-uninstall.min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function(n){var e=n("a.uninstall-dlm"),o=n("#dlm-uninstall-form");o.on("click","#delete_all",function(){n("#delete_all").is(":checked")?(n("#delete_options").prop("checked",!0),n("#delete_transients").prop("checked",!0),n("#delete_cpt").prop("checked",!0),n("#delete_set_tables").prop("checked",!0)):(n("#delete_options").prop("checked",!1),n("#delete_transients").prop("checked",!1),n("#delete_cpt").prop("checked",!1),n("#delete_set_tables").prop("checked",!1))}),n(e).on("click",function(){n("body").toggleClass("dlm-uninstall-form-active"),o.fadeIn(),o.on("click","#dlm-uninstall-submit-form",function(e){o.addClass("toggle-spinner");var t={delete_options:n("#delete_options").is(":checked")?1:0,delete_transients:n("#delete_transients").is(":checked")?1:0,delete_cpt:n("#delete_cpt").is(":checked")?1:0,delete_set_tables:n("#delete_set_tables").is(":checked")?1:0},l={action:"dlm_uninstall_plugin",security:wpDLMUninstall.nonce,dataType:"json",options:t};n.post(ajaxurl,l,function(e){window.location.href=wpDLMUninstall.redirect_url})}),o.on("click",function(e){e.stopPropagation()}),n(".dlm-uninstall-form-wrapper, .close-uninstall-form").on("click",function(e){e.stopPropagation(),o.fadeOut(),n("body").removeClass("dlm-uninstall-form-active")}),n(document).on("keyup",function(e){"Escape"===e.key&&(o.fadeOut(),n("body").removeClass("dlm-uninstall-form-active"))})})});
assets/js/edit-download.js CHANGED
@@ -69,7 +69,7 @@ jQuery( function ( $ ) {
69
  }
70
  } );
71
 
72
- var size = jQuery( '.downloadable_files .downloadable_file' ).size();
73
 
74
  var data = {
75
  action: 'download_monitor_add_file',
69
  }
70
  } );
71
 
72
+ var size = jQuery( '.downloadable_files .downloadable_file' ).length;
73
 
74
  var data = {
75
  action: 'download_monitor_add_file',
assets/js/edit-download.min.js CHANGED
@@ -1 +1 @@
1
- jQuery(function(d){function l(){jQuery(".downloadable_files .downloadable_file").each(function(e,o){jQuery(".file_menu_order",o).val(parseInt(jQuery(o).index(".downloadable_files .downloadable_file")))})}var r;jQuery(".expand_all").click(function(){return jQuery(this).closest(".dlm-metaboxes-wrapper").find(".dlm-metabox table").show(),!1}),jQuery(".close_all").click(function(){return jQuery(this).closest(".dlm-metaboxes-wrapper").find(".dlm-metabox table").hide(),!1}),jQuery(".dlm-metaboxes-wrapper").on("click",".dlm-metabox h3",function(e){jQuery(e.target).filter(":input, option").length||jQuery(this).next(".dlm-metabox-content").toggle()}),jQuery(".dlm-metabox.closed").each(function(){jQuery(this).find(".dlm-metabox-content").hide()}),jQuery(".date-picker-field").datepicker({dateFormat:"yy-mm-dd",numberOfMonths:1,showButtonPanel:!0}),jQuery(".downloadable_files").sortable({items:".downloadable_file",cursor:"move",axis:"y",handle:"h3",scrollSensitivity:40,forcePlaceholderSize:!0,helper:"clone",opacity:.65,placeholder:"dlm-metabox-sortable-placeholder",start:function(e,o){o.item.css("background-color","#f6f6f6")},stop:function(e,o){o.item.removeAttr("style"),l()}}),jQuery(".download_monitor_files").on("click","a.add_file",function(){jQuery(".download_monitor_files").block({message:null,overlayCSS:{background:"#fff url("+d("#dlm-plugin-url").val()+"/assets/images/ajax-loader.gif) no-repeat center",opacity:.6}});var e=jQuery(".downloadable_files .downloadable_file").size(),o={action:"download_monitor_add_file",post_id:d("#dlm-post-id").val(),size:e,security:d("#dlm-ajax-nonce-add-file").val()};return jQuery.post(ajaxurl,o,function(e){jQuery(".downloadable_files").prepend(e),l(),jQuery(".download_monitor_files").unblock(),jQuery(".date-picker-field").datepicker({dateFormat:"yy-mm-dd",numberOfMonths:1,showButtonPanel:!0})}),!1}),jQuery(".download_monitor_files").on("click","button.remove_file",function(e){if(e.preventDefault(),confirm(dlm_ed_strings.confirm_delete)){var o=jQuery(this).closest(".downloadable_file"),l=o.attr("data-file");if(0<l){jQuery(o).block({message:null,overlayCSS:{background:"#fff url("+d("#dlm-plugin-url").val()+"/assets/images/ajax-loader.gif) no-repeat center",opacity:.6}});var a={action:"download_monitor_remove_file",file_id:l,download_id:d("#dlm-post-id").val(),security:d("#dlm-ajax-nonce-remove-file").val()};jQuery.post(ajaxurl,a,function(e){jQuery(o).fadeOut("300").remove()})}else jQuery(o).fadeOut("300").remove()}return!1}),jQuery(".download_monitor_files").on("click","a.dlm_browse_for_file",function(e){return downloadable_files_field=jQuery(this).closest(".downloadable_file").find('textarea[name^="downloadable_file_urls"]'),window.send_to_editor=window.send_to_browse_file_url,tb_show(dlm_ed_strings.browse_file,"media-upload.php?post_id="+d("#dlm-post-id").val()+"&amp;type=downloadable_file_browser&amp;from=wpdlm01&amp;TB_iframe=true"),!1}),window.send_to_browse_file_url=function(e){e&&(old=jQuery.trim(jQuery(downloadable_files_field).val()),old&&(old+="\n"),jQuery(downloadable_files_field).val(old+e)),tb_remove(),window.send_to_editor=window.send_to_editor_default},jQuery(document).on("click",".dlm_upload_file",function(e){var o=d(this),l=o.parent().parent().find(".downloadable_file_urls"),a=l.val();e.preventDefault(),r&&r.close();var t=[new wp.media.controller.Library({library:wp.media.query(),multiple:!0,title:o.data("choose"),priority:20,filterable:"uploaded"})];(r=wp.media.frames.downloadable_file=wp.media({title:o.data("choose"),library:{type:""},button:{text:o.data("update")},multiple:!0,states:t})).on("select",function(){r.state().get("selection").map(function(e){(e=e.toJSON()).url&&(a=a?a+"\n"+e.url:e.url)}),l.val(a)}),r.on("ready",function(){r.uploader.options.uploader.params={type:"dlm_download"}}),r.open()})});
1
+ jQuery(function(d){function l(){jQuery(".downloadable_files .downloadable_file").each(function(e,o){jQuery(".file_menu_order",o).val(parseInt(jQuery(o).index(".downloadable_files .downloadable_file")))})}var r;jQuery(".expand_all").click(function(){return jQuery(this).closest(".dlm-metaboxes-wrapper").find(".dlm-metabox table").show(),!1}),jQuery(".close_all").click(function(){return jQuery(this).closest(".dlm-metaboxes-wrapper").find(".dlm-metabox table").hide(),!1}),jQuery(".dlm-metaboxes-wrapper").on("click",".dlm-metabox h3",function(e){jQuery(e.target).filter(":input, option").length||jQuery(this).next(".dlm-metabox-content").toggle()}),jQuery(".dlm-metabox.closed").each(function(){jQuery(this).find(".dlm-metabox-content").hide()}),jQuery(".date-picker-field").datepicker({dateFormat:"yy-mm-dd",numberOfMonths:1,showButtonPanel:!0}),jQuery(".downloadable_files").sortable({items:".downloadable_file",cursor:"move",axis:"y",handle:"h3",scrollSensitivity:40,forcePlaceholderSize:!0,helper:"clone",opacity:.65,placeholder:"dlm-metabox-sortable-placeholder",start:function(e,o){o.item.css("background-color","#f6f6f6")},stop:function(e,o){o.item.removeAttr("style"),l()}}),jQuery(".download_monitor_files").on("click","a.add_file",function(){jQuery(".download_monitor_files").block({message:null,overlayCSS:{background:"#fff url("+d("#dlm-plugin-url").val()+"/assets/images/ajax-loader.gif) no-repeat center",opacity:.6}});var e=jQuery(".downloadable_files .downloadable_file").length,o={action:"download_monitor_add_file",post_id:d("#dlm-post-id").val(),size:e,security:d("#dlm-ajax-nonce-add-file").val()};return jQuery.post(ajaxurl,o,function(e){jQuery(".downloadable_files").prepend(e),l(),jQuery(".download_monitor_files").unblock(),jQuery(".date-picker-field").datepicker({dateFormat:"yy-mm-dd",numberOfMonths:1,showButtonPanel:!0})}),!1}),jQuery(".download_monitor_files").on("click","button.remove_file",function(e){if(e.preventDefault(),confirm(dlm_ed_strings.confirm_delete)){var o=jQuery(this).closest(".downloadable_file"),l=o.attr("data-file");if(0<l){jQuery(o).block({message:null,overlayCSS:{background:"#fff url("+d("#dlm-plugin-url").val()+"/assets/images/ajax-loader.gif) no-repeat center",opacity:.6}});var a={action:"download_monitor_remove_file",file_id:l,download_id:d("#dlm-post-id").val(),security:d("#dlm-ajax-nonce-remove-file").val()};jQuery.post(ajaxurl,a,function(e){jQuery(o).fadeOut("300").remove()})}else jQuery(o).fadeOut("300").remove()}return!1}),jQuery(".download_monitor_files").on("click","a.dlm_browse_for_file",function(e){return downloadable_files_field=jQuery(this).closest(".downloadable_file").find('textarea[name^="downloadable_file_urls"]'),window.send_to_editor=window.send_to_browse_file_url,tb_show(dlm_ed_strings.browse_file,"media-upload.php?post_id="+d("#dlm-post-id").val()+"&amp;type=downloadable_file_browser&amp;from=wpdlm01&amp;TB_iframe=true"),!1}),window.send_to_browse_file_url=function(e){e&&(old=jQuery.trim(jQuery(downloadable_files_field).val()),old&&(old+="\n"),jQuery(downloadable_files_field).val(old+e)),tb_remove(),window.send_to_editor=window.send_to_editor_default},jQuery(document).on("click",".dlm_upload_file",function(e){var o=d(this),l=o.parent().parent().find(".downloadable_file_urls"),a=l.val();e.preventDefault(),r&&r.close();var t=[new wp.media.controller.Library({library:wp.media.query(),multiple:!0,title:o.data("choose"),priority:20,filterable:"uploaded"})];(r=wp.media.frames.downloadable_file=wp.media({title:o.data("choose"),library:{type:""},button:{text:o.data("update")},multiple:!0,states:t})).on("select",function(){r.state().get("selection").map(function(e){(e=e.toJSON()).url&&(a=a?a+"\n"+e.url:e.url)}),l.val(a)}),r.on("ready",function(){r.uploader.options.uploader.params={type:"dlm_download"}}),r.open()})});
assets/js/legacy-upgrader/.babelrc DELETED
@@ -1,11 +0,0 @@
1
- {
2
- "sourceMaps": true,
3
- "presets": [
4
- ["es2015", { "loose":true }],
5
- "stage-0"
6
- ],
7
- "plugins": [
8
- ["transform-decorators-legacy"],
9
- ["transform-react-jsx", { "pragma": "h" }]
10
- ]
11
- }
 
 
 
 
 
 
 
 
 
 
 
assets/js/legacy-upgrader/build/assets/.gitkeep DELETED
File without changes
assets/js/legacy-upgrader/src/assets/.gitkeep DELETED
File without changes
assets/js/legacy-upgrader/src/index.js CHANGED
File without changes
assets/js/legacy-upgrader/src/lib/.gitkeep DELETED
File without changes
assets/js/legacy-upgrader/src/style/index.less CHANGED
File without changes
assets/js/reports/charts.min.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * Chart.js v3.5.1
3
+ * https://www.chartjs.org
4
+ * (c) 2021 Chart.js Contributors
5
+ * Released under the MIT License
6
+ */
7
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";const t="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function e(e,i,n){const o=n||(t=>Array.prototype.slice.call(t));let s=!1,a=[];return function(...n){a=o(n),s||(s=!0,t.call(window,(()=>{s=!1,e.apply(i,a)})))}}function i(t,e){let i;return function(...n){return e?(clearTimeout(i),i=setTimeout(t,e,n)):t.apply(this,n),e}}const n=t=>"start"===t?"left":"end"===t?"right":"center",o=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,s=(t,e,i,n)=>t===(n?"left":"right")?i:"center"===t?(e+i)/2:e;var a=new class{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,n){const o=e.listeners[n],s=e.duration;o.forEach((n=>n({chart:t,initial:e.initial,numSteps:s,currentStep:Math.min(i-e.start,s)})))}_refresh(){const e=this;e._request||(e._running=!0,e._request=t.call(window,(()=>{e._update(),e._request=null,e._running&&e._refresh()})))}_update(t=Date.now()){const e=this;let i=0;e._charts.forEach(((n,o)=>{if(!n.running||!n.items.length)return;const s=n.items;let a,r=s.length-1,l=!1;for(;r>=0;--r)a=s[r],a._active?(a._total>n.duration&&(n.duration=a._total),a.tick(t),l=!0):(s[r]=s[s.length-1],s.pop());l&&(o.draw(),e._notify(o,n,t,"progress")),s.length||(n.running=!1,e._notify(o,n,t,"complete"),n.initial=!1),i+=s.length})),e._lastDate=t,0===i&&(e._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let n=i.length-1;for(;n>=0;--n)i[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}};
8
+ /*!
9
+ * @kurkle/color v0.1.9
10
+ * https://github.com/kurkle/color#readme
11
+ * (c) 2020 Jukka Kurkela
12
+ * Released under the MIT License
13
+ */const r={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},l="0123456789ABCDEF",c=t=>l[15&t],h=t=>l[(240&t)>>4]+l[15&t],d=t=>(240&t)>>4==(15&t);function u(t){var e=function(t){return d(t.r)&&d(t.g)&&d(t.b)&&d(t.a)}(t)?c:h;return t?"#"+e(t.r)+e(t.g)+e(t.b)+(t.a<255?e(t.a):""):t}function f(t){return t+.5|0}const g=(t,e,i)=>Math.max(Math.min(t,i),e);function p(t){return g(f(2.55*t),0,255)}function m(t){return g(f(255*t),0,255)}function x(t){return g(f(t/2.55)/100,0,1)}function b(t){return g(f(100*t),0,100)}const _=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const y=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function v(t,e,i){const n=e*Math.min(i,1-i),o=(e,o=(e+t/30)%12)=>i-n*Math.max(Math.min(o-3,9-o,1),-1);return[o(0),o(8),o(4)]}function w(t,e,i){const n=(n,o=(n+t/60)%6)=>i-i*e*Math.max(Math.min(o,4-o,1),0);return[n(5),n(3),n(1)]}function M(t,e,i){const n=v(t,1,.5);let o;for(e+i>1&&(o=1/(e+i),e*=o,i*=o),o=0;o<3;o++)n[o]*=1-e-i,n[o]+=e;return n}function k(t){const e=t.r/255,i=t.g/255,n=t.b/255,o=Math.max(e,i,n),s=Math.min(e,i,n),a=(o+s)/2;let r,l,c;return o!==s&&(c=o-s,l=a>.5?c/(2-o-s):c/(o+s),r=o===e?(i-n)/c+(i<n?6:0):o===i?(n-e)/c+2:(e-i)/c+4,r=60*r+.5),[0|r,l||0,a]}function S(t,e,i,n){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,i,n)).map(m)}function P(t,e,i){return S(v,t,e,i)}function D(t){return(t%360+360)%360}function C(t){const e=y.exec(t);let i,n=255;if(!e)return;e[5]!==i&&(n=e[6]?p(+e[5]):m(+e[5]));const o=D(+e[2]),s=+e[3]/100,a=+e[4]/100;return i="hwb"===e[1]?function(t,e,i){return S(M,t,e,i)}(o,s,a):"hsv"===e[1]?function(t,e,i){return S(w,t,e,i)}(o,s,a):P(o,s,a),{r:i[0],g:i[1],b:i[2],a:n}}const O={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},T={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};let A;function L(t){A||(A=function(){const t={},e=Object.keys(T),i=Object.keys(O);let n,o,s,a,r;for(n=0;n<e.length;n++){for(a=r=e[n],o=0;o<i.length;o++)s=i[o],r=r.replace(s,O[s]);s=parseInt(T[a],16),t[r]=[s>>16&255,s>>8&255,255&s]}return t}(),A.transparent=[0,0,0,0]);const e=A[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}function R(t,e,i){if(t){let n=k(t);n[e]=Math.max(0,Math.min(n[e]+n[e]*i,0===e?360:1)),n=P(n),t.r=n[0],t.g=n[1],t.b=n[2]}}function E(t,e){return t?Object.assign(e||{},t):t}function I(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=m(t[3]))):(e=E(t,{r:0,g:0,b:0,a:1})).a=m(e.a),e}function z(t){return"r"===t.charAt(0)?function(t){const e=_.exec(t);let i,n,o,s=255;if(e){if(e[7]!==i){const t=+e[7];s=255&(e[8]?p(t):255*t)}return i=+e[1],n=+e[3],o=+e[5],i=255&(e[2]?p(i):i),n=255&(e[4]?p(n):n),o=255&(e[6]?p(o):o),{r:i,g:n,b:o,a:s}}}(t):C(t)}class F{constructor(t){if(t instanceof F)return t;const e=typeof t;let i;var n,o,s;"object"===e?i=I(t):"string"===e&&(s=(n=t).length,"#"===n[0]&&(4===s||5===s?o={r:255&17*r[n[1]],g:255&17*r[n[2]],b:255&17*r[n[3]],a:5===s?17*r[n[4]]:255}:7!==s&&9!==s||(o={r:r[n[1]]<<4|r[n[2]],g:r[n[3]]<<4|r[n[4]],b:r[n[5]]<<4|r[n[6]],a:9===s?r[n[7]]<<4|r[n[8]]:255})),i=o||L(t)||z(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=E(this._rgb);return t&&(t.a=x(t.a)),t}set rgb(t){this._rgb=I(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${x(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):this._rgb;var t}hexString(){return this._valid?u(this._rgb):this._rgb}hslString(){return this._valid?function(t){if(!t)return;const e=k(t),i=e[0],n=b(e[1]),o=b(e[2]);return t.a<255?`hsla(${i}, ${n}%, ${o}%, ${x(t.a)})`:`hsl(${i}, ${n}%, ${o}%)`}(this._rgb):this._rgb}mix(t,e){const i=this;if(t){const n=i.rgb,o=t.rgb;let s;const a=e===s?.5:e,r=2*a-1,l=n.a-o.a,c=((r*l==-1?r:(r+l)/(1+r*l))+1)/2;s=1-c,n.r=255&c*n.r+s*o.r+.5,n.g=255&c*n.g+s*o.g+.5,n.b=255&c*n.b+s*o.b+.5,n.a=a*n.a+(1-a)*o.a,i.rgb=n}return i}clone(){return new F(this.rgb)}alpha(t){return this._rgb.a=m(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=f(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return R(this._rgb,2,t),this}darken(t){return R(this._rgb,2,-t),this}saturate(t){return R(this._rgb,1,t),this}desaturate(t){return R(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=k(t);i[0]=D(i[0]+e),i=P(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function B(t){return new F(t)}const V=t=>t instanceof CanvasGradient||t instanceof CanvasPattern;function W(t){return V(t)?t:B(t)}function N(t){return V(t)?t:B(t).saturate(.5).darken(.1).hexString()}function H(){}const j=function(){let t=0;return function(){return t++}}();function $(t){return null==t}function Y(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)}function U(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}const X=t=>("number"==typeof t||t instanceof Number)&&isFinite(+t);function q(t,e){return X(t)?t:e}function K(t,e){return void 0===t?e:t}const G=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:t/e,Z=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function Q(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function J(t,e,i,n){let o,s,a;if(Y(t))if(s=t.length,n)for(o=s-1;o>=0;o--)e.call(i,t[o],o);else for(o=0;o<s;o++)e.call(i,t[o],o);else if(U(t))for(a=Object.keys(t),s=a.length,o=0;o<s;o++)e.call(i,t[a[o]],a[o])}function tt(t,e){let i,n,o,s;if(!t||!e||t.length!==e.length)return!1;for(i=0,n=t.length;i<n;++i)if(o=t[i],s=e[i],o.datasetIndex!==s.datasetIndex||o.index!==s.index)return!1;return!0}function et(t){if(Y(t))return t.map(et);if(U(t)){const e=Object.create(null),i=Object.keys(t),n=i.length;let o=0;for(;o<n;++o)e[i[o]]=et(t[i[o]]);return e}return t}function it(t){return-1===["__proto__","prototype","constructor"].indexOf(t)}function nt(t,e,i,n){if(!it(t))return;const o=e[t],s=i[t];U(o)&&U(s)?ot(o,s,n):e[t]=et(s)}function ot(t,e,i){const n=Y(e)?e:[e],o=n.length;if(!U(t))return t;const s=(i=i||{}).merger||nt;for(let a=0;a<o;++a){if(!U(e=n[a]))continue;const o=Object.keys(e);for(let n=0,a=o.length;n<a;++n)s(o[n],t,e,i)}return t}function st(t,e){return ot(t,e,{merger:at})}function at(t,e,i){if(!it(t))return;const n=e[t],o=i[t];U(n)&&U(o)?st(n,o):Object.prototype.hasOwnProperty.call(e,t)||(e[t]=et(o))}function rt(t,e){const i=t.indexOf(".",e);return-1===i?t.length:i}function lt(t,e){if(""===e)return t;let i=0,n=rt(e,i);for(;t&&n>i;)t=t[e.substr(i,n-i)],i=n+1,n=rt(e,i);return t}function ct(t){return t.charAt(0).toUpperCase()+t.slice(1)}const ht=t=>void 0!==t,dt=t=>"function"==typeof t,ut=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0},ft=Object.create(null),gt=Object.create(null);function pt(t,e){if(!e)return t;const i=e.split(".");for(let e=0,n=i.length;e<n;++e){const n=i[e];t=t[n]||(t[n]=Object.create(null))}return t}function mt(t,e,i){return"string"==typeof e?ot(pt(t,e),i):ot(pt(t,""),e)}var xt=new class{constructor(t){this.animation=void 0,this.backgroundColor="rgba(0,0,0,0.1)",this.borderColor="rgba(0,0,0,0.1)",this.color="#666",this.datasets={},this.devicePixelRatio=t=>t.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>N(e.backgroundColor),this.hoverBorderColor=(t,e)=>N(e.borderColor),this.hoverColor=(t,e)=>N(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.describe(t)}set(t,e){return mt(this,t,e)}get(t){return pt(this,t)}describe(t,e){return mt(gt,t,e)}override(t,e){return mt(ft,t,e)}route(t,e,i,n){const o=pt(this,t),s=pt(this,i),a="_"+e;Object.defineProperties(o,{[a]:{value:o[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[a],e=s[n];return U(t)?Object.assign({},e,t):K(t,e)},set(t){this[a]=t}}})}}({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}});const bt=Math.PI,_t=2*bt,yt=_t+bt,vt=Number.POSITIVE_INFINITY,wt=bt/180,Mt=bt/2,kt=bt/4,St=2*bt/3,Pt=Math.log10,Dt=Math.sign;function Ct(t){const e=Math.round(t);t=At(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(Pt(t))),n=t/i;return(n<=1?1:n<=2?2:n<=5?5:10)*i}function Ot(t){const e=[],i=Math.sqrt(t);let n;for(n=1;n<i;n++)t%n==0&&(e.push(n),e.push(t/n));return i===(0|i)&&e.push(i),e.sort(((t,e)=>t-e)).pop(),e}function Tt(t){return!isNaN(parseFloat(t))&&isFinite(t)}function At(t,e,i){return Math.abs(t-e)<i}function Lt(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function Rt(t,e,i){let n,o,s;for(n=0,o=t.length;n<o;n++)s=t[n][i],isNaN(s)||(e.min=Math.min(e.min,s),e.max=Math.max(e.max,s))}function Et(t){return t*(bt/180)}function It(t){return t*(180/bt)}function zt(t){if(!X(t))return;let e=1,i=0;for(;Math.round(t*e)/e!==t;)e*=10,i++;return i}function Ft(t,e){const i=e.x-t.x,n=e.y-t.y,o=Math.sqrt(i*i+n*n);let s=Math.atan2(n,i);return s<-.5*bt&&(s+=_t),{angle:s,distance:o}}function Bt(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function Vt(t,e){return(t-e+yt)%_t-bt}function Wt(t){return(t%_t+_t)%_t}function Nt(t,e,i,n){const o=Wt(t),s=Wt(e),a=Wt(i),r=Wt(s-o),l=Wt(a-o),c=Wt(o-s),h=Wt(o-a);return o===s||o===a||n&&s===a||r>l&&c<h}function Ht(t,e,i){return Math.max(e,Math.min(i,t))}function jt(t){return Ht(t,-32768,32767)}function $t(t){return!t||$(t.size)||$(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function Yt(t,e,i,n,o){let s=e[o];return s||(s=e[o]=t.measureText(o).width,i.push(o)),s>n&&(n=s),n}function Ut(t,e,i,n){let o=(n=n||{}).data=n.data||{},s=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(o=n.data={},s=n.garbageCollect=[],n.font=e),t.save(),t.font=e;let a=0;const r=i.length;let l,c,h,d,u;for(l=0;l<r;l++)if(d=i[l],null!=d&&!0!==Y(d))a=Yt(t,o,s,a,d);else if(Y(d))for(c=0,h=d.length;c<h;c++)u=d[c],null==u||Y(u)||(a=Yt(t,o,s,a,u));t.restore();const f=s.length/2;if(f>i.length){for(l=0;l<f;l++)delete o[s[l]];s.splice(0,f)}return a}function Xt(t,e,i){const n=t.currentDevicePixelRatio,o=0!==i?Math.max(i/2,.5):0;return Math.round((e-o)*n)/n+o}function qt(t,e){(e=e||t.getContext("2d")).save(),e.resetTransform(),e.clearRect(0,0,t.width,t.height),e.restore()}function Kt(t,e,i,n){let o,s,a,r,l;const c=e.pointStyle,h=e.rotation,d=e.radius;let u=(h||0)*wt;if(c&&"object"==typeof c&&(o=c.toString(),"[object HTMLImageElement]"===o||"[object HTMLCanvasElement]"===o))return t.save(),t.translate(i,n),t.rotate(u),t.drawImage(c,-c.width/2,-c.height/2,c.width,c.height),void t.restore();if(!(isNaN(d)||d<=0)){switch(t.beginPath(),c){default:t.arc(i,n,d,0,_t),t.closePath();break;case"triangle":t.moveTo(i+Math.sin(u)*d,n-Math.cos(u)*d),u+=St,t.lineTo(i+Math.sin(u)*d,n-Math.cos(u)*d),u+=St,t.lineTo(i+Math.sin(u)*d,n-Math.cos(u)*d),t.closePath();break;case"rectRounded":l=.516*d,r=d-l,s=Math.cos(u+kt)*r,a=Math.sin(u+kt)*r,t.arc(i-s,n-a,l,u-bt,u-Mt),t.arc(i+a,n-s,l,u-Mt,u),t.arc(i+s,n+a,l,u,u+Mt),t.arc(i-a,n+s,l,u+Mt,u+bt),t.closePath();break;case"rect":if(!h){r=Math.SQRT1_2*d,t.rect(i-r,n-r,2*r,2*r);break}u+=kt;case"rectRot":s=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-s,n-a),t.lineTo(i+a,n-s),t.lineTo(i+s,n+a),t.lineTo(i-a,n+s),t.closePath();break;case"crossRot":u+=kt;case"cross":s=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-s,n-a),t.lineTo(i+s,n+a),t.moveTo(i+a,n-s),t.lineTo(i-a,n+s);break;case"star":s=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-s,n-a),t.lineTo(i+s,n+a),t.moveTo(i+a,n-s),t.lineTo(i-a,n+s),u+=kt,s=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-s,n-a),t.lineTo(i+s,n+a),t.moveTo(i+a,n-s),t.lineTo(i-a,n+s);break;case"line":s=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-s,n-a),t.lineTo(i+s,n+a);break;case"dash":t.moveTo(i,n),t.lineTo(i+Math.cos(u)*d,n+Math.sin(u)*d)}t.fill(),e.borderWidth>0&&t.stroke()}}function Gt(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.x<e.right+i&&t.y>e.top-i&&t.y<e.bottom+i}function Zt(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()}function Qt(t){t.restore()}function Jt(t,e,i,n,o){if(!e)return t.lineTo(i.x,i.y);if("middle"===o){const n=(e.x+i.x)/2;t.lineTo(n,e.y),t.lineTo(n,i.y)}else"after"===o!=!!n?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y);t.lineTo(i.x,i.y)}function te(t,e,i,n){if(!e)return t.lineTo(i.x,i.y);t.bezierCurveTo(n?e.cp1x:e.cp2x,n?e.cp1y:e.cp2y,n?i.cp2x:i.cp1x,n?i.cp2y:i.cp1y,i.x,i.y)}function ee(t,e,i,n,o,s={}){const a=Y(e)?e:[e],r=s.strokeWidth>0&&""!==s.strokeColor;let l,c;for(t.save(),t.font=o.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]);$(e.rotation)||t.rotate(e.rotation);e.color&&(t.fillStyle=e.color);e.textAlign&&(t.textAlign=e.textAlign);e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,s),l=0;l<a.length;++l)c=a[l],r&&(s.strokeColor&&(t.strokeStyle=s.strokeColor),$(s.strokeWidth)||(t.lineWidth=s.strokeWidth),t.strokeText(c,i,n,s.maxWidth)),t.fillText(c,i,n,s.maxWidth),ie(t,i,n,c,s),n+=o.lineHeight;t.restore()}function ie(t,e,i,n,o){if(o.strikethrough||o.underline){const s=t.measureText(n),a=e-s.actualBoundingBoxLeft,r=e+s.actualBoundingBoxRight,l=i-s.actualBoundingBoxAscent,c=i+s.actualBoundingBoxDescent,h=o.strikethrough?(l+c)/2:c;t.strokeStyle=t.fillStyle,t.beginPath(),t.lineWidth=o.decorationWidth||2,t.moveTo(a,h),t.lineTo(r,h),t.stroke()}}function ne(t,e){const{x:i,y:n,w:o,h:s,radius:a}=e;t.arc(i+a.topLeft,n+a.topLeft,a.topLeft,-Mt,bt,!0),t.lineTo(i,n+s-a.bottomLeft),t.arc(i+a.bottomLeft,n+s-a.bottomLeft,a.bottomLeft,bt,Mt,!0),t.lineTo(i+o-a.bottomRight,n+s),t.arc(i+o-a.bottomRight,n+s-a.bottomRight,a.bottomRight,Mt,0,!0),t.lineTo(i+o,n+a.topRight),t.arc(i+o-a.topRight,n+a.topRight,a.topRight,0,-Mt,!0),t.lineTo(i+a.topLeft,n)}function oe(t,e,i){i=i||(i=>t[i]<e);let n,o=t.length-1,s=0;for(;o-s>1;)n=s+o>>1,i(n)?s=n:o=n;return{lo:s,hi:o}}const se=(t,e,i)=>oe(t,i,(n=>t[n][e]<i)),ae=(t,e,i)=>oe(t,i,(n=>t[n][e]>=i));function re(t,e,i){let n=0,o=t.length;for(;n<o&&t[n]<e;)n++;for(;o>n&&t[o-1]>i;)o--;return n>0||o<t.length?t.slice(n,o):t}const le=["push","pop","shift","splice","unshift"];function ce(t,e){t._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),le.forEach((e=>{const i="_onData"+ct(e),n=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const o=n.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),o}})})))}function he(t,e){const i=t._chartjs;if(!i)return;const n=i.listeners,o=n.indexOf(e);-1!==o&&n.splice(o,1),n.length>0||(le.forEach((e=>{delete t[e]})),delete t._chartjs)}function de(t){const e=new Set;let i,n;for(i=0,n=t.length;i<n;++i)e.add(t[i]);return e.size===n?t:Array.from(e)}function ue(){return"undefined"!=typeof window&&"undefined"!=typeof document}function fe(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function ge(t,e,i){let n;return"string"==typeof t?(n=parseInt(t,10),-1!==t.indexOf("%")&&(n=n/100*e.parentNode[i])):n=t,n}const pe=t=>window.getComputedStyle(t,null);function me(t,e){return pe(t).getPropertyValue(e)}const xe=["top","right","bottom","left"];function be(t,e,i){const n={};i=i?"-"+i:"";for(let o=0;o<4;o++){const s=xe[o];n[s]=parseFloat(t[e+"-"+s+i])||0}return n.width=n.left+n.right,n.height=n.top+n.bottom,n}function _e(t,e){const{canvas:i,currentDevicePixelRatio:n}=e,o=pe(i),s="border-box"===o.boxSizing,a=be(o,"padding"),r=be(o,"border","width"),{x:l,y:c,box:h}=function(t,e){const i=t.native||t,n=i.touches,o=n&&n.length?n[0]:i,{offsetX:s,offsetY:a}=o;let r,l,c=!1;if(((t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot))(s,a,i.target))r=s,l=a;else{const t=e.getBoundingClientRect();r=o.clientX-t.left,l=o.clientY-t.top,c=!0}return{x:r,y:l,box:c}}(t,i),d=a.left+(h&&r.left),u=a.top+(h&&r.top);let{width:f,height:g}=e;return s&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/n),y:Math.round((c-u)/g*i.height/n)}}const ye=t=>Math.round(10*t)/10;function ve(t,e,i,n){const o=pe(t),s=be(o,"margin"),a=ge(o.maxWidth,t,"clientWidth")||vt,r=ge(o.maxHeight,t,"clientHeight")||vt,l=function(t,e,i){let n,o;if(void 0===e||void 0===i){const s=fe(t);if(s){const t=s.getBoundingClientRect(),a=pe(s),r=be(a,"border","width"),l=be(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,n=ge(a.maxWidth,s,"clientWidth"),o=ge(a.maxHeight,s,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:n||vt,maxHeight:o||vt}}(t,e,i);let{width:c,height:h}=l;if("content-box"===o.boxSizing){const t=be(o,"border","width"),e=be(o,"padding");c-=e.width+t.width,h-=e.height+t.height}return c=Math.max(0,c-s.width),h=Math.max(0,n?Math.floor(c/n):h-s.height),c=ye(Math.min(c,a,l.maxWidth)),h=ye(Math.min(h,r,l.maxHeight)),c&&!h&&(h=ye(c/2)),{width:c,height:h}}function we(t,e,i){const n=e||1,o=Math.floor(t.height*n),s=Math.floor(t.width*n);t.height=o/n,t.width=s/n;const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==n||a.height!==o||a.width!==s)&&(t.currentDevicePixelRatio=n,a.height=o,a.width=s,t.ctx.setTransform(n,0,0,n,0,0),!0)}const Me=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}();function ke(t,e){const i=me(t,e),n=i&&i.match(/^(\d+)(\.\d+)?px$/);return n?+n[1]:void 0}function Se(t,e){return"native"in t?{x:t.x,y:t.y}:_e(t,e)}function Pe(t,e,i,n){const{controller:o,data:s,_sorted:a}=t,r=o._cachedMeta.iScale;if(r&&e===r.axis&&a&&s.length){const t=r._reversePixels?ae:se;if(!n)return t(s,e,i);if(o._sharedOptions){const n=s[0],o="function"==typeof n.getRange&&n.getRange(e);if(o){const n=t(s,e,i-o),a=t(s,e,i+o);return{lo:n.lo,hi:a.hi}}}}return{lo:0,hi:s.length-1}}function De(t,e,i,n,o){const s=t.getSortedVisibleDatasetMetas(),a=i[e];for(let t=0,i=s.length;t<i;++t){const{index:i,data:r}=s[t],{lo:l,hi:c}=Pe(s[t],e,a,o);for(let t=l;t<=c;++t){const e=r[t];e.skip||n(e,i,t)}}}function Ce(t,e,i,n){const o=[];if(!Gt(e,t.chartArea,t._minPadding))return o;return De(t,i,e,(function(t,i,s){t.inRange(e.x,e.y,n)&&o.push({element:t,datasetIndex:i,index:s})}),!0),o}function Oe(t,e,i,n,o){const s=function(t){const e=-1!==t.indexOf("x"),i=-1!==t.indexOf("y");return function(t,n){const o=e?Math.abs(t.x-n.x):0,s=i?Math.abs(t.y-n.y):0;return Math.sqrt(Math.pow(o,2)+Math.pow(s,2))}}(i);let a=Number.POSITIVE_INFINITY,r=[];if(!Gt(e,t.chartArea,t._minPadding))return r;return De(t,i,e,(function(i,l,c){if(n&&!i.inRange(e.x,e.y,o))return;const h=i.getCenterPoint(o);if(!Gt(h,t.chartArea,t._minPadding)&&!i.inRange(e.x,e.y,o))return;const d=s(e,h);d<a?(r=[{element:i,datasetIndex:l,index:c}],a=d):d===a&&r.push({element:i,datasetIndex:l,index:c})})),r}function Te(t,e,i,n){const o=Se(e,t),s=[],a=i.axis,r="x"===a?"inXRange":"inYRange";let l=!1;return function(t,e){const i=t.getSortedVisibleDatasetMetas();let n,o,s;for(let t=0,a=i.length;t<a;++t){({index:n,data:o}=i[t]);for(let t=0,i=o.length;t<i;++t)s=o[t],s.skip||e(s,n,t)}}(t,((t,e,i)=>{t[r](o[a],n)&&s.push({element:t,datasetIndex:e,index:i}),t.inRange(o.x,o.y,n)&&(l=!0)})),i.intersect&&!l?[]:s}var Ae={modes:{index(t,e,i,n){const o=Se(e,t),s=i.axis||"x",a=i.intersect?Ce(t,o,s,n):Oe(t,o,s,!1,n),r=[];return a.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=a[0].index,i=t.data[e];i&&!i.skip&&r.push({element:i,datasetIndex:t.index,index:e})})),r):[]},dataset(t,e,i,n){const o=Se(e,t),s=i.axis||"xy";let a=i.intersect?Ce(t,o,s,n):Oe(t,o,s,!1,n);if(a.length>0){const e=a[0].datasetIndex,i=t.getDatasetMeta(e).data;a=[];for(let t=0;t<i.length;++t)a.push({element:i[t],datasetIndex:e,index:t})}return a},point:(t,e,i,n)=>Ce(t,Se(e,t),i.axis||"xy",n),nearest:(t,e,i,n)=>Oe(t,Se(e,t),i.axis||"xy",i.intersect,n),x:(t,e,i,n)=>(i.axis="x",Te(t,e,i,n)),y:(t,e,i,n)=>(i.axis="y",Te(t,e,i,n))}};const Le=new RegExp(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/),Re=new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);function Ee(t,e){const i=(""+t).match(Le);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}function Ie(t,e){const i={},n=U(e),o=n?Object.keys(e):e,s=U(t)?n?i=>K(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of o)i[t]=+s(t)||0;return i}function ze(t){return Ie(t,{top:"y",right:"x",bottom:"y",left:"x"})}function Fe(t){return Ie(t,["topLeft","topRight","bottomLeft","bottomRight"])}function Be(t){const e=ze(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Ve(t,e){t=t||{},e=e||xt.font;let i=K(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let n=K(t.style,e.style);n&&!(""+n).match(Re)&&(console.warn('Invalid font style specified: "'+n+'"'),n="");const o={family:K(t.family,e.family),lineHeight:Ee(K(t.lineHeight,e.lineHeight),i),size:i,style:n,weight:K(t.weight,e.weight),string:""};return o.string=$t(o),o}function We(t,e,i,n){let o,s,a,r=!0;for(o=0,s=t.length;o<s;++o)if(a=t[o],void 0!==a&&(void 0!==e&&"function"==typeof a&&(a=a(e),r=!1),void 0!==i&&Y(a)&&(a=a[i%a.length],r=!1),void 0!==a))return n&&!r&&(n.cacheable=!1),a}function Ne(t,e){const{min:i,max:n}=t;return{min:i-Math.abs(Z(e,i)),max:n+Z(e,n)}}const He=["left","top","right","bottom"];function je(t,e){return t.filter((t=>t.pos===e))}function $e(t,e){return t.filter((t=>-1===He.indexOf(t.pos)&&t.box.axis===e))}function Ye(t,e){return t.sort(((t,i)=>{const n=e?i:t,o=e?t:i;return n.weight===o.weight?n.index-o.index:n.weight-o.weight}))}function Ue(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:n,stackWeight:o}=i;if(!t||!He.includes(n))continue;const s=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});s.count++,s.weight+=o}return e}(t),{vBoxMaxWidth:n,hBoxMaxHeight:o}=e;let s,a,r;for(s=0,a=t.length;s<a;++s){r=t[s];const{fullSize:a}=r.box,l=i[r.stack],c=l&&r.stackWeight/l.weight;r.horizontal?(r.width=c?c*n:a&&e.availableWidth,r.height=o):(r.width=n,r.height=c?c*o:a&&e.availableHeight)}return i}function Xe(t,e,i,n){return Math.max(t[i],e[i])+Math.max(t[n],e[n])}function qe(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function Ke(t,e,i,n){const{pos:o,box:s}=i,a=t.maxPadding;if(!U(o)){i.size&&(t[o]-=i.size);const e=n[i.stack]||{size:0,count:1};e.size=Math.max(e.size,i.horizontal?s.height:s.width),i.size=e.size/e.count,t[o]+=i.size}s.getPadding&&qe(a,s.getPadding());const r=Math.max(0,e.outerWidth-Xe(a,t,"left","right")),l=Math.max(0,e.outerHeight-Xe(a,t,"top","bottom")),c=r!==t.w,h=l!==t.h;return t.w=r,t.h=l,i.horizontal?{same:c,other:h}:{same:h,other:c}}function Ge(t,e){const i=e.maxPadding;function n(t){const n={left:0,top:0,right:0,bottom:0};return t.forEach((t=>{n[t]=Math.max(e[t],i[t])})),n}return n(t?["left","right"]:["top","bottom"])}function Ze(t,e,i,n){const o=[];let s,a,r,l,c,h;for(s=0,a=t.length,c=0;s<a;++s){r=t[s],l=r.box,l.update(r.width||e.w,r.height||e.h,Ge(r.horizontal,e));const{same:a,other:d}=Ke(e,i,r,n);c|=a&&o.length,h=h||d,l.fullSize||o.push(r)}return c&&Ze(o,e,i,n)||h}function Qe(t,e,i,n,o){t.top=i,t.left=e,t.right=e+n,t.bottom=i+o,t.width=n,t.height=o}function Je(t,e,i,n){const o=i.padding;let{x:s,y:a}=e;for(const r of t){const t=r.box,l=n[r.stack]||{count:1,placed:0,weight:1},c=r.stackWeight/l.weight||1;if(r.horizontal){const n=e.w*c,s=l.size||t.height;ht(l.start)&&(a=l.start),t.fullSize?Qe(t,o.left,a,i.outerWidth-o.right-o.left,s):Qe(t,e.left+l.placed,a,n,s),l.start=a,l.placed+=n,a=t.bottom}else{const n=e.h*c,a=l.size||t.width;ht(l.start)&&(s=l.start),t.fullSize?Qe(t,s,o.top,a,i.outerHeight-o.bottom-o.top):Qe(t,s,e.top+l.placed,a,n),l.start=s,l.placed+=n,s=t.right}}e.x=s,e.y=a}xt.set("layout",{padding:{top:0,right:0,bottom:0,left:0}});var ti={addBox(t,e){t.boxes||(t.boxes=[]),e.fullSize=e.fullSize||!1,e.position=e.position||"top",e.weight=e.weight||0,e._layers=e._layers||function(){return[{z:0,draw(t){e.draw(t)}}]},t.boxes.push(e)},removeBox(t,e){const i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure(t,e,i){e.fullSize=i.fullSize,e.position=i.position,e.weight=i.weight},update(t,e,i,n){if(!t)return;const o=Be(t.options.layout.padding),s=Math.max(e-o.width,0),a=Math.max(i-o.height,0),r=function(t){const e=function(t){const e=[];let i,n,o,s,a,r;for(i=0,n=(t||[]).length;i<n;++i)o=t[i],({position:s,options:{stack:a,stackWeight:r=1}}=o),e.push({index:i,box:o,pos:s,horizontal:o.isHorizontal(),weight:o.weight,stack:a&&s+a,stackWeight:r});return e}(t),i=Ye(e.filter((t=>t.box.fullSize)),!0),n=Ye(je(e,"left"),!0),o=Ye(je(e,"right")),s=Ye(je(e,"top"),!0),a=Ye(je(e,"bottom")),r=$e(e,"x"),l=$e(e,"y");return{fullSize:i,leftAndTop:n.concat(s),rightAndBottom:o.concat(l).concat(a).concat(r),chartArea:je(e,"chartArea"),vertical:n.concat(o).concat(l),horizontal:s.concat(a).concat(r)}}(t.boxes),l=r.vertical,c=r.horizontal;J(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const h=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:o,availableWidth:s,availableHeight:a,vBoxMaxWidth:s/2/h,hBoxMaxHeight:a/2}),u=Object.assign({},o);qe(u,Be(n));const f=Object.assign({maxPadding:u,w:s,h:a,x:o.left,y:o.top},o),g=Ue(l.concat(c),d);Ze(r.fullSize,f,d,g),Ze(l,f,d,g),Ze(c,f,d,g)&&Ze(l,f,d,g),function(t){const e=t.maxPadding;function i(i){const n=Math.max(e[i]-t[i],0);return t[i]+=n,n}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(f),Je(r.leftAndTop,f,d,g),f.x+=f.w,f.y+=f.h,Je(r.rightAndBottom,f,d,g),t.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},J(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(f.w,f.h)}))}};function ei(t,e=[""],i=t,n,o=(()=>t[0])){ht(n)||(n=ui("_fallback",t));const s={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:i,_fallback:n,_getTarget:o,override:o=>ei([o,...t],e,i,n)};return new Proxy(s,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,n)=>ai(i,n,(()=>function(t,e,i,n){let o;for(const s of e)if(o=ui(oi(s,t),i),ht(o))return si(t,o)?hi(i,n,t,o):o}(n,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>fi(t).includes(e),ownKeys:t=>fi(t),set:(t,e,i)=>((t._storage||(t._storage=o()))[e]=i,delete t[e],delete t._keys,!0)})}function ii(t,e,i,n){const o={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:ni(t,n),setContext:e=>ii(t,e,i,n),override:o=>ii(t.override(o),e,i,n)};return new Proxy(o,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>ai(t,e,(()=>function(t,e,i){const{_proxy:n,_context:o,_subProxy:s,_descriptors:a}=t;let r=n[e];dt(r)&&a.isScriptable(e)&&(r=function(t,e,i,n){const{_proxy:o,_context:s,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t),e=e(s,a||n),r.delete(t),U(e)&&(e=hi(o._scopes,o,t,e));return e}(e,r,t,i));Y(r)&&r.length&&(r=function(t,e,i,n){const{_proxy:o,_context:s,_subProxy:a,_descriptors:r}=i;if(ht(s.index)&&n(t))e=e[s.index%e.length];else if(U(e[0])){const i=e,n=o._scopes.filter((t=>t!==i));e=[];for(const l of i){const i=hi(n,o,t,l);e.push(ii(i,s,a&&a[t],r))}}return e}(e,r,t,a.isIndexable));si(e,r)&&(r=ii(r,o,s&&s[e],a));return r}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,n)=>(t[i]=n,delete e[i],!0)})}function ni(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:n=e.indexable,_allKeys:o=e.allKeys}=t;return{allKeys:o,scriptable:i,indexable:n,isScriptable:dt(i)?i:()=>i,isIndexable:dt(n)?n:()=>n}}const oi=(t,e)=>t?t+ct(e):e,si=(t,e)=>U(e)&&"adapters"!==t;function ai(t,e,i){let n=t[e];return ht(n)||(n=i(),ht(n)&&(t[e]=n)),n}function ri(t,e,i){return dt(t)?t(e,i):t}const li=(t,e)=>!0===t?e:"string"==typeof t?lt(e,t):void 0;function ci(t,e,i,n){for(const o of e){const e=li(i,o);if(e){t.add(e);const o=ri(e._fallback,i,e);if(ht(o)&&o!==i&&o!==n)return o}else if(!1===e&&ht(n)&&i!==n)return null}return!1}function hi(t,e,i,n){const o=e._rootScopes,s=ri(e._fallback,i,n),a=[...t,...o],r=new Set;r.add(n);let l=di(r,a,i,s||i);return null!==l&&((!ht(s)||s===i||(l=di(r,a,s,l),null!==l))&&ei(Array.from(r),[""],o,s,(()=>function(t,e,i){const n=t._getTarget();e in n||(n[e]={});const o=n[e];if(Y(o)&&U(i))return i;return o}(e,i,n))))}function di(t,e,i,n){for(;i;)i=ci(t,e,i,n);return i}function ui(t,e){for(const i of e){if(!i)continue;const e=i[t];if(ht(e))return e}}function fi(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}const gi=Number.EPSILON||1e-14,pi=(t,e)=>e<t.length&&!t[e].skip&&t[e],mi=t=>"x"===t?"y":"x";function xi(t,e,i,n){const o=t.skip?e:t,s=e,a=i.skip?e:i,r=Bt(s,o),l=Bt(a,s);let c=r/(r+l),h=l/(r+l);c=isNaN(c)?0:c,h=isNaN(h)?0:h;const d=n*c,u=n*h;return{previous:{x:s.x-d*(a.x-o.x),y:s.y-d*(a.y-o.y)},next:{x:s.x+u*(a.x-o.x),y:s.y+u*(a.y-o.y)}}}function bi(t,e="x"){const i=mi(e),n=t.length,o=Array(n).fill(0),s=Array(n);let a,r,l,c=pi(t,0);for(a=0;a<n;++a)if(r=l,l=c,c=pi(t,a+1),l){if(c){const t=c[e]-l[e];o[a]=0!==t?(c[i]-l[i])/t:0}s[a]=r?c?Dt(o[a-1])!==Dt(o[a])?0:(o[a-1]+o[a])/2:o[a-1]:o[a]}!function(t,e,i){const n=t.length;let o,s,a,r,l,c=pi(t,0);for(let h=0;h<n-1;++h)l=c,c=pi(t,h+1),l&&c&&(At(e[h],0,gi)?i[h]=i[h+1]=0:(o=i[h]/e[h],s=i[h+1]/e[h],r=Math.pow(o,2)+Math.pow(s,2),r<=9||(a=3/Math.sqrt(r),i[h]=o*a*e[h],i[h+1]=s*a*e[h])))}(t,o,s),function(t,e,i="x"){const n=mi(i),o=t.length;let s,a,r,l=pi(t,0);for(let c=0;c<o;++c){if(a=r,r=l,l=pi(t,c+1),!r)continue;const o=r[i],h=r[n];a&&(s=(o-a[i])/3,r[`cp1${i}`]=o-s,r[`cp1${n}`]=h-s*e[c]),l&&(s=(l[i]-o)/3,r[`cp2${i}`]=o+s,r[`cp2${n}`]=h+s*e[c])}}(t,s,e)}function _i(t,e,i){return Math.max(Math.min(t,i),e)}function yi(t,e,i,n,o){let s,a,r,l;if(e.spanGaps&&(t=t.filter((t=>!t.skip))),"monotone"===e.cubicInterpolationMode)bi(t,o);else{let i=n?t[t.length-1]:t[0];for(s=0,a=t.length;s<a;++s)r=t[s],l=xi(i,r,t[Math.min(s+1,a-(n?0:1))%a],e.tension),r.cp1x=l.previous.x,r.cp1y=l.previous.y,r.cp2x=l.next.x,r.cp2y=l.next.y,i=r}e.capBezierPoints&&function(t,e){let i,n,o,s,a,r=Gt(t[0],e);for(i=0,n=t.length;i<n;++i)a=s,s=r,r=i<n-1&&Gt(t[i+1],e),s&&(o=t[i],a&&(o.cp1x=_i(o.cp1x,e.left,e.right),o.cp1y=_i(o.cp1y,e.top,e.bottom)),r&&(o.cp2x=_i(o.cp2x,e.left,e.right),o.cp2y=_i(o.cp2y,e.top,e.bottom)))}(t,i)}const vi=t=>0===t||1===t,wi=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*_t/i),Mi=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*_t/i)+1,ki={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*Mt),easeOutSine:t=>Math.sin(t*Mt),easeInOutSine:t=>-.5*(Math.cos(bt*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>vi(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>vi(t)?t:wi(t,.075,.3),easeOutElastic:t=>vi(t)?t:Mi(t,.075,.3),easeInOutElastic(t){const e=.1125;return vi(t)?t:t<.5?.5*wi(2*t,e,.45):.5+.5*Mi(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-ki.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*ki.easeInBounce(2*t):.5*ki.easeOutBounce(2*t-1)+.5};function Si(t,e,i,n){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function Pi(t,e,i,n){return{x:t.x+i*(e.x-t.x),y:"middle"===n?i<.5?t.y:e.y:"after"===n?i<1?t.y:e.y:i>0?e.y:t.y}}function Di(t,e,i,n){const o={x:t.cp2x,y:t.cp2y},s={x:e.cp1x,y:e.cp1y},a=Si(t,o,i),r=Si(o,s,i),l=Si(s,e,i),c=Si(a,r,i),h=Si(r,l,i);return Si(c,h,i)}const Ci=new Map;function Oi(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let n=Ci.get(i);return n||(n=new Intl.NumberFormat(t,e),Ci.set(i,n)),n}(e,i).format(t)}function Ti(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Ai(t,e){let i,n;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,n=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=n)}function Li(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Ri(t){return"angle"===t?{between:Nt,compare:Vt,normalize:Wt}:{between:(t,e,i)=>t>=Math.min(e,i)&&t<=Math.max(i,e),compare:(t,e)=>t-e,normalize:t=>t}}function Ei({start:t,end:e,count:i,loop:n,style:o}){return{start:t%i,end:e%i,loop:n&&(e-t+1)%i==0,style:o}}function Ii(t,e,i){if(!i)return[t];const{property:n,start:o,end:s}=i,a=e.length,{compare:r,between:l,normalize:c}=Ri(n),{start:h,end:d,loop:u,style:f}=function(t,e,i){const{property:n,start:o,end:s}=i,{between:a,normalize:r}=Ri(n),l=e.length;let c,h,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,c=0,h=l;c<h&&a(r(e[d%l][n]),o,s);++c)d--,u--;d%=l,u%=l}return u<d&&(u+=l),{start:d,end:u,loop:f,style:t.style}}(t,e,i),g=[];let p,m,x,b=!1,_=null;const y=()=>b||l(o,x,p)&&0!==r(o,x),v=()=>!b||0===r(s,p)||l(s,x,p);for(let t=h,i=h;t<=d;++t)m=e[t%a],m.skip||(p=c(m[n]),p!==x&&(b=l(p,o,s),null===_&&y()&&(_=0===r(p,o)?t:i),null!==_&&v()&&(g.push(Ei({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,x=p));return null!==_&&g.push(Ei({start:_,end:d,loop:u,count:a,style:f})),g}function zi(t,e){const i=[],n=t.segments;for(let o=0;o<n.length;o++){const s=Ii(n[o],t.points,e);s.length&&i.push(...s)}return i}function Fi(t,e){const i=t.points,n=t.options.spanGaps,o=i.length;if(!o)return[];const s=!!t._loop,{start:a,end:r}=function(t,e,i,n){let o=0,s=e-1;if(i&&!n)for(;o<e&&!t[o].skip;)o++;for(;o<e&&t[o].skip;)o++;for(o%=e,i&&(s+=o);s>o&&t[s%e].skip;)s--;return s%=e,{start:o,end:s}}(i,o,s,n);if(!0===n)return Bi(t,[{start:a,end:r,loop:s}],i,e);return Bi(t,function(t,e,i,n){const o=t.length,s=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%o];i.skip||i.stop?l.skip||(n=!1,s.push({start:e%o,end:(a-1)%o,loop:n}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&s.push({start:e%o,end:r%o,loop:n}),s}(i,a,r<a?r+o:r,!!t._fullLoop&&0===a&&r===o-1),i,e)}function Bi(t,e,i,n){return n&&n.setContext&&i?function(t,e,i,n){const o=Vi(t.options),s=i.length,a=[];let r=e[0].start,l=r;for(const c of e){let e,h=o,d=i[r%s];for(l=r+1;l<=c.end;l++){const o=i[l%s];e=Vi(n.setContext({type:"segment",p0:d,p1:o,p0DataIndex:(l-1)%s,p1DataIndex:l%s,datasetIndex:t._datasetIndex})),Wi(e,h)&&(a.push({start:r,end:l-1,loop:c.loop,style:h}),h=e,r=l-1),d=o,h=e}r<l-1&&(a.push({start:r,end:l-1,loop:c.loop,style:e}),r=l-1)}return a}(t,e,i,n):e}function Vi(t){return{backgroundColor:t.backgroundColor,borderCapStyle:t.borderCapStyle,borderDash:t.borderDash,borderDashOffset:t.borderDashOffset,borderJoinStyle:t.borderJoinStyle,borderWidth:t.borderWidth,borderColor:t.borderColor}}function Wi(t,e){return e&&JSON.stringify(t)!==JSON.stringify(e)}var Ni=Object.freeze({__proto__:null,easingEffects:ki,color:W,getHoverColor:N,noop:H,uid:j,isNullOrUndef:$,isArray:Y,isObject:U,isFinite:X,finiteOrDefault:q,valueOrDefault:K,toPercentage:G,toDimension:Z,callback:Q,each:J,_elementsEqual:tt,clone:et,_merger:nt,merge:ot,mergeIf:st,_mergerIf:at,_deprecated:function(t,e,i,n){void 0!==e&&console.warn(t+': "'+i+'" is deprecated. Please use "'+n+'" instead')},resolveObjectKey:lt,_capitalize:ct,defined:ht,isFunction:dt,setsEqual:ut,toFontString:$t,_measureText:Yt,_longestText:Ut,_alignPixel:Xt,clearCanvas:qt,drawPoint:Kt,_isPointInArea:Gt,clipArea:Zt,unclipArea:Qt,_steppedLineTo:Jt,_bezierCurveTo:te,renderText:ee,addRoundedRectPath:ne,_lookup:oe,_lookupByKey:se,_rlookupByKey:ae,_filterBetween:re,listenArrayEvents:ce,unlistenArrayEvents:he,_arrayUnique:de,_createResolver:ei,_attachContext:ii,_descriptors:ni,splineCurve:xi,splineCurveMonotone:bi,_updateBezierControlPoints:yi,_isDomSupported:ue,_getParentNode:fe,getStyle:me,getRelativePosition:_e,getMaximumSize:ve,retinaScale:we,supportsEventListenerOptions:Me,readUsedSize:ke,fontString:function(t,e,i){return e+" "+t+"px "+i},requestAnimFrame:t,throttled:e,debounce:i,_toLeftRightCenter:n,_alignStartEnd:o,_textX:s,_pointInLine:Si,_steppedInterpolation:Pi,_bezierInterpolation:Di,formatNumber:Oi,toLineHeight:Ee,_readValueToProps:Ie,toTRBL:ze,toTRBLCorners:Fe,toPadding:Be,toFont:Ve,resolve:We,_addGrace:Ne,PI:bt,TAU:_t,PITAU:yt,INFINITY:vt,RAD_PER_DEG:wt,HALF_PI:Mt,QUARTER_PI:kt,TWO_THIRDS_PI:St,log10:Pt,sign:Dt,niceNum:Ct,_factorize:Ot,isNumber:Tt,almostEquals:At,almostWhole:Lt,_setMinAndMaxByKey:Rt,toRadians:Et,toDegrees:It,_decimalPlaces:zt,getAngleFromPoint:Ft,distanceBetweenPoints:Bt,_angleDiff:Vt,_normalizeAngle:Wt,_angleBetween:Nt,_limitValue:Ht,_int16Range:jt,getRtlAdapter:Ti,overrideTextDirection:Ai,restoreTextDirection:Li,_boundSegment:Ii,_boundSegments:zi,_computeSegments:Fi});class Hi{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,n){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,n?Math.floor(e/n):i)}}isAttached(t){return!0}}class ji extends Hi{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}}const $i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Yi=t=>null===t||""===t;const Ui=!!Me&&{passive:!0};function Xi(t,e,i){t.canvas.removeEventListener(e,i,Ui)}function qi(t,e,i){const n=t.canvas,o=new MutationObserver((t=>{for(const e of t)for(const t of e.addedNodes)if(t===n||t.contains(n))return i()}));return o.observe(document,{childList:!0,subtree:!0}),o}function Ki(t,e,i){const n=t.canvas,o=new MutationObserver((t=>{for(const e of t)for(const t of e.removedNodes)if(t===n||t.contains(n))return i()}));return o.observe(document,{childList:!0,subtree:!0}),o}const Gi=new Map;let Zi=0;function Qi(){const t=window.devicePixelRatio;t!==Zi&&(Zi=t,Gi.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function Ji(t,i,n){const o=t.canvas,s=o&&fe(o);if(!s)return;const a=e(((t,e)=>{const i=s.clientWidth;n(t,e),i<s.clientWidth&&n()}),window),r=new ResizeObserver((t=>{const e=t[0],i=e.contentRect.width,n=e.contentRect.height;0===i&&0===n||a(i,n)}));return r.observe(s),function(t,e){Gi.size||window.addEventListener("resize",Qi),Gi.set(t,e)}(t,a),r}function tn(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){Gi.delete(t),Gi.size||window.removeEventListener("resize",Qi)}(t)}function en(t,i,n){const o=t.canvas,s=e((e=>{null!==t.ctx&&n(function(t,e){const i=$i[t.type]||t.type,{x:n,y:o}=_e(t,e);return{type:i,chart:e,native:t,x:void 0!==n?n:null,y:void 0!==o?o:null}}(e,t))}),t,(t=>{const e=t[0];return[e,e.offsetX,e.offsetY]}));return function(t,e,i){t.addEventListener(e,i,Ui)}(o,i,s),s}class nn extends Hi{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,n=t.getAttribute("height"),o=t.getAttribute("width");if(t.$chartjs={initial:{height:n,width:o,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",Yi(o)){const e=ke(t,"width");void 0!==e&&(t.width=e)}if(Yi(n))if(""===t.style.height)t.height=t.width/(e||2);else{const e=ke(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e.$chartjs)return!1;const i=e.$chartjs.initial;["height","width"].forEach((t=>{const n=i[t];$(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e.$chartjs,!0}addEventListener(t,e,i){this.removeEventListener(t,e);const n=t.$proxies||(t.$proxies={}),o={attach:qi,detach:Ki,resize:Ji}[e]||en;n[e]=o(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),n=i[e];if(!n)return;({attach:tn,detach:tn,resize:tn}[e]||Xi)(t,e,n),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,n){return ve(t,e,i,n)}isAttached(t){const e=fe(t);return!(!e||!e.isConnected)}}function on(t){return!ue()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?ji:nn}var sn=Object.freeze({__proto__:null,_detectPlatform:on,BasePlatform:Hi,BasicPlatform:ji,DomPlatform:nn});const an="transparent",rn={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const n=W(t||an),o=n.valid&&W(e||an);return o&&o.valid?o.mix(n,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class ln{constructor(t,e,i,n){const o=e[i];n=We([t.to,n,o,t.from]);const s=We([t.from,o,n]);this._active=!0,this._fn=t.fn||rn[t.type||typeof s],this._easing=ki[t.easing]||ki.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=s,this._to=n,this._promises=void 0}active(){return this._active}update(t,e,i){const n=this;if(n._active){n._notify(!1);const o=n._target[n._prop],s=i-n._start,a=n._duration-s;n._start=i,n._duration=Math.floor(Math.max(a,t.duration)),n._total+=s,n._loop=!!t.loop,n._to=We([t.to,e,o,t.from]),n._from=We([t.from,o,e])}}cancel(){const t=this;t._active&&(t.tick(Date.now()),t._active=!1,t._notify(!1))}tick(t){const e=this,i=t-e._start,n=e._duration,o=e._prop,s=e._from,a=e._loop,r=e._to;let l;if(e._active=s!==r&&(a||i<n),!e._active)return e._target[o]=r,void e._notify(!0);i<0?e._target[o]=s:(l=i/n%2,l=a&&l>1?2-l:l,l=e._easing(Math.min(1,Math.max(0,l))),e._target[o]=e._fn(s,r,l))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t<i.length;t++)i[t][e]()}}xt.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0});const cn=Object.keys(xt.animation);xt.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),xt.set("animations",{colors:{type:"color",properties:["color","borderColor","backgroundColor"]},numbers:{type:"number",properties:["x","y","borderWidth","radius","tension"]}}),xt.describe("animations",{_fallback:"animation"}),xt.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}});class hn{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!U(t))return;const e=this._properties;Object.getOwnPropertyNames(t).forEach((i=>{const n=t[i];if(!U(n))return;const o={};for(const t of cn)o[t]=n[t];(Y(n.properties)&&n.properties||[i]).forEach((t=>{t!==i&&e.has(t)||e.set(t,o)}))}))}_animateOptions(t,e){const i=e.options,n=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!n)return[];const o=this._createAnimations(n,i);return i.$shared&&function(t,e){const i=[],n=Object.keys(e);for(let e=0;e<n.length;e++){const o=t[n[e]];o&&o.active()&&i.push(o.wait())}return Promise.all(i)}(t.options.$animations,i).then((()=>{t.options=i}),(()=>{})),o}_createAnimations(t,e){const i=this._properties,n=[],o=t.$animations||(t.$animations={}),s=Object.keys(e),a=Date.now();let r;for(r=s.length-1;r>=0;--r){const l=s[r];if("$"===l.charAt(0))continue;if("options"===l){n.push(...this._animateOptions(t,e));continue}const c=e[l];let h=o[l];const d=i.get(l);if(h){if(d&&h.active()){h.update(d,c,a);continue}h.cancel()}d&&d.duration?(o[l]=h=new ln(d,t,l,c),n.push(h)):t[l]=c}return n}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(a.add(this._chart,i),!0):void 0}}function dn(t,e){const i=t&&t.options||{},n=i.reverse,o=void 0===i.min?e:0,s=void 0===i.max?e:0;return{start:n?s:o,end:n?o:s}}function un(t,e){const i=[],n=t._getSortedDatasetMetas(e);let o,s;for(o=0,s=n.length;o<s;++o)i.push(n[o].index);return i}function fn(t,e,i,n){const o=t.keys,s="single"===n.mode;let a,r,l,c;if(null!==e){for(a=0,r=o.length;a<r;++a){if(l=+o[a],l===i){if(n.all)continue;break}c=t.values[l],X(c)&&(s||0===e||Dt(e)===Dt(c))&&(e+=c)}return e}}function gn(t,e){const i=t&&t.options.stacked;return i||void 0===i&&void 0!==e.stack}function pn(t,e,i){const n=t[e]||(t[e]={});return n[i]||(n[i]={})}function mn(t,e,i,n){for(const o of e.getMatchingVisibleMetas(n).reverse()){const e=t[o.index];if(i&&e>0||!i&&e<0)return o.index}return null}function xn(t,e){const{chart:i,_cachedMeta:n}=t,o=i._stacks||(i._stacks={}),{iScale:s,vScale:a,index:r}=n,l=s.axis,c=a.axis,h=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(s,a,n),d=e.length;let u;for(let t=0;t<d;++t){const i=e[t],{[l]:s,[c]:d}=i;u=(i._stacks||(i._stacks={}))[c]=pn(o,h,s),u[r]=d,u._top=mn(u,a,!0,n.type),u._bottom=mn(u,a,!1,n.type)}}function bn(t,e){const i=t.scales;return Object.keys(i).filter((t=>i[t].axis===e)).shift()}function _n(t,e){const i=t.controller.index,n=t.vScale&&t.vScale.axis;if(n){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[n]||void 0===e[n][i])return;delete e[n][i]}}}const yn=t=>"reset"===t||"none"===t,vn=(t,e)=>e?t:Object.assign({},t);class wn{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.$context=void 0,this._syncList=[],this.initialize()}initialize(){const t=this,e=t._cachedMeta;t.configure(),t.linkScales(),e._stacked=gn(e.vScale,e),t.addElements()}updateIndex(t){this.index!==t&&_n(this._cachedMeta),this.index=t}linkScales(){const t=this,e=t.chart,i=t._cachedMeta,n=t.getDataset(),o=(t,e,i,n)=>"x"===t?e:"r"===t?n:i,s=i.xAxisID=K(n.xAxisID,bn(e,"x")),a=i.yAxisID=K(n.yAxisID,bn(e,"y")),r=i.rAxisID=K(n.rAxisID,bn(e,"r")),l=i.indexAxis,c=i.iAxisID=o(l,s,a,r),h=i.vAxisID=o(l,a,s,r);i.xScale=t.getScaleForId(s),i.yScale=t.getScaleForId(a),i.rScale=t.getScaleForId(r),i.iScale=t.getScaleForId(c),i.vScale=t.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&he(this._data,this),t._stacked&&_n(t)}_dataCheck(){const t=this,e=t.getDataset(),i=e.data||(e.data=[]),n=t._data;if(U(i))t._data=function(t){const e=Object.keys(t),i=new Array(e.length);let n,o,s;for(n=0,o=e.length;n<o;++n)s=e[n],i[n]={x:s,y:t[s]};return i}(i);else if(n!==i){if(n){he(n,t);const e=t._cachedMeta;_n(e),e._parsed=[]}i&&Object.isExtensible(i)&&ce(i,t),t._syncList=[],t._data=i}}addElements(){const t=this,e=t._cachedMeta;t._dataCheck(),t.datasetElementType&&(e.dataset=new t.datasetElementType)}buildOrUpdateElements(t){const e=this,i=e._cachedMeta,n=e.getDataset();let o=!1;e._dataCheck();const s=i._stacked;i._stacked=gn(i.vScale,i),i.stack!==n.stack&&(o=!0,_n(i),i.stack=n.stack),e._resyncElements(t),(o||s!==i._stacked)&&xn(e,i._parsed)}configure(){const t=this,e=t.chart.config,i=e.datasetScopeKeys(t._type),n=e.getOptionScopes(t.getDataset(),i,!0);t.options=e.createResolver(n,t.getContext()),t._parsing=t.options.parsing}parse(t,e){const i=this,{_cachedMeta:n,_data:o}=i,{iScale:s,_stacked:a}=n,r=s.axis;let l,c,h,d=0===t&&e===o.length||n._sorted,u=t>0&&n._parsed[t-1];if(!1===i._parsing)n._parsed=o,n._sorted=!0,h=o;else{h=Y(o[t])?i.parseArrayData(n,o,t,e):U(o[t])?i.parseObjectData(n,o,t,e):i.parsePrimitiveData(n,o,t,e);const s=()=>null===c[r]||u&&c[r]<u[r];for(l=0;l<e;++l)n._parsed[l+t]=c=h[l],d&&(s()&&(d=!1),u=c);n._sorted=d}a&&xn(i,h)}parsePrimitiveData(t,e,i,n){const{iScale:o,vScale:s}=t,a=o.axis,r=s.axis,l=o.getLabels(),c=o===s,h=new Array(n);let d,u,f;for(d=0,u=n;d<u;++d)f=d+i,h[d]={[a]:c||o.parse(l[f],f),[r]:s.parse(e[f],f)};return h}parseArrayData(t,e,i,n){const{xScale:o,yScale:s}=t,a=new Array(n);let r,l,c,h;for(r=0,l=n;r<l;++r)c=r+i,h=e[c],a[r]={x:o.parse(h[0],c),y:s.parse(h[1],c)};return a}parseObjectData(t,e,i,n){const{xScale:o,yScale:s}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l=new Array(n);let c,h,d,u;for(c=0,h=n;c<h;++c)d=c+i,u=e[d],l[c]={x:o.parse(lt(u,a),d),y:s.parse(lt(u,r),d)};return l}getParsed(t){return this._cachedMeta._parsed[t]}getDataElement(t){return this._cachedMeta.data[t]}applyStack(t,e,i){const n=this.chart,o=this._cachedMeta,s=e[t.axis];return fn({keys:un(n,!0),values:e._stacks[t.axis]},s,o.index,{mode:i})}updateRangeFromParsed(t,e,i,n){const o=i[e.axis];let s=null===o?NaN:o;const a=n&&i._stacks[e.axis];n&&a&&(n.values=a,t.min=Math.min(t.min,s),t.max=Math.max(t.max,s),s=fn(n,o,this._cachedMeta.index,{all:!0})),t.min=Math.min(t.min,s),t.max=Math.max(t.max,s)}getMinMax(t,e){const i=this,n=i._cachedMeta,o=n._parsed,s=n._sorted&&t===n.iScale,a=o.length,r=i._getOtherScale(t),l=e&&n._stacked&&{keys:un(i.chart,!0),values:null},c={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:h,max:d}=function(t){const{min:e,max:i,minDefined:n,maxDefined:o}=t.getUserBounds();return{min:n?e:Number.NEGATIVE_INFINITY,max:o?i:Number.POSITIVE_INFINITY}}(r);let u,f,g,p;function m(){return g=o[u],f=g[t.axis],p=g[r.axis],!X(f)||h>p||d<p}for(u=0;u<a&&(m()||(i.updateRangeFromParsed(c,t,g,l),!s));++u);if(s)for(u=a-1;u>=0;--u)if(!m()){i.updateRangeFromParsed(c,t,g,l);break}return c}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let n,o,s;for(n=0,o=e.length;n<o;++n)s=e[n][t.axis],X(s)&&i.push(s);return i}getMaxOverflow(){return!1}getLabelAndValue(t){const e=this._cachedMeta,i=e.iScale,n=e.vScale,o=this.getParsed(t);return{label:i?""+i.getLabelForValue(o[i.axis]):"",value:n?""+n.getLabelForValue(o[n.axis]):""}}_update(t){const e=this,i=e._cachedMeta;e.configure(),e._cachedDataOpts={},e.update(t||"default"),i._clip=function(t){let e,i,n,o;return U(t)?(e=t.top,i=t.right,n=t.bottom,o=t.left):e=i=n=o=t,{top:e,right:i,bottom:n,left:o,disabled:!1===t}}(K(e.options.clip,function(t,e,i){if(!1===i)return!1;const n=dn(t,i),o=dn(e,i);return{top:o.end,right:n.end,bottom:o.start,left:n.start}}(i.xScale,i.yScale,e.getMaxOverflow())))}update(t){}draw(){const t=this,e=t._ctx,i=t.chart,n=t._cachedMeta,o=n.data||[],s=i.chartArea,a=[],r=t._drawStart||0,l=t._drawCount||o.length-r;let c;for(n.dataset&&n.dataset.draw(e,s,r,l),c=r;c<r+l;++c){const t=o[c];t.hidden||(t.active?a.push(t):t.draw(e,s))}for(c=0;c<a.length;++c)a[c].draw(e,s)}getStyle(t,e){const i=e?"active":"default";return void 0===t&&this._cachedMeta.dataset?this.resolveDatasetElementOptions(i):this.resolveDataElementOptions(t||0,i)}getContext(t,e,i){const n=this,o=n.getDataset();let s;if(t>=0&&t<n._cachedMeta.data.length){const e=n._cachedMeta.data[t];s=e.$context||(e.$context=function(t,e,i){return Object.assign(Object.create(t),{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:"default",type:"data"})}(n.getContext(),t,e)),s.parsed=n.getParsed(t),s.raw=o.data[t],s.index=s.dataIndex=t}else s=n.$context||(n.$context=function(t,e){return Object.assign(Object.create(t),{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}(n.chart.getContext(),n.index)),s.dataset=o,s.index=s.datasetIndex=n.index;return s.active=!!e,s.mode=i,s}resolveDatasetElementOptions(t){return this._resolveElementOptions(this.datasetElementType.id,t)}resolveDataElementOptions(t,e){return this._resolveElementOptions(this.dataElementType.id,e,t)}_resolveElementOptions(t,e="default",i){const n=this,o="active"===e,s=n._cachedDataOpts,a=t+"-"+e,r=s[a],l=n.enableOptionSharing&&ht(i);if(r)return vn(r,l);const c=n.chart.config,h=c.datasetElementScopeKeys(n._type,t),d=o?[`${t}Hover`,"hover",t,""]:[t,""],u=c.getOptionScopes(n.getDataset(),h),f=Object.keys(xt.elements[t]),g=c.resolveNamedOptions(u,f,(()=>n.getContext(i,o)),d);return g.$shared&&(g.$shared=l,s[a]=Object.freeze(vn(g,l))),g}_resolveAnimations(t,e,i){const n=this,o=n.chart,s=n._cachedDataOpts,a=`animation-${e}`,r=s[a];if(r)return r;let l;if(!1!==o.options.animation){const o=n.chart.config,s=o.datasetAnimationScopeKeys(n._type,e),a=o.getOptionScopes(n.getDataset(),s);l=o.createResolver(a,n.getContext(t,i,e))}const c=new hn(o,l&&l.animations);return l&&l._cacheable&&(s[a]=Object.freeze(c)),c}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||yn(t)||this.chart._animationsDisabled}updateElement(t,e,i,n){yn(n)?Object.assign(t,i):this._resolveAnimations(e,n).update(t,i)}updateSharedOptions(t,e,i){t&&!yn(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,n){t.active=n;const o=this.getStyle(e,n);this._resolveAnimations(e,i,n).update(t,{options:!n&&this.getSharedOptions(o)||o})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this,i=e._data,n=e._cachedMeta.data;for(const[t,i,n]of e._syncList)e[t](i,n);e._syncList=[];const o=n.length,s=i.length,a=Math.min(s,o);a&&e.parse(0,a),s>o?e._insertElements(o,s-o,t):s<o&&e._removeElements(s,o-s)}_insertElements(t,e,i=!0){const n=this,o=n._cachedMeta,s=o.data,a=t+e;let r;const l=t=>{for(t.length+=e,r=t.length-1;r>=a;r--)t[r]=t[r-e]};for(l(s),r=t;r<a;++r)s[r]=new n.dataElementType;n._parsing&&l(o._parsed),n.parse(t,e),i&&n.updateElements(s,t,e,"reset")}updateElements(t,e,i,n){}_removeElements(t,e){const i=this._cachedMeta;if(this._parsing){const n=i._parsed.splice(t,e);i._stacked&&_n(i,n)}i.data.splice(t,e)}_sync(t){if(this._parsing)this._syncList.push(t);else{const[e,i,n]=t;this[e](i,n)}}_onDataPush(){const t=arguments.length;this._sync(["_insertElements",this.getDataset().data.length-t,t])}_onDataPop(){this._sync(["_removeElements",this._cachedMeta.data.length-1,1])}_onDataShift(){this._sync(["_removeElements",0,1])}_onDataSplice(t,e){this._sync(["_removeElements",t,e]),this._sync(["_insertElements",t,arguments.length-2])}_onDataUnshift(){this._sync(["_insertElements",0,arguments.length])}}wn.defaults={},wn.prototype.datasetElementType=null,wn.prototype.dataElementType=null;class Mn{constructor(){this.x=void 0,this.y=void 0,this.active=!1,this.options=void 0,this.$animations=void 0}tooltipPosition(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return Tt(this.x)&&Tt(this.y)}getProps(t,e){const i=this,n=this.$animations;if(!e||!n)return i;const o={};return t.forEach((t=>{o[t]=n[t]&&n[t].active()?n[t]._to:i[t]})),o}}Mn.defaults={},Mn.defaultRoutes=void 0;const kn={values:t=>Y(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const n=this.chart.options.locale;let o,s=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(o="scientific"),s=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=Pt(Math.abs(s)),r=Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:o,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),Oi(t,n,l)},logarithmic(t,e,i){if(0===t)return"0";const n=t/Math.pow(10,Math.floor(Pt(t)));return 1===n||2===n||5===n?kn.numeric.call(this,t,e,i):""}};var Sn={formatters:kn};function Pn(t,e){const i=t.options.ticks,n=i.maxTicksLimit||function(t){const e=t.options.offset,i=t._tickSize(),n=t._length/i+(e?0:1),o=t._maxLength/i;return Math.floor(Math.min(n,o))}(t),o=i.major.enabled?function(t){const e=[];let i,n;for(i=0,n=t.length;i<n;i++)t[i].major&&e.push(i);return e}(e):[],s=o.length,a=o[0],r=o[s-1],l=[];if(s>n)return function(t,e,i,n){let o,s=0,a=i[0];for(n=Math.ceil(n),o=0;o<t.length;o++)o===a&&(e.push(t[o]),s++,a=i[s*n])}(e,l,o,s/n),l;const c=function(t,e,i){const n=function(t){const e=t.length;let i,n;if(e<2)return!1;for(n=t[0],i=1;i<e;++i)if(t[i]-t[i-1]!==n)return!1;return n}(t),o=e.length/i;if(!n)return Math.max(o,1);const s=Ot(n);for(let t=0,e=s.length-1;t<e;t++){const e=s[t];if(e>o)return e}return Math.max(o,1)}(o,e,n);if(s>0){let t,i;const n=s>1?Math.round((r-a)/(s-1)):null;for(Dn(e,l,c,$(n)?0:a-n,a),t=0,i=s-1;t<i;t++)Dn(e,l,c,o[t],o[t+1]);return Dn(e,l,c,r,$(n)?e.length:r+n),l}return Dn(e,l,c),l}function Dn(t,e,i,n,o){const s=K(n,0),a=Math.min(K(o,t.length),t.length);let r,l,c,h=0;for(i=Math.ceil(i),o&&(r=o-n,i=r/Math.floor(r/i)),c=s;c<0;)h++,c=Math.round(s+h*i);for(l=Math.max(s,0);l<a;l++)l===c&&(e.push(t[l]),h++,c=Math.round(s+h*i))}xt.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",grace:0,grid:{display:!0,lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1,borderDash:[],borderDashOffset:0,borderWidth:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Sn.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),xt.route("scale.ticks","color","","color"),xt.route("scale.grid","color","","borderColor"),xt.route("scale.grid","borderColor","","borderColor"),xt.route("scale.title","color","","color"),xt.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t}),xt.describe("scales",{_fallback:"scale"}),xt.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t});const Cn=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i;function On(t,e){const i=[],n=t.length/e,o=t.length;let s=0;for(;s<o;s+=n)i.push(t[Math.floor(s)]);return i}function Tn(t,e,i){const n=t.ticks.length,o=Math.min(e,n-1),s=t._startPixel,a=t._endPixel,r=1e-6;let l,c=t.getPixelForTick(o);if(!(i&&(l=1===n?Math.max(c-s,a-c):0===e?(t.getPixelForTick(1)-c)/2:(c-t.getPixelForTick(o-1))/2,c+=o<e?l:-l,c<s-r||c>a+r)))return c}function An(t){return t.drawTicks?t.tickLength:0}function Ln(t,e){if(!t.display)return 0;const i=Ve(t.font,e),n=Be(t.padding);return(Y(t.text)?t.text.length:1)*i.lineHeight+n.height}function Rn(t,e,i){let o=n(t);return(i&&"right"!==e||!i&&"right"===e)&&(o=(t=>"left"===t?"right":"right"===t?"left":t)(o)),o}class En extends Mn{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){const e=this;e.options=t.setContext(e.getContext()),e.axis=t.axis,e._userMin=e.parse(t.min),e._userMax=e.parse(t.max),e._suggestedMin=e.parse(t.suggestedMin),e._suggestedMax=e.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:n}=this;return t=q(t,Number.POSITIVE_INFINITY),e=q(e,Number.NEGATIVE_INFINITY),i=q(i,Number.POSITIVE_INFINITY),n=q(n,Number.NEGATIVE_INFINITY),{min:q(t,i),max:q(e,n),minDefined:X(t),maxDefined:X(e)}}getMinMax(t){const e=this;let i,{min:n,max:o,minDefined:s,maxDefined:a}=e.getUserBounds();if(s&&a)return{min:n,max:o};const r=e.getMatchingVisibleMetas();for(let l=0,c=r.length;l<c;++l)i=r[l].controller.getMinMax(e,t),s||(n=Math.min(n,i.min)),a||(o=Math.max(o,i.max));return{min:q(n,q(o,n)),max:q(o,q(n,o))}}getPadding(){const t=this;return{left:t.paddingLeft||0,top:t.paddingTop||0,right:t.paddingRight||0,bottom:t.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){Q(this.options.beforeUpdate,[this])}update(t,e,i){const n=this,o=n.options.ticks,s=o.sampleSize;n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),n.ticks=null,n._labelSizes=null,n._gridLineItems=null,n._labelItems=null,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n._maxLength=n.isHorizontal()?n.width+i.left+i.right:n.height+i.top+i.bottom,n._dataLimitsCached||(n.beforeDataLimits(),n.determineDataLimits(),n.afterDataLimits(),n._range=Ne(n,n.options.grace),n._dataLimitsCached=!0),n.beforeBuildTicks(),n.ticks=n.buildTicks()||[],n.afterBuildTicks();const a=s<n.ticks.length;n._convertTicksToLabels(a?On(n.ticks,s):n.ticks),n.configure(),n.beforeCalculateLabelRotation(),n.calculateLabelRotation(),n.afterCalculateLabelRotation(),o.display&&(o.autoSkip||"auto"===o.source)&&(n.ticks=Pn(n,n.ticks),n._labelSizes=null),a&&n._convertTicksToLabels(n.ticks),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate()}configure(){const t=this;let e,i,n=t.options.reverse;t.isHorizontal()?(e=t.left,i=t.right):(e=t.top,i=t.bottom,n=!n),t._startPixel=e,t._endPixel=i,t._reversePixels=n,t._length=i-e,t._alignToPixels=t.options.alignToPixels}afterUpdate(){Q(this.options.afterUpdate,[this])}beforeSetDimensions(){Q(this.options.beforeSetDimensions,[this])}setDimensions(){const t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0}afterSetDimensions(){Q(this.options.afterSetDimensions,[this])}_callHooks(t){const e=this;e.chart.notifyPlugins(t,e.getContext()),Q(e.options[t],[e])}beforeDataLimits(){this._callHooks("beforeDataLimits")}determineDataLimits(){}afterDataLimits(){this._callHooks("afterDataLimits")}beforeBuildTicks(){this._callHooks("beforeBuildTicks")}buildTicks(){return[]}afterBuildTicks(){this._callHooks("afterBuildTicks")}beforeTickToLabelConversion(){Q(this.options.beforeTickToLabelConversion,[this])}generateTickLabels(t){const e=this,i=e.options.ticks;let n,o,s;for(n=0,o=t.length;n<o;n++)s=t[n],s.label=Q(i.callback,[s.value,n,t],e)}afterTickToLabelConversion(){Q(this.options.afterTickToLabelConversion,[this])}beforeCalculateLabelRotation(){Q(this.options.beforeCalculateLabelRotation,[this])}calculateLabelRotation(){const t=this,e=t.options,i=e.ticks,n=t.ticks.length,o=i.minRotation||0,s=i.maxRotation;let a,r,l,c=o;if(!t._isVisible()||!i.display||o>=s||n<=1||!t.isHorizontal())return void(t.labelRotation=o);const h=t._getLabelSizes(),d=h.widest.width,u=h.highest.height,f=Ht(t.chart.width-d,0,t.maxWidth);a=e.offset?t.maxWidth/n:f/(n-1),d+6>a&&(a=f/(n-(e.offset?.5:1)),r=t.maxHeight-An(e.grid)-i.padding-Ln(e.title,t.chart.options.font),l=Math.sqrt(d*d+u*u),c=It(Math.min(Math.asin(Ht((h.highest.height+6)/a,-1,1)),Math.asin(Ht(r/l,-1,1))-Math.asin(Ht(u/l,-1,1)))),c=Math.max(o,Math.min(s,c))),t.labelRotation=c}afterCalculateLabelRotation(){Q(this.options.afterCalculateLabelRotation,[this])}beforeFit(){Q(this.options.beforeFit,[this])}fit(){const t=this,e={width:0,height:0},{chart:i,options:{ticks:n,title:o,grid:s}}=t,a=t._isVisible(),r=t.isHorizontal();if(a){const a=Ln(o,i.options.font);if(r?(e.width=t.maxWidth,e.height=An(s)+a):(e.height=t.maxHeight,e.width=An(s)+a),n.display&&t.ticks.length){const{first:i,last:o,widest:s,highest:a}=t._getLabelSizes(),l=2*n.padding,c=Et(t.labelRotation),h=Math.cos(c),d=Math.sin(c);if(r){const i=n.mirror?0:d*s.width+h*a.height;e.height=Math.min(t.maxHeight,e.height+i+l)}else{const i=n.mirror?0:h*s.width+d*a.height;e.width=Math.min(t.maxWidth,e.width+i+l)}t._calculatePadding(i,o,d,h)}}t._handleMargins(),r?(t.width=t._length=i.width-t._margins.left-t._margins.right,t.height=e.height):(t.width=e.width,t.height=t._length=i.height-t._margins.top-t._margins.bottom)}_calculatePadding(t,e,i,n){const o=this,{ticks:{align:s,padding:a},position:r}=o.options,l=0!==o.labelRotation,c="top"!==r&&"x"===o.axis;if(o.isHorizontal()){const r=o.getPixelForTick(0)-o.left,h=o.right-o.getPixelForTick(o.ticks.length-1);let d=0,u=0;l?c?(d=n*t.width,u=i*e.height):(d=i*t.height,u=n*e.width):"start"===s?u=e.width:"end"===s?d=t.width:(d=t.width/2,u=e.width/2),o.paddingLeft=Math.max((d-r+a)*o.width/(o.width-r),0),o.paddingRight=Math.max((u-h+a)*o.width/(o.width-h),0)}else{let i=e.height/2,n=t.height/2;"start"===s?(i=0,n=t.height):"end"===s&&(i=e.height,n=0),o.paddingTop=i+a,o.paddingBottom=n+a}}_handleMargins(){const t=this;t._margins&&(t._margins.left=Math.max(t.paddingLeft,t._margins.left),t._margins.top=Math.max(t.paddingTop,t._margins.top),t._margins.right=Math.max(t.paddingRight,t._margins.right),t._margins.bottom=Math.max(t.paddingBottom,t._margins.bottom))}afterFit(){Q(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){const e=this;let i,n;for(e.beforeTickToLabelConversion(),e.generateTickLabels(t),i=0,n=t.length;i<n;i++)$(t[i].label)&&(t.splice(i,1),n--,i--);e.afterTickToLabelConversion()}_getLabelSizes(){const t=this;let e=t._labelSizes;if(!e){const i=t.options.ticks.sampleSize;let n=t.ticks;i<n.length&&(n=On(n,i)),t._labelSizes=e=t._computeLabelSizes(n,n.length)}return e}_computeLabelSizes(t,e){const{ctx:i,_longestTextCache:n}=this,o=[],s=[];let a,r,l,c,h,d,u,f,g,p,m,x=0,b=0;for(a=0;a<e;++a){if(c=t[a].label,h=this._resolveTickFontOptions(a),i.font=d=h.string,u=n[d]=n[d]||{data:{},gc:[]},f=h.lineHeight,g=p=0,$(c)||Y(c)){if(Y(c))for(r=0,l=c.length;r<l;++r)m=c[r],$(m)||Y(m)||(g=Yt(i,u.data,u.gc,g,m),p+=f)}else g=Yt(i,u.data,u.gc,g,c),p=f;o.push(g),s.push(p),x=Math.max(g,x),b=Math.max(p,b)}!function(t,e){J(t,(t=>{const i=t.gc,n=i.length/2;let o;if(n>e){for(o=0;o<n;++o)delete t.data[i[o]];i.splice(0,n)}}))}(n,e);const _=o.indexOf(x),y=s.indexOf(b),v=t=>({width:o[t]||0,height:s[t]||0});return{first:v(0),last:v(e-1),widest:v(_),highest:v(y),widths:o,heights:s}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){const e=this;e._reversePixels&&(t=1-t);const i=e._startPixel+t*e._length;return jt(e._alignToPixels?Xt(e.chart,i,0):i)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this,i=e.ticks||[];if(t>=0&&t<i.length){const n=i[t];return n.$context||(n.$context=function(t,e,i){return Object.assign(Object.create(t),{tick:i,index:e,type:"tick"})}(e.getContext(),t,n))}return e.$context||(e.$context=(n=e.chart.getContext(),o=e,Object.assign(Object.create(n),{scale:o,type:"scale"})));var n,o}_tickSize(){const t=this,e=t.options.ticks,i=Et(t.labelRotation),n=Math.abs(Math.cos(i)),o=Math.abs(Math.sin(i)),s=t._getLabelSizes(),a=e.autoSkipPadding||0,r=s?s.widest.width+a:0,l=s?s.highest.height+a:0;return t.isHorizontal()?l*n>r*o?r/n:l/o:l*o<r*n?l/n:r/o}_isVisible(){const t=this.options.display;return"auto"!==t?!!t:this.getMatchingVisibleMetas().length>0}_computeGridLineItems(t){const e=this,i=e.axis,n=e.chart,o=e.options,{grid:s,position:a}=o,r=s.offset,l=e.isHorizontal(),c=e.ticks.length+(r?1:0),h=An(s),d=[],u=s.setContext(e.getContext()),f=u.drawBorder?u.borderWidth:0,g=f/2,p=function(t){return Xt(n,t,f)};let m,x,b,_,y,v,w,M,k,S,P,D;if("top"===a)m=p(e.bottom),v=e.bottom-h,M=m-g,S=p(t.top)+g,D=t.bottom;else if("bottom"===a)m=p(e.top),S=t.top,D=p(t.bottom)-g,v=m+g,M=e.top+h;else if("left"===a)m=p(e.right),y=e.right-h,w=m-g,k=p(t.left)+g,P=t.right;else if("right"===a)m=p(e.left),k=t.left,P=p(t.right)-g,y=m+g,w=e.left+h;else if("x"===i){if("center"===a)m=p((t.top+t.bottom)/2+.5);else if(U(a)){const t=Object.keys(a)[0],i=a[t];m=p(e.chart.scales[t].getPixelForValue(i))}S=t.top,D=t.bottom,v=m+g,M=v+h}else if("y"===i){if("center"===a)m=p((t.left+t.right)/2);else if(U(a)){const t=Object.keys(a)[0],i=a[t];m=p(e.chart.scales[t].getPixelForValue(i))}y=m-g,w=y-h,k=t.left,P=t.right}const C=K(o.ticks.maxTicksLimit,c),O=Math.max(1,Math.ceil(c/C));for(x=0;x<c;x+=O){const t=s.setContext(e.getContext(x)),i=t.lineWidth,o=t.color,a=s.borderDash||[],c=t.borderDashOffset,h=t.tickWidth,u=t.tickColor,f=t.tickBorderDash||[],g=t.tickBorderDashOffset;b=Tn(e,x,r),void 0!==b&&(_=Xt(n,b,i),l?y=w=k=P=_:v=M=S=D=_,d.push({tx1:y,ty1:v,tx2:w,ty2:M,x1:k,y1:S,x2:P,y2:D,width:i,color:o,borderDash:a,borderDashOffset:c,tickWidth:h,tickColor:u,tickBorderDash:f,tickBorderDashOffset:g}))}return e._ticksLength=c,e._borderValue=m,d}_computeLabelItems(t){const e=this,i=e.axis,n=e.options,{position:o,ticks:s}=n,a=e.isHorizontal(),r=e.ticks,{align:l,crossAlign:c,padding:h,mirror:d}=s,u=An(n.grid),f=u+h,g=d?-h:f,p=-Et(e.labelRotation),m=[];let x,b,_,y,v,w,M,k,S,P,D,C,O="middle";if("top"===o)w=e.bottom-g,M=e._getXAxisLabelAlignment();else if("bottom"===o)w=e.top+g,M=e._getXAxisLabelAlignment();else if("left"===o){const t=e._getYAxisLabelAlignment(u);M=t.textAlign,v=t.x}else if("right"===o){const t=e._getYAxisLabelAlignment(u);M=t.textAlign,v=t.x}else if("x"===i){if("center"===o)w=(t.top+t.bottom)/2+f;else if(U(o)){const t=Object.keys(o)[0],i=o[t];w=e.chart.scales[t].getPixelForValue(i)+f}M=e._getXAxisLabelAlignment()}else if("y"===i){if("center"===o)v=(t.left+t.right)/2-f;else if(U(o)){const t=Object.keys(o)[0],i=o[t];v=e.chart.scales[t].getPixelForValue(i)}M=e._getYAxisLabelAlignment(u).textAlign}"y"===i&&("start"===l?O="top":"end"===l&&(O="bottom"));const T=e._getLabelSizes();for(x=0,b=r.length;x<b;++x){_=r[x],y=_.label;const t=s.setContext(e.getContext(x));k=e.getPixelForTick(x)+s.labelOffset,S=e._resolveTickFontOptions(x),P=S.lineHeight,D=Y(y)?y.length:1;const i=D/2,n=t.color,l=t.textStrokeColor,h=t.textStrokeWidth;let u;if(a?(v=k,C="top"===o?"near"===c||0!==p?-D*P+P/2:"center"===c?-T.highest.height/2-i*P+P:-T.highest.height+P/2:"near"===c||0!==p?P/2:"center"===c?T.highest.height/2-i*P:T.highest.height-D*P,d&&(C*=-1)):(w=k,C=(1-D)*P/2),t.showLabelBackdrop){const e=Be(t.backdropPadding),i=T.heights[x],n=T.widths[x];let o=w+C-e.top,s=v-e.left;switch(O){case"middle":o-=i/2;break;case"bottom":o-=i}switch(M){case"center":s-=n/2;break;case"right":s-=n}u={left:s,top:o,width:n+e.width,height:i+e.height,color:t.backdropColor}}m.push({rotation:p,label:y,font:S,color:n,strokeColor:l,strokeWidth:h,textOffset:C,textAlign:M,textBaseline:O,translation:[v,w],backdrop:u})}return m}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-Et(this.labelRotation))return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align&&(i="right"),i}_getYAxisLabelAlignment(t){const e=this,{position:i,ticks:{crossAlign:n,mirror:o,padding:s}}=e.options,a=t+s,r=e._getLabelSizes().widest.width;let l,c;return"left"===i?o?(c=e.right+s,"near"===n?l="left":"center"===n?(l="center",c+=r/2):(l="right",c+=r)):(c=e.right-a,"near"===n?l="right":"center"===n?(l="center",c-=r/2):(l="left",c=e.left)):"right"===i?o?(c=e.left+s,"near"===n?l="right":"center"===n?(l="center",c-=r/2):(l="left",c-=r)):(c=e.left+a,"near"===n?l="left":"center"===n?(l="center",c+=r/2):(l="right",c=e.right)):l="right",{textAlign:l,x:c}}_computeLabelArea(){const t=this;if(t.options.ticks.mirror)return;const e=t.chart,i=t.options.position;return"left"===i||"right"===i?{top:0,left:t.left,bottom:e.height,right:t.right}:"top"===i||"bottom"===i?{top:t.top,left:0,bottom:t.bottom,right:e.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:n,width:o,height:s}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,n,o,s),t.restore())}getLineWidthForValue(t){const e=this,i=e.options.grid;if(!e._isVisible()||!i.display)return 0;const n=e.ticks.findIndex((e=>e.value===t));if(n>=0){return i.setContext(e.getContext(n)).lineWidth}return 0}drawGrid(t){const e=this,i=e.options.grid,n=e.ctx,o=e._gridLineItems||(e._gridLineItems=e._computeGridLineItems(t));let s,a;const r=(t,e,i)=>{i.width&&i.color&&(n.save(),n.lineWidth=i.width,n.strokeStyle=i.color,n.setLineDash(i.borderDash||[]),n.lineDashOffset=i.borderDashOffset,n.beginPath(),n.moveTo(t.x,t.y),n.lineTo(e.x,e.y),n.stroke(),n.restore())};if(i.display)for(s=0,a=o.length;s<a;++s){const t=o[s];i.drawOnChartArea&&r({x:t.x1,y:t.y1},{x:t.x2,y:t.y2},t),i.drawTicks&&r({x:t.tx1,y:t.ty1},{x:t.tx2,y:t.ty2},{color:t.tickColor,width:t.tickWidth,borderDash:t.tickBorderDash,borderDashOffset:t.tickBorderDashOffset})}}drawBorder(){const t=this,{chart:e,ctx:i,options:{grid:n}}=t,o=n.setContext(t.getContext()),s=n.drawBorder?o.borderWidth:0;if(!s)return;const a=n.setContext(t.getContext(0)).lineWidth,r=t._borderValue;let l,c,h,d;t.isHorizontal()?(l=Xt(e,t.left,s)-s/2,c=Xt(e,t.right,a)+a/2,h=d=r):(h=Xt(e,t.top,s)-s/2,d=Xt(e,t.bottom,a)+a/2,l=c=r),i.save(),i.lineWidth=o.borderWidth,i.strokeStyle=o.borderColor,i.beginPath(),i.moveTo(l,h),i.lineTo(c,d),i.stroke(),i.restore()}drawLabels(t){const e=this;if(!e.options.ticks.display)return;const i=e.ctx,n=e._computeLabelArea();n&&Zt(i,n);const o=e._labelItems||(e._labelItems=e._computeLabelItems(t));let s,a;for(s=0,a=o.length;s<a;++s){const t=o[s],e=t.font,n=t.label;t.backdrop&&(i.fillStyle=t.backdrop.color,i.fillRect(t.backdrop.left,t.backdrop.top,t.backdrop.width,t.backdrop.height)),ee(i,n,0,t.textOffset,e,t)}n&&Qt(i)}drawTitle(){const{ctx:t,options:{position:e,title:i,reverse:n}}=this;if(!i.display)return;const s=Ve(i.font),a=Be(i.padding),r=i.align;let l=s.lineHeight/2;"bottom"===e||"center"===e||U(e)?(l+=a.bottom,Y(i.text)&&(l+=s.lineHeight*(i.text.length-1))):l+=a.top;const{titleX:c,titleY:h,maxWidth:d,rotation:u}=function(t,e,i,n){const{top:s,left:a,bottom:r,right:l,chart:c}=t,{chartArea:h,scales:d}=c;let u,f,g,p=0;const m=r-s,x=l-a;if(t.isHorizontal()){if(f=o(n,a,l),U(i)){const t=Object.keys(i)[0],n=i[t];g=d[t].getPixelForValue(n)+m-e}else g="center"===i?(h.bottom+h.top)/2+m-e:Cn(t,i,e);u=l-a}else{if(U(i)){const t=Object.keys(i)[0],n=i[t];f=d[t].getPixelForValue(n)-x+e}else f="center"===i?(h.left+h.right)/2-x+e:Cn(t,i,e);g=o(n,r,s),p="left"===i?-Mt:Mt}return{titleX:f,titleY:g,maxWidth:u,rotation:p}}(this,l,e,r);ee(t,i.text,0,0,s,{color:i.color,maxWidth:d,rotation:u,textAlign:Rn(r,e,n),textBaseline:"middle",translation:[c,h]})}draw(t){const e=this;e._isVisible()&&(e.drawBackground(),e.drawGrid(t),e.drawBorder(),e.drawTitle(),e.drawLabels(t))}_layers(){const t=this,e=t.options,i=e.ticks&&e.ticks.z||0,n=K(e.grid&&e.grid.z,-1);return t._isVisible()&&t.draw===En.prototype.draw?[{z:n,draw(e){t.drawBackground(),t.drawGrid(e),t.drawTitle()}},{z:n+1,draw(){t.drawBorder()}},{z:i,draw(e){t.drawLabels(e)}}]:[{z:i,draw(e){t.draw(e)}}]}getMatchingVisibleMetas(t){const e=this,i=e.chart.getSortedVisibleDatasetMetas(),n=e.axis+"AxisID",o=[];let s,a;for(s=0,a=i.length;s<a;++s){const a=i[s];a[n]!==e.id||t&&a.type!==t||o.push(a)}return o}_resolveTickFontOptions(t){return Ve(this.options.ticks.setContext(this.getContext(t)).font)}_maxDigits(){const t=this,e=t._resolveTickFontOptions(0).lineHeight;return(t.isHorizontal()?t.width:t.height)/e}}class In{constructor(t,e,i){this.type=t,this.scope=e,this.override=i,this.items=Object.create(null)}isForType(t){return Object.prototype.isPrototypeOf.call(this.type.prototype,t.prototype)}register(t){const e=this,i=Object.getPrototypeOf(t);let n;(function(t){return"id"in t&&"defaults"in t})(i)&&(n=e.register(i));const o=e.items,s=t.id,a=e.scope+"."+s;if(!s)throw new Error("class does not have id: "+t);return s in o||(o[s]=t,function(t,e,i){const n=ot(Object.create(null),[i?xt.get(i):{},xt.get(e),t.defaults]);xt.set(e,n),t.defaultRoutes&&function(t,e){Object.keys(e).forEach((i=>{const n=i.split("."),o=n.pop(),s=[t].concat(n).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");xt.route(s,o,l,r)}))}(e,t.defaultRoutes);t.descriptors&&xt.describe(e,t.descriptors)}(t,a,n),e.override&&xt.override(t.id,t.overrides)),a}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,n=this.scope;i in e&&delete e[i],n&&i in xt[n]&&(delete xt[n][i],this.override&&delete ft[i])}}var zn=new class{constructor(){this.controllers=new In(wn,"datasets",!0),this.elements=new In(Mn,"elements"),this.plugins=new In(Object,"plugins"),this.scales=new In(En,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){const n=this;[...e].forEach((e=>{const o=i||n._getRegistryForType(e);i||o.isForType(e)||o===n.plugins&&e.id?n._exec(t,o,e):J(e,(e=>{const o=i||n._getRegistryForType(e);n._exec(t,o,e)}))}))}_exec(t,e,i){const n=ct(t);Q(i["before"+n],[],i),e[t](i),Q(i["after"+n],[],i)}_getRegistryForType(t){for(let e=0;e<this._typedRegistries.length;e++){const i=this._typedRegistries[e];if(i.isForType(t))return i}return this.plugins}_get(t,e,i){const n=e.get(t);if(void 0===n)throw new Error('"'+t+'" is not a registered '+i+".");return n}};class Fn{constructor(){this._init=[]}notify(t,e,i,n){const o=this;"beforeInit"===e&&(o._init=o._createDescriptors(t,!0),o._notify(o._init,t,"install"));const s=n?o._descriptors(t).filter(n):o._descriptors(t),a=o._notify(s,t,e,i);return"destroy"===e&&(o._notify(s,t,"stop"),o._notify(o._init,t,"uninstall")),a}_notify(t,e,i,n){n=n||{};for(const o of t){const t=o.plugin;if(!1===Q(t[i],[e,n,o.options],t)&&n.cancelable)return!1}return!0}invalidate(){$(this._cache)||(this._oldCache=this._cache,this._cache=void 0)}_descriptors(t){if(this._cache)return this._cache;const e=this._cache=this._createDescriptors(t);return this._notifyStateChanges(t),e}_createDescriptors(t,e){const i=t&&t.config,n=K(i.options&&i.options.plugins,{}),o=function(t){const e=[],i=Object.keys(zn.plugins.items);for(let t=0;t<i.length;t++)e.push(zn.getPlugin(i[t]));const n=t.plugins||[];for(let t=0;t<n.length;t++){const i=n[t];-1===e.indexOf(i)&&e.push(i)}return e}(i);return!1!==n||e?function(t,e,i,n){const o=[],s=t.getContext();for(let a=0;a<e.length;a++){const r=e[a],l=Bn(i[r.id],n);null!==l&&o.push({plugin:r,options:Vn(t.config,r,l,s)})}return o}(t,o,n,e):[]}_notifyStateChanges(t){const e=this._oldCache||[],i=this._cache,n=(t,e)=>t.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(n(e,i),t,"stop"),this._notify(n(i,e),t,"start")}}function Bn(t,e){return e||!1!==t?!0===t?{}:t:null}function Vn(t,e,i,n){const o=t.pluginScopeKeys(e),s=t.getOptionScopes(i,o);return t.createResolver(s,n,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function Wn(t,e){const i=xt.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function Nn(t,e){return"x"===t||"y"===t?t:e.axis||("top"===(i=e.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.charAt(0).toLowerCase();var i}function Hn(t){const e=t.options||(t.options={});e.plugins=K(e.plugins,{}),e.scales=function(t,e){const i=ft[t.type]||{scales:{}},n=e.scales||{},o=Wn(t.type,e),s=Object.create(null),a=Object.create(null);return Object.keys(n).forEach((t=>{const e=n[t];if(!U(e))return console.error(`Invalid scale configuration for scale: ${t}`);if(e._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);const r=Nn(t,e),l=function(t,e){return t===e?"_index_":"_value_"}(r,o),c=i.scales||{};s[r]=s[r]||t,a[t]=st(Object.create(null),[{axis:r},e,c[r],c[l]])})),t.data.datasets.forEach((i=>{const o=i.type||t.type,r=i.indexAxis||Wn(o,e),l=(ft[o]||{}).scales||{};Object.keys(l).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,r),o=i[e+"AxisID"]||s[e]||e;a[o]=a[o]||Object.create(null),st(a[o],[{axis:e},n[o],l[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];st(e,[xt.scales[e.type],xt.scale])})),a}(t,e)}function jn(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const $n=new Map,Yn=new Set;function Un(t,e){let i=$n.get(t);return i||(i=e(),$n.set(t,i),Yn.add(i)),i}const Xn=(t,e,i)=>{const n=lt(e,i);void 0!==n&&t.add(n)};class qn{constructor(t){this._config=function(t){return(t=t||{}).data=jn(t.data),Hn(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=jn(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Hn(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return Un(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return Un(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return Un(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return Un(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let n=i.get(t);return n&&!e||(n=new Map,i.set(t,n)),n}getOptionScopes(t,e,i){const{options:n,type:o}=this,s=this._cachedScopes(t,i),a=s.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>Xn(r,t,e)))),e.forEach((t=>Xn(r,n,t))),e.forEach((t=>Xn(r,ft[o]||{},t))),e.forEach((t=>Xn(r,xt,t))),e.forEach((t=>Xn(r,gt,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),Yn.has(e)&&s.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,ft[e]||{},xt.datasets[e]||{},{type:e},xt,gt]}resolveNamedOptions(t,e,i,n=[""]){const o={$shared:!0},{resolver:s,subPrefixes:a}=Kn(this._resolverCache,t,n);let r=s;if(function(t,e){const{isScriptable:i,isIndexable:n}=ni(t);for(const o of e)if(i(o)&&dt(t[o])||n(o)&&Y(t[o]))return!0;return!1}(s,e)){o.$shared=!1;r=ii(s,i=dt(i)?i():i,this.createResolver(t,i,a))}for(const t of e)o[t]=r[t];return o}createResolver(t,e,i=[""],n){const{resolver:o}=Kn(this._resolverCache,t,i);return U(e)?ii(o,e,void 0,n):o}}function Kn(t,e,i){let n=t.get(e);n||(n=new Map,t.set(e,n));const o=i.join();let s=n.get(o);if(!s){s={resolver:ei(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},n.set(o,s)}return s}const Gn=["top","bottom","left","right","chartArea"];function Zn(t,e){return"top"===t||"bottom"===t||-1===Gn.indexOf(t)&&"x"===e}function Qn(t,e){return function(i,n){return i[t]===n[t]?i[e]-n[e]:i[t]-n[t]}}function Jn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),Q(i&&i.onComplete,[t],e)}function to(t){const e=t.chart,i=e.options.animation;Q(i&&i.onProgress,[t],e)}function eo(t){return ue()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const io={},no=t=>{const e=eo(t);return Object.values(io).filter((t=>t.canvas===e)).pop()};class oo{constructor(t,e){const n=this,o=this.config=new qn(e),s=eo(t),r=no(s);if(r)throw new Error("Canvas is already in use. Chart with ID '"+r.id+"' must be destroyed before the canvas can be reused.");const l=o.createResolver(o.chartOptionScopes(),n.getContext());this.platform=new(o.platform||on(s));const c=n.platform.acquireContext(s,l.aspectRatio),h=c&&c.canvas,d=h&&h.height,u=h&&h.width;this.id=j(),this.ctx=c,this.canvas=h,this.width=u,this.height=d,this._options=l,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Fn,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=i((t=>this.update(t)),l.resizeDelay||0),io[n.id]=n,c&&h?(a.listen(n,"complete",Jn),a.listen(n,"progress",to),n._initialize(),n.attached&&n.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return $(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}_initialize(){const t=this;return t.notifyPlugins("beforeInit"),t.options.responsive?t.resize():we(t,t.options.devicePixelRatio),t.bindEvents(),t.notifyPlugins("afterInit"),t}clear(){return qt(this.canvas,this.ctx),this}stop(){return a.stop(this),this}resize(t,e){a.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this,n=i.options,o=i.canvas,s=n.maintainAspectRatio&&i.aspectRatio,a=i.platform.getMaximumSize(o,t,e,s),r=n.devicePixelRatio||i.platform.getDevicePixelRatio(),l=i.width?"resize":"attach";i.width=a.width,i.height=a.height,i._aspectRatio=i.aspectRatio,we(i,r,!0)&&(i.notifyPlugins("resize",{size:a}),Q(n.onResize,[i,a],i),i.attached&&i._doResize(l)&&i.render())}ensureScalesHaveIDs(){J(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this,e=t.options,i=e.scales,n=t.scales,o=Object.keys(n).reduce(((t,e)=>(t[e]=!1,t)),{});let s=[];i&&(s=s.concat(Object.keys(i).map((t=>{const e=i[t],n=Nn(t,e),o="r"===n,s="x"===n;return{options:e,dposition:o?"chartArea":s?"bottom":"left",dtype:o?"radialLinear":s?"category":"linear"}})))),J(s,(i=>{const s=i.options,a=s.id,r=Nn(a,s),l=K(s.type,i.dtype);void 0!==s.position&&Zn(s.position,r)===Zn(i.dposition)||(s.position=i.dposition),o[a]=!0;let c=null;if(a in n&&n[a].type===l)c=n[a];else{c=new(zn.getScale(l))({id:a,type:l,ctx:t.ctx,chart:t}),n[c.id]=c}c.init(s,e)})),J(o,((t,e)=>{t||delete n[e]})),J(n,(e=>{ti.configure(t,e,e.options),ti.addBox(t,e)}))}_updateMetasets(){const t=this,e=t._metasets,i=t.data.datasets.length,n=e.length;if(e.sort(((t,e)=>t.index-e.index)),n>i){for(let e=i;e<n;++e)t._destroyDatasetMeta(e);e.splice(i,n-i)}t._sortedMetasets=e.slice(0).sort(Qn("order","index"))}_removeUnreferencedMetasets(){const t=this,{_metasets:e,data:{datasets:i}}=t;e.length>i.length&&delete t._stacks,e.forEach(((e,n)=>{0===i.filter((t=>t===e._dataset)).length&&t._destroyDatasetMeta(n)}))}buildOrUpdateControllers(){const t=this,e=[],i=t.data.datasets;let n,o;for(t._removeUnreferencedMetasets(),n=0,o=i.length;n<o;n++){const o=i[n];let s=t.getDatasetMeta(n);const a=o.type||t.config.type;if(s.type&&s.type!==a&&(t._destroyDatasetMeta(n),s=t.getDatasetMeta(n)),s.type=a,s.indexAxis=o.indexAxis||Wn(a,t.options),s.order=o.order||0,s.index=n,s.label=""+o.label,s.visible=t.isDatasetVisible(n),s.controller)s.controller.updateIndex(n),s.controller.linkScales();else{const i=zn.getController(a),{datasetElementType:o,dataElementType:r}=xt.datasets[a];Object.assign(i.prototype,{dataElementType:zn.getElement(r),datasetElementType:o&&zn.getElement(o)}),s.controller=new i(t,n),e.push(s.controller)}}return t._updateMetasets(),e}_resetElements(){const t=this;J(t.data.datasets,((e,i)=>{t.getDatasetMeta(i).controller.reset()}),t)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this,i=e.config;i.update(),e._options=i.createResolver(i.chartOptionScopes(),e.getContext()),J(e.scales,(t=>{ti.removeBox(e,t)}));const n=e._animationsDisabled=!e.options.animation;e.ensureScalesHaveIDs(),e.buildOrUpdateScales();const o=new Set(Object.keys(e._listeners)),s=new Set(e.options.events);if(ut(o,s)&&!!this._responsiveListeners===e.options.responsive||(e.unbindEvents(),e.bindEvents()),e._plugins.invalidate(),!1===e.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const a=e.buildOrUpdateControllers();e.notifyPlugins("beforeElementsUpdate");let r=0;for(let t=0,i=e.data.datasets.length;t<i;t++){const{controller:i}=e.getDatasetMeta(t),o=!n&&-1===a.indexOf(i);i.buildOrUpdateElements(o),r=Math.max(+i.getMaxOverflow(),r)}e._minPadding=r,e._updateLayout(r),n||J(a,(t=>{t.reset()})),e._updateDatasets(t),e.notifyPlugins("afterUpdate",{mode:t}),e._layers.sort(Qn("z","_idx")),e._lastEvent&&e._eventHandler(e._lastEvent,!0),e.render()}_updateLayout(t){const e=this;if(!1===e.notifyPlugins("beforeLayout",{cancelable:!0}))return;ti.update(e,e.width,e.height,t);const i=e.chartArea,n=i.width<=0||i.height<=0;e._layers=[],J(e.boxes,(t=>{n&&"chartArea"===t.position||(t.configure&&t.configure(),e._layers.push(...t._layers()))}),e),e._layers.forEach(((t,e)=>{t._idx=e})),e.notifyPlugins("afterLayout")}_updateDatasets(t){const e=this,i="function"==typeof t;if(!1!==e.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let n=0,o=e.data.datasets.length;n<o;++n)e._updateDataset(n,i?t({datasetIndex:n}):t);e.notifyPlugins("afterDatasetsUpdate",{mode:t})}}_updateDataset(t,e){const i=this,n=i.getDatasetMeta(t),o={meta:n,index:t,mode:e,cancelable:!0};!1!==i.notifyPlugins("beforeDatasetUpdate",o)&&(n.controller._update(e),o.cancelable=!1,i.notifyPlugins("afterDatasetUpdate",o))}render(){const t=this;!1!==t.notifyPlugins("beforeRender",{cancelable:!0})&&(a.has(t)?t.attached&&!a.running(t)&&a.start(t):(t.draw(),Jn({chart:t})))}draw(){const t=this;let e;if(t._resizeBeforeDraw){const{width:e,height:i}=t._resizeBeforeDraw;t._resize(e,i),t._resizeBeforeDraw=null}if(t.clear(),t.width<=0||t.height<=0)return;if(!1===t.notifyPlugins("beforeDraw",{cancelable:!0}))return;const i=t._layers;for(e=0;e<i.length&&i[e].z<=0;++e)i[e].draw(t.chartArea);for(t._drawDatasets();e<i.length;++e)i[e].draw(t.chartArea);t.notifyPlugins("afterDraw")}_getSortedDatasetMetas(t){const e=this._sortedMetasets,i=[];let n,o;for(n=0,o=e.length;n<o;++n){const o=e[n];t&&!o.visible||i.push(o)}return i}getSortedVisibleDatasetMetas(){return this._getSortedDatasetMetas(!0)}_drawDatasets(){const t=this;if(!1===t.notifyPlugins("beforeDatasetsDraw",{cancelable:!0}))return;const e=t.getSortedVisibleDatasetMetas();for(let i=e.length-1;i>=0;--i)t._drawDataset(e[i]);t.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this,i=e.ctx,n=t._clip,o=!n.disabled,s=e.chartArea,a={meta:t,index:t.index,cancelable:!0};!1!==e.notifyPlugins("beforeDatasetDraw",a)&&(o&&Zt(i,{left:!1===n.left?0:s.left-n.left,right:!1===n.right?e.width:s.right+n.right,top:!1===n.top?0:s.top-n.top,bottom:!1===n.bottom?e.height:s.bottom+n.bottom}),t.controller.draw(),o&&Qt(i),a.cancelable=!1,e.notifyPlugins("afterDatasetDraw",a))}getElementsAtEventForMode(t,e,i,n){const o=Ae.modes[e];return"function"==typeof o?o(this,t,i,n):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let n=i.filter((t=>t&&t._dataset===e)).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(n)),n}getContext(){return this.$context||(this.$context={chart:this,type:"chart"})}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const n=this,o=i?"show":"hide",s=n.getDatasetMeta(t),a=s.controller._resolveAnimations(void 0,o);ht(e)?(s.data[e].hidden=!i,n.update()):(n.setDatasetVisibility(t,i),a.update(s,{visible:i}),n.update((e=>e.datasetIndex===t?o:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this,i=e._metasets&&e._metasets[t];i&&i.controller&&(i.controller._destroy(),delete e._metasets[t])}_stop(){const t=this;let e,i;for(t.stop(),a.remove(t),e=0,i=t.data.datasets.length;e<i;++e)t._destroyDatasetMeta(e)}destroy(){const t=this,{canvas:e,ctx:i}=t;t._stop(),t.config.clearCache(),e&&(t.unbindEvents(),qt(e,i),t.platform.releaseContext(i),t.canvas=null,t.ctx=null),t.notifyPlugins("destroy"),delete io[t.id]}toBase64Image(...t){return this.canvas.toDataURL(...t)}bindEvents(){this.bindUserEvents(),this.options.responsive?this.bindResponsiveEvents():this.attached=!0}bindUserEvents(){const t=this,e=t._listeners,i=t.platform,n=function(e,i,n){e.offsetX=i,e.offsetY=n,t._eventHandler(e)};J(t.options.events,(o=>((n,o)=>{i.addEventListener(t,n,o),e[n]=o})(o,n)))}bindResponsiveEvents(){const t=this;t._responsiveListeners||(t._responsiveListeners={});const e=t._responsiveListeners,i=t.platform,n=(n,o)=>{i.addEventListener(t,n,o),e[n]=o},o=(n,o)=>{e[n]&&(i.removeEventListener(t,n,o),delete e[n])},s=(e,i)=>{t.canvas&&t.resize(e,i)};let a;const r=()=>{o("attach",r),t.attached=!0,t.resize(),n("resize",s),n("detach",a)};a=()=>{t.attached=!1,o("resize",s),t._stop(),t._resize(0,0),n("attach",r)},i.isAttached(t.canvas)?r():a()}unbindEvents(){const t=this;J(t._listeners,((e,i)=>{t.platform.removeEventListener(t,i,e)})),t._listeners={},J(t._responsiveListeners,((e,i)=>{t.platform.removeEventListener(t,i,e)})),t._responsiveListeners=void 0}updateHoverStyle(t,e,i){const n=i?"set":"remove";let o,s,a,r;for("dataset"===e&&(o=this.getDatasetMeta(t[0].datasetIndex),o.controller["_"+n+"DatasetHoverStyle"]()),a=0,r=t.length;a<r;++a){s=t[a];const e=s&&this.getDatasetMeta(s.datasetIndex).controller;e&&e[n+"HoverStyle"](s.element,s.datasetIndex,s.index)}}getActiveElements(){return this._active||[]}setActiveElements(t){const e=this,i=e._active||[],n=t.map((({datasetIndex:t,index:i})=>{const n=e.getDatasetMeta(t);if(!n)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:n.data[i],index:i}}));!tt(n,i)&&(e._active=n,e._updateHoverStyles(n,i))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}_updateHoverStyles(t,e,i){const n=this,o=n.options.hover,s=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),a=s(e,t),r=i?t:s(t,e);a.length&&n.updateHoverStyle(a,o.mode,!1),r.length&&o.mode&&n.updateHoverStyle(r,o.mode,!0)}_eventHandler(t,e){const i=this,n={event:t,replay:e,cancelable:!0},o=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===i.notifyPlugins("beforeEvent",n,o))return;const s=i._handleEvent(t,e);return n.cancelable=!1,i.notifyPlugins("afterEvent",n,o),(s||n.changed)&&i.render(),i}_handleEvent(t,e){const i=this,{_active:n=[],options:o}=i,s=o.hover,a=e;let r=[],l=!1,c=null;return"mouseout"!==t.type&&(r=i.getElementsAtEventForMode(t,s.mode,s,a),c="click"===t.type?i._lastEvent:t),i._lastEvent=null,Gt(t,i.chartArea,i._minPadding)&&(Q(o.onHover,[t,r,i],i),"mouseup"!==t.type&&"click"!==t.type&&"contextmenu"!==t.type||Q(o.onClick,[t,r,i],i)),l=!tt(r,n),(l||e)&&(i._active=r,i._updateHoverStyles(r,n,e)),i._lastEvent=c,l}}const so=()=>J(oo.instances,(t=>t._plugins.invalidate())),ao=!0;function ro(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}Object.defineProperties(oo,{defaults:{enumerable:ao,value:xt},instances:{enumerable:ao,value:io},overrides:{enumerable:ao,value:ft},registry:{enumerable:ao,value:zn},version:{enumerable:ao,value:"3.5.1"},getChart:{enumerable:ao,value:no},register:{enumerable:ao,value:(...t)=>{zn.add(...t),so()}},unregister:{enumerable:ao,value:(...t)=>{zn.remove(...t),so()}}});class lo{constructor(t){this.options=t||{}}formats(){return ro()}parse(t,e){return ro()}format(t,e){return ro()}add(t,e,i){return ro()}diff(t,e,i){return ro()}startOf(t,e,i){return ro()}endOf(t,e){return ro()}}lo.override=function(t){Object.assign(lo.prototype,t)};var co={_date:lo};function ho(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let n=[];for(let e=0,o=i.length;e<o;e++)n=n.concat(i[e].controller.getAllParsedValues(t));t._cache.$bar=de(n.sort(((t,e)=>t-e)))}return t._cache.$bar}(e,t.type);let n,o,s,a,r=e._length;const l=()=>{32767!==s&&-32768!==s&&(ht(a)&&(r=Math.min(r,Math.abs(s-a)||r)),a=s)};for(n=0,o=i.length;n<o;++n)s=e.getPixelForValue(i[n]),l();for(a=void 0,n=0,o=e.ticks.length;n<o;++n)s=e.getPixelForTick(n),l();return r}function uo(t,e,i,n){return Y(t)?function(t,e,i,n){const o=i.parse(t[0],n),s=i.parse(t[1],n),a=Math.min(o,s),r=Math.max(o,s);let l=a,c=r;Math.abs(a)>Math.abs(r)&&(l=r,c=a),e[i.axis]=c,e._custom={barStart:l,barEnd:c,start:o,end:s,min:a,max:r}}(t,e,i,n):e[i.axis]=i.parse(t,n),e}function fo(t,e,i,n){const o=t.iScale,s=t.vScale,a=o.getLabels(),r=o===s,l=[];let c,h,d,u;for(c=i,h=i+n;c<h;++c)u=e[c],d={},d[o.axis]=r||o.parse(a[c],c),l.push(uo(u,d,s,c));return l}function go(t){return t&&void 0!==t.barStart&&void 0!==t.barEnd}function po(t,e,i,n){let o=e.borderSkipped;const s={};if(!o)return void(t.borderSkipped=s);const{start:a,end:r,reverse:l,top:c,bottom:h}=function(t){let e,i,n,o,s;return t.horizontal?(e=t.base>t.x,i="left",n="right"):(e=t.base<t.y,i="bottom",n="top"),e?(o="end",s="start"):(o="start",s="end"),{start:i,end:n,reverse:e,top:o,bottom:s}}(t);"middle"===o&&i&&(t.enableBorderRadius=!0,(i._top||0)===n?o=c:(i._bottom||0)===n?o=h:(s[mo(h,a,r,l)]=!0,o=c)),s[mo(o,a,r,l)]=!0,t.borderSkipped=s}function mo(t,e,i,n){var o,s,a;return n?(a=i,t=xo(t=(o=t)===(s=e)?a:o===a?s:o,i,e)):t=xo(t,e,i),t}function xo(t,e,i){return"start"===t?e:"end"===t?i:t}class bo extends wn{parsePrimitiveData(t,e,i,n){return fo(t,e,i,n)}parseArrayData(t,e,i,n){return fo(t,e,i,n)}parseObjectData(t,e,i,n){const{iScale:o,vScale:s}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l="x"===o.axis?a:r,c="x"===s.axis?a:r,h=[];let d,u,f,g;for(d=i,u=i+n;d<u;++d)g=e[d],f={},f[o.axis]=o.parse(lt(g,l),d),h.push(uo(lt(g,c),f,s,d));return h}updateRangeFromParsed(t,e,i,n){super.updateRangeFromParsed(t,e,i,n);const o=i._custom;o&&e===this._cachedMeta.vScale&&(t.min=Math.min(t.min,o.min),t.max=Math.max(t.max,o.max))}getMaxOverflow(){return 0}getLabelAndValue(t){const e=this._cachedMeta,{iScale:i,vScale:n}=e,o=this.getParsed(t),s=o._custom,a=go(s)?"["+s.start+", "+s.end+"]":""+n.getLabelForValue(o[n.axis]);return{label:""+i.getLabelForValue(o[i.axis]),value:a}}initialize(){const t=this;t.enableOptionSharing=!0,super.initialize();t._cachedMeta.stack=t.getDataset().stack}update(t){const e=this._cachedMeta;this.updateElements(e.data,0,e.data.length,t)}updateElements(t,e,i,n){const o=this,s="reset"===n,{index:a,_cachedMeta:{vScale:r}}=o,l=r.getBasePixel(),c=r.isHorizontal(),h=o._getRuler(),d=o.resolveDataElementOptions(e,n),u=o.getSharedOptions(d),f=o.includeOptions(n,u);o.updateSharedOptions(u,n,d);for(let d=e;d<e+i;d++){const e=o.getParsed(d),i=s||$(e[r.axis])?{base:l,head:l}:o._calculateBarValuePixels(d),g=o._calculateBarIndexPixels(d,h),p=(e._stacks||{})[r.axis],m={horizontal:c,base:i.base,enableBorderRadius:!p||go(e._custom)||a===p._top||a===p._bottom,x:c?i.head:g.center,y:c?g.center:i.head,height:c?g.size:Math.abs(i.size),width:c?Math.abs(i.size):g.size};f&&(m.options=u||o.resolveDataElementOptions(d,t[d].active?"active":n)),po(m,m.options||t[d].options,p,a),o.updateElement(t[d],d,m,n)}}_getStacks(t,e){const i=this._cachedMeta.iScale,n=i.getMatchingVisibleMetas(this._type),o=i.options.stacked,s=n.length,a=[];let r,l;for(r=0;r<s;++r)if(l=n[r],l.controller.options.grouped){if(void 0!==e){const t=l.controller.getParsed(e)[l.controller._cachedMeta.vScale.axis];if($(t)||isNaN(t))continue}if((!1===o||-1===a.indexOf(l.stack)||void 0===o&&void 0===l.stack)&&a.push(l.stack),l.index===t)break}return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const n=this._getStacks(t,i),o=void 0!==e?n.indexOf(e):-1;return-1===o?n.length-1:o}_getRuler(){const t=this,e=t.options,i=t._cachedMeta,n=i.iScale,o=[];let s,a;for(s=0,a=i.data.length;s<a;++s)o.push(n.getPixelForValue(t.getParsed(s)[n.axis],s));const r=e.barThickness;return{min:r||ho(i),pixels:o,start:n._startPixel,end:n._endPixel,stackCount:t._getStackCount(),scale:n,grouped:e.grouped,ratio:r?1:e.categoryPercentage*e.barPercentage}}_calculateBarValuePixels(t){const e=this,{_cachedMeta:{vScale:i,_stacked:n},options:{base:o,minBarLength:s}}=e,a=o||0,r=e.getParsed(t),l=r._custom,c=go(l);let h,d,u=r[i.axis],f=0,g=n?e.applyStack(i,r,n):u;g!==u&&(f=g-u,g=u),c&&(u=l.barStart,g=l.barEnd-l.barStart,0!==u&&Dt(u)!==Dt(l.barEnd)&&(f=0),f+=u);const p=$(o)||c?f:o;let m=i.getPixelForValue(p);if(h=e.chart.getDataVisibility(t)?i.getPixelForValue(f+g):m,d=h-m,Math.abs(d)<s&&(d=function(t,e,i){return 0!==t?Dt(t):(e.isHorizontal()?1:-1)*(e.min>=i?1:-1)}(d,i,a)*s,u===a&&(m-=d/2),h=m+d),m===i.getPixelForValue(a)){const t=Dt(d)*i.getLineWidthForValue(a)/2;m+=t,d-=t}return{size:d,base:m,head:h,center:h+d/2}}_calculateBarIndexPixels(t,e){const i=this,n=e.scale,o=i.options,s=o.skipNull,a=K(o.maxBarThickness,1/0);let r,l;if(e.grouped){const n=s?i._getStackCount(t):e.stackCount,c="flex"===o.barThickness?function(t,e,i,n){const o=e.pixels,s=o[t];let a=t>0?o[t-1]:null,r=t<o.length-1?o[t+1]:null;const l=i.categoryPercentage;null===a&&(a=s-(null===r?e.end-e.start:r-s)),null===r&&(r=s+s-a);const c=s-(s-Math.min(a,r))/2*l;return{chunk:Math.abs(r-a)/2*l/n,ratio:i.barPercentage,start:c}}(t,e,o,n):function(t,e,i,n){const o=i.barThickness;let s,a;return $(o)?(s=e.min*i.categoryPercentage,a=i.barPercentage):(s=o*n,a=1),{chunk:s/n,ratio:a,start:e.pixels[t]-s/2}}(t,e,o,n),h=i._getStackIndex(i.index,i._cachedMeta.stack,s?t:void 0);r=c.start+c.chunk*h+c.chunk/2,l=Math.min(a,c.chunk*c.ratio)}else r=n.getPixelForValue(i.getParsed(t)[n.axis],t),l=Math.min(a,e.min*e.ratio);return{base:r-l/2,head:r+l/2,center:r,size:l}}draw(){const t=this,e=t._cachedMeta,i=e.vScale,n=e.data,o=n.length;let s=0;for(;s<o;++s)null!==t.getParsed(s)[i.axis]&&n[s].draw(t._ctx)}}bo.id="bar",bo.defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}},bo.overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};class _o extends wn{initialize(){this.enableOptionSharing=!0,super.initialize()}parseObjectData(t,e,i,n){const{xScale:o,yScale:s}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l=[];let c,h,d;for(c=i,h=i+n;c<h;++c)d=e[c],l.push({x:o.parse(lt(d,a),c),y:s.parse(lt(d,r),c),_custom:d&&d.r&&+d.r});return l}getMaxOverflow(){const{data:t,_parsed:e}=this._cachedMeta;let i=0;for(let n=t.length-1;n>=0;--n)i=Math.max(i,t[n].size()/2,e[n]._custom);return i>0&&i}getLabelAndValue(t){const e=this._cachedMeta,{xScale:i,yScale:n}=e,o=this.getParsed(t),s=i.getLabelForValue(o.x),a=n.getLabelForValue(o.y),r=o._custom;return{label:e.label,value:"("+s+", "+a+(r?", "+r:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,n){const o=this,s="reset"===n,{iScale:a,vScale:r}=o._cachedMeta,l=o.resolveDataElementOptions(e,n),c=o.getSharedOptions(l),h=o.includeOptions(n,c),d=a.axis,u=r.axis;for(let l=e;l<e+i;l++){const e=t[l],i=!s&&o.getParsed(l),c={},f=c[d]=s?a.getPixelForDecimal(.5):a.getPixelForValue(i[d]),g=c[u]=s?r.getBasePixel():r.getPixelForValue(i[u]);c.skip=isNaN(f)||isNaN(g),h&&(c.options=o.resolveDataElementOptions(l,e.active?"active":n),s&&(c.options.radius=0)),o.updateElement(e,l,c,n)}o.updateSharedOptions(c,n,l)}resolveDataElementOptions(t,e){const i=this.getParsed(t);let n=super.resolveDataElementOptions(t,e);n.$shared&&(n=Object.assign({},n,{$shared:!1}));const o=n.radius;return"active"!==e&&(n.radius=0),n.radius+=K(i&&i._custom,o),n}}_o.id="bubble",_o.defaults={datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}},_o.overrides={scales:{x:{type:"linear"},y:{type:"linear"}},plugins:{tooltip:{callbacks:{title:()=>""}}}};class yo extends wn{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,n=this._cachedMeta;if(!1===this._parsing)n._parsed=i;else{let o,s,a=t=>+i[t];if(U(i[t])){const{key:t="value"}=this._parsing;a=e=>+lt(i[e],t)}for(o=t,s=t+e;o<s;++o)n._parsed[o]=a(o)}}_getRotation(){return Et(this.options.rotation-90)}_getCircumference(){return Et(this.options.circumference)}_getRotationExtents(){let t=_t,e=-_t;const i=this;for(let n=0;n<i.chart.data.datasets.length;++n)if(i.chart.isDatasetVisible(n)){const o=i.chart.getDatasetMeta(n).controller,s=o._getRotation(),a=o._getCircumference();t=Math.min(t,s),e=Math.max(e,s+a)}return{rotation:t,circumference:e-t}}update(t){const e=this,i=e.chart,{chartArea:n}=i,o=e._cachedMeta,s=o.data,a=e.getMaxBorderWidth()+e.getMaxOffset(s)+e.options.spacing,r=Math.max((Math.min(n.width,n.height)-a)/2,0),l=Math.min(G(e.options.cutout,r),1),c=e._getRingWeight(e.index),{circumference:h,rotation:d}=e._getRotationExtents(),{ratioX:u,ratioY:f,offsetX:g,offsetY:p}=function(t,e,i){let n=1,o=1,s=0,a=0;if(e<_t){const r=t,l=r+e,c=Math.cos(r),h=Math.sin(r),d=Math.cos(l),u=Math.sin(l),f=(t,e,n)=>Nt(t,r,l,!0)?1:Math.max(e,e*i,n,n*i),g=(t,e,n)=>Nt(t,r,l,!0)?-1:Math.min(e,e*i,n,n*i),p=f(0,c,d),m=f(Mt,h,u),x=g(bt,c,d),b=g(bt+Mt,h,u);n=(p-x)/2,o=(m-b)/2,s=-(p+x)/2,a=-(m+b)/2}return{ratioX:n,ratioY:o,offsetX:s,offsetY:a}}(d,h,l),m=(n.width-a)/u,x=(n.height-a)/f,b=Math.max(Math.min(m,x)/2,0),_=Z(e.options.radius,b),y=(_-Math.max(_*l,0))/e._getVisibleDatasetWeightTotal();e.offsetX=g*_,e.offsetY=p*_,o.total=e.calculateTotal(),e.outerRadius=_-y*e._getRingWeightOffset(e.index),e.innerRadius=Math.max(e.outerRadius-y*c,0),e.updateElements(s,0,s.length,t)}_circumference(t,e){const i=this,n=i.options,o=i._cachedMeta,s=i._getCircumference();return e&&n.animation.animateRotate||!this.chart.getDataVisibility(t)||null===o._parsed[t]||o.data[t].hidden?0:i.calculateCircumference(o._parsed[t]*s/_t)}updateElements(t,e,i,n){const o=this,s="reset"===n,a=o.chart,r=a.chartArea,l=a.options.animation,c=(r.left+r.right)/2,h=(r.top+r.bottom)/2,d=s&&l.animateScale,u=d?0:o.innerRadius,f=d?0:o.outerRadius,g=o.resolveDataElementOptions(e,n),p=o.getSharedOptions(g),m=o.includeOptions(n,p);let x,b=o._getRotation();for(x=0;x<e;++x)b+=o._circumference(x,s);for(x=e;x<e+i;++x){const e=o._circumference(x,s),i=t[x],a={x:c+o.offsetX,y:h+o.offsetY,startAngle:b,endAngle:b+e,circumference:e,outerRadius:f,innerRadius:u};m&&(a.options=p||o.resolveDataElementOptions(x,i.active?"active":n)),b+=e,o.updateElement(i,x,a,n)}o.updateSharedOptions(p,n,g)}calculateTotal(){const t=this._cachedMeta,e=t.data;let i,n=0;for(i=0;i<e.length;i++){const o=t._parsed[i];null===o||isNaN(o)||!this.chart.getDataVisibility(i)||e[i].hidden||(n+=Math.abs(o))}return n}calculateCircumference(t){const e=this._cachedMeta.total;return e>0&&!isNaN(t)?_t*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,n=i.data.labels||[],o=Oi(e._parsed[t],i.options.locale);return{label:n[t]||"",value:o}}getMaxBorderWidth(t){const e=this;let i=0;const n=e.chart;let o,s,a,r,l;if(!t)for(o=0,s=n.data.datasets.length;o<s;++o)if(n.isDatasetVisible(o)){a=n.getDatasetMeta(o),t=a.data,r=a.controller,r!==e&&r.configure();break}if(!t)return 0;for(o=0,s=t.length;o<s;++o)l=r.resolveDataElementOptions(o),"inner"!==l.borderAlign&&(i=Math.max(i,l.borderWidth||0,l.hoverBorderWidth||0));return i}getMaxOffset(t){let e=0;for(let i=0,n=t.length;i<n;++i){const t=this.resolveDataElementOptions(i);e=Math.max(e,t.offset||0,t.hoverOffset||0)}return e}_getRingWeightOffset(t){let e=0;for(let i=0;i<t;++i)this.chart.isDatasetVisible(i)&&(e+=this._getRingWeight(i));return e}_getRingWeight(t){return Math.max(K(this.chart.data.datasets[t].weight,1),0)}_getVisibleDatasetWeightTotal(){return this._getRingWeightOffset(this.chart.data.datasets.length)||1}}yo.id="doughnut",yo.defaults={datasetElementType:!1,dataElementType:"arc",animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:"number",properties:["circumference","endAngle","innerRadius","outerRadius","startAngle","x","y","offset","borderWidth","spacing"]}},cutout:"50%",rotation:0,circumference:360,radius:"100%",spacing:0,indexAxis:"r"},yo.descriptors={_scriptable:t=>"spacing"!==t,_indexable:t=>"spacing"!==t},yo.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label(t){let e=t.label;const i=": "+t.formattedValue;return Y(e)?(e=e.slice(),e[0]+=i):e+=i,e}}}}};class vo extends wn{initialize(){this.enableOptionSharing=!0,super.initialize()}update(t){const e=this,i=e._cachedMeta,{dataset:n,data:o=[],_dataset:s}=i,a=e.chart._animationsDisabled;let{start:r,count:l}=function(t,e,i){const n=e.length;let o=0,s=n;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:c,max:h,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(o=Ht(Math.min(se(r,a.axis,c).lo,i?n:se(e,l,a.getPixelForValue(c)).lo),0,n-1)),s=u?Ht(Math.max(se(r,a.axis,h).hi+1,i?0:se(e,l,a.getPixelForValue(h)).hi+1),o,n)-o:n-o}return{start:o,count:s}}(i,o,a);e._drawStart=r,e._drawCount=l,function(t){const{xScale:e,yScale:i,_scaleRanges:n}=t,o={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!n)return t._scaleRanges=o,!0;const s=n.xmin!==e.min||n.xmax!==e.max||n.ymin!==i.min||n.ymax!==i.max;return Object.assign(n,o),s}(i)&&(r=0,l=o.length),n._datasetIndex=e.index,n._decimated=!!s._decimated,n.points=o;const c=e.resolveDatasetElementOptions(t);e.options.showLine||(c.borderWidth=0),c.segment=e.options.segment,e.updateElement(n,void 0,{animated:!a,options:c},t),e.updateElements(o,r,l,t)}updateElements(t,e,i,n){const o=this,s="reset"===n,{iScale:a,vScale:r,_stacked:l}=o._cachedMeta,c=o.resolveDataElementOptions(e,n),h=o.getSharedOptions(c),d=o.includeOptions(n,h),u=a.axis,f=r.axis,g=o.options.spanGaps,p=Tt(g)?g:Number.POSITIVE_INFINITY,m=o.chart._animationsDisabled||s||"none"===n;let x=e>0&&o.getParsed(e-1);for(let c=e;c<e+i;++c){const e=t[c],i=o.getParsed(c),g=m?e:{},b=$(i[f]),_=g[u]=a.getPixelForValue(i[u],c),y=g[f]=s||b?r.getBasePixel():r.getPixelForValue(l?o.applyStack(r,i,l):i[f],c);g.skip=isNaN(_)||isNaN(y)||b,g.stop=c>0&&i[u]-x[u]>p,g.parsed=i,d&&(g.options=h||o.resolveDataElementOptions(c,e.active?"active":n)),m||o.updateElement(e,c,g,n),x=i}o.updateSharedOptions(h,n,c)}getMaxOverflow(){const t=this,e=t._cachedMeta,i=e.dataset,n=i.options&&i.options.borderWidth||0,o=e.data||[];if(!o.length)return n;const s=o[0].size(t.resolveDataElementOptions(0)),a=o[o.length-1].size(t.resolveDataElementOptions(o.length-1));return Math.max(n,s,a)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}vo.id="line",vo.defaults={datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1},vo.overrides={scales:{_index_:{type:"category"},_value_:{type:"linear"}}};class wo extends wn{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,n=i.data.labels||[],o=Oi(e._parsed[t].r,i.options.locale);return{label:n[t]||"",value:o}}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}_updateRadius(){const t=this,e=t.chart,i=e.chartArea,n=e.options,o=Math.min(i.right-i.left,i.bottom-i.top),s=Math.max(o/2,0),a=(s-Math.max(n.cutoutPercentage?s/100*n.cutoutPercentage:1,0))/e.getVisibleDatasetCount();t.outerRadius=s-a*t.index,t.innerRadius=t.outerRadius-a}updateElements(t,e,i,n){const o=this,s="reset"===n,a=o.chart,r=o.getDataset(),l=a.options.animation,c=o._cachedMeta.rScale,h=c.xCenter,d=c.yCenter,u=c.getIndexAngle(0)-.5*bt;let f,g=u;const p=360/o.countVisibleElements();for(f=0;f<e;++f)g+=o._computeAngle(f,n,p);for(f=e;f<e+i;f++){const e=t[f];let i=g,m=g+o._computeAngle(f,n,p),x=a.getDataVisibility(f)?c.getDistanceFromCenterForValue(r.data[f]):0;g=m,s&&(l.animateScale&&(x=0),l.animateRotate&&(i=m=u));const b={x:h,y:d,innerRadius:0,outerRadius:x,startAngle:i,endAngle:m,options:o.resolveDataElementOptions(f,e.active?"active":n)};o.updateElement(e,f,b,n)}}countVisibleElements(){const t=this.getDataset(),e=this._cachedMeta;let i=0;return e.data.forEach(((e,n)=>{!isNaN(t.data[n])&&this.chart.getDataVisibility(n)&&i++})),i}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?Et(this.resolveDataElementOptions(t,e).angle||i):0}}wo.id="polarArea",wo.defaults={dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0},wo.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label:t=>t.chart.data.labels[t.dataIndex]+": "+t.formattedValue}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};class Mo extends yo{}Mo.id="pie",Mo.defaults={cutout:0,rotation:0,circumference:360,radius:"100%"};class ko extends wn{getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}update(t){const e=this,i=e._cachedMeta,n=i.dataset,o=i.data||[],s=i.iScale.getLabels();if(n.points=o,"resize"!==t){const i=e.resolveDatasetElementOptions(t);e.options.showLine||(i.borderWidth=0);const a={_loop:!0,_fullLoop:s.length===o.length,options:i};e.updateElement(n,void 0,a,t)}e.updateElements(o,0,o.length,t)}updateElements(t,e,i,n){const o=this,s=o.getDataset(),a=o._cachedMeta.rScale,r="reset"===n;for(let l=e;l<e+i;l++){const e=t[l],i=o.resolveDataElementOptions(l,e.active?"active":n),c=a.getPointPositionForValue(l,s.data[l]),h=r?a.xCenter:c.x,d=r?a.yCenter:c.y,u={x:h,y:d,angle:c.angle,skip:isNaN(h)||isNaN(d),options:i};o.updateElement(e,l,u,n)}}}ko.id="radar",ko.defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}},ko.overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};class So extends vo{}So.id="scatter",So.defaults={showLine:!1,fill:!1},So.overrides={interaction:{mode:"point"},plugins:{tooltip:{callbacks:{title:()=>"",label:t=>"("+t.label+", "+t.formattedValue+")"}}},scales:{x:{type:"linear"},y:{type:"linear"}}};var Po=Object.freeze({__proto__:null,BarController:bo,BubbleController:_o,DoughnutController:yo,LineController:vo,PolarAreaController:wo,PieController:Mo,RadarController:ko,ScatterController:So});function Do(t,e,i){const{startAngle:n,pixelMargin:o,x:s,y:a,outerRadius:r,innerRadius:l}=e;let c=o/r;t.beginPath(),t.arc(s,a,r,n-c,i+c),l>o?(c=o/l,t.arc(s,a,l,i+c,n-c,!0)):t.arc(s,a,o,i+Mt,n-Mt),t.closePath(),t.clip()}function Co(t,e,i,n){const o=Ie(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const s=(i-e)/2,a=Math.min(s,n*e/2),r=t=>{const e=(i-Math.min(s,t))*n/2;return Ht(t,0,Math.min(s,e))};return{outerStart:r(o.outerStart),outerEnd:r(o.outerEnd),innerStart:Ht(o.innerStart,0,a),innerEnd:Ht(o.innerEnd,0,a)}}function Oo(t,e,i,n){return{x:i+t*Math.cos(e),y:n+t*Math.sin(e)}}function To(t,e,i,n,o){const{x:s,y:a,startAngle:r,pixelMargin:l,innerRadius:c}=e,h=Math.max(e.outerRadius+n+i-l,0),d=c>0?c+n+i+l:0;let u=0;const f=o-r;if(n){const t=((c>0?c-n:0)+(h>0?h-n:0))/2;u=(f-(0!==t?f*t/(t+n):f))/2}const g=(f-Math.max(.001,f*h-i/bt)/h)/2,p=r+g+u,m=o-g-u,{outerStart:x,outerEnd:b,innerStart:_,innerEnd:y}=Co(e,d,h,m-p),v=h-x,w=h-b,M=p+x/v,k=m-b/w,S=d+_,P=d+y,D=p+_/S,C=m-y/P;if(t.beginPath(),t.arc(s,a,h,M,k),b>0){const e=Oo(w,k,s,a);t.arc(e.x,e.y,b,k,m+Mt)}const O=Oo(P,m,s,a);if(t.lineTo(O.x,O.y),y>0){const e=Oo(P,C,s,a);t.arc(e.x,e.y,y,m+Mt,C+Math.PI)}if(t.arc(s,a,d,m-y/d,p+_/d,!0),_>0){const e=Oo(S,D,s,a);t.arc(e.x,e.y,_,D+Math.PI,p-Mt)}const T=Oo(v,p,s,a);if(t.lineTo(T.x,T.y),x>0){const e=Oo(v,M,s,a);t.arc(e.x,e.y,x,p-Mt,M)}t.closePath()}function Ao(t,e,i,n,o){const{options:s}=e,a="inner"===s.borderAlign;s.borderWidth&&(a?(t.lineWidth=2*s.borderWidth,t.lineJoin="round"):(t.lineWidth=s.borderWidth,t.lineJoin="bevel"),e.fullCircles&&function(t,e,i){const{x:n,y:o,startAngle:s,pixelMargin:a,fullCircles:r}=e,l=Math.max(e.outerRadius-a,0),c=e.innerRadius+a;let h;for(i&&Do(t,e,s+_t),t.beginPath(),t.arc(n,o,c,s+_t,s,!0),h=0;h<r;++h)t.stroke();for(t.beginPath(),t.arc(n,o,l,s,s+_t),h=0;h<r;++h)t.stroke()}(t,e,a),a&&Do(t,e,o),To(t,e,i,n,o),t.stroke())}class Lo extends Mn{constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const n=this.getProps(["x","y"],i),{angle:o,distance:s}=Ft(n,{x:t,y:e}),{startAngle:a,endAngle:r,innerRadius:l,outerRadius:c,circumference:h}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),d=this.options.spacing/2;return(h>=_t||Nt(o,a,r))&&(s>=l+d&&s<=c+d)}getCenterPoint(t){const{x:e,y:i,startAngle:n,endAngle:o,innerRadius:s,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius","circumference"],t),{offset:r,spacing:l}=this.options,c=(n+o)/2,h=(s+a+l+r)/2;return{x:e+Math.cos(c)*h,y:i+Math.sin(c)*h}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const e=this,{options:i,circumference:n}=e,o=(i.offset||0)/2,s=(i.spacing||0)/2;if(e.pixelMargin="inner"===i.borderAlign?.33:0,e.fullCircles=n>_t?Math.floor(n/_t):0,0===n||e.innerRadius<0||e.outerRadius<0)return;t.save();let a=0;if(o){a=o/2;const i=(e.startAngle+e.endAngle)/2;t.translate(Math.cos(i)*a,Math.sin(i)*a),e.circumference>=bt&&(a=o)}t.fillStyle=i.backgroundColor,t.strokeStyle=i.borderColor;const r=function(t,e,i,n){const{fullCircles:o,startAngle:s,circumference:a}=e;let r=e.endAngle;if(o){To(t,e,i,n,s+_t);for(let e=0;e<o;++e)t.fill();isNaN(a)||(r=s+a%_t,a%_t==0&&(r+=_t))}return To(t,e,i,n,r),t.fill(),r}(t,e,a,s);Ao(t,e,a,s,r),t.restore()}}function Ro(t,e,i=e){t.lineCap=K(i.borderCapStyle,e.borderCapStyle),t.setLineDash(K(i.borderDash,e.borderDash)),t.lineDashOffset=K(i.borderDashOffset,e.borderDashOffset),t.lineJoin=K(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=K(i.borderWidth,e.borderWidth),t.strokeStyle=K(i.borderColor,e.borderColor)}function Eo(t,e,i){t.lineTo(i.x,i.y)}function Io(t,e,i={}){const n=t.length,{start:o=0,end:s=n-1}=i,{start:a,end:r}=e,l=Math.max(o,a),c=Math.min(s,r),h=o<a&&s<a||o>r&&s>r;return{count:n,start:l,loop:e.loop,ilen:c<l&&!h?n+c-l:c-l}}function zo(t,e,i,n){const{points:o,options:s}=e,{count:a,start:r,loop:l,ilen:c}=Io(o,i,n),h=function(t){return t.stepped?Jt:t.tension||"monotone"===t.cubicInterpolationMode?te:Eo}(s);let d,u,f,{move:g=!0,reverse:p}=n||{};for(d=0;d<=c;++d)u=o[(r+(p?c-d:d))%a],u.skip||(g?(t.moveTo(u.x,u.y),g=!1):h(t,f,u,p,s.stepped),f=u);return l&&(u=o[(r+(p?c:0))%a],h(t,f,u,p,s.stepped)),!!l}function Fo(t,e,i,n){const o=e.points,{count:s,start:a,ilen:r}=Io(o,i,n),{move:l=!0,reverse:c}=n||{};let h,d,u,f,g,p,m=0,x=0;const b=t=>(a+(c?r-t:t))%s,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=o[b(0)],t.moveTo(d.x,d.y)),h=0;h<=r;++h){if(d=o[b(h)],d.skip)continue;const e=d.x,i=d.y,n=0|e;n===u?(i<f?f=i:i>g&&(g=i),m=(x*m+e)/++x):(_(),t.lineTo(e,i),u=n,x=0,f=g=i),p=i}_()}function Bo(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?Fo:zo}Lo.id="arc",Lo.defaults={borderAlign:"center",borderColor:"#fff",borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0},Lo.defaultRoutes={backgroundColor:"backgroundColor"};const Vo="function"==typeof Path2D;function Wo(t,e,i,n){Vo&&1===e.segments.length?function(t,e,i,n){let o=e._path;o||(o=e._path=new Path2D,e.path(o,i,n)&&o.closePath()),Ro(t,e.options),t.stroke(o)}(t,e,i,n):function(t,e,i,n){const{segments:o,options:s}=e,a=Bo(e);for(const r of o)Ro(t,s,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+n-1})&&t.closePath(),t.stroke()}(t,e,i,n)}class No extends Mn{constructor(t){super(),this.animated=!0,this.options=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this,n=i.options;if((n.tension||"monotone"===n.cubicInterpolationMode)&&!n.stepped&&!i._pointsUpdated){const o=n.spanGaps?i._loop:i._fullLoop;yi(i._points,n,t,o,e),i._pointsUpdated=!0}}set points(t){const e=this;e._points=t,delete e._segments,delete e._path,e._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Fi(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this,n=i.options,o=t[e],s=i.points,a=zi(i,{property:e,start:o,end:o});if(!a.length)return;const r=[],l=function(t){return t.stepped?Pi:t.tension||"monotone"===t.cubicInterpolationMode?Di:Si}(n);let c,h;for(c=0,h=a.length;c<h;++c){const{start:i,end:h}=a[c],d=s[i],u=s[h];if(d===u){r.push(d);continue}const f=l(d,u,Math.abs((o-d[e])/(u[e]-d[e])),n.stepped);f[e]=t[e],r.push(f)}return 1===r.length?r[0]:r}pathSegment(t,e,i){return Bo(this)(t,this,e,i)}path(t,e,i){const n=this,o=n.segments,s=Bo(n);let a=n._loop;e=e||0,i=i||n.points.length-e;for(const r of o)a&=s(t,n,r,{start:e,end:e+i-1});return!!a}draw(t,e,i,n){const o=this,s=o.options||{};(o.points||[]).length&&s.borderWidth&&(t.save(),Wo(t,o,i,n),t.restore()),o.animated&&(o._pointsUpdated=!1,o._path=void 0)}}function Ho(t,e,i,n){const o=t.options,{[i]:s}=t.getProps([i],n);return Math.abs(e-s)<o.radius+o.hitRadius}No.id="line",No.defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0},No.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"},No.descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t&&"fill"!==t};class jo extends Mn{constructor(t){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const n=this.options,{x:o,y:s}=this.getProps(["x","y"],i);return Math.pow(t-o,2)+Math.pow(e-s,2)<Math.pow(n.hitRadius+n.radius,2)}inXRange(t,e){return Ho(this,t,"x",e)}inYRange(t,e){return Ho(this,t,"y",e)}getCenterPoint(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}size(t){let e=(t=t||this.options||{}).radius||0;e=Math.max(e,e&&t.hoverRadius||0);return 2*(e+(e&&t.borderWidth||0))}draw(t,e){const i=this,n=i.options;i.skip||n.radius<.1||!Gt(i,e,i.size(n)/2)||(t.strokeStyle=n.borderColor,t.lineWidth=n.borderWidth,t.fillStyle=n.backgroundColor,Kt(t,n,i.x,i.y))}getRange(){const t=this.options||{};return t.radius+t.hitRadius}}function $o(t,e){const{x:i,y:n,base:o,width:s,height:a}=t.getProps(["x","y","base","width","height"],e);let r,l,c,h,d;return t.horizontal?(d=a/2,r=Math.min(i,o),l=Math.max(i,o),c=n-d,h=n+d):(d=s/2,r=i-d,l=i+d,c=Math.min(n,o),h=Math.max(n,o)),{left:r,top:c,right:l,bottom:h}}function Yo(t,e,i,n){return t?0:Ht(e,i,n)}function Uo(t){const e=$o(t),i=e.right-e.left,n=e.bottom-e.top,o=function(t,e,i){const n=t.options.borderWidth,o=t.borderSkipped,s=ze(n);return{t:Yo(o.top,s.top,0,i),r:Yo(o.right,s.right,0,e),b:Yo(o.bottom,s.bottom,0,i),l:Yo(o.left,s.left,0,e)}}(t,i/2,n/2),s=function(t,e,i){const{enableBorderRadius:n}=t.getProps(["enableBorderRadius"]),o=t.options.borderRadius,s=Fe(o),a=Math.min(e,i),r=t.borderSkipped,l=n||U(o);return{topLeft:Yo(!l||r.top||r.left,s.topLeft,0,a),topRight:Yo(!l||r.top||r.right,s.topRight,0,a),bottomLeft:Yo(!l||r.bottom||r.left,s.bottomLeft,0,a),bottomRight:Yo(!l||r.bottom||r.right,s.bottomRight,0,a)}}(t,i/2,n/2);return{outer:{x:e.left,y:e.top,w:i,h:n,radius:s},inner:{x:e.left+o.l,y:e.top+o.t,w:i-o.l-o.r,h:n-o.t-o.b,radius:{topLeft:Math.max(0,s.topLeft-Math.max(o.t,o.l)),topRight:Math.max(0,s.topRight-Math.max(o.t,o.r)),bottomLeft:Math.max(0,s.bottomLeft-Math.max(o.b,o.l)),bottomRight:Math.max(0,s.bottomRight-Math.max(o.b,o.r))}}}}function Xo(t,e,i,n){const o=null===e,s=null===i,a=t&&!(o&&s)&&$o(t,n);return a&&(o||e>=a.left&&e<=a.right)&&(s||i>=a.top&&i<=a.bottom)}function qo(t,e){t.rect(e.x,e.y,e.w,e.h)}function Ko(t,e,i={}){const n=t.x!==i.x?-e:0,o=t.y!==i.y?-e:0,s=(t.x+t.w!==i.x+i.w?e:0)-n,a=(t.y+t.h!==i.y+i.h?e:0)-o;return{x:t.x+n,y:t.y+o,w:t.w+s,h:t.h+a,radius:t.radius}}jo.id="point",jo.defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:"circle",radius:3,rotation:0},jo.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};class Go extends Mn{constructor(t){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,t&&Object.assign(this,t)}draw(t){const e=this.options,{inner:i,outer:n}=Uo(this),o=(s=n.radius).topLeft||s.topRight||s.bottomLeft||s.bottomRight?ne:qo;var s;const a=.33;t.save(),n.w===i.w&&n.h===i.h||(t.beginPath(),o(t,Ko(n,a,i)),t.clip(),o(t,Ko(i,-.33,n)),t.fillStyle=e.borderColor,t.fill("evenodd")),t.beginPath(),o(t,Ko(i,a,n)),t.fillStyle=e.backgroundColor,t.fill(),t.restore()}inRange(t,e,i){return Xo(this,t,e,i)}inXRange(t,e){return Xo(this,t,null,e)}inYRange(t,e){return Xo(this,null,t,e)}getCenterPoint(t){const{x:e,y:i,base:n,horizontal:o}=this.getProps(["x","y","base","horizontal"],t);return{x:o?(e+n)/2:e,y:o?i:(i+n)/2}}getRange(t){return"x"===t?this.width/2:this.height/2}}Go.id="bar",Go.defaults={borderSkipped:"start",borderWidth:0,borderRadius:0,enableBorderRadius:!0,pointStyle:void 0},Go.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};var Zo=Object.freeze({__proto__:null,ArcElement:Lo,LineElement:No,PointElement:jo,BarElement:Go});function Qo(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{value:e})}}function Jo(t){t.data.datasets.forEach((t=>{Qo(t)}))}var ts={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Jo(t);const n=t.width;t.data.datasets.forEach(((e,o)=>{const{_data:s,indexAxis:a}=e,r=t.getDatasetMeta(o),l=s||e.data;if("y"===We([a,t.options.indexAxis]))return;if("line"!==r.type)return;const c=t.scales[r.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(t.options.parsing)return;let{start:h,count:d}=function(t,e){const i=e.length;let n,o=0;const{iScale:s}=t,{min:a,max:r,minDefined:l,maxDefined:c}=s.getUserBounds();return l&&(o=Ht(se(e,s.axis,a).lo,0,i-1)),n=c?Ht(se(e,s.axis,r).hi+1,o,i)-o:i-o,{start:o,count:n}}(r,l);if(d<=(i.threshold||4*n))return void Qo(e);let u;switch($(s)&&(e._data=l,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":u=function(t,e,i,n,o){const s=o.samples||n;if(s>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(s-2);let l=0;const c=e+i-1;let h,d,u,f,g,p=e;for(a[l++]=t[p],h=0;h<s-2;h++){let n,o=0,s=0;const c=Math.floor((h+1)*r)+1+e,m=Math.min(Math.floor((h+2)*r)+1,i)+e,x=m-c;for(n=c;n<m;n++)o+=t[n].x,s+=t[n].y;o/=x,s/=x;const b=Math.floor(h*r)+1+e,_=Math.min(Math.floor((h+1)*r)+1,i)+e,{x:y,y:v}=t[p];for(u=f=-1,n=b;n<_;n++)f=.5*Math.abs((y-o)*(t[n].y-v)-(y-t[n].x)*(s-v)),f>u&&(u=f,d=t[n],g=n);a[l++]=d,p=g}return a[l++]=t[c],a}(l,h,d,n,i);break;case"min-max":u=function(t,e,i,n){let o,s,a,r,l,c,h,d,u,f,g=0,p=0;const m=[],x=e+i-1,b=t[e].x,_=t[x].x-b;for(o=e;o<e+i;++o){s=t[o],a=(s.x-b)/_*n,r=s.y;const e=0|a;if(e===l)r<u?(u=r,c=o):r>f&&(f=r,h=o),g=(p*g+s.x)/++p;else{const i=o-1;if(!$(c)&&!$(h)){const e=Math.min(c,h),n=Math.max(c,h);e!==d&&e!==i&&m.push({...t[e],x:g}),n!==d&&n!==i&&m.push({...t[n],x:g})}o>0&&i!==d&&m.push(t[i]),m.push(s),l=e,p=0,u=f=r,c=h=d=o}}return m}(l,h,d,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=u}))},destroy(t){Jo(t)}};function es(t,e,i){const n=function(t){const e=t.options,i=e.fill;let n=K(i&&i.target,i);return void 0===n&&(n=!!e.backgroundColor),!1!==n&&null!==n&&(!0===n?"origin":n)}(t);if(U(n))return!isNaN(n.value)&&n;let o=parseFloat(n);return X(o)&&Math.floor(o)===o?("-"!==n[0]&&"+"!==n[0]||(o=e+o),!(o===e||o<0||o>=i)&&o):["origin","start","end","stack","shape"].indexOf(n)>=0&&n}class is{constructor(t){this.x=t.x,this.y=t.y,this.radius=t.radius}pathSegment(t,e,i){const{x:n,y:o,radius:s}=this;return e=e||{start:0,end:_t},t.arc(n,o,s,e.end,e.start,!0),!i.bounds}interpolate(t){const{x:e,y:i,radius:n}=this,o=t.angle;return{x:e+Math.cos(o)*n,y:i+Math.sin(o)*n,angle:o}}}function ns(t){return(t.scale||{}).getPointPositionForValue?function(t){const{scale:e,fill:i}=t,n=e.options,o=e.getLabels().length,s=[],a=n.reverse?e.max:e.min,r=n.reverse?e.min:e.max;let l,c,h;if(h="start"===i?a:"end"===i?r:U(i)?i.value:e.getBaseValue(),n.grid.circular)return c=e.getPointPositionForValue(0,a),new is({x:c.x,y:c.y,radius:e.getDistanceFromCenterForValue(h)});for(l=0;l<o;++l)s.push(e.getPointPositionForValue(l,h));return s}(t):function(t){const{scale:e={},fill:i}=t;let n,o=null;return"start"===i?o=e.bottom:"end"===i?o=e.top:U(i)?o=e.getPixelForValue(i.value):e.getBasePixel&&(o=e.getBasePixel()),X(o)?(n=e.isHorizontal(),{x:n?o:null,y:n?null:o}):null}(t)}function os(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function ss(t){const{chart:e,scale:i,index:n,line:o}=t,s=[],a=o.segments,r=o.points,l=function(t,e){const i=[],n=t.getSortedVisibleDatasetMetas();for(let t=0;t<n.length;t++){const o=n[t];if(o.index===e)break;as(o)&&i.unshift(o.dataset)}return i}(e,n);l.push(cs({x:null,y:i.bottom},o));for(let t=0;t<a.length;t++){const e=a[t];for(let t=e.start;t<=e.end;t++)rs(s,r[t],l)}return new No({points:s,options:{}})}const as=t=>"line"===t.type&&!t.hidden;function rs(t,e,i){const n=[];for(let o=0;o<i.length;o++){const s=i[o],{first:a,last:r,point:l}=ls(s,e,"x");if(!(!l||a&&r))if(a)n.unshift(l);else if(t.push(l),!r)break}t.push(...n)}function ls(t,e,i){const n=t.interpolate(e,i);if(!n)return{};const o=n[i],s=t.segments,a=t.points;let r=!1,l=!1;for(let t=0;t<s.length;t++){const e=s[t],n=a[e.start][i],c=a[e.end][i];if(o>=n&&o<=c){r=o===n,l=o===c;break}}return{first:r,last:l,point:n}}function cs(t,e){let i=[],n=!1;return Y(t)?(n=!0,i=t):i=function(t,e){const{x:i=null,y:n=null}=t||{},o=e.points,s=[];return e.segments.forEach((({start:t,end:e})=>{e=os(t,e,o);const a=o[t],r=o[e];null!==n?(s.push({x:a.x,y:n}),s.push({x:r.x,y:n})):null!==i&&(s.push({x:i,y:a.y}),s.push({x:i,y:r.y}))})),s}(t,e),i.length?new No({points:i,options:{tension:0},_loop:n,_fullLoop:n}):null}function hs(t,e,i){let n=t[e].fill;const o=[e];let s;if(!i)return n;for(;!1!==n&&-1===o.indexOf(n);){if(!X(n))return n;if(s=t[n],!s)return!1;if(s.visible)return n;o.push(n),n=s.fill}return!1}function ds(t,e,i){t.beginPath(),e.path(t),t.lineTo(e.last().x,i),t.lineTo(e.first().x,i),t.closePath(),t.clip()}function us(t,e,i,n){if(n)return;let o=e[t],s=i[t];return"angle"===t&&(o=Wt(o),s=Wt(s)),{property:t,start:o,end:s}}function fs(t,e,i,n){return t&&e?n(t[i],e[i]):t?t[i]:e?e[i]:0}function gs(t,e,i){const{top:n,bottom:o}=e.chart.chartArea,{property:s,start:a,end:r}=i||{};"x"===s&&(t.beginPath(),t.rect(a,n,r-a,o-n),t.clip())}function ps(t,e,i,n){const o=e.interpolate(i,n);o&&t.lineTo(o.x,o.y)}function ms(t,e){const{line:i,target:n,property:o,color:s,scale:a}=e,r=function(t,e,i){const n=t.segments,o=t.points,s=e.points,a=[];for(const t of n){let{start:n,end:r}=t;r=os(n,r,o);const l=us(i,o[n],o[r],t.loop);if(!e.segments){a.push({source:t,target:l,start:o[n],end:o[r]});continue}const c=zi(e,l);for(const e of c){const n=us(i,s[e.start],s[e.end],e.loop),r=Ii(t,o,n);for(const t of r)a.push({source:t,target:e,start:{[i]:fs(l,n,"start",Math.max)},end:{[i]:fs(l,n,"end",Math.min)}})}}return a}(i,n,o);for(const{source:e,target:l,start:c,end:h}of r){const{style:{backgroundColor:r=s}={}}=e,d=!0!==n;t.save(),t.fillStyle=r,gs(t,a,d&&us(o,c,h)),t.beginPath();const u=!!i.pathSegment(t,e);let f;if(d){u?t.closePath():ps(t,n,h,o);const e=!!n.pathSegment(t,l,{move:u,reverse:!0});f=u&&e,f||ps(t,n,c,o)}t.closePath(),t.fill(f?"evenodd":"nonzero"),t.restore()}}function xs(t,e,i){const n=function(t){const{chart:e,fill:i,line:n}=t;if(X(i))return function(t,e){const i=t.getDatasetMeta(e);return i&&t.isDatasetVisible(e)?i.dataset:null}(e,i);if("stack"===i)return ss(t);if("shape"===i)return!0;const o=ns(t);return o instanceof is?o:cs(o,n)}(e),{line:o,scale:s,axis:a}=e,r=o.options,l=r.fill,c=r.backgroundColor,{above:h=c,below:d=c}=l||{};n&&o.points.length&&(Zt(t,i),function(t,e){const{line:i,target:n,above:o,below:s,area:a,scale:r}=e,l=i._loop?"angle":e.axis;t.save(),"x"===l&&s!==o&&(ds(t,n,a.top),ms(t,{line:i,target:n,color:o,scale:r,property:l}),t.restore(),t.save(),ds(t,n,a.bottom)),ms(t,{line:i,target:n,color:s,scale:r,property:l}),t.restore()}(t,{line:o,target:n,above:h,below:d,area:i,scale:s,axis:a}),Qt(t))}var bs={id:"filler",afterDatasetsUpdate(t,e,i){const n=(t.data.datasets||[]).length,o=[];let s,a,r,l;for(a=0;a<n;++a)s=t.getDatasetMeta(a),r=s.dataset,l=null,r&&r.options&&r instanceof No&&(l={visible:t.isDatasetVisible(a),index:a,fill:es(r,a,n),chart:t,axis:s.controller.options.indexAxis,scale:s.vScale,line:r}),s.$filler=l,o.push(l);for(a=0;a<n;++a)l=o[a],l&&!1!==l.fill&&(l.fill=hs(o,a,i.propagate))},beforeDraw(t,e,i){const n="beforeDraw"===i.drawTime,o=t.getSortedVisibleDatasetMetas(),s=t.chartArea;for(let e=o.length-1;e>=0;--e){const i=o[e].$filler;i&&(i.line.updateControlPoints(s,i.axis),n&&xs(t.ctx,i,s))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const n=t.getSortedVisibleDatasetMetas();for(let e=n.length-1;e>=0;--e){const i=n[e].$filler;i&&xs(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const n=e.meta.$filler;n&&!1!==n.fill&&"beforeDatasetDraw"===i.drawTime&&xs(t.ctx,n,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const _s=(t,e)=>{let{boxHeight:i=e,boxWidth:n=e}=t;return t.usePointStyle&&(i=Math.min(i,e),n=Math.min(n,e)),{boxWidth:n,boxHeight:i,itemHeight:Math.max(e,i)}};class ys extends Mn{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){const n=this;n.maxWidth=t,n.maxHeight=e,n._margins=i,n.setDimensions(),n.buildLabels(),n.fit()}setDimensions(){const t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=t._margins.left,t.right=t.width):(t.height=t.maxHeight,t.top=t._margins.top,t.bottom=t.height)}buildLabels(){const t=this,e=t.options.labels||{};let i=Q(e.generateLabels,[t.chart],t)||[];e.filter&&(i=i.filter((i=>e.filter(i,t.chart.data)))),e.sort&&(i=i.sort(((i,n)=>e.sort(i,n,t.chart.data)))),t.options.reverse&&i.reverse(),t.legendItems=i}fit(){const t=this,{options:e,ctx:i}=t;if(!e.display)return void(t.width=t.height=0);const n=e.labels,o=Ve(n.font),s=o.size,a=t._computeTitleHeight(),{boxWidth:r,itemHeight:l}=_s(n,s);let c,h;i.font=o.string,t.isHorizontal()?(c=t.maxWidth,h=t._fitRows(a,s,r,l)+10):(h=t.maxHeight,c=t._fitCols(a,s,r,l)+10),t.width=Math.min(c,e.maxWidth||t.maxWidth),t.height=Math.min(h,e.maxHeight||t.maxHeight)}_fitRows(t,e,i,n){const o=this,{ctx:s,maxWidth:a,options:{labels:{padding:r}}}=o,l=o.legendHitBoxes=[],c=o.lineWidths=[0],h=n+r;let d=t;s.textAlign="left",s.textBaseline="middle";let u=-1,f=-h;return o.legendItems.forEach(((t,o)=>{const g=i+e/2+s.measureText(t.text).width;(0===o||c[c.length-1]+g+2*r>a)&&(d+=h,c[c.length-(o>0?0:1)]=0,f+=h,u++),l[o]={left:0,top:f,row:u,width:g,height:n},c[c.length-1]+=g+r})),d}_fitCols(t,e,i,n){const o=this,{ctx:s,maxHeight:a,options:{labels:{padding:r}}}=o,l=o.legendHitBoxes=[],c=o.columnSizes=[],h=a-t;let d=r,u=0,f=0,g=0,p=0;return o.legendItems.forEach(((t,o)=>{const a=i+e/2+s.measureText(t.text).width;o>0&&f+n+2*r>h&&(d+=u+r,c.push({width:u,height:f}),g+=u+r,p++,u=f=0),l[o]={left:g,top:f,col:p,width:a,height:n},u=Math.max(u,a),f+=n+r})),d+=u,c.push({width:u,height:f}),d}adjustHitBoxes(){const t=this;if(!t.options.display)return;const e=t._computeTitleHeight(),{legendHitBoxes:i,options:{align:n,labels:{padding:s},rtl:a}}=t,r=Ti(a,t.left,t.width);if(this.isHorizontal()){let a=0,l=o(n,t.left+s,t.right-t.lineWidths[a]);for(const c of i)a!==c.row&&(a=c.row,l=o(n,t.left+s,t.right-t.lineWidths[a])),c.top+=t.top+e+s,c.left=r.leftForLtr(r.x(l),c.width),l+=c.width+s}else{let a=0,l=o(n,t.top+e+s,t.bottom-t.columnSizes[a].height);for(const c of i)c.col!==a&&(a=c.col,l=o(n,t.top+e+s,t.bottom-t.columnSizes[a].height)),c.top=l,c.left+=t.left+s,c.left=r.leftForLtr(r.x(c.left),c.width),l+=c.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){const t=this;if(t.options.display){const e=t.ctx;Zt(e,t),t._draw(),Qt(e)}}_draw(){const t=this,{options:e,columnSizes:i,lineWidths:n,ctx:a}=t,{align:r,labels:l}=e,c=xt.color,h=Ti(e.rtl,t.left,t.width),d=Ve(l.font),{color:u,padding:f}=l,g=d.size,p=g/2;let m;t.drawTitle(),a.textAlign=h.textAlign("left"),a.textBaseline="middle",a.lineWidth=.5,a.font=d.string;const{boxWidth:x,boxHeight:b,itemHeight:_}=_s(l,g),y=t.isHorizontal(),v=this._computeTitleHeight();m=y?{x:o(r,t.left+f,t.right-n[0]),y:t.top+f+v,line:0}:{x:t.left+f,y:o(r,t.top+v+f,t.bottom-i[0].height),line:0},Ai(t.ctx,e.textDirection);const w=_+f;t.legendItems.forEach(((M,k)=>{a.strokeStyle=M.fontColor||u,a.fillStyle=M.fontColor||u;const S=a.measureText(M.text).width,P=h.textAlign(M.textAlign||(M.textAlign=l.textAlign)),D=x+p+S;let C=m.x,O=m.y;h.setWidth(t.width),y?k>0&&C+D+f>t.right&&(O=m.y+=w,m.line++,C=m.x=o(r,t.left+f,t.right-n[m.line])):k>0&&O+w>t.bottom&&(C=m.x=C+i[m.line].width+f,m.line++,O=m.y=o(r,t.top+v+f,t.bottom-i[m.line].height));!function(t,e,i){if(isNaN(x)||x<=0||isNaN(b)||b<0)return;a.save();const n=K(i.lineWidth,1);if(a.fillStyle=K(i.fillStyle,c),a.lineCap=K(i.lineCap,"butt"),a.lineDashOffset=K(i.lineDashOffset,0),a.lineJoin=K(i.lineJoin,"miter"),a.lineWidth=n,a.strokeStyle=K(i.strokeStyle,c),a.setLineDash(K(i.lineDash,[])),l.usePointStyle){const o={radius:x*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},s=h.xPlus(t,x/2);Kt(a,o,s,e+p)}else{const o=e+Math.max((g-b)/2,0),s=h.leftForLtr(t,x),r=Fe(i.borderRadius);a.beginPath(),Object.values(r).some((t=>0!==t))?ne(a,{x:s,y:o,w:x,h:b,radius:r}):a.rect(s,o,x,b),a.fill(),0!==n&&a.stroke()}a.restore()}(h.x(C),O,M),C=s(P,C+x+p,y?C+D:t.right,e.rtl),function(t,e,i){ee(a,i.text,t,e+_/2,d,{strikethrough:i.hidden,textAlign:h.textAlign(i.textAlign)})}(h.x(C),O,M),y?m.x+=D+f:m.y+=w})),Li(t.ctx,e.textDirection)}drawTitle(){const t=this,e=t.options,i=e.title,s=Ve(i.font),a=Be(i.padding);if(!i.display)return;const r=Ti(e.rtl,t.left,t.width),l=t.ctx,c=i.position,h=s.size/2,d=a.top+h;let u,f=t.left,g=t.width;if(this.isHorizontal())g=Math.max(...t.lineWidths),u=t.top+d,f=o(e.align,f,t.right-g);else{const i=t.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);u=d+o(e.align,t.top,t.bottom-i-e.labels.padding-t._computeTitleHeight())}const p=o(c,f,f+g);l.textAlign=r.textAlign(n(c)),l.textBaseline="middle",l.strokeStyle=i.color,l.fillStyle=i.color,l.font=s.string,ee(l,i.text,p,u,s)}_computeTitleHeight(){const t=this.options.title,e=Ve(t.font),i=Be(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){const i=this;let n,o,s;if(t>=i.left&&t<=i.right&&e>=i.top&&e<=i.bottom)for(s=i.legendHitBoxes,n=0;n<s.length;++n)if(o=s[n],t>=o.left&&t<=o.left+o.width&&e>=o.top&&e<=o.top+o.height)return i.legendItems[n];return null}handleEvent(t){const e=this,i=e.options;if(!function(t,e){if("mousemove"===t&&(e.onHover||e.onLeave))return!0;if(e.onClick&&("click"===t||"mouseup"===t))return!0;return!1}(t.type,i))return;const n=e._getLegendItemAt(t.x,t.y);if("mousemove"===t.type){const a=e._hoveredItem,r=(s=n,null!==(o=a)&&null!==s&&o.datasetIndex===s.datasetIndex&&o.index===s.index);a&&!r&&Q(i.onLeave,[t,a,e],e),e._hoveredItem=n,n&&!r&&Q(i.onHover,[t,n,e],e)}else n&&Q(i.onClick,[t,n,e],e);var o,s}}var vs={id:"legend",_element:ys,start(t,e,i){const n=t.legend=new ys({ctx:t.ctx,options:i,chart:t});ti.configure(t,n,i),ti.addBox(t,n)},stop(t){ti.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const n=t.legend;ti.configure(t,n,i),n.options=i},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,i){const n=e.datasetIndex,o=i.chart;o.isDatasetVisible(n)?(o.hide(n),e.hidden=!0):(o.show(n),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:n,textAlign:o,color:s}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const a=t.controller.getStyle(i?0:void 0),r=Be(a.borderWidth);return{text:e[t.index].label,fillStyle:a.backgroundColor,fontColor:s,hidden:!t.visible,lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:(r.width+r.height)/4,strokeStyle:a.borderColor,pointStyle:n||a.pointStyle,rotation:a.rotation,textAlign:o||a.textAlign,borderRadius:0,datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class ws extends Mn{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this,n=i.options;if(i.left=0,i.top=0,!n.display)return void(i.width=i.height=i.right=i.bottom=0);i.width=i.right=t,i.height=i.bottom=e;const o=Y(n.text)?n.text.length:1;i._padding=Be(n.padding);const s=o*Ve(n.font).lineHeight+i._padding.height;i.isHorizontal()?i.height=s:i.width=s}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:n,right:s,options:a}=this,r=a.align;let l,c,h,d=0;return this.isHorizontal()?(c=o(r,i,s),h=e+t,l=s-i):("left"===a.position?(c=i+t,h=o(r,n,e),d=-.5*bt):(c=s-t,h=o(r,e,n),d=.5*bt),l=n-e),{titleX:c,titleY:h,maxWidth:l,rotation:d}}draw(){const t=this,e=t.ctx,i=t.options;if(!i.display)return;const o=Ve(i.font),s=o.lineHeight/2+t._padding.top,{titleX:a,titleY:r,maxWidth:l,rotation:c}=t._drawArgs(s);ee(e,i.text,0,0,o,{color:i.color,maxWidth:l,rotation:c,textAlign:n(i.align),textBaseline:"middle",translation:[a,r]})}}var Ms={id:"title",_element:ws,start(t,e,i){!function(t,e){const i=new ws({ctx:t.ctx,options:e,chart:t});ti.configure(t,i,e),ti.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;ti.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const n=t.titleBlock;ti.configure(t,n,i),n.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const ks=new WeakMap;var Ss={id:"subtitle",start(t,e,i){const n=new ws({ctx:t.ctx,options:i,chart:t});ti.configure(t,n,i),ti.addBox(t,n),ks.set(t,n)},stop(t){ti.removeBox(t,ks.get(t)),ks.delete(t)},beforeUpdate(t,e,i){const n=ks.get(t);ti.configure(t,n,i),n.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Ps={average(t){if(!t.length)return!1;let e,i,n=0,o=0,s=0;for(e=0,i=t.length;e<i;++e){const i=t[e].element;if(i&&i.hasValue()){const t=i.tooltipPosition();n+=t.x,o+=t.y,++s}}return{x:n/s,y:o/s}},nearest(t,e){if(!t.length)return!1;let i,n,o,s=e.x,a=e.y,r=Number.POSITIVE_INFINITY;for(i=0,n=t.length;i<n;++i){const n=t[i].element;if(n&&n.hasValue()){const t=Bt(e,n.getCenterPoint());t<r&&(r=t,o=n)}}if(o){const t=o.tooltipPosition();s=t.x,a=t.y}return{x:s,y:a}}};function Ds(t,e){return e&&(Y(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function Cs(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function Os(t,e){const{element:i,datasetIndex:n,index:o}=e,s=t.getDatasetMeta(n).controller,{label:a,value:r}=s.getLabelAndValue(o);return{chart:t,label:a,parsed:s.getParsed(o),raw:t.data.datasets[n].data[o],formattedValue:r,dataset:s.getDataset(),dataIndex:o,datasetIndex:n,element:i}}function Ts(t,e){const i=t._chart.ctx,{body:n,footer:o,title:s}=t,{boxWidth:a,boxHeight:r}=e,l=Ve(e.bodyFont),c=Ve(e.titleFont),h=Ve(e.footerFont),d=s.length,u=o.length,f=n.length,g=Be(e.padding);let p=g.height,m=0,x=n.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(x+=t.beforeBody.length+t.afterBody.length,d&&(p+=d*c.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),x){p+=f*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(x-f)*l.lineHeight+(x-1)*e.bodySpacing}u&&(p+=e.footerMarginTop+u*h.lineHeight+(u-1)*e.footerSpacing);let b=0;const _=function(t){m=Math.max(m,i.measureText(t).width+b)};return i.save(),i.font=c.string,J(t.title,_),i.font=l.string,J(t.beforeBody.concat(t.afterBody),_),b=e.displayColors?a+2+e.boxPadding:0,J(n,(t=>{J(t.before,_),J(t.lines,_),J(t.after,_)})),b=0,i.font=h.string,J(t.footer,_),i.restore(),m+=g.width,{width:m,height:p}}function As(t,e,i,n){const{x:o,width:s}=i,{width:a,chartArea:{left:r,right:l}}=t;let c="center";return"center"===n?c=o<=(r+l)/2?"left":"right":o<=s/2?c="left":o>=a-s/2&&(c="right"),function(t,e,i,n){const{x:o,width:s}=n,a=i.caretSize+i.caretPadding;return"left"===t&&o+s+a>e.width||"right"===t&&o-s-a<0||void 0}(c,t,e,i)&&(c="center"),c}function Ls(t,e,i){const n=e.yAlign||function(t,e){const{y:i,height:n}=e;return i<n/2?"top":i>t.height-n/2?"bottom":"center"}(t,i);return{xAlign:e.xAlign||As(t,e,i,n),yAlign:n}}function Rs(t,e,i,n){const{caretSize:o,caretPadding:s,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,c=o+s,{topLeft:h,topRight:d,bottomLeft:u,bottomRight:f}=Fe(a);let g=function(t,e){let{x:i,width:n}=t;return"right"===e?i-=n:"center"===e&&(i-=n/2),i}(e,r);const p=function(t,e,i){let{y:n,height:o}=t;return"top"===e?n+=i:n-="bottom"===e?o+i:o/2,n}(e,l,c);return"center"===l?"left"===r?g+=c:"right"===r&&(g-=c):"left"===r?g-=Math.max(h,u)+s:"right"===r&&(g+=Math.max(d,f)+s),{x:Ht(g,0,n.width-e.width),y:Ht(p,0,n.height-e.height)}}function Es(t,e,i){const n=Be(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-n.right:t.x+n.left}function Is(t){return Ds([],Cs(t))}function zs(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}class Fs extends Mn{constructor(t){super(),this.opacity=0,this._active=[],this._chart=t._chart,this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this,e=t._cachedAnimations;if(e)return e;const i=t._chart,n=t.options.setContext(t.getContext()),o=n.enabled&&i.options.animation&&n.animations,s=new hn(t._chart,o);return o._cacheable&&(t._cachedAnimations=Object.freeze(s)),s}getContext(){const t=this;return t.$context||(t.$context=(e=t._chart.getContext(),i=t,n=t._tooltipItems,Object.assign(Object.create(e),{tooltip:i,tooltipItems:n,type:"tooltip"})));var e,i,n}getTitle(t,e){const i=this,{callbacks:n}=e,o=n.beforeTitle.apply(i,[t]),s=n.title.apply(i,[t]),a=n.afterTitle.apply(i,[t]);let r=[];return r=Ds(r,Cs(o)),r=Ds(r,Cs(s)),r=Ds(r,Cs(a)),r}getBeforeBody(t,e){return Is(e.callbacks.beforeBody.apply(this,[t]))}getBody(t,e){const i=this,{callbacks:n}=e,o=[];return J(t,(t=>{const e={before:[],lines:[],after:[]},s=zs(n,t);Ds(e.before,Cs(s.beforeLabel.call(i,t))),Ds(e.lines,s.label.call(i,t)),Ds(e.after,Cs(s.afterLabel.call(i,t))),o.push(e)})),o}getAfterBody(t,e){return Is(e.callbacks.afterBody.apply(this,[t]))}getFooter(t,e){const i=this,{callbacks:n}=e,o=n.beforeFooter.apply(i,[t]),s=n.footer.apply(i,[t]),a=n.afterFooter.apply(i,[t]);let r=[];return r=Ds(r,Cs(o)),r=Ds(r,Cs(s)),r=Ds(r,Cs(a)),r}_createItems(t){const e=this,i=e._active,n=e._chart.data,o=[],s=[],a=[];let r,l,c=[];for(r=0,l=i.length;r<l;++r)c.push(Os(e._chart,i[r]));return t.filter&&(c=c.filter(((e,i,o)=>t.filter(e,i,o,n)))),t.itemSort&&(c=c.sort(((e,i)=>t.itemSort(e,i,n)))),J(c,(i=>{const n=zs(t.callbacks,i);o.push(n.labelColor.call(e,i)),s.push(n.labelPointStyle.call(e,i)),a.push(n.labelTextColor.call(e,i))})),e.labelColors=o,e.labelPointStyles=s,e.labelTextColors=a,e.dataPoints=c,c}update(t,e){const i=this,n=i.options.setContext(i.getContext()),o=i._active;let s,a=[];if(o.length){const t=Ps[n.position].call(i,o,i._eventPosition);a=i._createItems(n),i.title=i.getTitle(a,n),i.beforeBody=i.getBeforeBody(a,n),i.body=i.getBody(a,n),i.afterBody=i.getAfterBody(a,n),i.footer=i.getFooter(a,n);const e=i._size=Ts(i,n),r=Object.assign({},t,e),l=Ls(i._chart,n,r),c=Rs(n,r,l,i._chart);i.xAlign=l.xAlign,i.yAlign=l.yAlign,s={opacity:1,x:c.x,y:c.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==i.opacity&&(s={opacity:0});i._tooltipItems=a,i.$context=void 0,s&&i._resolveAnimations().update(i,s),t&&n.external&&n.external.call(i,{chart:i._chart,tooltip:i,replay:e})}drawCaret(t,e,i,n){const o=this.getCaretPosition(t,i,n);e.lineTo(o.x1,o.y1),e.lineTo(o.x2,o.y2),e.lineTo(o.x3,o.y3)}getCaretPosition(t,e,i){const{xAlign:n,yAlign:o}=this,{caretSize:s,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:c,bottomRight:h}=Fe(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,x,b,_,y;return"center"===o?(_=u+g/2,"left"===n?(p=d,m=p-s,b=_+s,y=_-s):(p=d+f,m=p+s,b=_-s,y=_+s),x=p):(m="left"===n?d+Math.max(r,c)+s:"right"===n?d+f-Math.max(l,h)-s:this.caretX,"top"===o?(b=u,_=b-s,p=m-s,x=m+s):(b=u+g,_=b+s,p=m+s,x=m-s),y=b),{x1:p,x2:m,x3:x,y1:b,y2:_,y3:y}}drawTitle(t,e,i){const n=this,o=n.title,s=o.length;let a,r,l;if(s){const c=Ti(i.rtl,n.x,n.width);for(t.x=Es(n,i.titleAlign,i),e.textAlign=c.textAlign(i.titleAlign),e.textBaseline="middle",a=Ve(i.titleFont),r=i.titleSpacing,e.fillStyle=i.titleColor,e.font=a.string,l=0;l<s;++l)e.fillText(o[l],c.x(t.x),t.y+a.lineHeight/2),t.y+=a.lineHeight+r,l+1===s&&(t.y+=i.titleMarginBottom-r)}}_drawColorBox(t,e,i,n,o){const s=this,a=s.labelColors[i],r=s.labelPointStyles[i],{boxHeight:l,boxWidth:c,boxPadding:h}=o,d=Ve(o.bodyFont),u=Es(s,"left",o),f=n.x(u),g=l<d.lineHeight?(d.lineHeight-l)/2:0,p=e.y+g;if(o.usePointStyle){const e={radius:Math.min(c,l)/2,pointStyle:r.pointStyle,rotation:r.rotation,borderWidth:1},i=n.leftForLtr(f,c)+c/2,s=p+l/2;t.strokeStyle=o.multiKeyBackground,t.fillStyle=o.multiKeyBackground,Kt(t,e,i,s),t.strokeStyle=a.borderColor,t.fillStyle=a.backgroundColor,Kt(t,e,i,s)}else{t.lineWidth=a.borderWidth||1,t.strokeStyle=a.borderColor,t.setLineDash(a.borderDash||[]),t.lineDashOffset=a.borderDashOffset||0;const e=n.leftForLtr(f,c-h),i=n.leftForLtr(n.xPlus(f,1),c-h-2),s=Fe(a.borderRadius);Object.values(s).some((t=>0!==t))?(t.beginPath(),t.fillStyle=o.multiKeyBackground,ne(t,{x:e,y:p,w:c,h:l,radius:s}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),ne(t,{x:i,y:p+1,w:c-2,h:l-2,radius:s}),t.fill()):(t.fillStyle=o.multiKeyBackground,t.fillRect(e,p,c,l),t.strokeRect(e,p,c,l),t.fillStyle=a.backgroundColor,t.fillRect(i,p+1,c-2,l-2))}t.fillStyle=s.labelTextColors[i]}drawBody(t,e,i){const n=this,{body:o}=n,{bodySpacing:s,bodyAlign:a,displayColors:r,boxHeight:l,boxWidth:c,boxPadding:h}=i,d=Ve(i.bodyFont);let u=d.lineHeight,f=0;const g=Ti(i.rtl,n.x,n.width),p=function(i){e.fillText(i,g.x(t.x+f),t.y+u/2),t.y+=u+s},m=g.textAlign(a);let x,b,_,y,v,w,M;for(e.textAlign=a,e.textBaseline="middle",e.font=d.string,t.x=Es(n,m,i),e.fillStyle=i.bodyColor,J(n.beforeBody,p),f=r&&"right"!==m?"center"===a?c/2+h:c+2+h:0,y=0,w=o.length;y<w;++y){for(x=o[y],b=n.labelTextColors[y],e.fillStyle=b,J(x.before,p),_=x.lines,r&&_.length&&(n._drawColorBox(e,t,y,g,i),u=Math.max(d.lineHeight,l)),v=0,M=_.length;v<M;++v)p(_[v]),u=d.lineHeight;J(x.after,p)}f=0,u=d.lineHeight,J(n.afterBody,p),t.y-=s}drawFooter(t,e,i){const n=this,o=n.footer,s=o.length;let a,r;if(s){const l=Ti(i.rtl,n.x,n.width);for(t.x=Es(n,i.footerAlign,i),t.y+=i.footerMarginTop,e.textAlign=l.textAlign(i.footerAlign),e.textBaseline="middle",a=Ve(i.footerFont),e.fillStyle=i.footerColor,e.font=a.string,r=0;r<s;++r)e.fillText(o[r],l.x(t.x),t.y+a.lineHeight/2),t.y+=a.lineHeight+i.footerSpacing}}drawBackground(t,e,i,n){const{xAlign:o,yAlign:s}=this,{x:a,y:r}=t,{width:l,height:c}=i,{topLeft:h,topRight:d,bottomLeft:u,bottomRight:f}=Fe(n.cornerRadius);e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,e.lineWidth=n.borderWidth,e.beginPath(),e.moveTo(a+h,r),"top"===s&&this.drawCaret(t,e,i,n),e.lineTo(a+l-d,r),e.quadraticCurveTo(a+l,r,a+l,r+d),"center"===s&&"right"===o&&this.drawCaret(t,e,i,n),e.lineTo(a+l,r+c-f),e.quadraticCurveTo(a+l,r+c,a+l-f,r+c),"bottom"===s&&this.drawCaret(t,e,i,n),e.lineTo(a+u,r+c),e.quadraticCurveTo(a,r+c,a,r+c-u),"center"===s&&"left"===o&&this.drawCaret(t,e,i,n),e.lineTo(a,r+h),e.quadraticCurveTo(a,r,a+h,r),e.closePath(),e.fill(),n.borderWidth>0&&e.stroke()}_updateAnimationTarget(t){const e=this,i=e._chart,n=e.$animations,o=n&&n.x,s=n&&n.y;if(o||s){const n=Ps[t.position].call(e,e._active,e._eventPosition);if(!n)return;const a=e._size=Ts(e,t),r=Object.assign({},n,e._size),l=Ls(i,t,r),c=Rs(t,r,l,i);o._to===c.x&&s._to===c.y||(e.xAlign=l.xAlign,e.yAlign=l.yAlign,e.width=a.width,e.height=a.height,e.caretX=n.x,e.caretY=n.y,e._resolveAnimations().update(e,c))}}draw(t){const e=this,i=e.options.setContext(e.getContext());let n=e.opacity;if(!n)return;e._updateAnimationTarget(i);const o={width:e.width,height:e.height},s={x:e.x,y:e.y};n=Math.abs(n)<.001?0:n;const a=Be(i.padding),r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;i.enabled&&r&&(t.save(),t.globalAlpha=n,e.drawBackground(s,t,o,i),Ai(t,i.textDirection),s.y+=a.top,e.drawTitle(s,t,i),e.drawBody(s,t,i),e.drawFooter(s,t,i),Li(t,i.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this,n=i._active,o=t.map((({datasetIndex:t,index:e})=>{const n=i._chart.getDatasetMeta(t);if(!n)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:n.data[e],index:e}})),s=!tt(n,o),a=i._positionChanged(o,e);(s||a)&&(i._active=o,i._eventPosition=e,i.update(!0))}handleEvent(t,e){const i=this,n=i.options,o=i._active||[];let s=!1,a=[];"mouseout"!==t.type&&(a=i._chart.getElementsAtEventForMode(t,n.mode,n,e),n.reverse&&a.reverse());const r=i._positionChanged(a,t);return s=e||!tt(a,o)||r,s&&(i._active=a,(n.enabled||n.external)&&(i._eventPosition={x:t.x,y:t.y},i.update(!0,e))),s}_positionChanged(t,e){const{caretX:i,caretY:n,options:o}=this,s=Ps[o.position].call(this,t,e);return!1!==s&&(i!==s.x||n!==s.y)}}Fs.positioners=Ps;var Bs={id:"tooltip",_element:Fs,positioners:Ps,afterInit(t,e,i){i&&(t.tooltip=new Fs({_chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip,i={tooltip:e};!1!==t.notifyPlugins("beforeTooltipDraw",i)&&(e&&e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i))},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:{beforeTitle:H,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,n=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(n>0&&e.dataIndex<n)return i[e.dataIndex]}return""},afterTitle:H,beforeBody:H,beforeLabel:H,label(t){if(this&&this.options&&"dataset"===this.options.mode)return t.label+": "+t.formattedValue||t.formattedValue;let e=t.dataset.label||"";e&&(e+=": ");const i=t.formattedValue;return $(i)||(e+=i),e},labelColor(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{borderColor:e.borderColor,backgroundColor:e.backgroundColor,borderWidth:e.borderWidth,borderDash:e.borderDash,borderDashOffset:e.borderDashOffset,borderRadius:0}},labelTextColor(){return this.options.bodyColor},labelPointStyle(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{pointStyle:e.pointStyle,rotation:e.rotation}},afterLabel:H,afterBody:H,beforeFooter:H,footer:H,afterFooter:H}},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},Vs=Object.freeze({__proto__:null,Decimation:ts,Filler:bs,Legend:vs,SubTitle:Ss,Title:Ms,Tooltip:Bs});function Ws(t,e,i){const n=t.indexOf(e);if(-1===n)return((t,e,i)=>"string"==typeof e?t.push(e)-1:isNaN(e)?null:i)(t,e,i);return n!==t.lastIndexOf(e)?i:n}class Ns extends En{constructor(t){super(t),this._startValue=void 0,this._valueRange=0}parse(t,e){if($(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:Ht(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:Ws(i,t,K(e,t)),i.length-1)}determineDataLimits(){const t=this,{minDefined:e,maxDefined:i}=t.getUserBounds();let{min:n,max:o}=t.getMinMax(!0);"ticks"===t.options.bounds&&(e||(n=0),i||(o=t.getLabels().length-1)),t.min=n,t.max=o}buildTicks(){const t=this,e=t.min,i=t.max,n=t.options.offset,o=[];let s=t.getLabels();s=0===e&&i===s.length-1?s:s.slice(e,i+1),t._valueRange=Math.max(s.length-(n?0:1),1),t._startValue=t.min-(n?.5:0);for(let t=e;t<=i;t++)o.push({value:t});return o}getLabelForValue(t){const e=this.getLabels();return t>=0&&t<e.length?e[t]:t}configure(){const t=this;super.configure(),t.isHorizontal()||(t._reversePixels=!t._reversePixels)}getPixelForValue(t){const e=this;return"number"!=typeof t&&(t=e.parse(t)),null===t?NaN:e.getPixelForDecimal((t-e._startValue)/e._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){const e=this;return Math.round(e._startValue+e.getDecimalForPixel(t)*e._valueRange)}getBasePixel(){return this.bottom}}function Hs(t,e,{horizontal:i,minRotation:n}){const o=Et(n),s=(i?Math.sin(o):Math.cos(o))||.001,a=.75*e*(""+t).length;return Math.min(e/s,a)}Ns.id="category",Ns.defaults={ticks:{callback:Ns.prototype.getLabelForValue}};class js extends En{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return $(t)||("number"==typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const t=this,{beginAtZero:e}=t.options,{minDefined:i,maxDefined:n}=t.getUserBounds();let{min:o,max:s}=t;const a=t=>o=i?o:t,r=t=>s=n?s:t;if(e){const t=Dt(o),e=Dt(s);t<0&&e<0?r(0):t>0&&e>0&&a(0)}if(o===s){let t=1;(s>=Number.MAX_SAFE_INTEGER||o<=Number.MIN_SAFE_INTEGER)&&(t=Math.abs(.05*s)),r(s+t),e||a(o-t)}t.min=o,t.max=s}getTickLimit(){const t=this,e=t.options.ticks;let i,{maxTicksLimit:n,stepSize:o}=e;return o?i=Math.ceil(t.max/o)-Math.floor(t.min/o)+1:(i=t.computeTickLimit(),n=n||11),n&&(i=Math.min(n,i)),i}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this,e=t.options,i=e.ticks;let n=t.getTickLimit();n=Math.max(2,n);const o=function(t,e){const i=[],{bounds:n,step:o,min:s,max:a,precision:r,count:l,maxTicks:c,maxDigits:h,includeBounds:d}=t,u=o||1,f=c-1,{min:g,max:p}=e,m=!$(s),x=!$(a),b=!$(l),_=(p-g)/(h+1);let y,v,w,M,k=Ct((p-g)/f/u)*u;if(k<1e-14&&!m&&!x)return[{value:g},{value:p}];M=Math.ceil(p/k)-Math.floor(g/k),M>f&&(k=Ct(M*k/f/u)*u),$(r)||(y=Math.pow(10,r),k=Math.ceil(k*y)/y),"ticks"===n?(v=Math.floor(g/k)*k,w=Math.ceil(p/k)*k):(v=g,w=p),m&&x&&o&&Lt((a-s)/o,k/1e3)?(M=Math.round(Math.min((a-s)/k,c)),k=(a-s)/M,v=s,w=a):b?(v=m?s:v,w=x?a:w,M=l-1,k=(w-v)/M):(M=(w-v)/k,M=At(M,Math.round(M),k/1e3)?Math.round(M):Math.ceil(M));const S=Math.max(zt(k),zt(v));y=Math.pow(10,$(r)?S:r),v=Math.round(v*y)/y,w=Math.round(w*y)/y;let P=0;for(m&&(d&&v!==s?(i.push({value:s}),v<s&&P++,At(Math.round((v+P*k)*y)/y,s,Hs(s,_,t))&&P++):v<s&&P++);P<M;++P)i.push({value:Math.round((v+P*k)*y)/y});return x&&d&&w!==a?At(i[i.length-1].value,a,Hs(a,_,t))?i[i.length-1].value=a:i.push({value:a}):x&&w!==a||i.push({value:w}),i}({maxTicks:n,bounds:e.bounds,min:e.min,max:e.max,precision:i.precision,step:i.stepSize,count:i.count,maxDigits:t._maxDigits(),horizontal:t.isHorizontal(),minRotation:i.minRotation||0,includeBounds:!1!==i.includeBounds},t._range||t);return"ticks"===e.bounds&&Rt(o,t,"value"),e.reverse?(o.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max),o}configure(){const t=this,e=t.ticks;let i=t.min,n=t.max;if(super.configure(),t.options.offset&&e.length){const t=(n-i)/Math.max(e.length-1,1)/2;i-=t,n+=t}t._startValue=i,t._endValue=n,t._valueRange=n-i}getLabelForValue(t){return Oi(t,this.chart.options.locale)}}class $s extends js{determineDataLimits(){const t=this,{min:e,max:i}=t.getMinMax(!0);t.min=X(e)?e:0,t.max=X(i)?i:1,t.handleTickRangeOptions()}computeTickLimit(){const t=this,e=t.isHorizontal(),i=e?t.width:t.height,n=Et(t.options.ticks.minRotation),o=(e?Math.sin(n):Math.cos(n))||.001,s=t._resolveTickFontOptions(0);return Math.ceil(i/Math.min(40,s.lineHeight/o))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}function Ys(t){return 1===t/Math.pow(10,Math.floor(Pt(t)))}$s.id="linear",$s.defaults={ticks:{callback:Sn.formatters.numeric}};class Us extends En{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=js.prototype.parse.apply(this,[t,e]);if(0!==i)return X(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const t=this,{min:e,max:i}=t.getMinMax(!0);t.min=X(e)?Math.max(0,e):null,t.max=X(i)?Math.max(0,i):null,t.options.beginAtZero&&(t._zero=!0),t.handleTickRangeOptions()}handleTickRangeOptions(){const t=this,{minDefined:e,maxDefined:i}=t.getUserBounds();let n=t.min,o=t.max;const s=t=>n=e?n:t,a=t=>o=i?o:t,r=(t,e)=>Math.pow(10,Math.floor(Pt(t))+e);n===o&&(n<=0?(s(1),a(10)):(s(r(n,-1)),a(r(o,1)))),n<=0&&s(r(o,-1)),o<=0&&a(r(n,1)),t._zero&&t.min!==t._suggestedMin&&n===r(t.min,0)&&s(r(n,-1)),t.min=n,t.max=o}buildTicks(){const t=this,e=t.options,i=function(t,e){const i=Math.floor(Pt(e.max)),n=Math.ceil(e.max/Math.pow(10,i)),o=[];let s=q(t.min,Math.pow(10,Math.floor(Pt(e.min)))),a=Math.floor(Pt(s)),r=Math.floor(s/Math.pow(10,a)),l=a<0?Math.pow(10,Math.abs(a)):1;do{o.push({value:s,major:Ys(s)}),++r,10===r&&(r=1,++a,l=a>=0?1:l),s=Math.round(r*Math.pow(10,a)*l)/l}while(a<i||a===i&&r<n);const c=q(t.max,s);return o.push({value:c,major:Ys(s)}),o}({min:t._userMin,max:t._userMax},t);return"ticks"===e.bounds&&Rt(i,t,"value"),e.reverse?(i.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max),i}getLabelForValue(t){return void 0===t?"0":Oi(t,this.chart.options.locale)}configure(){const t=this,e=t.min;super.configure(),t._startValue=Pt(e),t._valueRange=Pt(t.max)-Pt(e)}getPixelForValue(t){const e=this;return void 0!==t&&0!==t||(t=e.min),null===t||isNaN(t)?NaN:e.getPixelForDecimal(t===e.min?0:(Pt(t)-e._startValue)/e._valueRange)}getValueForPixel(t){const e=this,i=e.getDecimalForPixel(t);return Math.pow(10,e._startValue+i*e._valueRange)}}function Xs(t){const e=t.ticks;if(e.display&&t.display){const t=Be(e.backdropPadding);return K(e.font&&e.font.size,xt.font.size)+t.height}return 0}function qs(t,e,i,n,o){return t===n||t===o?{start:e-i/2,end:e+i/2}:t<n||t>o?{start:e-i,end:e}:{start:e,end:e+i}}function Ks(t){const e={l:0,r:t.width,t:0,b:t.height-t.paddingTop},i={},n=[],o=[],s=t.getLabels().length;for(let c=0;c<s;c++){const s=t.options.pointLabels.setContext(t.getPointLabelContext(c));o[c]=s.padding;const h=t.getPointPosition(c,t.drawingArea+o[c]),d=Ve(s.font),u=(a=t.ctx,r=d,l=Y(l=t._pointLabels[c])?l:[l],{w:Ut(a,r.string,l),h:l.length*r.lineHeight});n[c]=u;const f=t.getIndexAngle(c),g=It(f),p=qs(g,h.x,u.w,0,180),m=qs(g,h.y,u.h,90,270);p.start<e.l&&(e.l=p.start,i.l=f),p.end>e.r&&(e.r=p.end,i.r=f),m.start<e.t&&(e.t=m.start,i.t=f),m.end>e.b&&(e.b=m.end,i.b=f)}var a,r,l;t._setReductions(t.drawingArea,e,i),t._pointLabelItems=function(t,e,i){const n=[],o=t.getLabels().length,s=t.options,a=Xs(s),r=t.getDistanceFromCenterForValue(s.ticks.reverse?t.min:t.max);for(let s=0;s<o;s++){const o=0===s?a/2:0,l=t.getPointPosition(s,r+o+i[s]),c=It(t.getIndexAngle(s)),h=e[s],d=Qs(l.y,h.h,c),u=Gs(c),f=Zs(l.x,h.w,u);n.push({x:l.x,y:d,textAlign:u,left:f,top:d,right:f+h.w,bottom:d+h.h})}return n}(t,n,o)}function Gs(t){return 0===t||180===t?"center":t<180?"left":"right"}function Zs(t,e,i){return"right"===i?t-=e:"center"===i&&(t-=e/2),t}function Qs(t,e,i){return 90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e),t}function Js(t,e,i,n){const{ctx:o}=t;if(i)o.arc(t.xCenter,t.yCenter,e,0,_t);else{let i=t.getPointPosition(0,e);o.moveTo(i.x,i.y);for(let s=1;s<n;s++)i=t.getPointPosition(s,e),o.lineTo(i.x,i.y)}}function ta(t){return Tt(t)?t:0}Us.id="logarithmic",Us.defaults={ticks:{callback:Sn.formatters.logarithmic,major:{enabled:!0}}};class ea extends js{constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Xs(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2}determineDataLimits(){const t=this,{min:e,max:i}=t.getMinMax(!1);t.min=X(e)&&!isNaN(e)?e:0,t.max=X(i)&&!isNaN(i)?i:0,t.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/Xs(this.options))}generateTickLabels(t){const e=this;js.prototype.generateTickLabels.call(e,t),e._pointLabels=e.getLabels().map(((t,i)=>{const n=Q(e.options.pointLabels.callback,[t,i],e);return n||0===n?n:""}))}fit(){const t=this,e=t.options;e.display&&e.pointLabels.display?Ks(t):t.setCenterPoint(0,0,0,0)}_setReductions(t,e,i){const n=this;let o=e.l/Math.sin(i.l),s=Math.max(e.r-n.width,0)/Math.sin(i.r),a=-e.t/Math.cos(i.t),r=-Math.max(e.b-(n.height-n.paddingTop),0)/Math.cos(i.b);o=ta(o),s=ta(s),a=ta(a),r=ta(r),n.drawingArea=Math.max(t/2,Math.min(Math.floor(t-(o+s)/2),Math.floor(t-(a+r)/2))),n.setCenterPoint(o,s,a,r)}setCenterPoint(t,e,i,n){const o=this,s=o.width-e-o.drawingArea,a=t+o.drawingArea,r=i+o.drawingArea,l=o.height-o.paddingTop-n-o.drawingArea;o.xCenter=Math.floor((a+s)/2+o.left),o.yCenter=Math.floor((r+l)/2+o.top+o.paddingTop)}getIndexAngle(t){return Wt(t*(_t/this.getLabels().length)+Et(this.options.startAngle||0))}getDistanceFromCenterForValue(t){const e=this;if($(t))return NaN;const i=e.drawingArea/(e.max-e.min);return e.options.reverse?(e.max-t)*i:(t-e.min)*i}getValueForDistanceFromCenter(t){if($(t))return NaN;const e=this,i=t/(e.drawingArea/(e.max-e.min));return e.options.reverse?e.max-i:e.min+i}getPointLabelContext(t){const e=this,i=e._pointLabels||[];if(t>=0&&t<i.length){const n=i[t];return function(t,e,i){return Object.assign(Object.create(t),{label:i,index:e,type:"pointLabel"})}(e.getContext(),t,n)}}getPointPosition(t,e){const i=this,n=i.getIndexAngle(t)-Mt;return{x:Math.cos(n)*e+i.xCenter,y:Math.sin(n)*e+i.yCenter,angle:n}}getPointPositionForValue(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))}getBasePosition(t){return this.getPointPositionForValue(t||0,this.getBaseValue())}getPointLabelPosition(t){const{left:e,top:i,right:n,bottom:o}=this._pointLabelItems[t];return{left:e,top:i,right:n,bottom:o}}drawBackground(){const t=this,{backgroundColor:e,grid:{circular:i}}=t.options;if(e){const n=t.ctx;n.save(),n.beginPath(),Js(t,t.getDistanceFromCenterForValue(t._endValue),i,t.getLabels().length),n.closePath(),n.fillStyle=e,n.fill(),n.restore()}}drawGrid(){const t=this,e=t.ctx,i=t.options,{angleLines:n,grid:o}=i,s=t.getLabels().length;let a,r,l;if(i.pointLabels.display&&function(t,e){const{ctx:i,options:{pointLabels:n}}=t;for(let o=e-1;o>=0;o--){const e=n.setContext(t.getPointLabelContext(o)),s=Ve(e.font),{x:a,y:r,textAlign:l,left:c,top:h,right:d,bottom:u}=t._pointLabelItems[o],{backdropColor:f}=e;if(!$(f)){const t=Be(e.backdropPadding);i.fillStyle=f,i.fillRect(c-t.left,h-t.top,d-c+t.width,u-h+t.height)}ee(i,t._pointLabels[o],a,r+s.lineHeight/2,s,{color:e.color,textAlign:l,textBaseline:"middle"})}}(t,s),o.display&&t.ticks.forEach(((e,i)=>{if(0!==i){r=t.getDistanceFromCenterForValue(e.value);const n=o.setContext(t.getContext(i-1));!function(t,e,i,n){const o=t.ctx,s=e.circular,{color:a,lineWidth:r}=e;!s&&!n||!a||!r||i<0||(o.save(),o.strokeStyle=a,o.lineWidth=r,o.setLineDash(e.borderDash),o.lineDashOffset=e.borderDashOffset,o.beginPath(),Js(t,i,s,n),o.closePath(),o.stroke(),o.restore())}(t,n,r,s)}})),n.display){for(e.save(),a=t.getLabels().length-1;a>=0;a--){const o=n.setContext(t.getPointLabelContext(a)),{color:s,lineWidth:c}=o;c&&s&&(e.lineWidth=c,e.strokeStyle=s,e.setLineDash(o.borderDash),e.lineDashOffset=o.borderDashOffset,r=t.getDistanceFromCenterForValue(i.ticks.reverse?t.min:t.max),l=t.getPointPosition(a,r),e.beginPath(),e.moveTo(t.xCenter,t.yCenter),e.lineTo(l.x,l.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){const t=this,e=t.ctx,i=t.options,n=i.ticks;if(!n.display)return;const o=t.getIndexAngle(0);let s,a;e.save(),e.translate(t.xCenter,t.yCenter),e.rotate(o),e.textAlign="center",e.textBaseline="middle",t.ticks.forEach(((o,r)=>{if(0===r&&!i.reverse)return;const l=n.setContext(t.getContext(r)),c=Ve(l.font);if(s=t.getDistanceFromCenterForValue(t.ticks[r].value),l.showLabelBackdrop){e.font=c.string,a=e.measureText(o.label).width,e.fillStyle=l.backdropColor;const t=Be(l.backdropPadding);e.fillRect(-a/2-t.left,-s-c.size/2-t.top,a+t.width,c.size+t.height)}ee(e,o.label,0,-s,c,{color:l.color})})),e.restore()}drawTitle(){}}ea.id="radialLinear",ea.defaults={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Sn.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:t=>t,padding:5}},ea.defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"},ea.descriptors={angleLines:{_fallback:"grid"}};const ia={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},na=Object.keys(ia);function oa(t,e){return t-e}function sa(t,e){if($(e))return null;const i=t._adapter,{parser:n,round:o,isoWeekday:s}=t._parseOpts;let a=e;return"function"==typeof n&&(a=n(a)),X(a)||(a="string"==typeof n?i.parse(a,n):i.parse(a)),null===a?null:(o&&(a="week"!==o||!Tt(s)&&!0!==s?i.startOf(a,o):i.startOf(a,"isoWeek",s)),+a)}function aa(t,e,i,n){const o=na.length;for(let s=na.indexOf(t);s<o-1;++s){const t=ia[na[s]],o=t.steps?t.steps:Number.MAX_SAFE_INTEGER;if(t.common&&Math.ceil((i-e)/(o*t.size))<=n)return na[s]}return na[o-1]}function ra(t,e,i){if(i){if(i.length){const{lo:n,hi:o}=oe(i,e);t[i[n]>=e?i[n]:i[o]]=!0}}else t[e]=!0}function la(t,e,i){const n=[],o={},s=e.length;let a,r;for(a=0;a<s;++a)r=e[a],o[r]=a,n.push({value:r,major:!1});return 0!==s&&i?function(t,e,i,n){const o=t._adapter,s=+o.startOf(e[0].value,n),a=e[e.length-1].value;let r,l;for(r=s;r<=a;r=+o.add(r,1,n))l=i[r],l>=0&&(e[l].major=!0);return e}(t,n,o,i):n}class ca extends En{constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e){const i=t.time||(t.time={}),n=this._adapter=new co._date(t.adapters.date);st(i.displayFormats,n.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:sa(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this,e=t.options,i=t._adapter,n=e.time.unit||"day";let{min:o,max:s,minDefined:a,maxDefined:r}=t.getUserBounds();function l(t){a||isNaN(t.min)||(o=Math.min(o,t.min)),r||isNaN(t.max)||(s=Math.max(s,t.max))}a&&r||(l(t._getLabelBounds()),"ticks"===e.bounds&&"labels"===e.ticks.source||l(t.getMinMax(!1))),o=X(o)&&!isNaN(o)?o:+i.startOf(Date.now(),n),s=X(s)&&!isNaN(s)?s:+i.endOf(Date.now(),n)+1,t.min=Math.min(o,s-1),t.max=Math.max(o+1,s)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this,e=t.options,i=e.time,n=e.ticks,o="labels"===n.source?t.getLabelTimestamps():t._generate();"ticks"===e.bounds&&o.length&&(t.min=t._userMin||o[0],t.max=t._userMax||o[o.length-1]);const s=t.min,a=re(o,s,t.max);return t._unit=i.unit||(n.autoSkip?aa(i.minUnit,t.min,t.max,t._getLabelCapacity(s)):function(t,e,i,n,o){for(let s=na.length-1;s>=na.indexOf(i);s--){const i=na[s];if(ia[i].common&&t._adapter.diff(o,n,i)>=e-1)return i}return na[i?na.indexOf(i):0]}(t,a.length,i.minUnit,t.min,t.max)),t._majorUnit=n.major.enabled&&"year"!==t._unit?function(t){for(let e=na.indexOf(t)+1,i=na.length;e<i;++e)if(ia[na[e]].common)return na[e]}(t._unit):void 0,t.initOffsets(o),e.reverse&&a.reverse(),la(t,a,t._majorUnit)}initOffsets(t){const e=this;let i,n,o=0,s=0;e.options.offset&&t.length&&(i=e.getDecimalForValue(t[0]),o=1===t.length?1-i:(e.getDecimalForValue(t[1])-i)/2,n=e.getDecimalForValue(t[t.length-1]),s=1===t.length?n:(n-e.getDecimalForValue(t[t.length-2]))/2);const a=t.length<3?.5:.25;o=Ht(o,0,a),s=Ht(s,0,a),e._offsets={start:o,end:s,factor:1/(o+1+s)}}_generate(){const t=this,e=t._adapter,i=t.min,n=t.max,o=t.options,s=o.time,a=s.unit||aa(s.minUnit,i,n,t._getLabelCapacity(i)),r=K(s.stepSize,1),l="week"===a&&s.isoWeekday,c=Tt(l)||!0===l,h={};let d,u,f=i;if(c&&(f=+e.startOf(f,"isoWeek",l)),f=+e.startOf(f,c?"day":a),e.diff(n,i,a)>1e5*r)throw new Error(i+" and "+n+" are too far apart with stepSize of "+r+" "+a);const g="data"===o.ticks.source&&t.getDataTimestamps();for(d=f,u=0;d<n;d=+e.add(d,r,a),u++)ra(h,d,g);return d!==n&&"ticks"!==o.bounds&&1!==u||ra(h,d,g),Object.keys(h).sort(((t,e)=>t-e)).map((t=>+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}_tickFormatFunction(t,e,i,n){const o=this,s=o.options,a=s.time.displayFormats,r=o._unit,l=o._majorUnit,c=r&&a[r],h=l&&a[l],d=i[e],u=l&&h&&d&&d.major,f=o._adapter.format(t,n||(u?h:c)),g=s.ticks.callback;return g?Q(g,[f,e,i],o):f}generateTickLabels(t){let e,i,n;for(e=0,i=t.length;e<i;++e)n=t[e],n.label=this._tickFormatFunction(n.value,e,t)}getDecimalForValue(t){const e=this;return null===t?NaN:(t-e.min)/(e.max-e.min)}getPixelForValue(t){const e=this,i=e._offsets,n=e.getDecimalForValue(t);return e.getPixelForDecimal((i.start+n)*i.factor)}getValueForPixel(t){const e=this,i=e._offsets,n=e.getDecimalForPixel(t)/i.factor-i.end;return e.min+n*(e.max-e.min)}_getLabelSize(t){const e=this,i=e.options.ticks,n=e.ctx.measureText(t).width,o=Et(e.isHorizontal()?i.maxRotation:i.minRotation),s=Math.cos(o),a=Math.sin(o),r=e._resolveTickFontOptions(0).size;return{w:n*s+r*a,h:n*a+r*s}}_getLabelCapacity(t){const e=this,i=e.options.time,n=i.displayFormats,o=n[i.unit]||n.millisecond,s=e._tickFormatFunction(t,0,la(e,[t],e._majorUnit),o),a=e._getLabelSize(s),r=Math.floor(e.isHorizontal()?e.width/a.w:e.height/a.h)-1;return r>0?r:1}getDataTimestamps(){const t=this;let e,i,n=t._cache.data||[];if(n.length)return n;const o=t.getMatchingVisibleMetas();if(t._normalized&&o.length)return t._cache.data=o[0].controller.getAllParsedValues(t);for(e=0,i=o.length;e<i;++e)n=n.concat(o[e].controller.getAllParsedValues(t));return t._cache.data=t.normalize(n)}getLabelTimestamps(){const t=this,e=t._cache.labels||[];let i,n;if(e.length)return e;const o=t.getLabels();for(i=0,n=o.length;i<n;++i)e.push(sa(t,o[i]));return t._cache.labels=t._normalized?e:t.normalize(e)}normalize(t){return de(t.sort(oa))}}function ha(t,e,i){let n,o,s,a,r=0,l=t.length-1;i?(e>=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=se(t,"pos",e)),({pos:n,time:s}=t[r]),({pos:o,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=se(t,"time",e)),({time:n,pos:s}=t[r]),({time:o,pos:a}=t[l]));const c=o-n;return c?s+(a-s)*(e-n)/c:s}ca.id="time",ca.defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",major:{enabled:!1}}};class da extends ca{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this,e=t._getTimestampsForTable(),i=t._table=t.buildLookupTable(e);t._minPos=ha(i,t.min),t._tableRange=ha(i,t.max)-t._minPos,super.initOffsets(e)}buildLookupTable(t){const{min:e,max:i}=this,n=[],o=[];let s,a,r,l,c;for(s=0,a=t.length;s<a;++s)l=t[s],l>=e&&l<=i&&n.push(l);if(n.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(s=0,a=n.length;s<a;++s)c=n[s+1],r=n[s-1],l=n[s],Math.round((c+r)/2)!==l&&o.push({time:l,pos:s/(a-1)});return o}_getTimestampsForTable(){const t=this;let e=t._cache.all||[];if(e.length)return e;const i=t.getDataTimestamps(),n=t.getLabelTimestamps();return e=i.length&&n.length?t.normalize(i.concat(n)):i.length?i:n,e=t._cache.all=e,e}getDecimalForValue(t){return(ha(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this,i=e._offsets,n=e.getDecimalForPixel(t)/i.factor-i.end;return ha(e._table,n*e._tableRange+e._minPos,!0)}}da.id="timeseries",da.defaults=ca.defaults;var ua=Object.freeze({__proto__:null,CategoryScale:Ns,LinearScale:$s,LogarithmicScale:Us,RadialLinearScale:ea,TimeScale:ca,TimeSeriesScale:da});return oo.register(Po,ua,Zo,Vs),oo.helpers={...Ni},oo._adapters=co,oo.Animation=ln,oo.Animations=hn,oo.animator=a,oo.controllers=zn.controllers.items,oo.DatasetController=wn,oo.Element=Mn,oo.elements=Zo,oo.Interaction=Ae,oo.layouts=ti,oo.platforms=sn,oo.Scale=En,oo.Ticks=Sn,Object.assign(oo,Po,ua,Zo,Vs,sn),oo.Chart=oo,"undefined"!=typeof window&&(window.Chart=oo),oo}));
assets/js/reports/reports.js CHANGED
@@ -13,6 +13,16 @@ jQuery( function ( $ ) {
13
  new DLM_Reports_Block_Table( v );
14
  } );
15
 
 
 
 
 
 
 
 
 
 
 
16
  } );
17
 
18
  /**
@@ -137,9 +147,8 @@ DLM_Reports_Block_Chart.prototype.render = function () {
137
  if ( this.data === null ) {
138
  return;
139
  }
140
-
141
- this.chart = new Chart( {
142
- parent: this.container,
143
  title: "",
144
  data: this.data,
145
  type: this.queryData.type,
@@ -148,14 +157,6 @@ DLM_Reports_Block_Chart.prototype.render = function () {
148
  x_axis_mode: "tick",
149
  y_axis_mode: "span",
150
  is_series: 1,
151
- format_tooltip_x: function ( d ) {
152
- return (
153
- d + ""
154
- ).toUpperCase()
155
- },
156
- format_tooltip_y: function ( d ) {
157
- return d + " downloads"
158
- }
159
  } );
160
  };
161
 
@@ -262,45 +263,106 @@ DLM_Reports_Block_Table.prototype.fetch = function () {
262
  };
263
 
264
  DLM_Reports_Block_Table.prototype.render = function () {
265
- if ( this.data === null || this.data.length < 2 ) {
266
  return;
267
  }
268
 
269
  var instance = this;
270
 
271
- // the table
272
- var table = jQuery( document.createElement( 'table' ) );
273
 
274
- table.attr( 'cellspacing', 0 ).attr( 'cellpadding', 0 ).attr( 'border', 0 );
 
 
 
275
 
276
- // setup header row
277
- var headerRow = document.createElement( 'tr' );
278
 
279
- for ( var i = 0; i < this.data[0].length; i ++ ) {
280
- var th = document.createElement( 'th' );
281
- th.innerHTML = this.data[0][i];
282
- headerRow.appendChild( th );
283
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
284
 
285
- // append header row
286
- table.append( headerRow );
 
 
 
 
 
 
 
287
 
288
- for ( var i = 1; i < this.data.length; i ++ ) {
289
- // new row
290
- var tr = document.createElement( 'tr' );
291
 
292
- // loop
293
- for ( var j = 0; j < this.data[i].length; j ++ ) {
294
- var td = document.createElement( 'td' );
295
- td.innerHTML = this.data[i][j];
296
- tr.appendChild( td );
 
 
 
 
 
 
 
 
 
 
 
 
 
297
  }
298
 
299
- // append row
300
- table.append( tr );
301
- }
 
 
 
 
 
 
 
 
 
 
302
 
303
- // put table in container
304
- jQuery( this.container ).html( '' ).append( table );
 
 
 
 
 
305
 
306
  };
13
  new DLM_Reports_Block_Table( v );
14
  } );
15
 
16
+ $( '#total_downloads_browser_table' ).on( 'click', 'a', function ( e ) {
17
+ e.preventDefault();
18
+
19
+ var target = $( this ).attr( 'href' );
20
+ $( this ).addClass( 'nav-tab-active' );
21
+ $( '#total_downloads_browser_table' ).find( 'a' ).not( $( this ) ).removeClass( 'nav-tab-active' );
22
+ $( target ).removeClass( 'hidden' );
23
+ $( '#total_downloads_browser_table' ).find( 'table' ).not( $( target ) ).addClass( 'hidden' );
24
+ } );
25
+
26
  } );
27
 
28
  /**
147
  if ( this.data === null ) {
148
  return;
149
  }
150
+ var chartId = document.getElementById('total_downloads_chart');
151
+ this.chart = new Chart( chartId, {
 
152
  title: "",
153
  data: this.data,
154
  type: this.queryData.type,
157
  x_axis_mode: "tick",
158
  y_axis_mode: "span",
159
  is_series: 1,
 
 
 
 
 
 
 
 
160
  } );
161
  };
162
 
263
  };
264
 
265
  DLM_Reports_Block_Table.prototype.render = function () {
266
+ if ( this.data === null || (this.data.length < 2 && 'undefined' === typeof this.data['total_downloads_browser_table']) ) {
267
  return;
268
  }
269
 
270
  var instance = this;
271
 
272
+ if ( 'undefined' !== typeof this.data['total_downloads_browser_table'] ) {
 
273
 
274
+ var $data = this.data['total_downloads_browser_table'];
275
+ var navigation = '<h2 class="dlm-reports-tab-navigation nav-tab-wrapper">';
276
+ jQuery( this.container ).html( '' );
277
+ jQuery( this.container ).append('<div class="">');
278
 
279
+ Object.keys( $data ).forEach( key => {
 
280
 
281
+ // the table
282
+ var table = jQuery( document.createElement( 'table' ) );
283
+ var table_class = 'hidden';
284
+ var link_class = '';
285
+
286
+ if ( 'desktop' == key ) {
287
+ table_class = '';
288
+ link_class = 'nav-tab-active';
289
+ }
290
+
291
+ navigation += '<a href="#' + key + '" class="nav-tab ' + link_class + '">' + key + '</a>';
292
+
293
+ table.attr( 'cellspacing', 0 ).attr( 'cellpadding', 0 ).attr( 'border', 0 ).attr( 'id', key ).attr( 'class', table_class );
294
+
295
+ // setup header row
296
+ var headerRow = document.createElement( 'tr' );
297
+
298
+ for ( var i = 0; i < $data[key][0].length; i++ ) {
299
+
300
+ var th = document.createElement( 'th' );
301
+ th.innerHTML = $data[key][0][i];
302
+ headerRow.appendChild( th );
303
+ }
304
+
305
+ // append header row
306
+ table.append( headerRow );
307
+
308
+ for ( var i = 1; i < $data[key].length; i++ ) {
309
+ // new row
310
+ var tr = document.createElement( 'tr' );
311
 
312
+ // loop
313
+ for ( var j = 0; j < $data[key][i].length; j++ ) {
314
+ var td = document.createElement( 'td' );
315
+ td.innerHTML = $data[key][i][j];
316
+ tr.appendChild( td );
317
+ }
318
+ // append row
319
+ table.append( tr );
320
+ }
321
 
322
+ // put table in container
323
+ jQuery( this.container ).append( table );
324
+ } );
325
 
326
+ navigation += '</div>';
327
+
328
+ jQuery( this.container ).prepend( navigation );
329
+
330
+ } else {
331
+
332
+ // the table
333
+ var table = jQuery( document.createElement( 'table' ) );
334
+
335
+ table.attr( 'cellspacing', 0 ).attr( 'cellpadding', 0 ).attr( 'border', 0 );
336
+
337
+ // setup header row
338
+ var headerRow = document.createElement( 'tr' );
339
+
340
+ for ( var i = 0; i < this.data[0].length; i++ ) {
341
+ var th = document.createElement( 'th' );
342
+ th.innerHTML = this.data[0][i];
343
+ headerRow.appendChild( th );
344
  }
345
 
346
+ // append header row
347
+ table.append( headerRow );
348
+
349
+ for ( var i = 1; i < this.data.length; i++ ) {
350
+ // new row
351
+ var tr = document.createElement( 'tr' );
352
+
353
+ // loop
354
+ for ( var j = 0; j < this.data[i].length; j++ ) {
355
+ var td = document.createElement( 'td' );
356
+ td.innerHTML = this.data[i][j];
357
+ tr.appendChild( td );
358
+ }
359
 
360
+ // append row
361
+ table.append( tr );
362
+ }
363
+
364
+ // put table in container
365
+ jQuery( this.container ).html( '' ).append( table );
366
+ }
367
 
368
  };
assets/views/meta-box/version.php CHANGED
@@ -25,7 +25,8 @@ if ( ! defined( 'ABSPATH' ) ) {
25
  </td>
26
  <td rowspan="3">
27
 
28
- <label><?php _e( 'File URL(s)', 'download-monitor' ); ?>:</label>
 
29
  <textarea name="downloadable_file_urls[<?php echo $version_increment; ?>]" wrap="off" class="downloadable_file_urls"
30
  cols="5" rows="5"
31
  placeholder="<?php _e( 'Enter one file path/URL per line - multiple files will be used as mirrors (chosen at random).', 'download-monitor' ); ?>"><?php echo esc_textarea( implode( "\n", $file_urls ) ); ?></textarea>
25
  </td>
26
  <td rowspan="3">
27
 
28
+ <label><?php _e( 'File asdURL(s); note: only enter multiple URLs in here if you want to use file mirrors', 'download-monitor' ); ?></label>
29
+
30
  <textarea name="downloadable_file_urls[<?php echo $version_increment; ?>]" wrap="off" class="downloadable_file_urls"
31
  cols="5" rows="5"
32
  placeholder="<?php _e( 'Enter one file path/URL per line - multiple files will be used as mirrors (chosen at random).', 'download-monitor' ); ?>"><?php echo esc_textarea( implode( "\n", $file_urls ) ); ?></textarea>
download-monitor.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Download Monitor
4
  Plugin URI: https://www.download-monitor.com
5
  Description: A full solution for managing and selling downloadable files, monitoring downloads and outputting download links and file information on your WordPress powered site.
6
- Version: 4.4.4
7
  Author: WPChill
8
  Author URI: https://wpchill.com
9
  Requires at least: 5.4
@@ -33,7 +33,7 @@ if ( ! defined( 'ABSPATH' ) ) {
33
  } // Exit if accessed directly
34
 
35
  // Define DLM Version
36
- define( 'DLM_VERSION', '4.4.4' );
37
 
38
  // Define DLM FILE
39
  define( 'DLM_PLUGIN_FILE', __FILE__ );
@@ -44,3 +44,44 @@ if ( version_compare( PHP_VERSION, '5.3.0' ) >= 0 ) {
44
  require_once plugin_dir_path( DLM_PLUGIN_FILE ) . 'includes/php-too-low.php';
45
  }
46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  Plugin Name: Download Monitor
4
  Plugin URI: https://www.download-monitor.com
5
  Description: A full solution for managing and selling downloadable files, monitoring downloads and outputting download links and file information on your WordPress powered site.
6
+ Version: 4.4.5
7
  Author: WPChill
8
  Author URI: https://wpchill.com
9
  Requires at least: 5.4
33
  } // Exit if accessed directly
34
 
35
  // Define DLM Version
36
+ define( 'DLM_VERSION', '4.4.5' );
37
 
38
  // Define DLM FILE
39
  define( 'DLM_PLUGIN_FILE', __FILE__ );
44
  require_once plugin_dir_path( DLM_PLUGIN_FILE ) . 'includes/php-too-low.php';
45
  }
46
 
47
+ /**
48
+ * This function allows you to track usage of your plugin
49
+ * Place in your main plugin file
50
+ * Refer to https://wisdomplugin.com/support for help
51
+ */
52
+ if( ! class_exists( 'Download_Monitor_Usage_Tracker') ) {
53
+ require_once dirname( __FILE__ ) . '/includes/tracking/class-download-monitor-usage-tracker.php';
54
+ }
55
+ if( ! function_exists( 'download_monitor_start_plugin_tracking' ) ) {
56
+ function download_monitor_start_plugin_tracking() {
57
+ $wisdom = new Download_Monitor_Usage_Tracker(
58
+ __FILE__,
59
+ 'https://tracking.download-monitor.com/',
60
+ array(),
61
+ true,
62
+ true,
63
+ 0
64
+ );
65
+ }
66
+ download_monitor_start_plugin_tracking();
67
+ }
68
+
69
+ ini_set("xdebug.var_display_max_depth", -1);
70
+ ini_set("xdebug.var_display_max_children", -1);
71
+ ini_set("xdebug.var_display_max_data", -1);
72
+
73
+ $active_plugins = get_option( 'active_plugins', array() );
74
+ $licenses = array();
75
+ if ( ! empty( $active_plugins ) ) {
76
+ foreach ( $active_plugins as $plugin => $value ) {
77
+ if ( 0 === strpos( $value, 'dlm' ) ) {
78
+ $new_val = explode( '/', $value );
79
+ $licenses[ $new_val[0] ] = get_option( $new_val[0] . '-license' );
80
+ unset( $licenses[ $new_val[0] ][1] );
81
+ $licenses[ $new_val[0] ] = serialize( $licenses[ $new_val[0] ] );
82
+ }
83
+ }
84
+ }
85
+
86
+ // var_dump( $licenses );
87
+ // die();
includes/admin/class-dlm-upsells.php ADDED
@@ -0,0 +1,642 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! defined( 'ABSPATH' ) ) {
4
+ exit;
5
+ } // Exit if accessed directly
6
+
7
+ /**
8
+ * Class DLM_Upsells
9
+ *
10
+ * @since 4.4.5
11
+ */
12
+ class DLM_Upsells {
13
+
14
+ /**
15
+ * Holds the class object.
16
+ *
17
+ * @since 4.4.5
18
+ *
19
+ * @var object
20
+ */
21
+ public static $instance;
22
+
23
+ public $extensions = array();
24
+
25
+ private $upsell_tabs = array();
26
+
27
+ /**
28
+ * DLM_Upsells constructor.
29
+ *
30
+ * @since 4.4.5
31
+ */
32
+ public function __construct() {
33
+
34
+ $this->set_hooks();
35
+
36
+ $this->set_tabs();
37
+
38
+ $this->set_upsell_actions();
39
+
40
+ }
41
+
42
+ /**
43
+ * Returns the singleton instance of the class.
44
+ *
45
+ * @return object The DLM_Upsells object.
46
+ *
47
+ * @since 4.4.5
48
+ */
49
+ public static function get_instance() {
50
+
51
+ if ( ! isset( self::$instance ) && ! ( self::$instance instanceof DLM_Upsells ) ) {
52
+ self::$instance = new DLM_Upsells();
53
+ }
54
+
55
+ return self::$instance;
56
+
57
+ }
58
+
59
+ /**
60
+ * Set our hooks
61
+ *
62
+ * @since 4.4.5
63
+ */
64
+ public function set_hooks(){
65
+
66
+ add_action( 'dlm_tab_content_general', array( $this, 'general_tab_upsell' ), 15 );
67
+
68
+ add_action( 'dlm_tab_content_access', array( $this, 'access_tab_upsell' ), 15 );
69
+
70
+ add_action( 'dlm_tab_content_logging', array( $this, 'logging_tab_upsell' ), 15 );
71
+
72
+ add_action( 'dlm_tab_content_terns_and_conditions', array( $this, 'terms_and_conditions_tab_upsell' ), 15 );
73
+
74
+ add_action( 'dlm_tab_content_email_notification', array( $this, 'emails_tab_upsell' ), 15 );
75
+
76
+ add_action( 'dlm_tab_content_pages', array( $this, 'pages_tab_upsell' ), 15 );
77
+
78
+ add_action( 'dlm_tab_content_misc', array( $this, 'misc_tab_upsell' ), 15 );
79
+
80
+ add_action( 'dlm_tab_content_endpoints', array( $this, 'endpoint_tab_upsell' ), 15 );
81
+
82
+ add_filter( 'dlm_download_metaboxes', array( $this, 'add_meta_boxes' ), 30 );
83
+
84
+ add_action( 'dlm_download_monitor_files_writepanel_start', array( $this, 'files_metabox_upsells' ), 30, 1 );
85
+
86
+ add_filter( 'dlm_settings', array( $this, 'pro_tab_upsells' ), 99, 1 );
87
+
88
+ add_action( 'admin_init', array( $this, 'set_extensions' ), 99 );
89
+
90
+ }
91
+
92
+
93
+ /**
94
+ * Generate the all-purpose upsell box
95
+ *
96
+ * @param $title
97
+ * @param $description
98
+ * @param $tab
99
+ * @param $extension
100
+ * @param null $utm_source
101
+ * @param array $features
102
+ *
103
+ * @return string
104
+ *
105
+ * @since 4.4.5
106
+ */
107
+ public function generate_upsell_box( $title, $description, $tab, $extension, $features = array(), $utm_source = null ) {
108
+
109
+ $upsell_box = '<div class="wpchill-upsell">';
110
+
111
+ if ( ! empty( $title ) ) {
112
+ $upsell_box .= '<h2>' . esc_html( $title ) . '</h2>';
113
+ }
114
+
115
+ if ( ! empty( $features ) ) {
116
+
117
+ $upsell_box .= '<ul class="wpchill-upsell-features">';
118
+
119
+ foreach ( $features as $feature ) {
120
+
121
+ $upsell_box .= '<li>';
122
+ if ( isset( $feature['tooltip'] ) && '' != $feature['tooltip'] ) {
123
+ $upsell_box .= '<div class="wpchill-tooltip"><span>[?]</span>';
124
+ $upsell_box .= '<div class="wpchill-tooltip-content">' . esc_html( $feature['tooltip'] ) . '</div>';
125
+ $upsell_box .= '</div>';
126
+ $upsell_box .= "<p>" . esc_html( $feature['feature'] ) . "</p>";
127
+ } else {
128
+ $upsell_box .= '<span class="wpchill-check dashicons dashicons-yes"></span>' . esc_html( $feature['feature'] );
129
+ }
130
+
131
+ $upsell_box .= '</li>';
132
+
133
+ }
134
+ $upsell_box .= '</ul>';
135
+ }
136
+
137
+ if ( ! $utm_source ) {
138
+ $utm_source = 'settings_panel';
139
+ }
140
+
141
+ $upsell_box .= '<p class="wpchill-upsell-description">' . esc_html( $description ) . '</p>';
142
+ $upsell_box .= '<p>';
143
+
144
+ $buttons = '<a target="_blank" href="https://download-monitor.com/extensions/' . $extension . '/?utm_source=' . $utm_source . '&utm_medium=upsell&utm_campaign=w.org&utm_content=' . $tab . '" class="button-primary button">' . esc_html__( 'Get Extension!', 'download-monitor' ) . '</a>';
145
+
146
+ $upsell_box .= apply_filters( 'dlm_upsell_buttons', $buttons, $tab );
147
+
148
+ $upsell_box .= '</p>';
149
+ $upsell_box .= '</div>';
150
+
151
+ return $upsell_box;
152
+ }
153
+
154
+ /**
155
+ * Add upsell metaboxes
156
+ *
157
+ * @since 4.4.5
158
+ */
159
+ public function add_meta_boxes( $meta_boxes ) {
160
+
161
+ if ( ! $this->check_extension( 'dlm-download-page' ) ) {
162
+
163
+ $meta_boxes[] = array(
164
+ 'id' => 'dlm-download-page-upsell',
165
+ 'title' => esc_html__( 'Downloading page', 'download-monitor' ),
166
+ 'callback' => array( $this, 'output_download_page_upsell' ),
167
+ 'screen' => 'dlm_download',
168
+ 'context' => 'side',
169
+ 'priority' => 30
170
+ );
171
+ }
172
+
173
+ if ( ! $this->check_extension( 'dlm-buttons' ) ) {
174
+
175
+ $meta_boxes[] = array(
176
+ 'id' => 'dlm-buttons-upsell',
177
+ 'title' => esc_html__( 'Buttons', 'download-monitor' ),
178
+ 'callback' => array( $this, 'output_buttons_upsell' ),
179
+ 'screen' => 'dlm_download',
180
+ 'context' => 'side',
181
+ 'priority' => 40
182
+ );
183
+ }
184
+
185
+ return $meta_boxes;
186
+ }
187
+
188
+ /**
189
+ * Set the existing extensions
190
+ *
191
+ * @since 4.4.5
192
+ */
193
+ public function set_extensions() {
194
+
195
+ $dlm_Extensions = DLM_Admin_Extensions::get_instance();
196
+
197
+ $extensions = $dlm_Extensions->get_extensions();
198
+
199
+ foreach ( $extensions as $extension ) {
200
+ $this->extensions[] = $extension->product_id;
201
+ }
202
+
203
+ }
204
+
205
+ /**
206
+ * Check if extension exists
207
+ *
208
+ * @param $extension
209
+ *
210
+ * @return bool
211
+ *
212
+ * @since 4.4.5
213
+ */
214
+ public function check_extension( $extension ) {
215
+
216
+ if ( empty( $this->extensions ) || ! in_array( $extension, $this->extensions ) ) {
217
+ return false;
218
+ }
219
+
220
+ return true;
221
+ }
222
+
223
+ /**
224
+ * Set DLM's upsell tabs
225
+ *
226
+ * @since 4.4.5
227
+ */
228
+ public function set_tabs() {
229
+ // Define our upsell tabs
230
+ // First is the tab and then are the sections
231
+ $this->upsell_tabs = apply_filters( 'dlm_upsell_tabs', array(
232
+ 'lead_generation' => array(
233
+ 'title' => esc_html__( 'Lead Generation', 'download-monitor' ),
234
+ 'upsell' => true,
235
+ 'sections' => array(
236
+ 'ninja_forms' => array(
237
+ 'title' => __( 'Ninja Forms', 'download-monitor' ),
238
+ 'sections' => array(), // Need to put sections here for backwards compatibility
239
+ ),
240
+ 'gravity_forms' => array(
241
+ 'title' => __( 'Gravity Forms', 'download-monitor' ),
242
+ 'sections' => array(), // Need to put sections here for backwards compatibility
243
+ 'upsell' => true,
244
+ 'badge' => true,
245
+ ),
246
+ 'email_lock' => array(
247
+ 'title' => __( 'Email lock', 'download-monitor' ),
248
+ 'sections' => array(), // Need to put sections here for backwards compatibility
249
+ ),
250
+ ),
251
+ ),
252
+ 'external_hosting' => array(
253
+ 'title' => esc_html__( 'External hosting', 'download-monitor' ),
254
+ 'sections' => array(
255
+ 'amazon_s3' => array(
256
+ 'title' => __( 'Amazon S3', 'download-monitor' ),
257
+ 'sections' => array(), // Need to put sections here for backwards compatibility
258
+ ),
259
+ 'google_drive' => array(
260
+ 'title' => __( 'Google Drive', 'download-monitor' ),
261
+ 'sections' => array(), // Need to put sections here for backwards compatibility
262
+ ),
263
+ ),
264
+ ),
265
+ 'advanced' => array(
266
+ 'title' => esc_html__( 'Advanced', 'download-monitor' ),
267
+ 'sections' => array(
268
+ 'page_addon' => array(
269
+ 'title' => __( 'Page Addon', 'download-monitor' ),
270
+ 'sections' => array(), // Need to put sections here for backwards compatibility
271
+ ),
272
+ 'downloading_page' => array(
273
+ 'title' => __( 'Downloading Page', 'download-monitor' ),
274
+ 'sections' => array(), // Need to put sections here for backwards compatibility
275
+ ),
276
+ 'captcha' => array(
277
+ 'title' => __( 'Captcha', 'download-monitor' ),
278
+ 'sections' => array(), // Need to put sections here for backwards compatibility
279
+ )
280
+ ),
281
+ ),
282
+ 'integration' => array(
283
+ 'title' => esc_html__( 'Integration', 'download-monitor' ),
284
+ 'sections' => array(
285
+ 'captcha' => array(
286
+ 'title' => __( 'Captcha', 'download-monitor' ),
287
+ 'sections' => array(), // Need to put sections here for backwards compatibility
288
+ )
289
+ ),
290
+ ),
291
+ )
292
+ );
293
+ }
294
+
295
+ /**
296
+ * Add PRO Tabs upsells
297
+ *
298
+ * @param $settings
299
+ *
300
+ * @return mixed
301
+ *
302
+ * @since 4.4.5
303
+ */
304
+ public function pro_tab_upsells( $settings ) {
305
+
306
+ foreach ( $this->upsell_tabs as $key => $tab ) {
307
+
308
+ if ( ! isset( $settings[ $key ] ) ) {
309
+
310
+ if ( ! isset( $settings[ $key ]['title'] ) ) {
311
+
312
+ $settings[ $key ]['title'] = $tab['title'];
313
+ }
314
+
315
+ foreach ( $tab['sections'] as $section_key => $section ) {
316
+
317
+ if ( ! isset( $settings[ $key ]['sections'][ $section_key ] ) ) {
318
+
319
+ $settings[ $key ]['sections'][ $section_key ] = $section;
320
+ $settings[ $key ]['sections'][ $section_key ]['upsell'] = true;
321
+ }
322
+ }
323
+ }
324
+ }
325
+
326
+ return $settings;
327
+
328
+ }
329
+
330
+ /**
331
+ * Add Upsell tabs content
332
+ *
333
+ * @since 4.4.5
334
+ */
335
+ public function set_upsell_actions() {
336
+
337
+ foreach ( $this->upsell_tabs as $key => $tab ) {
338
+
339
+ if ( method_exists( 'DLM_Upsells', 'upsell_tab_content_' . $key ) ) {
340
+ add_action( 'dlm_tab_content_' . $key, array( $this, 'upsell_tab_content_' . $key ), 30, 1 );
341
+ }
342
+
343
+ }
344
+ }
345
+
346
+ /**
347
+ * Settings General tab upsell
348
+ *
349
+ *
350
+ * @since 4.4.5
351
+ */
352
+ public function general_tab_upsell() {
353
+
354
+ if ( ! $this->check_extension( 'dlm-download-duplicator' ) ) {
355
+
356
+ echo $this->generate_upsell_box( 'Duplicate your downloads', 'You’re one click away from duplicating downloads, including their data, versions, and files.', 'general', 'download-duplicator' );
357
+ }
358
+
359
+ if ( ! $this->check_extension( 'dlm-email-notification' ) ) {
360
+
361
+ echo $this->generate_upsell_box( 'Email notifications', 'Create an email alert to be notified each time one of your files has been downloaded.', 'general', 'email-notification' );
362
+ }
363
+
364
+ }
365
+
366
+ /**
367
+ * Settings Access tab upsell
368
+ *
369
+ *
370
+ * @since 4.4.5
371
+ */
372
+ public function access_tab_upsell() {
373
+
374
+ if ( ! $this->check_extension( 'dlm-advanced-access-manager' ) ) {
375
+
376
+ echo $this->generate_upsell_box( 'Advanced access manager', 'Limit access to your downloads by setting advanced access rules and restrictions with this extension.', 'access', 'advanced-access-manager' );
377
+ }
378
+
379
+ if ( ! $this->check_extension( 'dlm-twitter-lock' ) ) {
380
+
381
+ echo $this->generate_upsell_box( 'Twitter lock', 'Allow your users to tweet a pre-defined text before accessing a download.', 'access', 'twitter-lock' );
382
+ }
383
+
384
+ if ( ! $this->check_extension( 'dlm-email-lock' ) ) {
385
+
386
+ echo $this->generate_upsell_box( 'Email lock', 'Require your users’ email addresses to send newsletters and create a list of your customers.', 'access', 'email-lock' );
387
+ }
388
+
389
+ if ( ! $this->check_extension( 'dlm-gravity-forms' ) ) {
390
+
391
+ echo $this->generate_upsell_box( 'Gravity forms extension', 'Ask users to fill in a form created on Gravity Forms before they start downloading your files.', 'access', 'gravity-forms' );
392
+ }
393
+
394
+ if ( ! $this->check_extension( 'dlm-ninja-forms' ) ) {
395
+
396
+ echo $this->generate_upsell_box( 'Ninja forms extension', 'Use the Ninja Forms extension to add forms easily to your download files.', 'access', 'ninja-forms' );
397
+ }
398
+
399
+ if ( ! $this->check_extension( 'dlm-mailchimp-lock' ) ) {
400
+
401
+ echo $this->generate_upsell_box( 'Mailchimp extension', 'Create a MailChimp list and ask users to subscribe to it before accessing a downloadable file.', 'access', 'mailchimp-lock' );
402
+ }
403
+
404
+ }
405
+
406
+ /**
407
+ * Settings Logging tab upsell
408
+ *
409
+ *
410
+ * @since 4.4.5
411
+ */
412
+ public function logging_tab_upsell() {
413
+
414
+ if ( ! $this->check_extension( 'dlm-captcha' ) ) {
415
+
416
+ echo $this->generate_upsell_box( 'Captcha', 'Stop bots from spamming your downloads and ask users to complete Google reCAPTCHA.', 'logging', 'captcha' );
417
+ }
418
+
419
+ }
420
+
421
+ /**
422
+ * Settings Terms and conditions tab upsell
423
+ *
424
+ *
425
+ * @since 4.4.5
426
+ */
427
+ public function terms_and_conditions_tab_upsell() {
428
+
429
+ if ( ! $this->check_extension( 'dlm-terms-and-conditions' ) ) {
430
+
431
+ echo $this->generate_upsell_box( 'Terms and conditions', 'Require your users to accept your terms and conditions before they can download your files.', 'terns_and_conditions', 'terms-and-conditions' );
432
+ }
433
+
434
+ }
435
+
436
+ /**
437
+ * Settings Emails tab upsell
438
+ *
439
+ *
440
+ * @since 4.4.5
441
+ */
442
+ public function emails_tab_upsell() {
443
+
444
+ if ( ! $this->check_extension( 'dlm-email-notification' ) ) {
445
+
446
+ echo $this->generate_upsell_box( 'Email notifications', 'The Email Notification extension for Download Monitor sends you an email whenever one of your files is downloaded', 'email_notifications', 'email-notifications' );
447
+ }
448
+
449
+ }
450
+
451
+ /**
452
+ * Settings Logging tab upsell
453
+ *
454
+ *
455
+ * @since 4.4.5
456
+ */
457
+ public function pages_tab_upsell() {
458
+
459
+ if ( ! $this->check_extension( 'dlm-terms-conditions' ) ) {
460
+
461
+ echo $this->generate_upsell_box( 'Terms & Conditions', 'Easily require your visitors to agree to your terms and conditions before downloading files.', 'pages', 'terms-conditions' );
462
+ }
463
+
464
+ if ( ! $this->check_extension( 'dlm-page-addon' ) ) {
465
+
466
+ echo $this->generate_upsell_box( 'Page Addon', 'List all downloads, categories, tags, and showcase info pages of each resource with a self-contained [download_page] shortcode!', 'pages', 'page-addon' );
467
+ }
468
+
469
+ }
470
+
471
+ /**
472
+ * Settings Misc tab upsell
473
+ *
474
+ *
475
+ * @since 4.4.5
476
+ */
477
+ public function output_buttons_upsell() {
478
+
479
+ if ( ! $this->check_extension( 'dlm-buttons' ) ) {
480
+
481
+ echo $this->generate_upsell_box( 'Buttons', 'The Buttons extension allows you to customize your download buttons as you please in order to improve the user experience. Create stunning buttons without needing any coding skills!', 'cpt', 'buttons' );
482
+ }
483
+
484
+ }
485
+
486
+ /**
487
+ * Settings Misc tab upsell
488
+ *
489
+ *
490
+ * @since 4.4.5
491
+ */
492
+ public function endpoint_tab_upsell() {
493
+
494
+ if ( ! $this->check_extension( 'dlm-csv-impoter' ) ) {
495
+
496
+ echo $this->generate_upsell_box( 'Importer', 'Easily import your downloads, including their categories, tags, and files.
497
+ ', 'endpoint', 'csv-impoter' );
498
+ }
499
+
500
+ if ( ! $this->check_extension( 'dlm-csv-exporter' ) ) {
501
+
502
+ echo $this->generate_upsell_box( 'Exporter', 'With a single click, you can quickly export your downloads and their tags, categories, and file versions to a CSV file.', 'endpoint', 'csv-exporter' );
503
+ }
504
+
505
+ }
506
+
507
+ /**
508
+ * Output the DLM Downloading Page extension upsell
509
+ *
510
+ * @since 4.4.5
511
+ */
512
+ public function output_download_page_upsell() {
513
+
514
+ if ( ! $this->check_extension( 'dlm-downloading-page' ) ) {
515
+
516
+ echo $this->generate_upsell_box( '', esc_html__( 'Customize the downloading page by adding banners, ads, and anything you like.', 'download-monitor' ), 'downloading_page', 'downloading-page' );
517
+ }
518
+
519
+ }
520
+
521
+ /**
522
+ * Upsell for Locking tab
523
+ *
524
+ * @since 4.4.5
525
+ */
526
+ public function upsell_tab_content_lead_generation() {
527
+
528
+ if ( ! $this->check_extension( 'dlm-ninja-forms' ) ) {
529
+
530
+ echo $this->generate_upsell_box( esc_html__( 'Ninja Forms extension', 'download-monitor' ), esc_html__( 'The Ninja Forms extension for Download Monitor allows you to require users to fill in a Ninja Forms form before they gain access to a download.', 'download-monitor' ), 'ninja_forms', 'ninja-forms' );
531
+ }
532
+
533
+ if ( ! $this->check_extension( 'dlm-email-lock' ) ) {
534
+
535
+ echo $this->generate_upsell_box( esc_html__( 'Email lock extension', 'download-monitor' ), esc_html__( 'The Email Lock extension for Download Monitor allows you to require users to fill in their email address before they gain access to a download.', 'download-monitor' ), 'email_lock', 'email-lock' );
536
+ }
537
+
538
+ if ( ! $this->check_extension( 'dlm-gravity-forms' ) ) {
539
+
540
+ echo $this->generate_upsell_box( esc_html__( 'Gravity Forms extension', 'download-monitor' ), esc_html__( 'The Gravity Forms extension for Download Monitor allows you to require users to fill out a Gravity Forms form before they gain access to a download.', 'download-monitor' ), 'gravity_forms', 'gravity-forms' );
541
+ }
542
+
543
+ }
544
+
545
+ /**
546
+ * Upsell for Amazon S3 setting tab
547
+ *
548
+ * @since 4.4.5
549
+ */
550
+ public function upsell_tab_content_external_hosting() {
551
+
552
+ if ( ! $this->check_extension( 'dlm-amazon-s3' ) ) {
553
+
554
+ echo $this->generate_upsell_box( esc_html__( 'Amazon S3', 'download-monitor' ), esc_html__( 'Link to files hosted on Amazon s3 so that you can serve secure, expiring download links.', 'download-monitor' ), 'amazon_s3', 'amazon-s3' );
555
+ }
556
+
557
+ if ( ! $this->check_extension( 'dlm-google-drive' ) ) {
558
+
559
+ echo $this->generate_upsell_box( esc_html__( 'Google Drive', 'download-monitor' ), esc_html__( 'With this extension, you can integrate your files from Google Drive into Download Monitor.', 'download-monitor' ), 'google_drive', 'google-drive' );
560
+ }
561
+
562
+
563
+ }
564
+
565
+
566
+ /**
567
+ * Upsell for Page Addon setting tab
568
+ *
569
+ * @since 4.4.5
570
+ */
571
+ public function upsell_tab_content_advanced() {
572
+
573
+ if ( ! $this->check_extension( 'dlm-page-addon' ) ) {
574
+
575
+ echo $this->generate_upsell_box( esc_html__( 'Page addon extension', 'download-monitor' ), esc_html__( 'Add a self contained [download_page] shortcode to your site to list downloads, categories, tags, and show info pages about each of your resources.', 'download-monitor' ), 'page_addon', 'page-addon' );
576
+ }
577
+
578
+ if ( ! $this->check_extension( 'dlm-downloading-page' ) ) {
579
+
580
+ echo $this->generate_upsell_box( esc_html__( 'Downloading page extension', 'download-monitor' ), esc_html__( 'The Downloading Page extension for Download Monitor forces your downloads to be served from a separate page.', 'download-monitor' ), 'downloading_page', 'downloading-page' );
581
+ }
582
+
583
+
584
+ }
585
+
586
+ /**
587
+ * Upsell for Captcha setting tab
588
+ *
589
+ * @since 4.4.5
590
+ */
591
+ public function upsell_tab_content_captcha() {
592
+
593
+ if ( ! $this->check_extension( 'dlm=captcha' ) ) {
594
+
595
+ echo $this->generate_upsell_box( esc_html__( 'Captcha extension', 'download-monitor' ), esc_html__( 'The Captcha extension for Download Monitor allows you to require users to complete a Google reCAPTCHA before they gain access to a download.', 'download-monitor' ), 'captcha', 'captcha' );
596
+ }
597
+
598
+
599
+ }
600
+
601
+
602
+ /**
603
+ * Output the Downloadable Files locations in the Downloadable files metabox
604
+ *
605
+ * @param $download
606
+ *
607
+ * @since 4.4.5
608
+ */
609
+ public function files_metabox_upsells( $download ) {
610
+
611
+ echo '<div class="upsells-columns">';
612
+
613
+ if ( ! $this->check_extension( 'dlm-amazon-s3' ) ) {
614
+
615
+ echo '<div class="upsells-column"><span class="dashicons dashicons-amazon"></span><h3>' . esc_html__( 'Amazon S3', 'download-monitor' ) . '</h3>' . $this->generate_upsell_box( '', esc_html__( 'Use Amazon S3 links for Download Monitor files to run secure, expiring download links.', 'download-monitor' ), 'amazon_s3', 'amazon-s3' ) . '</div>';
616
+ }
617
+
618
+ if ( ! $this->check_extension( 'dlm-google-drive' ) ) {
619
+
620
+ echo '<div class="upsells-column"><span class="dashicons dashicons-google"></span><h3>' . esc_html__( 'Google Drive', 'download-monitor' ) . '</h3>' . $this->generate_upsell_box( '', esc_html__( 'With this extension, you can integrate your files from Google Drive into Download Monitor.', 'download-monitor' ), 'google_drive', 'google-drive' ) . '</div>';
621
+ }
622
+
623
+ echo '</div>';
624
+
625
+ }
626
+
627
+ /**
628
+ * Upsell for Integration tab
629
+ *
630
+ * @since 4.4.5
631
+ */
632
+ public function upsell_tab_content_integration() {
633
+
634
+ if ( ! $this->check_extension( 'dlm-captcha' ) ) {
635
+
636
+ echo $this->generate_upsell_box( 'Captcha', 'Stop bots from spamming your downloads and ask users to complete Google reCAPTCHA.', 'logging', 'captcha' );
637
+ }
638
+
639
+ }
640
+ }
641
+
642
+ DLM_Upsells::get_instance();
includes/admin/uninstall/class-dlm-uninstall.php ADDED
@@ -0,0 +1,271 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class DLM_Uninstall {
4
+
5
+ /**
6
+ * Holds the class object.
7
+ *
8
+ * @since 4.4.5
9
+ *
10
+ * @var object
11
+ */
12
+ public static $instance;
13
+
14
+ /**
15
+ * @since 4.4.5
16
+ * DLM_Uninstall constructor.
17
+ *
18
+ */
19
+ function __construct() {
20
+
21
+ // Deactivation
22
+ add_filter( 'plugin_action_links_' . plugin_basename( DLM_PLUGIN_FILE ), array(
23
+ $this,
24
+ 'filter_action_links'
25
+ ) );
26
+
27
+ add_action( 'admin_footer-plugins.php', array( $this, 'add_uninstall_form' ), 16 );
28
+ add_action( 'wp_ajax_dlm_uninstall_plugin', array( $this, 'dlm_uninstall_plugin' ) );
29
+ add_action( 'admin_enqueue_scripts', array( $this, 'uninstall_scripts' ) );
30
+ }
31
+
32
+ /**
33
+ * Enqueue uninstall scripts
34
+ *
35
+ * @since 4.4.5
36
+ */
37
+ public function uninstall_scripts() {
38
+
39
+ $plugin_url = download_monitor()->get_plugin_url();
40
+
41
+ $current_screen = get_current_screen();
42
+ if ( in_array( $current_screen->base, array( 'plugins', 'plugins-network' ) ) ) {
43
+ wp_enqueue_style( 'dlm-uninstall', $plugin_url . '/assets/css/dlm-uninstall.css' );
44
+ wp_enqueue_script( 'dlm-uninstall', $plugin_url . '/assets/js/dlm-uninstall.js', array( 'jquery' ), DLM_VERSION, true );
45
+ wp_localize_script( 'dlm-uninstall', 'wpDLMUninstall', array(
46
+ 'redirect_url' => admin_url( '/plugins.php' ),
47
+ 'nonce' => wp_create_nonce( 'dlm_uninstall_plugin' )
48
+ ) );
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Set uninstall link
54
+ *
55
+ * @param $links
56
+ *
57
+ * @return array
58
+ *
59
+ * @since 4.4.5
60
+ */
61
+ public function filter_action_links( $links ) {
62
+
63
+ $links = array_merge( $links, array(
64
+ '<a onclick="javascript:event.preventDefault();" id="dlm-uninstall-link" class="uninstall-dlm dlm-red-text" href="#">' . esc_html__( 'Uninstall', 'download-monitor' ) . '</a>',
65
+ ) );
66
+
67
+ return $links;
68
+ }
69
+
70
+ /**
71
+ * Form text strings
72
+ * These can be filtered
73
+ *
74
+ * @since 4.4.5
75
+ */
76
+ public function add_uninstall_form() {
77
+
78
+ // Get our strings for the form
79
+ $form = $this->get_form_info();
80
+
81
+ ?>
82
+ <div class="dlm-uninstall-form-bg">
83
+ </div>
84
+ <div class="dlm-uninstall-form-wrapper">
85
+ <span class="dlm-uninstall-form" id="dlm-uninstall-form">
86
+ <div class="dlm-uninstall-form-head">
87
+ <h3><strong><?php echo esc_html( $form['heading'] ); ?></strong></h3>
88
+ <i class="close-uninstall-form">X</i>
89
+ </div>
90
+ <div class="dlm-uninstall-form-body"><p><?php echo wp_kses_post( $form['body'] ); ?></p>
91
+
92
+ <?php
93
+ if ( is_array( $form['options'] ) ) {
94
+ ?>
95
+ <div class="dlm-uninstall-options">
96
+ <?php
97
+ foreach ( $form['options'] as $key => $option ) {
98
+
99
+ $before_input = '';
100
+ $after_input = '';
101
+ if ( 'delete_all' == $key ) {
102
+ $before_input = '<strong class="dlm-red-text">';
103
+ $after_input = '</strong>';
104
+ }
105
+
106
+ echo ' <p><input type="checkbox" name="' . esc_attr( $key ) . ' " id="' . esc_attr( $key ) . '" value="' . esc_attr( $key ) . '"> <label for="' . esc_attr( $key ) . '">' . $before_input . esc_attr( $option['label'] ) . $after_input . '</label><p class="description">' . esc_html( $option['description'] ) . '</p><br>';
107
+ }
108
+ ?>
109
+ </div><!-- .dlm-uninstall-options -->
110
+ <?php } ?>
111
+
112
+ </div><!-- .dlm-uninstall-form-body -->
113
+ <p class="deactivating-spinner"><span
114
+ class="spinner"></span><?php echo esc_html__( 'Cleaning...', 'download-monitor' ); ?></p>
115
+ <div class="uninstall">
116
+ <p>
117
+ <a id="dlm-uninstall-submit-form" class="button button-primary"
118
+ href="#"><?php echo esc_html__( 'Uninstall', 'download-monitor' ); ?></a>
119
+ </p>
120
+ </div>
121
+ </span>
122
+ </div>
123
+ <?php
124
+ }
125
+
126
+ /**
127
+ * Form text strings
128
+ *
129
+ * These are non-filterable and used as fallback in case filtered strings aren't set correctly
130
+ *
131
+ * @since 4.4.5
132
+ */
133
+ public function get_form_info() {
134
+ $form = array();
135
+ $form['heading'] = esc_html__( 'Sorry to see you go', 'download-monitor' );
136
+ $form['body'] = '<strong class="dlm-red-text">' . esc_html__( ' Caution!! This action CANNOT be undone', 'download-monitor' ) . '</strong>';
137
+ $form['options'] = apply_filters( 'dlm_uninstall_options', array(
138
+ 'delete_all' => array(
139
+ 'label' => esc_html__( 'Delete all data', 'download-monitor' ),
140
+ 'description' => esc_html__( 'Select this to delete all data Download Monitor plugin and it\'s add-ons have set in your database.', 'download-monitor' )
141
+ ),
142
+ 'delete_options' => array(
143
+ 'label' => esc_html__( 'Delete Download Monitor\'s options', 'download-monitor' ),
144
+ 'description' => esc_html__( 'Delete options set by Download Monitor plugin and it\'s add-ons to options table in the database.', 'download-monitor' )
145
+ ),
146
+ 'delete_transients' => array(
147
+ 'label' => esc_html__( 'Delete Download Monitor set transients', 'download-monitor' ),
148
+ 'description' => esc_html__( 'Delete transients set by Download Monitor plugin and it\'s add-ons to options table in the database.', 'download-monitor' )
149
+ ),
150
+ 'delete_cpt' => array(
151
+ 'label' => esc_html__( 'Delete dlm_download custom post type', 'download-monitor' ),
152
+ 'description' => esc_html__( 'Delete custom post types set by Download Monitor plugin and it\'s add-ons in the database.', 'download-monitor' )
153
+ ),
154
+ 'delete_set_tables' => array(
155
+ 'label' => esc_html__( 'Delete set tables ', 'download-monitor' ),
156
+ 'description' => esc_html__( 'Delete tables set by plugin ( Ex.: Logs table )', 'download-monitor' )
157
+ )
158
+ ) );
159
+
160
+ return $form;
161
+ }
162
+
163
+ /**
164
+ * @since 2.2.4
165
+ * DLM Uninstall procedure
166
+ */
167
+ public function dlm_uninstall_plugin() {
168
+
169
+ global $wpdb;
170
+ check_ajax_referer( 'dlm_uninstall_plugin', 'security' );
171
+
172
+ $uninstall_option = isset( $_POST['options'] ) ? $_POST['options'] : false;
173
+
174
+ // Delete options
175
+ if ( '1' == $uninstall_option['delete_options'] ) {
176
+
177
+ /**
178
+ * Remove all options that have our dlm_ prefix
179
+ */
180
+ $wpdb->query( "DELETE FROM {$wpdb->options} WHERE `option_name` LIKE 'dlm_%';" );
181
+
182
+ // filter for options to be added by Download Monitor's add-ons
183
+ $options_array = apply_filters( 'dlm_uninstall_db_options', array() );
184
+
185
+ foreach ( $options_array as $db_option ) {
186
+ delete_option( $db_option );
187
+ }
188
+
189
+ }
190
+
191
+ // Delete transients
192
+ if ( '1' == $uninstall_option['delete_transients'] ) {
193
+
194
+ /**
195
+ * Remove all DLM transients that have our dlm_ prefix
196
+ */
197
+ $wpdb->query( "DELETE FROM {$wpdb->options} WHERE `option_name` LIKE '_transient_timeout_dlm_%';" );
198
+ $wpdb->query( "DELETE FROM {$wpdb->options} WHERE `option_name` LIKE '_transient_dlm_%';" );
199
+
200
+ // filter for transients to be added by Download Monitor's add-ons
201
+ $transients_array = apply_filters( 'dlm_uninstall_transients', array() );
202
+
203
+ foreach ( $transients_array as $db_transient ) {
204
+ delete_transient( $db_transient );
205
+ }
206
+
207
+ }
208
+
209
+ // Delete custom post type
210
+ if ( '1' == $uninstall_option['delete_cpt'] ) {
211
+
212
+ $post_types = apply_filters( 'dlm_uninstall_post_types', array( 'dlm_download' ) );
213
+
214
+ $dlm_cpts = get_posts( array( 'post_type' => $post_types, 'posts_per_page' => - 1, 'fields' => 'ids' ) );
215
+
216
+
217
+ if ( is_array( $dlm_cpts ) && ! empty( $dlm_cpts ) ) {
218
+
219
+ $id_in = implode( ',', $dlm_cpts );
220
+
221
+ $sql = $wpdb->prepare( "DELETE FROM $wpdb->posts WHERE ID IN ( $id_in )" );
222
+ $sql_meta = $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE post_id IN ( $id_in )" );
223
+ $wpdb->query( $sql );
224
+ $wpdb->query( $sql_meta );
225
+ }
226
+ }
227
+
228
+ // Delete tables set by the plugin
229
+ if ( '1' == $uninstall_option['delete_set_tables'] ) {
230
+
231
+ $dlm_tables = apply_filters( 'dlm_uninstall_db_tables', array( $wpdb->prefix . "download_log" ) );
232
+
233
+ if ( ! empty( $dlm_tables ) ) {
234
+
235
+ foreach ( $dlm_tables as $table ) {
236
+
237
+ $sql_dlm_table = $wpdb->prepare( "DROP TABLE IF EXISTS $table" );
238
+
239
+ $wpdb->query( $sql_dlm_table );
240
+ }
241
+ }
242
+
243
+
244
+ }
245
+
246
+ do_action( 'dlm_uninstall' );
247
+
248
+ deactivate_plugins( DLM_PLUGIN_FILE );
249
+ wp_die();
250
+ }
251
+
252
+ /**
253
+ * Returns the singleton instance of the class.
254
+ *
255
+ * @return object The DLM_Uninstall object.
256
+ *
257
+ * @since 4.4.5
258
+ */
259
+ public static function get_instance() {
260
+
261
+ if ( ! isset( self::$instance ) && ! ( self::$instance instanceof DLM_Uninstall ) ) {
262
+ self::$instance = new DLM_Uninstall();
263
+ }
264
+
265
+ return self::$instance;
266
+
267
+ }
268
+
269
+ }
270
+
271
+ DLM_Uninstall::get_instance();
includes/bootstrap.php CHANGED
@@ -20,6 +20,9 @@ function _load_download_monitor() {
20
  // require autoloader
21
  require_once dirname( DLM_PLUGIN_FILE ) . '/vendor/autoload.php';
22
 
 
 
 
23
  // Init plugin
24
  add_action( 'plugins_loaded', '_load_download_monitor', 10 );
25
 
20
  // require autoloader
21
  require_once dirname( DLM_PLUGIN_FILE ) . '/vendor/autoload.php';
22
 
23
+ // load the upsells
24
+ require_once dirname( DLM_PLUGIN_FILE ) . '/includes/admin/class-dlm-upsells.php';
25
+
26
  // Init plugin
27
  add_action( 'plugins_loaded', '_load_download_monitor', 10 );
28
 
includes/deprecated.php CHANGED
@@ -10,15 +10,15 @@
10
  *
11
  * @deprecated 1.6.0
12
  *
13
- * @param string $type (default: '')
14
- * @param string $status (default: '')
15
- * @param string $message (default: '')
16
  * @param mixed $download
17
  * @param mixed $version
18
  *
19
  * @return void
20
  */
21
- function dlm_create_log( $type = '', $status = '', $message = '', $download, $version ) {
22
 
23
  // Deprecated notice
24
  _deprecated_function( __FUNCTION__, '1.6.0', 'DLM_Logging->create_log()' );
@@ -34,4 +34,4 @@ function dlm_create_log( $type = '', $status = '', $message = '', $download, $ve
34
 
35
  }
36
 
37
- }
10
  *
11
  * @deprecated 1.6.0
12
  *
13
+ * @param string $type
14
+ * @param string $status
15
+ * @param string $message
16
  * @param mixed $download
17
  * @param mixed $version
18
  *
19
  * @return void
20
  */
21
+ function dlm_create_log( $type, $status, $message, $download, $version ) {
22
 
23
  // Deprecated notice
24
  _deprecated_function( __FUNCTION__, '1.6.0', 'DLM_Logging->create_log()' );
34
 
35
  }
36
 
37
+ }
includes/tracking/class-download-monitor-usage-tracker.php ADDED
@@ -0,0 +1,1303 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This is the class that sends all the data back to the home site
4
+ * It also handles opting in and deactivation
5
+ *
6
+ * @version 1.2.5
7
+ *
8
+ * @package dlm
9
+ */
10
+
11
+ // Exit if accessed directly.
12
+ if ( ! defined( 'ABSPATH' ) ) {
13
+ exit;
14
+ }
15
+
16
+ if ( ! class_exists( 'Download_Monitor_Usage_Tracker' ) ) {
17
+
18
+ /**
19
+ * Main class for our usage tracker
20
+ */
21
+ class Download_Monitor_Usage_Tracker {
22
+
23
+ /**
24
+ * Current wisdom plugin version.
25
+ *
26
+ * @var string
27
+ */
28
+
29
+ private $wisdom_version = '1.2.4';
30
+
31
+ /**
32
+ * Receiver url
33
+ *
34
+ * @var string
35
+ */
36
+ private $home_url = '';
37
+
38
+ /**
39
+ * File path for plugin
40
+ *
41
+ * @var string
42
+ */
43
+ private $plugin_file = '';
44
+
45
+ /**
46
+ * Plugin name
47
+ *
48
+ * @var string
49
+ */
50
+ private $plugin_name = '';
51
+
52
+ /**
53
+ * Plugin options to track
54
+ *
55
+ * @var array
56
+ */
57
+ private $options = array();
58
+
59
+ /**
60
+ * Where user opt-in is requireed
61
+ *
62
+ * @var bool
63
+ */
64
+ private $require_optin = true;
65
+
66
+ /**
67
+ * Whether to include a for when the user deactivates
68
+ *
69
+ * @var bool
70
+ */
71
+ private $include_goodbye_form = true;
72
+
73
+ /**
74
+ * Marketing method:
75
+ * 0: Don't collect email addresses
76
+ * 1: Request permission same time as tracking opt-in
77
+ * 2: Request permission after opt-in
78
+ *
79
+ * @var bool
80
+ */
81
+ private $marketing = false;
82
+
83
+ /**
84
+ * Collect email
85
+ *
86
+ * @var bool
87
+ */
88
+ private $collect_email = false;
89
+
90
+ /**
91
+ * Tracking object
92
+ *
93
+ * @var string
94
+ */
95
+ private $what_am_i = 'plugin';
96
+
97
+ /**
98
+ * If theme and tracking
99
+ *
100
+ * @var bool
101
+ */
102
+ private $theme_allows_tracking = 0;
103
+
104
+ /**
105
+ * Tracking object
106
+ *
107
+ * @var string
108
+ */
109
+ private $active_plugins = array();
110
+
111
+ /**
112
+ * Main construct function for our class
113
+ *
114
+ * @param string $_plugin_file plugin file.
115
+ * @param string $_home_url homepage url.
116
+ * @param array $_options array.
117
+ * @param bool $_require_optin defaults to true.
118
+ * @param bool $_include_goodbye_form defaults to true.
119
+ * @param bool $_marketing defauts to false.
120
+ */
121
+ public function __construct(
122
+ $_plugin_file,
123
+ $_home_url,
124
+ $_options,
125
+ $_require_optin = true,
126
+ $_include_goodbye_form = true,
127
+ $_marketing = false ) {
128
+
129
+ $this->plugin_file = $_plugin_file;
130
+ $this->home_url = trailingslashit( $_home_url );
131
+
132
+ // If the filename is 'functions' then we're tracking a theme.
133
+ if ( basename( $this->plugin_file, '.php' ) != 'functions' ) {
134
+ $this->plugin_name = 'download-monitor';
135
+ }
136
+
137
+ $this->options = $_options;
138
+ $this->require_optin = $_require_optin;
139
+ $this->include_goodbye_form = $_include_goodbye_form;
140
+ $this->marketing = $_marketing;
141
+
142
+ $this->active_plugins = get_option( 'active_plugins', array() );
143
+
144
+
145
+ register_activation_hook( $this->plugin_file, array( $this, 'schedule_tracking' ) );
146
+ register_deactivation_hook( $this->plugin_file, array( $this, 'deactivate_this_plugin' ) );
147
+
148
+ // Get it going.
149
+ $this->init();
150
+
151
+ }
152
+
153
+ /**
154
+ * Init function hooked to construct.
155
+ */
156
+ public function init() {
157
+
158
+ // Check marketing.
159
+ if ( 3 === $this->marketing ) {
160
+ $this->set_can_collect_email( true, $this->plugin_name );
161
+ }
162
+
163
+ // Check whether opt-in is required.
164
+ // If not, then tracking is allowed.
165
+ if ( ! $this->require_optin ) {
166
+ $this->set_can_collect_email( true, $this->plugin_name );
167
+ $this->set_is_tracking_allowed( true );
168
+ $this->update_block_notice();
169
+ $this->do_tracking();
170
+ }
171
+
172
+ // Hook our do_tracking function to the weekly action.
173
+ add_filter( 'cron_schedules', array( $this, 'schedule_weekly_event' ) );
174
+ // It's called weekly, but in fact it could be daily, weekly or monthly.
175
+ add_action( 'wpchill_do_weekly_action', array( $this, 'do_tracking' ) );
176
+
177
+ // Use this action for local testing.
178
+ //add_action( 'admin_init', array( $this, 'do_tracking' ) );
179
+
180
+ // Display the admin notice on activation.
181
+ add_action( 'admin_init', array( $this, 'set_notification_time' ) );
182
+ add_action( 'admin_notices', array( $this, 'optin_notice' ) );
183
+ add_action( 'admin_notices', array( $this, 'marketing_notice' ) );
184
+
185
+ // Deactivation.
186
+ add_filter( 'plugin_action_links_' . plugin_basename( $this->plugin_file ), array( $this, 'filter_action_links' ) );
187
+ add_action( 'admin_footer-plugins.php', array( $this, 'goodbye_ajax' ) );
188
+ add_action( 'wp_ajax_'.$this->plugin_name.'_goodbye_form', array( $this, 'goodbye_form_callback' ) );
189
+
190
+ add_filter( 'dlm_uninstall_db_options', array( $this, 'uninstall_options' ) );
191
+
192
+ add_filter( 'dlm_settings', array( $this, 'optin_tracking' ), 30, 1 );
193
+
194
+ add_filter( 'dlm_settings_defaults', array( $this, 'default_tracking' ) );
195
+
196
+ }
197
+
198
+ /**
199
+ * When the plugin is activated
200
+ * Create scheduled event
201
+ * And check if tracking is enabled - perhaps the plugin has been reactivated
202
+ *
203
+ * @since 1.0.0
204
+ */
205
+ public function schedule_tracking() {
206
+ if ( ! wp_next_scheduled( 'wpchill_do_weekly_action' ) ) {
207
+ $schedule = $this->get_schedule();
208
+ wp_schedule_event( time(), $schedule, 'wpchill_do_weekly_action' );
209
+ }
210
+ $this->do_tracking();
211
+ }
212
+
213
+ /**
214
+ * Create weekly schedule.
215
+ *
216
+ * @param array $schedules schedules intervals.
217
+ *
218
+ * @since 1.2.3
219
+ */
220
+ public function schedule_weekly_event( $schedules ) {
221
+ $schedules['weekly'] = array(
222
+ 'interval' => 604800,
223
+ 'display' => __( 'Once Weekly' ),
224
+ );
225
+ $schedules['monthly'] = array(
226
+ 'interval' => 2635200,
227
+ 'display' => __( 'Once Monthly' ),
228
+ );
229
+ return $schedules;
230
+ }
231
+
232
+ /**
233
+ * Get how frequently data is tracked back
234
+ *
235
+ * @since 1.2.3
236
+ */
237
+ public function get_schedule() {
238
+ // Could be daily, weekly or monthly.
239
+ $schedule = apply_filters( 'wisdom_filter_schedule_' . $this->plugin_name, 'monthly' );
240
+ return $schedule;
241
+ }
242
+
243
+ /**
244
+ * This is our function to get everything going
245
+ * Check that user has opted in
246
+ * Collect data
247
+ * Then send it back
248
+ *
249
+ * // FOR TESTING PURPOSES FORCE IS SET TO TRUE. BY DEFAULT IT IS FALSE .
250
+ *
251
+ * @since 1.0.0
252
+ */
253
+ public function do_tracking() {
254
+
255
+ // If the home site hasn't been defined, we just drop out. Nothing much we can do.
256
+ if ( ! $this->home_url ) {
257
+ return;
258
+ }
259
+
260
+ // Check to see if the user has opted in to tracking.
261
+ if ( ! $this->get_is_tracking_allowed() ) {
262
+ return;
263
+ }
264
+
265
+ $this->set_admin_email();
266
+
267
+ // Get our data.
268
+ $body = $this->get_data();
269
+
270
+ // Send the data.
271
+ $this->send_data( $body );
272
+
273
+ }
274
+
275
+
276
+ /**
277
+ * Send the data to the home site
278
+ *
279
+ * @since 1.0.0
280
+ *
281
+ * @param array $body body of the post.
282
+ */
283
+ public function send_data( $body ) {
284
+
285
+ $request = wp_remote_post(
286
+ esc_url( $this->home_url . '?usage_tracker=hello' ),
287
+ array(
288
+ 'method' => 'POST',
289
+ 'timeout' => 20,
290
+ 'redirection' => 5,
291
+ 'httpversion' => '1.1',
292
+ 'blocking' => true,
293
+ 'body' => $body,
294
+ 'user-agent' => 'PUT/1.0.0; ' . home_url(),
295
+ )
296
+ );
297
+ ini_set( 'xdebug.var_display_max_depth', '100' );
298
+ ini_set( 'xdebug.var_display_max_children', '25006' );
299
+ ini_set( 'xdebug.var_display_max_data', '102004' );
300
+
301
+ $this->set_track_time();
302
+
303
+ if ( is_wp_error( $request ) ) {
304
+ return $request;
305
+ }
306
+
307
+ }
308
+
309
+ /**
310
+ * Here we collect most of the data
311
+ *
312
+ * @since 1.0.0
313
+ */
314
+ public function get_data() {
315
+
316
+ // Use this to pass error messages back if necessary.
317
+ $body['message'] = '';
318
+
319
+ // Use this array to send data back.
320
+ $body = array(
321
+ 'plugin_slug' => sanitize_text_field( $this->plugin_name ),
322
+ 'url' => home_url(),
323
+ 'site_name' => get_bloginfo( 'name' ),
324
+ 'site_version' => get_bloginfo( 'version' ),
325
+ 'site_language' => get_bloginfo( 'language' ),
326
+ 'charset' => get_bloginfo( 'charset' ),
327
+ 'wisdom_version' => $this->wisdom_version,
328
+ 'php_version' => ( defined( 'PHP_VERSION' ) ) ? PHP_VERSION : phpversion(),
329
+ 'multisite' => is_multisite(),
330
+ 'file_location' => __FILE__,
331
+ 'product_type' => esc_html( $this->what_am_i ),
332
+ );
333
+
334
+ // Collect the email if the correct option has been set.
335
+ if ( $this->get_can_collect_email() ) {
336
+ $body['email'] = $this->get_admin_email();
337
+ }
338
+ $body['marketing_method'] = $this->marketing;
339
+
340
+ $body['server'] = isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : '';
341
+
342
+ // Extra PHP fields.
343
+ $body['memory_limit'] = ini_get( 'memory_limit' );
344
+ $body['upload_max_size'] = ini_get( 'upload_max_size' );
345
+ $body['post_max_size'] = ini_get( 'post_max_size' );
346
+ $body['upload_max_filesize'] = ini_get( 'upload_max_filesize' );
347
+ $body['max_execution_time'] = ini_get( 'max_execution_time' );
348
+ $body['max_input_time'] = ini_get( 'max_input_time' );
349
+
350
+ // Retrieve current plugin information.
351
+ if ( ! function_exists( 'get_plugins' ) ) {
352
+ include ABSPATH . '/wp-admin/includes/plugin.php';
353
+ }
354
+
355
+ $plugins = array_keys( get_plugins() );
356
+
357
+ foreach ( $plugins as $key => $plugin ) {
358
+ if ( in_array( $plugin, $this->active_plugins ) ) {
359
+ // Remove active plugins from list so we can show active and inactive separately.
360
+ unset( $plugins[ $key ] );
361
+ }
362
+ }
363
+
364
+ $body['active_plugins'] = $this->active_plugins;
365
+ $body['inactive_plugins'] = $plugins;
366
+
367
+ // Check text direction.
368
+ $body['text_direction'] = 'LTR';
369
+ if ( function_exists( 'is_rtl' ) ) {
370
+ if ( is_rtl() ) {
371
+ $body['text_direction'] = 'RTL';
372
+ }
373
+ } else {
374
+ $body['text_direction'] = 'not set';
375
+ }
376
+
377
+ /**
378
+ * Get our plugin data
379
+ * Currently we grab plugin name and version
380
+ * Or, return a message if the plugin data is not available
381
+ *
382
+ * @since 1.0.0
383
+ */
384
+ $plugin = $this->plugin_data();
385
+ $body['status'] = 'Active'; // Never translated.
386
+ if ( empty( $plugin ) ) {
387
+ // We can't find the plugin data.
388
+ // Send a message back to our home site.
389
+ $body['message'] .= esc_html( 'We can\'t detect any product information. This is most probably because you have not included the code snippet.');
390
+ $body['status'] = 'Data not found'; // Never translated.
391
+ } else {
392
+ if ( isset( $plugin['Name'] ) ) {
393
+ $body['plugin'] = sanitize_text_field( $plugin['Name'] );
394
+ }
395
+ if ( isset( $plugin['Version'] ) ) {
396
+ $body['version'] = sanitize_text_field( $plugin['Version'] );
397
+ }
398
+ }
399
+
400
+ /**
401
+ * Get our plugin options
402
+ *
403
+ * @since 1.0.0
404
+ */
405
+ $options = $this->options;
406
+ $plugin_options = array();
407
+ if ( ! empty( $options ) && is_array( $options ) ) {
408
+ foreach ( $options as $option ) {
409
+ $fields = get_option( $option );
410
+ // Check for permission to send this option.
411
+ if ( isset( $fields['wisdom_registered_setting'] ) ) {
412
+ foreach ( $fields as $key => $value ) {
413
+ $plugin_options[ $key ] = $value;
414
+ }
415
+ }
416
+ }
417
+ }
418
+ $body['plugin_options'] = $this->options; // Returns array.
419
+ $body['plugin_options_fields'] = $plugin_options; // Returns object.
420
+
421
+ /**
422
+ * Get our theme data
423
+ * Currently we grab theme name and version
424
+ *
425
+ * @since 1.0.0
426
+ */
427
+ $theme = wp_get_theme();
428
+ if ( $theme->Name ) {
429
+ $body['theme'] = sanitize_text_field( $theme->Name );
430
+ }
431
+ if ( $theme->Version ) {
432
+ $body['theme_version'] = sanitize_text_field( $theme->Version );
433
+ }
434
+ if ( $theme->Template ) {
435
+ $body['theme_parent'] = sanitize_text_field( $theme->Template );
436
+ }
437
+
438
+ $body['download_monitor'] = $this->get_downloads();
439
+ // Return the data.
440
+ return $body;
441
+
442
+ }
443
+
444
+ /**
445
+ * Return plugin data
446
+ *
447
+ * @since 1.0.0
448
+ */
449
+ public function plugin_data() {
450
+ // Being cautious here.
451
+ if ( ! function_exists( 'get_plugin_data' ) ) {
452
+ include ABSPATH . '/wp-admin/includes/plugin.php';
453
+ }
454
+ // Retrieve current plugin information.
455
+ $plugin = get_plugin_data( $this->plugin_file );
456
+ return $plugin;
457
+ }
458
+
459
+ /**
460
+ * Deactivating plugin
461
+ *
462
+ * @since 1.0.0
463
+ */
464
+ public function deactivate_this_plugin() {
465
+ // Check to see if the user has opted in to tracking.
466
+ if ( $this->what_am_i == 'theme' ) {
467
+ $allow_tracking = $this->theme_allows_tracking;
468
+ } else {
469
+ $allow_tracking = $this->get_is_tracking_allowed();
470
+ }
471
+
472
+ if ( ! $allow_tracking ) {
473
+ return;
474
+ }
475
+
476
+ $body = $this->get_data();
477
+ $body['status'] = 'Deactivated'; // Never translated.
478
+ $body['deactivated_date'] = time();
479
+
480
+ // Add deactivation form data.
481
+ if ( false !== get_option( 'wisdom_deactivation_reason_' . $this->plugin_name ) ) {
482
+ $body['deactivation_reason'] = get_option( 'wisdom_deactivation_reason_' . $this->plugin_name );
483
+ }
484
+ if ( false !== get_option( 'wisdom_deactivation_details_' . $this->plugin_name ) ) {
485
+ $body['deactivation_details'] = get_option( 'wisdom_deactivation_details_' . $this->plugin_name );
486
+ }
487
+
488
+ $this->send_data( $body );
489
+
490
+ remove_action( 'wpchill_do_weekly_action', array( $this, 'do_tracking' ) );
491
+ // Clear scheduled update.
492
+ if ( ! has_action( 'wpchill_do_weekly_action' ) ) {
493
+ wp_clear_scheduled_hook( 'wpchill_do_weekly_action' );
494
+ }
495
+
496
+ // Clear the wisdom_last_track_time value for this plugin.
497
+ // @since 1.2.2
498
+ $track_time = get_option( 'download_monitor_wisdom_last_track_time' );
499
+ if ( isset( $track_time[ $this->plugin_name ] ) ) {
500
+ unset( $track_time[ $this->plugin_name ] );
501
+ }
502
+ update_option( 'download_monitor_wisdom_last_track_time', $track_time );
503
+
504
+ }
505
+
506
+ /**
507
+ * Is tracking allowed?
508
+ *
509
+ * @since 1.0.0
510
+ */
511
+ public function get_is_tracking_allowed() {
512
+
513
+ // First, check if the user has changed their mind and opted out of tracking.
514
+ if ( $this->has_user_opted_out() ) {
515
+ $this->set_is_tracking_allowed( false, $this->plugin_name );
516
+ return false;
517
+ }
518
+
519
+ if ( $this->what_am_i == 'theme' ) {
520
+
521
+ $mod = get_theme_mod( 'download_monitor-wisdom-allow-tracking', 0 );
522
+ if ( $mod ) {
523
+ return true;
524
+ }
525
+ } else {
526
+
527
+ // The wisdom_allow_tracking option is an array of plugins that are being tracked
528
+ $allow_tracking = get_option( $this->plugin_name . '_wisdom_tracking' );
529
+ if ( isset( $allow_tracking ) && '1' === $allow_tracking ) {
530
+ return true;
531
+ }
532
+ }
533
+
534
+ return false;
535
+ }
536
+
537
+ /**
538
+ * Set if tracking is allowed
539
+ * Option is an array of all plugins with tracking permitted
540
+ * More than one plugin may be using the tracker
541
+ *
542
+ * @since 1.0.0
543
+ * @param $is_allowed Boolean true if tracking is allowed, false if not
544
+ */
545
+ public function set_is_tracking_allowed( $is_allowed, $plugin = null ) {
546
+
547
+ if ( empty( $plugin ) ) {
548
+ $plugin = $this->plugin_name;
549
+ }
550
+
551
+ $block_notice = get_option( 'download_monitor_wisdom_block_notice' );
552
+ if ( isset( $block_notice[ $plugin ] ) ) {
553
+ return;
554
+ }
555
+
556
+ // The wisdom_allow_tracking option is an array of plugins that are being tracked.
557
+ $allow_tracking = get_option( $this->plugin_name . '_wisdom_tracking' );
558
+ $track = false;
559
+ // If the user has decided to opt out.
560
+ if ( $this->has_user_opted_out() ) {
561
+ if ( $this->what_am_i == 'theme' ) {
562
+ set_theme_mod( 'download_monitor-wisdom-allow-tracking', 0 );
563
+ } else {
564
+ if ( isset( $allow_tracking ) && '1' == $allow_tracking ) {
565
+ $track = false;
566
+ }
567
+ }
568
+
569
+ } else if ( $is_allowed || ! $this->require_optin ) {
570
+ // If the user has agreed to allow tracking or if opt-in is not required
571
+
572
+ if ( $this->what_am_i == 'theme' ) {
573
+ set_theme_mod( 'download_monitor-wisdom-allow-tracking', 1 );
574
+ } else {
575
+ if ( ! isset( $allow_tracking ) || '1' != $allow_tracking ) {
576
+ $track = true;
577
+ }
578
+ }
579
+
580
+ } else {
581
+ if ( $this->what_am_i == 'theme' ) {
582
+ set_theme_mod( 'download_monitor-wisdom-allow-tracking', 0 );
583
+ } else {
584
+ if ( isset( $allow_tracking ) && '1' === $allow_tracking ) {
585
+ $track = false;
586
+ }
587
+ }
588
+
589
+ }
590
+
591
+ if ( $track ) {
592
+ update_option( $this->plugin_name . '_wisdom_tracking', '1' );
593
+ } else {
594
+ delete_option( $this->plugin_name . '_wisdom_tracking' );
595
+ }
596
+
597
+ //update_option( 'download_monitor_troubleshooting_option', $allow_tracking );
598
+ }
599
+
600
+ /**
601
+ * Has the user opted out of allowing tracking?
602
+ * Note that themes are opt in / plugins are opt out
603
+ *
604
+ * @since 1.1.0
605
+ * @return Boolean
606
+ */
607
+ public function has_user_opted_out() {
608
+ // Different opt-out methods for plugins and themes
609
+ if( $this->what_am_i == 'theme' ) {
610
+ // Look for the theme mod
611
+ $mod = get_theme_mod( 'modula-wisdom-allow-tracking', 0 );
612
+ if( false === $mod ) {
613
+ // If the theme mod is not set, then return true - the user has opted out
614
+ return true;
615
+ }
616
+ } else {
617
+ // Iterate through the options that are being tracked looking for wisdom_opt_out setting
618
+ if( ! empty( $this->options ) ) {
619
+ foreach( $this->options as $option_name ) {
620
+ // Check each option
621
+ $options = get_option( $option_name );
622
+ // If we find the setting, return true
623
+ if( ! empty( $options['wisdom_opt_out'] ) ) {
624
+ return true;
625
+ }
626
+ }
627
+ }
628
+ }
629
+ return false;
630
+ }
631
+
632
+ /**
633
+ * Record the time we send tracking data
634
+ *
635
+ * @since 1.1.1
636
+ */
637
+ public function set_track_time() {
638
+ // We've tracked, so record the time.
639
+ $track_times = get_option( 'download_monitor_wisdom_last_track_time', array() );
640
+ // Set different times according to plugin, in case we are tracking multiple plugins.
641
+ $track_times[ $this->plugin_name ] = time();
642
+ update_option( 'download_monitor_wisdom_last_track_time', $track_times );
643
+ }
644
+
645
+ /**
646
+ * Set the time when we can display the opt-in notification
647
+ * Will display now unless filtered
648
+ *
649
+ * @since 1.2.4
650
+ */
651
+ public function set_notification_time() {
652
+ $notification_times = get_option( 'download_monitor_wisdom_notification_times', array() );
653
+ // Set different times according to plugin, in case we are tracking multiple plugins.
654
+ if ( ! isset( $notification_times[ $this->plugin_name ] ) ) {
655
+ $delay_notification = apply_filters( 'wisdom_delay_notification_' . $this->plugin_name, 0 );
656
+ // We can delay the notification time.
657
+ $notification_time = time() + absint( $delay_notification );
658
+ $notification_times[ $this->plugin_name ] = $notification_time;
659
+ update_option( 'download_monitor_wisdom_notification_times', $notification_times );
660
+ }
661
+ }
662
+
663
+ /**
664
+ * Get whether it's time to display the notification
665
+ *
666
+ * @since 1.2.4
667
+ * @return Boolean
668
+ */
669
+ public function get_is_notification_time() {
670
+ $notification_times = get_option( 'download_monitor_wisdom_notification_times', array() );
671
+ $time = time();
672
+ // Set different times according to plugin, in case we are tracking multiple plugins.
673
+ if ( isset( $notification_times[ $this->plugin_name ] ) ) {
674
+ $notification_time = $notification_times[ $this->plugin_name ];
675
+ if ( $time >= $notification_time ) {
676
+ return true;
677
+ }
678
+ }
679
+ return false;
680
+ }
681
+
682
+ /**
683
+ * Set if we should block the opt-in notice for this plugin
684
+ * Option is an array of all plugins that have received a response from the user
685
+ *
686
+ * @since 1.0.0
687
+ */
688
+ public function update_block_notice( $plugin = null ) {
689
+ if ( empty( $plugin ) ) {
690
+ $plugin = $this->plugin_name;
691
+ }
692
+ $block_notice = get_option( 'download_monitor_wisdom_block_notice' );
693
+ if ( empty( $block_notice ) || ! is_array( $block_notice ) ) {
694
+ // If nothing exists in the option yet, start a new array with the plugin name.
695
+ $block_notice = array( $plugin => $plugin );
696
+ } else {
697
+ // Else add the plugin name to the array.
698
+ $block_notice[ $plugin ] = $plugin;
699
+ }
700
+ update_option( 'download_monitor_wisdom_block_notice', $block_notice );
701
+ }
702
+
703
+ /**
704
+ * Can we collect the email address?
705
+ *
706
+ * @since 1.0.0
707
+ */
708
+ public function get_can_collect_email() {
709
+ // The wisdom_collect_email option is an array of plugins that are being tracked.
710
+ $collect_email = get_option( 'download_monitor_wisdom_collect_email' );
711
+ // If this plugin is in the array, then we can collect the email address.
712
+ if ( isset( $collect_email[ $this->plugin_name ] ) ) {
713
+ return true;
714
+ }
715
+ return false;
716
+ }
717
+
718
+ /**
719
+ * Set if user has allowed us to collect their email address
720
+ * Option is an array of all plugins with email collection permitted
721
+ * More than one plugin may be using the tracker
722
+ *
723
+ * @since 1.0.0
724
+ * @param $can_collect Boolean true if collection is allowed, false if not
725
+ */
726
+ public function set_can_collect_email( $can_collect, $plugin = null ) {
727
+ if ( empty( $plugin ) ) {
728
+ $plugin = $this->plugin_name;
729
+ }
730
+ // The wisdom_collect_email option is an array of plugins that are being tracked.
731
+ $collect_email = get_option( 'download_monitor_wisdom_collect_email' );
732
+ // If the user has agreed to allow tracking or if opt-in is not required.
733
+ if ( $can_collect ) {
734
+ if ( empty( $collect_email ) || ! is_array( $collect_email ) ) {
735
+ // If nothing exists in the option yet, start a new array with the plugin name.
736
+ $collect_email = array( $plugin => $plugin );
737
+ } else {
738
+ // Else add the plugin name to the array.
739
+ $collect_email[ $plugin ] = $plugin;
740
+ }
741
+ } else {
742
+ if ( isset( $collect_email[ $plugin ] ) ) {
743
+ unset( $collect_email[ $plugin ] );
744
+ }
745
+ }
746
+ update_option( 'download_monitor_wisdom_collect_email', $collect_email );
747
+ }
748
+
749
+ /**
750
+ * Get the correct email address to use
751
+ *
752
+ * @since 1.1.2
753
+ * @return Email address
754
+ */
755
+ public function get_admin_email() {
756
+ // The wisdom_collect_email option is an array of plugins that are being tracked.
757
+ $email = get_option( 'download_monitor_wisdom_admin_emails' );
758
+ // If this plugin is in the array, then we can collect the email address.
759
+ if ( isset( $email[ $this->plugin_name ] ) ) {
760
+ return $email[ $this->plugin_name ];
761
+ }
762
+ return false;
763
+ }
764
+
765
+ /**
766
+ * Set the correct email address to use
767
+ * There might be more than one admin on the site
768
+ * So we only use the first admin's email address
769
+ *
770
+ * @param $email Email address to set
771
+ * @param $plugin Plugin name to set email address for
772
+ * @since 1.1.2
773
+ */
774
+ public function set_admin_email( $email = null, $plugin = null ) {
775
+ if ( empty( $plugin ) ) {
776
+ $plugin = $this->plugin_name;
777
+ }
778
+ // If no email address passed, try to get the current user's email.
779
+ if ( empty( $email ) ) {
780
+ // Have to check that current user object is available.
781
+ if ( function_exists( 'wp_get_current_user' ) ) {
782
+ $current_user = wp_get_current_user();
783
+ $email = $current_user->user_email;
784
+ }
785
+ }
786
+ // The wisdom_admin_emails option is an array of admin email addresses.
787
+ $admin_emails = get_option( 'wisdom_admin_emails' );
788
+ if ( empty( $admin_emails ) || ! is_array( $admin_emails ) ) {
789
+ // If nothing exists in the option yet, start a new array with the plugin name.
790
+ $admin_emails = array( $plugin => sanitize_email( $email ) );
791
+ } elseif ( empty( $admin_emails[ $plugin ] ) ) {
792
+ // Else add the email address to the array, if not already set.
793
+ $admin_emails[ $plugin ] = sanitize_email( $email );
794
+ }
795
+ update_option( 'download_monitor_wisdom_admin_emails', $admin_emails );
796
+ }
797
+
798
+ /**
799
+ * Display the admin notice to users to allow them to opt in
800
+ *
801
+ * @since 1.0.0
802
+ */
803
+ public function optin_notice() {
804
+
805
+ // Check for plugin args.
806
+ if ( isset( $_GET['plugin'] ) && $this->plugin_name === $_GET['plugin'] && isset( $_GET['plugin_action'] ) ) {
807
+
808
+ $action = sanitize_text_field( $_GET['plugin_action'] );
809
+ if ( $action === 'yes' ) {
810
+ $this->set_is_tracking_allowed( true, $this->plugin_name );
811
+ // Run this straightaway.
812
+ add_action( 'admin_init', array( $this, 'do_tracking' ) );
813
+ } else {
814
+ $this->set_is_tracking_allowed( false, $this->plugin_name );
815
+ }
816
+ $this->update_block_notice( $this->plugin_name );
817
+ }
818
+
819
+ // Is it time to display the notification?.
820
+ $is_time = $this->get_is_notification_time();
821
+
822
+ if ( ! $is_time ) {
823
+ return false;
824
+ }
825
+
826
+ // Check whether to block the notice, e.g. because we're in a local environment.
827
+ // wisdom_block_notice works the same as wisdom_allow_tracking, an array of plugin names.
828
+ $block_notice = get_option( 'download_monitor_wisdom_block_notice' );
829
+
830
+ if ( isset( $block_notice[ $this->plugin_name ] ) ) {
831
+ return;
832
+ }
833
+
834
+ if ( ! current_user_can( 'manage_options' ) ) {
835
+ return;
836
+ }
837
+
838
+ // @credit EDD.
839
+ // Don't bother asking user to opt in if they're in local dev.
840
+ $is_local = false;
841
+ if ( stristr( network_site_url( '/' ), '.dev' ) !== false || stristr( network_site_url( '/' ), 'localhost' ) !== false || stristr( network_site_url( '/' ), ':8888' ) !== false ) {
842
+ $is_local = true;
843
+ }
844
+ $is_local = apply_filters( 'wisdom_is_local_' . $this->plugin_name, $is_local );
845
+ if ( $is_local ) {
846
+ $this->update_block_notice();
847
+ } else {
848
+
849
+ // Display the notice requesting permission to track.
850
+ // Retrieve current plugin information.
851
+ $plugin = $this->plugin_data();
852
+ $plugin_name = $plugin['Name'];
853
+
854
+ // Args to add to query if user opts in to tracking.
855
+ $yes_args = array(
856
+ 'plugin' => $this->plugin_name,
857
+ 'plugin_action' => 'yes',
858
+ );
859
+
860
+ // Decide how to request permission to collect email addresses.
861
+ if ( $this->marketing == 1 ) {
862
+ // Option 1 combines permissions to track and collect email.
863
+ $yes_args['marketing_optin'] = 'no';
864
+ } elseif ( $this->marketing == 2 ) {
865
+ // Option 2 enables a second notice that fires after the user opts in to tracking.
866
+ $yes_args['marketing'] = 'no';
867
+ }
868
+ $url_yes = add_query_arg( $yes_args );
869
+ $url_no = add_query_arg(
870
+ array(
871
+ 'plugin' => $this->plugin_name,
872
+ 'plugin_action' => 'no',
873
+ )
874
+ );
875
+
876
+ // Decide on notice text.
877
+ if ( $this->marketing != 1 ) {
878
+ // Standard notice text.
879
+ $notice_text = sprintf(
880
+ __( 'Thank you for installing our %1$s. We would like to track its usage on your site. We don\'t record any sensitive data, only information regarding the WordPress environment and %1$s settings, which we will use to help us make improvements to the %1$s. Tracking is completely optional. You can always opt out by going to Settings-> Advanced-> Tracking and uncheck the track data field.', 'download-monitor' ),
881
+ $this->what_am_i
882
+ );
883
+ } else {
884
+ // If we have option 1 for marketing, we include reference to sending product information here.
885
+ $notice_text = sprintf(
886
+ __( 'Thank you for installing our %1$s. We\'d like your permission to track its usage on your site and subscribe you to our newsletter. We won\'t record any sensitive data, only information regarding the WordPress environment and %1$s settings, which we will use to help us make improvements to the %1$s. Tracking is completely optional.You can always opt out by going to Settings-> Advanced-> Tracking and uncheck the track data field.', 'download-monitor' ),
887
+ $this->what_am_i
888
+ );
889
+ }
890
+ // And we allow you to filter the text anyway.
891
+ $notice_text = apply_filters( 'wisdom_notice_text_' . esc_attr( $this->plugin_name ), $notice_text ); ?>
892
+
893
+ <div class="notice notice-info updated put-dismiss-notice">
894
+ <p><?php echo '<strong>' . esc_html( $plugin_name ) . '</strong>'; ?></p>
895
+ <p><?php echo esc_html( $notice_text ); ?></p>
896
+ <p>
897
+ <a href="<?php echo esc_url( $url_yes ); ?>" class="button-secondary"><?php _e( 'Allow', 'download-monitor' ); ?></a>
898
+ <a href="<?php echo esc_url( $url_no ); ?>" class="button-secondary"><?php _e( 'Do Not Allow', 'download-monitor' ); ?></a>
899
+ </p>
900
+ </div>
901
+ <?php
902
+ }
903
+
904
+ }
905
+
906
+ /**
907
+ * Display the marketing notice to users if enabled
908
+ * Only displays after the user has opted in to tracking
909
+ *
910
+ * @since 1.0.0
911
+ */
912
+ public function marketing_notice() {
913
+ // Check if user has opted in to marketing.
914
+ if ( isset( $_GET['marketing_optin'] ) ) {
915
+ // Set marketing optin.
916
+ $this->set_can_collect_email( sanitize_text_field( $_GET['marketing_optin'] ), $this->plugin_name );
917
+ // Do tracking.
918
+ $this->do_tracking();
919
+ } elseif ( isset( $_GET['marketing'] ) && $_GET['marketing'] == 'yes' ) {
920
+ // Display the notice requesting permission to collect email address.
921
+ // Retrieve current plugin information.
922
+ $plugin = $this->plugin_data();
923
+ $plugin_name = $plugin['Name'];
924
+
925
+ $url_yes = add_query_arg(
926
+ array(
927
+ 'plugin' => $this->plugin_name,
928
+ 'marketing_optin' => 'yes',
929
+ )
930
+ );
931
+ $url_no = add_query_arg(
932
+ array(
933
+ 'plugin' => $this->plugin_name,
934
+ 'marketing_optin' => 'no',
935
+ )
936
+ );
937
+
938
+ $marketing_text = sprintf(
939
+ __( 'Thank you for opting in to tracking. Would you like to receive occasional news about this %s, including details of new features and special offers?', 'download-monitor' ),
940
+ $this->what_am_i
941
+ );
942
+ $marketing_text = apply_filters( 'wisdom_marketing_text_' . esc_attr( $this->plugin_name ), $marketing_text );
943
+ ?>
944
+
945
+ <div class="notice notice-info updated put-dismiss-notice">
946
+ <p><?php echo '<strong>' . esc_html( $plugin_name ) . '</strong>'; ?></p>
947
+ <p><?php echo esc_html( $marketing_text ); ?></p>
948
+ <p>
949
+ <a href="<?php echo esc_url( $url_yes ); ?>" data-putnotice="yes" class="button-secondary"><?php _e( 'Yes Please', 'download-monitor' ); ?></a>
950
+ <a href="<?php echo esc_url( $url_no ); ?>" data-putnotice="no" class="button-secondary"><?php _e( 'No Thank You', 'download-monitor' ); ?></a>
951
+ </p>
952
+ </div>
953
+ <?php
954
+ }
955
+ }
956
+
957
+ /**
958
+ * Filter the deactivation link to allow us to present a form when the user deactivates the plugin
959
+ *
960
+ * @since 1.0.0
961
+ */
962
+ public function filter_action_links( $links ) {
963
+
964
+ // Check to see if the user has opted in to tracking.
965
+ if ( ! $this->get_is_tracking_allowed() ) {
966
+ return $links;
967
+ }
968
+
969
+ if ( isset( $links['deactivate'] ) && $this->include_goodbye_form ) {
970
+ $deactivation_link = $links['deactivate'];
971
+ // Insert an onClick action to allow form before deactivating.
972
+ $deactivation_link = str_replace( '<a ', '<div class="' . esc_attr( $this->plugin_name ) . '-put-goodbye-form-wrapper"><span class="' . esc_attr( $this->plugin_name ) . '-put-goodbye-form" id="' . esc_attr( $this->plugin_name ) . '-put-goodbye-form"></span></div><a onclick="javascript:event.preventDefault();" id="' . esc_attr( $this->plugin_name ) . '-put-goodbye-link" ', $deactivation_link );
973
+ $links['deactivate'] = $deactivation_link;
974
+ }
975
+
976
+ return $links;
977
+ }
978
+
979
+ /*
980
+ * Form text strings
981
+ * These are non-filterable and used as fallback in case filtered strings aren't set correctly
982
+ * @since 1.0.0
983
+ */
984
+ public function form_default_text() {
985
+ $form = array();
986
+ $form['heading'] = __( 'Sorry to see you go', 'download-monitor' );
987
+ $form['body'] = __( 'Before you deactivate the plugin, would you quickly give us your reason for doing so?', 'download-monitor' );
988
+ $form['options'] = array(
989
+ __( 'Set up is too difficult', 'download-monitor' ),
990
+ __( 'Lack of documentation', 'download-monitor' ),
991
+ __( 'Not the features I wanted', 'download-monitor' ),
992
+ __( 'Found a better plugin', 'download-monitor' ),
993
+ __( 'Installed by mistake', 'download-monitor' ),
994
+ __( 'Only required temporarily', 'download-monitor' ),
995
+ __( 'Didn\'t work', 'download-monitor' ),
996
+ );
997
+ $form['details'] = __( 'Details (optional)', 'download-monitor' );
998
+ return $form;
999
+ }
1000
+
1001
+ /**
1002
+ * Form text strings
1003
+ * These can be filtered
1004
+ * The filter hook must be unique to the plugin
1005
+ *
1006
+ * @since 1.0.0
1007
+ */
1008
+ public function form_filterable_text() {
1009
+ $form = $this->form_default_text();
1010
+ return apply_filters( 'wisdom_form_text_' . esc_attr( $this->plugin_name ), $form );
1011
+ }
1012
+
1013
+ /**
1014
+ * Form text strings
1015
+ * These can be filtered
1016
+ *
1017
+ * @since 1.0.0
1018
+ */
1019
+ public function goodbye_ajax() {
1020
+ // Get our strings for the form
1021
+ $form = $this->form_filterable_text();
1022
+
1023
+ if ( ! isset( $form['heading'] ) || ! isset( $form['body'] ) || ! isset( $form['options'] ) || ! is_array( $form['options'] ) || ! isset( $form['details'] ) ) {
1024
+ // If the form hasn't been filtered correctly, we revert to the default form.
1025
+ $form = $this->form_default_text();
1026
+ }
1027
+ // Build the HTML to go in the form.
1028
+ $html = '<div class="'.esc_attr($this->plugin_name).'-put-goodbye-form-head"><strong>' . esc_html( $form['heading'] ) . '</strong></div>';
1029
+ $html .= '<div class="'.esc_attr($this->plugin_name).'-put-goodbye-form-body"><p>' . esc_html( $form['body'] ) . '</p>';
1030
+
1031
+ if ( is_array( $form['options'] ) ) {
1032
+
1033
+ $html .= '<div class="'.esc_attr($this->plugin_name).'-put-goodbye-options"><p>';
1034
+ foreach ( $form['options'] as $option ) {
1035
+ $html .= '<input type="checkbox" name="'.esc_attr($this->plugin_name).'-put-goodbye-options[]" id="' . str_replace( ' ', '', esc_attr( $option ) ) . '" value="' . esc_attr( $option ) . '"> <label for="' . str_replace( ' ', '', esc_attr( $option ) ) . '">' . esc_html( $option ) . '</label><br>';
1036
+ }
1037
+ $html .= '</p><label for="'.esc_attr($this->plugin_name).'-put-goodbye-reasons">' . esc_html( $form['details'] ) . '</label><textarea name="'.esc_attr($this->plugin_name).'-put-goodbye-reasons" id="'.esc_attr($this->plugin_name).'-put-goodbye-reasons" rows="2" style="width:100%"></textarea>';
1038
+ $html .= '</div><!-- .put-goodbye-options -->';
1039
+ }
1040
+
1041
+ $html .= '</div><!-- .put-goodbye-form-body -->';
1042
+ $html .= '<p class="'.esc_attr($this->plugin_name).'-deactivating-spinner"><span class="spinner"></span> ' . __( 'Submitting form', 'download-monitor' ) . '</p>';
1043
+ ?>
1044
+ <div class="<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form-bg"></div>
1045
+ <style type="text/css">
1046
+ .<?php echo esc_attr($this->plugin_name); ?>-put-form-active .<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form-bg {
1047
+ background: rgba( 0, 0, 0, .5 );
1048
+ position: fixed;
1049
+ top: 0;
1050
+ left: 0;
1051
+ width: 100%;
1052
+ height: 100%;
1053
+ }
1054
+ .<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form-wrapper {
1055
+ position: fixed;
1056
+ z-index: 999;
1057
+ display: none;
1058
+ top:0;
1059
+ bottom:0;
1060
+ left:0;
1061
+ right:0;
1062
+ width:100vw;
1063
+ height:100vh;
1064
+ }
1065
+ .<?php echo esc_attr($this->plugin_name); ?>-put-form-active .<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form-wrapper {
1066
+ display: block;
1067
+ }
1068
+ .<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form {
1069
+ display: none;
1070
+ }
1071
+ .<?php echo esc_attr($this->plugin_name); ?>-put-form-active .<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form {
1072
+ position: absolute;
1073
+ left:0;
1074
+ right:0;
1075
+ margin:0 auto;
1076
+ max-width: 400px;
1077
+ background: #fff;
1078
+ white-space: normal;
1079
+ top:50%;
1080
+ transform: translateY(-50%);
1081
+ }
1082
+ .<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form-head {
1083
+ background: #0073aa;
1084
+ color: #fff;
1085
+ padding: 8px 18px;
1086
+ }
1087
+ .<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form-body {
1088
+ padding: 8px 18px;
1089
+ color: #444;
1090
+ }
1091
+ .<?php echo esc_attr($this->plugin_name); ?>-deactivating-spinner {
1092
+ display: none;
1093
+ }
1094
+ .<?php echo esc_attr($this->plugin_name); ?>-deactivating-spinner .spinner {
1095
+ float: none;
1096
+ margin: 4px 4px 0 18px;
1097
+ vertical-align: bottom;
1098
+ visibility: visible;
1099
+ }
1100
+ .<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form-footer {
1101
+ padding: 8px 18px;
1102
+ }
1103
+ </style>
1104
+ <script>
1105
+ jQuery( document ).ready( function ( $ ) {
1106
+
1107
+ var url = document.getElementById( "<?php echo esc_attr( $this->plugin_name ); ?>-put-goodbye-link" );
1108
+
1109
+ $( "#<?php echo esc_attr( $this->plugin_name ); ?>-put-goodbye-link" ).on( "click", function () {
1110
+ // We'll send the user to this deactivation link when they've completed or dismissed the form.
1111
+ $( 'body' ).toggleClass( '<?php echo esc_attr($this->plugin_name); ?>-put-form-active' );
1112
+ $( "#<?php echo esc_attr( $this->plugin_name ); ?>-put-goodbye-form" ).fadeIn();
1113
+ $( "#<?php echo esc_attr( $this->plugin_name ); ?>-put-goodbye-form" ).html( '<?php echo $html; ?>' + '<div class="<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form-footer"><p><a id="<?php echo esc_attr($this->plugin_name); ?>-put-submit-form" class="button primary" href="#"><?php _e( 'Submit and Deactivate', 'download-monitor' ); ?></a>&nbsp;<a class="secondary button" href="' + url + '"><?php _e( 'Just Deactivate', 'download-monitor' ); ?></a></p></div>' );
1114
+ } );
1115
+
1116
+ $( "#<?php echo esc_attr( $this->plugin_name ); ?>-put-goodbye-form" ).on( "click", "#<?php echo esc_attr( $this->plugin_name ); ?>-put-submit-form", function ( e ) {
1117
+ // As soon as we click, the body of the form should disappear.
1118
+ $( "#<?php echo esc_attr( $this->plugin_name ); ?>-put-goodbye-form .<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form-body" ).fadeOut();
1119
+ $( "#<?php echo esc_attr( $this->plugin_name ); ?>-put-goodbye-form .<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form-footer" ).fadeOut();
1120
+ // Fade in spinner.
1121
+ $( "#<?php echo esc_attr( $this->plugin_name ); ?>-put-goodbye-form .<?php echo esc_attr($this->plugin_name); ?>-deactivating-spinner" ).fadeIn();
1122
+ e.preventDefault();
1123
+
1124
+ var values = new Array();
1125
+ $.each( $( "input[name='<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-options[]']:checked" ), function () {
1126
+ values.push( $( this ).val() );
1127
+ } );
1128
+
1129
+ var details = $( '#<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-reasons' ).val();
1130
+
1131
+ var data = {
1132
+ 'action' : '<?php echo esc_attr($this->plugin_name); ?>_goodbye_form',
1133
+ 'values' : values,
1134
+ 'details' : details,
1135
+ 'security': "<?php echo wp_create_nonce( 'wisdom_goodbye_form' ); ?>",
1136
+ 'dataType': "json"
1137
+ }
1138
+
1139
+ $.post(
1140
+ ajaxurl,
1141
+ data,
1142
+ function ( response ) {
1143
+ // Redirect to original deactivation URL.
1144
+ window.location.href = url;
1145
+ }
1146
+ );
1147
+ } );
1148
+
1149
+ // If we click outside the form, the form will close.
1150
+ $( '.<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form' ).on( 'click', function (e) {
1151
+ e.stopPropagation();
1152
+ });
1153
+
1154
+ $( '.<?php echo esc_attr($this->plugin_name); ?>-put-goodbye-form-wrapper' ).on( 'click', function () {
1155
+ $( "#<?php echo esc_attr( $this->plugin_name ); ?>-put-goodbye-form" ).fadeOut();
1156
+ $( 'body' ).removeClass( '<?php echo esc_attr($this->plugin_name); ?>-put-form-active' );
1157
+ } );
1158
+ } );
1159
+ </script>
1160
+ <?php
1161
+ }
1162
+
1163
+ /**
1164
+ * AJAX callback when the form is submitted
1165
+ *
1166
+ * @since 1.0.0
1167
+ */
1168
+ public function goodbye_form_callback() {
1169
+
1170
+ check_ajax_referer( 'wisdom_goodbye_form', 'security' );
1171
+
1172
+ if ( isset( $_POST['values'] ) ) {
1173
+ $values = json_encode( wp_unslash( $_POST['values'] ) );
1174
+ update_option( 'wisdom_deactivation_reason_' . $this->plugin_name, $values );
1175
+ }
1176
+
1177
+ if ( isset( $_POST['details'] ) ) {
1178
+ $details = sanitize_text_field( $_POST['details'] );
1179
+ update_option( 'wisdom_deactivation_details_' . $this->plugin_name, $details );
1180
+ }
1181
+
1182
+ $this->do_tracking(); // Run this straightaway.
1183
+ echo 'success';
1184
+ wp_die();
1185
+ }
1186
+
1187
+ public function get_downloads() {
1188
+ $settings_class = new DLM_Admin_Settings();
1189
+ $args = array(
1190
+ 'numberposts' => -1,
1191
+ 'post_type' => 'dlm_download',
1192
+ );
1193
+ $downloads = get_posts( $args );
1194
+ $total_downloads = count( $downloads );
1195
+ $settings = $settings_class->get_settings();
1196
+ $formatted_settings = array();
1197
+ $licenses = array();
1198
+ $return_array = array();
1199
+
1200
+ if ( ! empty( $this->active_plugins ) ) {
1201
+ foreach ( $this->active_plugins as $plugin => $value ) {
1202
+ if ( 0 === strpos( $value, 'dlm' ) ) {
1203
+ $new_val = explode( '/', $value );
1204
+ $licenses[ $new_val[0] ] = get_option( $new_val[0] . '-license' );
1205
+ unset( $licenses[ $new_val[0] ][1] );
1206
+ }
1207
+ }
1208
+ }
1209
+
1210
+ $site_url = base64_encode( site_url() );
1211
+
1212
+ foreach ( $settings as $tab_key => $tab ) {
1213
+ foreach ( $tab['sections'] as $section_key => $section ) {
1214
+ if ( isset( $section['fields'] ) ) {
1215
+ foreach ( $section['fields'] as $field ) {
1216
+ if ( isset( $field['name'] ) ) {
1217
+ $formatted_settings[ $field['name'] ] = get_option( $field['name'] );
1218
+ }
1219
+ }
1220
+ }
1221
+ }
1222
+ }
1223
+
1224
+ $return_array['settings'] = $formatted_settings;
1225
+ $return_array['licenses'] = $licenses;
1226
+ $return_array['site_url'] = $site_url;
1227
+ $return_array['total_downloads'] = $total_downloads;
1228
+
1229
+ return $return_array;
1230
+
1231
+ }
1232
+
1233
+ /**
1234
+ * Add tracking options to uninstall process
1235
+ *
1236
+ * @param $options
1237
+ *
1238
+ * @return mixed
1239
+ */
1240
+ public function uninstall_options( $options ) {
1241
+
1242
+ $options[] = 'download_monitor_wisdom_last_track_time';
1243
+ //$options[] = 'download_monitor_troubleshooting_option';
1244
+ $options[] = 'download_monitor_wisdom_notification_times';
1245
+ $options[] = 'download_monitor_wisdom_block_notice';
1246
+ $options[] = 'download_monitor_wisdom_collect_email';
1247
+ $options[] = 'download_monitor_wisdom_admin_emails';
1248
+ $options[] = 'wisdom_deactivation_reason_' . $this->plugin_name;
1249
+ $options[] = 'wisdom_deactivation_details_' . $this->plugin_name;
1250
+ $options[] = $this->plugin_name . '_wisdom_tracking';
1251
+
1252
+ return $options;
1253
+
1254
+ }
1255
+
1256
+ /**
1257
+ * Add the optin setting
1258
+ *
1259
+ * @param $settings
1260
+ *
1261
+ * @return array
1262
+ */
1263
+ public function optin_tracking( $settings ) {
1264
+
1265
+ if ( isset( $settings['advanced'] ) ) {
1266
+
1267
+ $settings['advanced']['sections']['tracking'] = array(
1268
+ 'title' => __( 'Tracking', 'download-monitor' ),
1269
+ 'fields' => array(
1270
+ array(
1271
+ 'name' => $this->plugin_name.'_wisdom_tracking',
1272
+ 'std' => '0',
1273
+ 'label' => __( 'Track data', 'download-monitor' ),
1274
+ 'cb_label' => __( 'We would like to track its usage on your site. We don\'t record any sensitive data, only information regarding the WordPress environment and Download Monitor settings, which we will use to help us make improvements.', 'download-monitor' ),
1275
+ 'desc' => '',
1276
+ 'type' => 'checkbox'
1277
+ ),
1278
+ )
1279
+ );
1280
+ }
1281
+
1282
+ return $settings;
1283
+
1284
+ }
1285
+
1286
+ /**
1287
+ * Default tracking
1288
+ *
1289
+ * @param $defaults
1290
+ *
1291
+ * @return mixed
1292
+ */
1293
+ public function default_tracking( $defaults ) {
1294
+
1295
+ $defaults[ $this->plugin_name . '_wisdom_tracking' ] = '1';
1296
+
1297
+ return $defaults;
1298
+
1299
+ }
1300
+
1301
+ }
1302
+
1303
+ }
package-lock.json DELETED
@@ -1,6791 +0,0 @@
1
- {
2
- "name": "download-monitor",
3
- "version": "4.2.1",
4
- "lockfileVersion": 1,
5
- "requires": true,
6
- "dependencies": {
7
- "@babel/helper-module-imports": {
8
- "version": "7.0.0",
9
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz",
10
- "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==",
11
- "requires": {
12
- "@babel/types": "^7.0.0"
13
- }
14
- },
15
- "@babel/runtime": {
16
- "version": "7.3.4",
17
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz",
18
- "integrity": "sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g==",
19
- "requires": {
20
- "regenerator-runtime": "^0.12.0"
21
- }
22
- },
23
- "@babel/types": {
24
- "version": "7.3.4",
25
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz",
26
- "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==",
27
- "requires": {
28
- "esutils": "^2.0.2",
29
- "lodash": "^4.17.11",
30
- "to-fast-properties": "^2.0.0"
31
- }
32
- },
33
- "@emotion/babel-utils": {
34
- "version": "0.6.10",
35
- "resolved": "https://registry.npmjs.org/@emotion/babel-utils/-/babel-utils-0.6.10.tgz",
36
- "integrity": "sha512-/fnkM/LTEp3jKe++T0KyTszVGWNKPNOUJfjNKLO17BzQ6QPxgbg3whayom1Qr2oLFH3V92tDymU+dT5q676uow==",
37
- "requires": {
38
- "@emotion/hash": "^0.6.6",
39
- "@emotion/memoize": "^0.6.6",
40
- "@emotion/serialize": "^0.9.1",
41
- "convert-source-map": "^1.5.1",
42
- "find-root": "^1.1.0",
43
- "source-map": "^0.7.2"
44
- },
45
- "dependencies": {
46
- "source-map": {
47
- "version": "0.7.3",
48
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
49
- "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
50
- }
51
- }
52
- },
53
- "@emotion/hash": {
54
- "version": "0.6.6",
55
- "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.6.6.tgz",
56
- "integrity": "sha512-ojhgxzUHZ7am3D2jHkMzPpsBAiB005GF5YU4ea+8DNPybMk01JJUM9V9YRlF/GE95tcOm8DxQvWA2jq19bGalQ=="
57
- },
58
- "@emotion/memoize": {
59
- "version": "0.6.6",
60
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.6.6.tgz",
61
- "integrity": "sha512-h4t4jFjtm1YV7UirAFuSuFGyLa+NNxjdkq6DpFLANNQY5rHueFZHVY+8Cu1HYVP6DrheB0kv4m5xPjo7eKT7yQ=="
62
- },
63
- "@emotion/serialize": {
64
- "version": "0.9.1",
65
- "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.9.1.tgz",
66
- "integrity": "sha512-zTuAFtyPvCctHBEL8KZ5lJuwBanGSutFEncqLn/m9T1a6a93smBStK+bZzcNPgj4QS8Rkw9VTwJGhRIUVO8zsQ==",
67
- "requires": {
68
- "@emotion/hash": "^0.6.6",
69
- "@emotion/memoize": "^0.6.6",
70
- "@emotion/unitless": "^0.6.7",
71
- "@emotion/utils": "^0.8.2"
72
- }
73
- },
74
- "@emotion/stylis": {
75
- "version": "0.7.1",
76
- "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.7.1.tgz",
77
- "integrity": "sha512-/SLmSIkN13M//53TtNxgxo57mcJk/UJIDFRKwOiLIBEyBHEcipgR6hNMQ/59Sl4VjCJ0Z/3zeAZyvnSLPG/1HQ=="
78
- },
79
- "@emotion/unitless": {
80
- "version": "0.6.7",
81
- "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.6.7.tgz",
82
- "integrity": "sha512-Arj1hncvEVqQ2p7Ega08uHLr1JuRYBuO5cIvcA+WWEQ5+VmkOE3ZXzl04NbQxeQpWX78G7u6MqxKuNX3wvYZxg=="
83
- },
84
- "@emotion/utils": {
85
- "version": "0.8.2",
86
- "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.8.2.tgz",
87
- "integrity": "sha512-rLu3wcBWH4P5q1CGoSSH/i9hrXs7SlbRLkoq9IGuoPYNGQvDJ3pt/wmOM+XgYjIDRMVIdkUWt0RsfzF50JfnCw=="
88
- },
89
- "@fltwk/grunt-po2mo": {
90
- "version": "0.2.0",
91
- "resolved": "https://registry.npmjs.org/@fltwk/grunt-po2mo/-/grunt-po2mo-0.2.0.tgz",
92
- "integrity": "sha512-E2ai+1H4bKSSa5eRNgeu/xXIWoY2e7JZdcc3KrrNZ624xbRNMhgtrC4zqvhwRxymIjXWoNiV5DsGf5/Kq6GV1Q==",
93
- "dev": true
94
- },
95
- "@tannin/compile": {
96
- "version": "1.0.2",
97
- "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.0.2.tgz",
98
- "integrity": "sha512-Zv4CtKcI5tmo5epgRwFR3uPrNuCzCuFJOFhONmEanNFSVt/Ck/rV4fdkOJ0bJPxV/AwR5fcmxDx4Xxd/GDvi6g==",
99
- "requires": {
100
- "@tannin/evaluate": "^1.1.0",
101
- "@tannin/postfix": "^1.0.1"
102
- }
103
- },
104
- "@tannin/evaluate": {
105
- "version": "1.1.0",
106
- "resolved": "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.1.0.tgz",
107
- "integrity": "sha512-plrVqbuiqh6tWpAKznsXkCT5t4cmTLinfrB3AmX6zDduJkFmKb55n2JBdSB6D6SFvtJHtiFCmp4CUrn9dCNlqA=="
108
- },
109
- "@tannin/plural-forms": {
110
- "version": "1.0.2",
111
- "resolved": "https://registry.npmjs.org/@tannin/plural-forms/-/plural-forms-1.0.2.tgz",
112
- "integrity": "sha512-LNO8NwyVRSDOL3yDWo7Oao1Guceqr6KD0nOqR1t2mEPw21u4Tscvb0UqnAZ+IiXRzZsymPgeECss5JaEXoq30w==",
113
- "requires": {
114
- "@tannin/compile": "^1.0.2"
115
- }
116
- },
117
- "@tannin/postfix": {
118
- "version": "1.0.1",
119
- "resolved": "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.0.1.tgz",
120
- "integrity": "sha512-y+h7tNlxDPDrH/TrSw1wCSm6FoEAY8FrbUxYng3BMSYBTUsX1utLooizk9v8J1yy6F9AioXNnPZ1qiu2vsa08Q=="
121
- },
122
- "@wordpress/api-fetch": {
123
- "version": "2.2.8",
124
- "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-2.2.8.tgz",
125
- "integrity": "sha512-mbdP9GvDe8Ojv8cobk30mfg2btEZDQEe7IgO+rGSlvVlHC88U8cc2VgOLNX6c9/6/sCvkoGd4Tsy85VbdTlTXw==",
126
- "requires": {
127
- "@babel/runtime": "^7.0.0",
128
- "@wordpress/hooks": "^2.0.5",
129
- "@wordpress/i18n": "^3.1.1",
130
- "@wordpress/url": "^2.3.3"
131
- }
132
- },
133
- "@wordpress/hooks": {
134
- "version": "2.0.5",
135
- "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-2.0.5.tgz",
136
- "integrity": "sha512-EcE7lm5p6f3qB6nJClY3LPejFpbjo66b6j4ihgLLgrWMKqs4lLPGS2OzK4KyP0O52cofKj+Tv/wBaAiYSufFcA==",
137
- "requires": {
138
- "@babel/runtime": "^7.0.0"
139
- }
140
- },
141
- "@wordpress/i18n": {
142
- "version": "3.1.1",
143
- "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-3.1.1.tgz",
144
- "integrity": "sha512-qZx3GcrIfPG5uOhYjb/Sz0XBT7OMkdFXYa966S8/gxWIkewD5TWV0ROQ9UX6+u7ScbblNdS87irJI0FDQ0lM3Q==",
145
- "requires": {
146
- "@babel/runtime": "^7.0.0",
147
- "gettext-parser": "^1.3.1",
148
- "lodash": "^4.17.10",
149
- "memize": "^1.0.5",
150
- "sprintf-js": "^1.1.1",
151
- "tannin": "^1.0.1"
152
- }
153
- },
154
- "@wordpress/url": {
155
- "version": "2.3.3",
156
- "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-2.3.3.tgz",
157
- "integrity": "sha512-WGqQjOyu02E7bJ77G8385GGjUYpvF8vDqZXXHW06/WRSb4nW6fmMIM65UWdBaYY5XecAkpglCqwd8DNbquLucQ==",
158
- "requires": {
159
- "@babel/runtime": "^7.0.0",
160
- "qs": "^6.5.2"
161
- }
162
- },
163
- "abbrev": {
164
- "version": "1.1.1",
165
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
166
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
167
- },
168
- "acorn": {
169
- "version": "5.7.3",
170
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
171
- "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
172
- "dev": true
173
- },
174
- "acorn-dynamic-import": {
175
- "version": "2.0.2",
176
- "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz",
177
- "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=",
178
- "dev": true,
179
- "requires": {
180
- "acorn": "^4.0.3"
181
- },
182
- "dependencies": {
183
- "acorn": {
184
- "version": "4.0.13",
185
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
186
- "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
187
- "dev": true
188
- }
189
- }
190
- },
191
- "ajv": {
192
- "version": "6.9.2",
193
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.2.tgz",
194
- "integrity": "sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg==",
195
- "dev": true,
196
- "requires": {
197
- "fast-deep-equal": "^2.0.1",
198
- "fast-json-stable-stringify": "^2.0.0",
199
- "json-schema-traverse": "^0.4.1",
200
- "uri-js": "^4.2.2"
201
- }
202
- },
203
- "ajv-keywords": {
204
- "version": "3.4.0",
205
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz",
206
- "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==",
207
- "dev": true
208
- },
209
- "align-text": {
210
- "version": "0.1.4",
211
- "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
212
- "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
213
- "dev": true,
214
- "requires": {
215
- "kind-of": "^3.0.2",
216
- "longest": "^1.0.1",
217
- "repeat-string": "^1.5.2"
218
- }
219
- },
220
- "ansi-regex": {
221
- "version": "2.1.1",
222
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
223
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
224
- "dev": true
225
- },
226
- "ansi-styles": {
227
- "version": "2.2.1",
228
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
229
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
230
- "dev": true
231
- },
232
- "anymatch": {
233
- "version": "2.0.0",
234
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
235
- "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
236
- "dev": true,
237
- "requires": {
238
- "micromatch": "^3.1.4",
239
- "normalize-path": "^2.1.1"
240
- },
241
- "dependencies": {
242
- "normalize-path": {
243
- "version": "2.1.1",
244
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
245
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
246
- "dev": true,
247
- "requires": {
248
- "remove-trailing-separator": "^1.0.1"
249
- }
250
- }
251
- }
252
- },
253
- "argparse": {
254
- "version": "1.0.10",
255
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
256
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
257
- "requires": {
258
- "sprintf-js": "~1.0.2"
259
- },
260
- "dependencies": {
261
- "sprintf-js": {
262
- "version": "1.0.3",
263
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
264
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
265
- }
266
- }
267
- },
268
- "arr-diff": {
269
- "version": "4.0.0",
270
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
271
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
272
- "dev": true
273
- },
274
- "arr-flatten": {
275
- "version": "1.1.0",
276
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
277
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
278
- "dev": true
279
- },
280
- "arr-union": {
281
- "version": "3.1.0",
282
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
283
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
284
- "dev": true
285
- },
286
- "array-find-index": {
287
- "version": "1.0.2",
288
- "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
289
- "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
290
- "dev": true
291
- },
292
- "array-unique": {
293
- "version": "0.3.2",
294
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
295
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
296
- "dev": true
297
- },
298
- "asap": {
299
- "version": "2.0.6",
300
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
301
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
302
- "dev": true,
303
- "optional": true
304
- },
305
- "asn1": {
306
- "version": "0.2.4",
307
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
308
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
309
- "dev": true,
310
- "optional": true,
311
- "requires": {
312
- "safer-buffer": "~2.1.0"
313
- }
314
- },
315
- "asn1.js": {
316
- "version": "4.10.1",
317
- "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
318
- "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
319
- "dev": true,
320
- "requires": {
321
- "bn.js": "^4.0.0",
322
- "inherits": "^2.0.1",
323
- "minimalistic-assert": "^1.0.0"
324
- }
325
- },
326
- "assert": {
327
- "version": "1.4.1",
328
- "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
329
- "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
330
- "dev": true,
331
- "requires": {
332
- "util": "0.10.3"
333
- },
334
- "dependencies": {
335
- "inherits": {
336
- "version": "2.0.1",
337
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
338
- "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
339
- "dev": true
340
- },
341
- "util": {
342
- "version": "0.10.3",
343
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
344
- "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
345
- "dev": true,
346
- "requires": {
347
- "inherits": "2.0.1"
348
- }
349
- }
350
- }
351
- },
352
- "assert-plus": {
353
- "version": "1.0.0",
354
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
355
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
356
- "dev": true,
357
- "optional": true
358
- },
359
- "assign-symbols": {
360
- "version": "1.0.0",
361
- "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
362
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
363
- "dev": true
364
- },
365
- "async": {
366
- "version": "1.5.2",
367
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
368
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
369
- "dev": true
370
- },
371
- "async-each": {
372
- "version": "1.0.1",
373
- "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
374
- "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
375
- "dev": true
376
- },
377
- "asynckit": {
378
- "version": "0.4.0",
379
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
380
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
381
- "dev": true,
382
- "optional": true
383
- },
384
- "atob": {
385
- "version": "2.1.2",
386
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
387
- "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
388
- "dev": true
389
- },
390
- "aws-sign2": {
391
- "version": "0.7.0",
392
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
393
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
394
- "dev": true,
395
- "optional": true
396
- },
397
- "aws4": {
398
- "version": "1.8.0",
399
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
400
- "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
401
- "dev": true,
402
- "optional": true
403
- },
404
- "babel-code-frame": {
405
- "version": "6.26.0",
406
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
407
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
408
- "dev": true,
409
- "requires": {
410
- "chalk": "^1.1.3",
411
- "esutils": "^2.0.2",
412
- "js-tokens": "^3.0.2"
413
- },
414
- "dependencies": {
415
- "js-tokens": {
416
- "version": "3.0.2",
417
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
418
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
419
- "dev": true
420
- }
421
- }
422
- },
423
- "babel-core": {
424
- "version": "6.26.3",
425
- "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
426
- "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
427
- "dev": true,
428
- "requires": {
429
- "babel-code-frame": "^6.26.0",
430
- "babel-generator": "^6.26.0",
431
- "babel-helpers": "^6.24.1",
432
- "babel-messages": "^6.23.0",
433
- "babel-register": "^6.26.0",
434
- "babel-runtime": "^6.26.0",
435
- "babel-template": "^6.26.0",
436
- "babel-traverse": "^6.26.0",
437
- "babel-types": "^6.26.0",
438
- "babylon": "^6.18.0",
439
- "convert-source-map": "^1.5.1",
440
- "debug": "^2.6.9",
441
- "json5": "^0.5.1",
442
- "lodash": "^4.17.4",
443
- "minimatch": "^3.0.4",
444
- "path-is-absolute": "^1.0.1",
445
- "private": "^0.1.8",
446
- "slash": "^1.0.0",
447
- "source-map": "^0.5.7"
448
- }
449
- },
450
- "babel-generator": {
451
- "version": "6.26.1",
452
- "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
453
- "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
454
- "dev": true,
455
- "requires": {
456
- "babel-messages": "^6.23.0",
457
- "babel-runtime": "^6.26.0",
458
- "babel-types": "^6.26.0",
459
- "detect-indent": "^4.0.0",
460
- "jsesc": "^1.3.0",
461
- "lodash": "^4.17.4",
462
- "source-map": "^0.5.7",
463
- "trim-right": "^1.0.1"
464
- }
465
- },
466
- "babel-helper-builder-binary-assignment-operator-visitor": {
467
- "version": "6.24.1",
468
- "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
469
- "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
470
- "dev": true,
471
- "requires": {
472
- "babel-helper-explode-assignable-expression": "^6.24.1",
473
- "babel-runtime": "^6.22.0",
474
- "babel-types": "^6.24.1"
475
- }
476
- },
477
- "babel-helper-builder-react-jsx": {
478
- "version": "6.26.0",
479
- "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz",
480
- "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=",
481
- "dev": true,
482
- "requires": {
483
- "babel-runtime": "^6.26.0",
484
- "babel-types": "^6.26.0",
485
- "esutils": "^2.0.2"
486
- }
487
- },
488
- "babel-helper-call-delegate": {
489
- "version": "6.24.1",
490
- "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
491
- "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
492
- "dev": true,
493
- "requires": {
494
- "babel-helper-hoist-variables": "^6.24.1",
495
- "babel-runtime": "^6.22.0",
496
- "babel-traverse": "^6.24.1",
497
- "babel-types": "^6.24.1"
498
- }
499
- },
500
- "babel-helper-define-map": {
501
- "version": "6.26.0",
502
- "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
503
- "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
504
- "dev": true,
505
- "requires": {
506
- "babel-helper-function-name": "^6.24.1",
507
- "babel-runtime": "^6.26.0",
508
- "babel-types": "^6.26.0",
509
- "lodash": "^4.17.4"
510
- }
511
- },
512
- "babel-helper-explode-assignable-expression": {
513
- "version": "6.24.1",
514
- "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
515
- "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
516
- "dev": true,
517
- "requires": {
518
- "babel-runtime": "^6.22.0",
519
- "babel-traverse": "^6.24.1",
520
- "babel-types": "^6.24.1"
521
- }
522
- },
523
- "babel-helper-function-name": {
524
- "version": "6.24.1",
525
- "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
526
- "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
527
- "dev": true,
528
- "requires": {
529
- "babel-helper-get-function-arity": "^6.24.1",
530
- "babel-runtime": "^6.22.0",
531
- "babel-template": "^6.24.1",
532
- "babel-traverse": "^6.24.1",
533
- "babel-types": "^6.24.1"
534
- }
535
- },
536
- "babel-helper-get-function-arity": {
537
- "version": "6.24.1",
538
- "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
539
- "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
540
- "dev": true,
541
- "requires": {
542
- "babel-runtime": "^6.22.0",
543
- "babel-types": "^6.24.1"
544
- }
545
- },
546
- "babel-helper-hoist-variables": {
547
- "version": "6.24.1",
548
- "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
549
- "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
550
- "dev": true,
551
- "requires": {
552
- "babel-runtime": "^6.22.0",
553
- "babel-types": "^6.24.1"
554
- }
555
- },
556
- "babel-helper-optimise-call-expression": {
557
- "version": "6.24.1",
558
- "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
559
- "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
560
- "dev": true,
561
- "requires": {
562
- "babel-runtime": "^6.22.0",
563
- "babel-types": "^6.24.1"
564
- }
565
- },
566
- "babel-helper-regex": {
567
- "version": "6.26.0",
568
- "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
569
- "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
570
- "dev": true,
571
- "requires": {
572
- "babel-runtime": "^6.26.0",
573
- "babel-types": "^6.26.0",
574
- "lodash": "^4.17.4"
575
- }
576
- },
577
- "babel-helper-remap-async-to-generator": {
578
- "version": "6.24.1",
579
- "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
580
- "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
581
- "dev": true,
582
- "requires": {
583
- "babel-helper-function-name": "^6.24.1",
584
- "babel-runtime": "^6.22.0",
585
- "babel-template": "^6.24.1",
586
- "babel-traverse": "^6.24.1",
587
- "babel-types": "^6.24.1"
588
- }
589
- },
590
- "babel-helper-replace-supers": {
591
- "version": "6.24.1",
592
- "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
593
- "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
594
- "dev": true,
595
- "requires": {
596
- "babel-helper-optimise-call-expression": "^6.24.1",
597
- "babel-messages": "^6.23.0",
598
- "babel-runtime": "^6.22.0",
599
- "babel-template": "^6.24.1",
600
- "babel-traverse": "^6.24.1",
601
- "babel-types": "^6.24.1"
602
- }
603
- },
604
- "babel-helpers": {
605
- "version": "6.24.1",
606
- "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
607
- "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
608
- "dev": true,
609
- "requires": {
610
- "babel-runtime": "^6.22.0",
611
- "babel-template": "^6.24.1"
612
- }
613
- },
614
- "babel-loader": {
615
- "version": "7.1.5",
616
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz",
617
- "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==",
618
- "dev": true,
619
- "requires": {
620
- "find-cache-dir": "^1.0.0",
621
- "loader-utils": "^1.0.2",
622
- "mkdirp": "^0.5.1"
623
- }
624
- },
625
- "babel-messages": {
626
- "version": "6.23.0",
627
- "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
628
- "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
629
- "dev": true,
630
- "requires": {
631
- "babel-runtime": "^6.22.0"
632
- }
633
- },
634
- "babel-plugin-check-es2015-constants": {
635
- "version": "6.22.0",
636
- "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
637
- "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
638
- "dev": true,
639
- "requires": {
640
- "babel-runtime": "^6.22.0"
641
- }
642
- },
643
- "babel-plugin-emotion": {
644
- "version": "9.2.11",
645
- "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-9.2.11.tgz",
646
- "integrity": "sha512-dgCImifnOPPSeXod2znAmgc64NhaaOjGEHROR/M+lmStb3841yK1sgaDYAYMnlvWNz8GnpwIPN0VmNpbWYZ+VQ==",
647
- "requires": {
648
- "@babel/helper-module-imports": "^7.0.0",
649
- "@emotion/babel-utils": "^0.6.4",
650
- "@emotion/hash": "^0.6.2",
651
- "@emotion/memoize": "^0.6.1",
652
- "@emotion/stylis": "^0.7.0",
653
- "babel-plugin-macros": "^2.0.0",
654
- "babel-plugin-syntax-jsx": "^6.18.0",
655
- "convert-source-map": "^1.5.0",
656
- "find-root": "^1.1.0",
657
- "mkdirp": "^0.5.1",
658
- "source-map": "^0.5.7",
659
- "touch": "^2.0.1"
660
- }
661
- },
662
- "babel-plugin-macros": {
663
- "version": "2.5.0",
664
- "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.5.0.tgz",
665
- "integrity": "sha512-BWw0lD0kVZAXRD3Od1kMrdmfudqzDzYv2qrN3l2ISR1HVp1EgLKfbOrYV9xmY5k3qx3RIu5uPAUZZZHpo0o5Iw==",
666
- "requires": {
667
- "cosmiconfig": "^5.0.5",
668
- "resolve": "^1.8.1"
669
- }
670
- },
671
- "babel-plugin-syntax-async-functions": {
672
- "version": "6.13.0",
673
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
674
- "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
675
- "dev": true
676
- },
677
- "babel-plugin-syntax-exponentiation-operator": {
678
- "version": "6.13.0",
679
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
680
- "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
681
- "dev": true
682
- },
683
- "babel-plugin-syntax-jsx": {
684
- "version": "6.18.0",
685
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
686
- "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
687
- },
688
- "babel-plugin-syntax-trailing-function-commas": {
689
- "version": "6.22.0",
690
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
691
- "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
692
- "dev": true
693
- },
694
- "babel-plugin-transform-async-to-generator": {
695
- "version": "6.24.1",
696
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
697
- "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
698
- "dev": true,
699
- "requires": {
700
- "babel-helper-remap-async-to-generator": "^6.24.1",
701
- "babel-plugin-syntax-async-functions": "^6.8.0",
702
- "babel-runtime": "^6.22.0"
703
- }
704
- },
705
- "babel-plugin-transform-es2015-arrow-functions": {
706
- "version": "6.22.0",
707
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
708
- "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
709
- "dev": true,
710
- "requires": {
711
- "babel-runtime": "^6.22.0"
712
- }
713
- },
714
- "babel-plugin-transform-es2015-block-scoped-functions": {
715
- "version": "6.22.0",
716
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
717
- "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
718
- "dev": true,
719
- "requires": {
720
- "babel-runtime": "^6.22.0"
721
- }
722
- },
723
- "babel-plugin-transform-es2015-block-scoping": {
724
- "version": "6.26.0",
725
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
726
- "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
727
- "dev": true,
728
- "requires": {
729
- "babel-runtime": "^6.26.0",
730
- "babel-template": "^6.26.0",
731
- "babel-traverse": "^6.26.0",
732
- "babel-types": "^6.26.0",
733
- "lodash": "^4.17.4"
734
- }
735
- },
736
- "babel-plugin-transform-es2015-classes": {
737
- "version": "6.24.1",
738
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
739
- "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
740
- "dev": true,
741
- "requires": {
742
- "babel-helper-define-map": "^6.24.1",
743
- "babel-helper-function-name": "^6.24.1",
744
- "babel-helper-optimise-call-expression": "^6.24.1",
745
- "babel-helper-replace-supers": "^6.24.1",
746
- "babel-messages": "^6.23.0",
747
- "babel-runtime": "^6.22.0",
748
- "babel-template": "^6.24.1",
749
- "babel-traverse": "^6.24.1",
750
- "babel-types": "^6.24.1"
751
- }
752
- },
753
- "babel-plugin-transform-es2015-computed-properties": {
754
- "version": "6.24.1",
755
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
756
- "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
757
- "dev": true,
758
- "requires": {
759
- "babel-runtime": "^6.22.0",
760
- "babel-template": "^6.24.1"
761
- }
762
- },
763
- "babel-plugin-transform-es2015-destructuring": {
764
- "version": "6.23.0",
765
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
766
- "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
767
- "dev": true,
768
- "requires": {
769
- "babel-runtime": "^6.22.0"
770
- }
771
- },
772
- "babel-plugin-transform-es2015-duplicate-keys": {
773
- "version": "6.24.1",
774
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
775
- "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
776
- "dev": true,
777
- "requires": {
778
- "babel-runtime": "^6.22.0",
779
- "babel-types": "^6.24.1"
780
- }
781
- },
782
- "babel-plugin-transform-es2015-for-of": {
783
- "version": "6.23.0",
784
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
785
- "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
786
- "dev": true,
787
- "requires": {
788
- "babel-runtime": "^6.22.0"
789
- }
790
- },
791
- "babel-plugin-transform-es2015-function-name": {
792
- "version": "6.24.1",
793
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
794
- "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
795
- "dev": true,
796
- "requires": {
797
- "babel-helper-function-name": "^6.24.1",
798
- "babel-runtime": "^6.22.0",
799
- "babel-types": "^6.24.1"
800
- }
801
- },
802
- "babel-plugin-transform-es2015-literals": {
803
- "version": "6.22.0",
804
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
805
- "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
806
- "dev": true,
807
- "requires": {
808
- "babel-runtime": "^6.22.0"
809
- }
810
- },
811
- "babel-plugin-transform-es2015-modules-amd": {
812
- "version": "6.24.1",
813
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
814
- "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
815
- "dev": true,
816
- "requires": {
817
- "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
818
- "babel-runtime": "^6.22.0",
819
- "babel-template": "^6.24.1"
820
- }
821
- },
822
- "babel-plugin-transform-es2015-modules-commonjs": {
823
- "version": "6.26.2",
824
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
825
- "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
826
- "dev": true,
827
- "requires": {
828
- "babel-plugin-transform-strict-mode": "^6.24.1",
829
- "babel-runtime": "^6.26.0",
830
- "babel-template": "^6.26.0",
831
- "babel-types": "^6.26.0"
832
- }
833
- },
834
- "babel-plugin-transform-es2015-modules-systemjs": {
835
- "version": "6.24.1",
836
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
837
- "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
838
- "dev": true,
839
- "requires": {
840
- "babel-helper-hoist-variables": "^6.24.1",
841
- "babel-runtime": "^6.22.0",
842
- "babel-template": "^6.24.1"
843
- }
844
- },
845
- "babel-plugin-transform-es2015-modules-umd": {
846
- "version": "6.24.1",
847
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
848
- "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
849
- "dev": true,
850
- "requires": {
851
- "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
852
- "babel-runtime": "^6.22.0",
853
- "babel-template": "^6.24.1"
854
- }
855
- },
856
- "babel-plugin-transform-es2015-object-super": {
857
- "version": "6.24.1",
858
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
859
- "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
860
- "dev": true,
861
- "requires": {
862
- "babel-helper-replace-supers": "^6.24.1",
863
- "babel-runtime": "^6.22.0"
864
- }
865
- },
866
- "babel-plugin-transform-es2015-parameters": {
867
- "version": "6.24.1",
868
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
869
- "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
870
- "dev": true,
871
- "requires": {
872
- "babel-helper-call-delegate": "^6.24.1",
873
- "babel-helper-get-function-arity": "^6.24.1",
874
- "babel-runtime": "^6.22.0",
875
- "babel-template": "^6.24.1",
876
- "babel-traverse": "^6.24.1",
877
- "babel-types": "^6.24.1"
878
- }
879
- },
880
- "babel-plugin-transform-es2015-shorthand-properties": {
881
- "version": "6.24.1",
882
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
883
- "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
884
- "dev": true,
885
- "requires": {
886
- "babel-runtime": "^6.22.0",
887
- "babel-types": "^6.24.1"
888
- }
889
- },
890
- "babel-plugin-transform-es2015-spread": {
891
- "version": "6.22.0",
892
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
893
- "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
894
- "dev": true,
895
- "requires": {
896
- "babel-runtime": "^6.22.0"
897
- }
898
- },
899
- "babel-plugin-transform-es2015-sticky-regex": {
900
- "version": "6.24.1",
901
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
902
- "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
903
- "dev": true,
904
- "requires": {
905
- "babel-helper-regex": "^6.24.1",
906
- "babel-runtime": "^6.22.0",
907
- "babel-types": "^6.24.1"
908
- }
909
- },
910
- "babel-plugin-transform-es2015-template-literals": {
911
- "version": "6.22.0",
912
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
913
- "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
914
- "dev": true,
915
- "requires": {
916
- "babel-runtime": "^6.22.0"
917
- }
918
- },
919
- "babel-plugin-transform-es2015-typeof-symbol": {
920
- "version": "6.23.0",
921
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
922
- "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
923
- "dev": true,
924
- "requires": {
925
- "babel-runtime": "^6.22.0"
926
- }
927
- },
928
- "babel-plugin-transform-es2015-unicode-regex": {
929
- "version": "6.24.1",
930
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
931
- "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
932
- "dev": true,
933
- "requires": {
934
- "babel-helper-regex": "^6.24.1",
935
- "babel-runtime": "^6.22.0",
936
- "regexpu-core": "^2.0.0"
937
- }
938
- },
939
- "babel-plugin-transform-exponentiation-operator": {
940
- "version": "6.24.1",
941
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
942
- "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
943
- "dev": true,
944
- "requires": {
945
- "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
946
- "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
947
- "babel-runtime": "^6.22.0"
948
- }
949
- },
950
- "babel-plugin-transform-react-jsx": {
951
- "version": "6.24.1",
952
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz",
953
- "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=",
954
- "dev": true,
955
- "requires": {
956
- "babel-helper-builder-react-jsx": "^6.24.1",
957
- "babel-plugin-syntax-jsx": "^6.8.0",
958
- "babel-runtime": "^6.22.0"
959
- }
960
- },
961
- "babel-plugin-transform-regenerator": {
962
- "version": "6.26.0",
963
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
964
- "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
965
- "dev": true,
966
- "requires": {
967
- "regenerator-transform": "^0.10.0"
968
- }
969
- },
970
- "babel-plugin-transform-strict-mode": {
971
- "version": "6.24.1",
972
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
973
- "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
974
- "dev": true,
975
- "requires": {
976
- "babel-runtime": "^6.22.0",
977
- "babel-types": "^6.24.1"
978
- }
979
- },
980
- "babel-preset-env": {
981
- "version": "1.7.0",
982
- "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
983
- "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
984
- "dev": true,
985
- "requires": {
986
- "babel-plugin-check-es2015-constants": "^6.22.0",
987
- "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
988
- "babel-plugin-transform-async-to-generator": "^6.22.0",
989
- "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
990
- "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
991
- "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
992
- "babel-plugin-transform-es2015-classes": "^6.23.0",
993
- "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
994
- "babel-plugin-transform-es2015-destructuring": "^6.23.0",
995
- "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
996
- "babel-plugin-transform-es2015-for-of": "^6.23.0",
997
- "babel-plugin-transform-es2015-function-name": "^6.22.0",
998
- "babel-plugin-transform-es2015-literals": "^6.22.0",
999
- "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
1000
- "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
1001
- "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
1002
- "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
1003
- "babel-plugin-transform-es2015-object-super": "^6.22.0",
1004
- "babel-plugin-transform-es2015-parameters": "^6.23.0",
1005
- "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
1006
- "babel-plugin-transform-es2015-spread": "^6.22.0",
1007
- "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
1008
- "babel-plugin-transform-es2015-template-literals": "^6.22.0",
1009
- "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
1010
- "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
1011
- "babel-plugin-transform-exponentiation-operator": "^6.22.0",
1012
- "babel-plugin-transform-regenerator": "^6.22.0",
1013
- "browserslist": "^3.2.6",
1014
- "invariant": "^2.2.2",
1015
- "semver": "^5.3.0"
1016
- }
1017
- },
1018
- "babel-register": {
1019
- "version": "6.26.0",
1020
- "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
1021
- "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
1022
- "dev": true,
1023
- "requires": {
1024
- "babel-core": "^6.26.0",
1025
- "babel-runtime": "^6.26.0",
1026
- "core-js": "^2.5.0",
1027
- "home-or-tmp": "^2.0.0",
1028
- "lodash": "^4.17.4",
1029
- "mkdirp": "^0.5.1",
1030
- "source-map-support": "^0.4.15"
1031
- }
1032
- },
1033
- "babel-runtime": {
1034
- "version": "6.26.0",
1035
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
1036
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
1037
- "dev": true,
1038
- "requires": {
1039
- "core-js": "^2.4.0",
1040
- "regenerator-runtime": "^0.11.0"
1041
- },
1042
- "dependencies": {
1043
- "regenerator-runtime": {
1044
- "version": "0.11.1",
1045
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
1046
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
1047
- "dev": true
1048
- }
1049
- }
1050
- },
1051
- "babel-template": {
1052
- "version": "6.26.0",
1053
- "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
1054
- "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
1055
- "dev": true,
1056
- "requires": {
1057
- "babel-runtime": "^6.26.0",
1058
- "babel-traverse": "^6.26.0",
1059
- "babel-types": "^6.26.0",
1060
- "babylon": "^6.18.0",
1061
- "lodash": "^4.17.4"
1062
- }
1063
- },
1064
- "babel-traverse": {
1065
- "version": "6.26.0",
1066
- "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
1067
- "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
1068
- "dev": true,
1069
- "requires": {
1070
- "babel-code-frame": "^6.26.0",
1071
- "babel-messages": "^6.23.0",
1072
- "babel-runtime": "^6.26.0",
1073
- "babel-types": "^6.26.0",
1074
- "babylon": "^6.18.0",
1075
- "debug": "^2.6.8",
1076
- "globals": "^9.18.0",
1077
- "invariant": "^2.2.2",
1078
- "lodash": "^4.17.4"
1079
- }
1080
- },
1081
- "babel-types": {
1082
- "version": "6.26.0",
1083
- "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
1084
- "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
1085
- "dev": true,
1086
- "requires": {
1087
- "babel-runtime": "^6.26.0",
1088
- "esutils": "^2.0.2",
1089
- "lodash": "^4.17.4",
1090
- "to-fast-properties": "^1.0.3"
1091
- },
1092
- "dependencies": {
1093
- "to-fast-properties": {
1094
- "version": "1.0.3",
1095
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
1096
- "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
1097
- "dev": true
1098
- }
1099
- }
1100
- },
1101
- "babylon": {
1102
- "version": "6.18.0",
1103
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
1104
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
1105
- "dev": true
1106
- },
1107
- "balanced-match": {
1108
- "version": "1.0.0",
1109
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
1110
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
1111
- "dev": true
1112
- },
1113
- "base": {
1114
- "version": "0.11.2",
1115
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
1116
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
1117
- "dev": true,
1118
- "requires": {
1119
- "cache-base": "^1.0.1",
1120
- "class-utils": "^0.3.5",
1121
- "component-emitter": "^1.2.1",
1122
- "define-property": "^1.0.0",
1123
- "isobject": "^3.0.1",
1124
- "mixin-deep": "^1.2.0",
1125
- "pascalcase": "^0.1.1"
1126
- },
1127
- "dependencies": {
1128
- "define-property": {
1129
- "version": "1.0.0",
1130
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
1131
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
1132
- "dev": true,
1133
- "requires": {
1134
- "is-descriptor": "^1.0.0"
1135
- }
1136
- },
1137
- "is-accessor-descriptor": {
1138
- "version": "1.0.0",
1139
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1140
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1141
- "dev": true,
1142
- "requires": {
1143
- "kind-of": "^6.0.0"
1144
- }
1145
- },
1146
- "is-data-descriptor": {
1147
- "version": "1.0.0",
1148
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1149
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1150
- "dev": true,
1151
- "requires": {
1152
- "kind-of": "^6.0.0"
1153
- }
1154
- },
1155
- "is-descriptor": {
1156
- "version": "1.0.2",
1157
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1158
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1159
- "dev": true,
1160
- "requires": {
1161
- "is-accessor-descriptor": "^1.0.0",
1162
- "is-data-descriptor": "^1.0.0",
1163
- "kind-of": "^6.0.2"
1164
- }
1165
- },
1166
- "kind-of": {
1167
- "version": "6.0.2",
1168
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
1169
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
1170
- "dev": true
1171
- }
1172
- }
1173
- },
1174
- "base64-js": {
1175
- "version": "1.3.0",
1176
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
1177
- "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
1178
- "dev": true
1179
- },
1180
- "bcrypt-pbkdf": {
1181
- "version": "1.0.2",
1182
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
1183
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
1184
- "dev": true,
1185
- "optional": true,
1186
- "requires": {
1187
- "tweetnacl": "^0.14.3"
1188
- }
1189
- },
1190
- "big.js": {
1191
- "version": "5.2.2",
1192
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
1193
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
1194
- "dev": true
1195
- },
1196
- "binary-extensions": {
1197
- "version": "1.13.0",
1198
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz",
1199
- "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==",
1200
- "dev": true
1201
- },
1202
- "bluebird": {
1203
- "version": "3.5.3",
1204
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz",
1205
- "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==",
1206
- "dev": true
1207
- },
1208
- "bn.js": {
1209
- "version": "4.11.8",
1210
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
1211
- "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
1212
- "dev": true
1213
- },
1214
- "body": {
1215
- "version": "5.1.0",
1216
- "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz",
1217
- "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=",
1218
- "dev": true,
1219
- "requires": {
1220
- "continuable-cache": "^0.3.1",
1221
- "error": "^7.0.0",
1222
- "raw-body": "~1.1.0",
1223
- "safe-json-parse": "~1.0.1"
1224
- }
1225
- },
1226
- "brace-expansion": {
1227
- "version": "1.1.11",
1228
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1229
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1230
- "dev": true,
1231
- "requires": {
1232
- "balanced-match": "^1.0.0",
1233
- "concat-map": "0.0.1"
1234
- }
1235
- },
1236
- "braces": {
1237
- "version": "2.3.2",
1238
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
1239
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
1240
- "dev": true,
1241
- "requires": {
1242
- "arr-flatten": "^1.1.0",
1243
- "array-unique": "^0.3.2",
1244
- "extend-shallow": "^2.0.1",
1245
- "fill-range": "^4.0.0",
1246
- "isobject": "^3.0.1",
1247
- "repeat-element": "^1.1.2",
1248
- "snapdragon": "^0.8.1",
1249
- "snapdragon-node": "^2.0.1",
1250
- "split-string": "^3.0.2",
1251
- "to-regex": "^3.0.1"
1252
- },
1253
- "dependencies": {
1254
- "extend-shallow": {
1255
- "version": "2.0.1",
1256
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1257
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1258
- "dev": true,
1259
- "requires": {
1260
- "is-extendable": "^0.1.0"
1261
- }
1262
- }
1263
- }
1264
- },
1265
- "brorand": {
1266
- "version": "1.1.0",
1267
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
1268
- "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
1269
- "dev": true
1270
- },
1271
- "browserify-aes": {
1272
- "version": "1.2.0",
1273
- "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
1274
- "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
1275
- "dev": true,
1276
- "requires": {
1277
- "buffer-xor": "^1.0.3",
1278
- "cipher-base": "^1.0.0",
1279
- "create-hash": "^1.1.0",
1280
- "evp_bytestokey": "^1.0.3",
1281
- "inherits": "^2.0.1",
1282
- "safe-buffer": "^5.0.1"
1283
- }
1284
- },
1285
- "browserify-cipher": {
1286
- "version": "1.0.1",
1287
- "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
1288
- "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
1289
- "dev": true,
1290
- "requires": {
1291
- "browserify-aes": "^1.0.4",
1292
- "browserify-des": "^1.0.0",
1293
- "evp_bytestokey": "^1.0.0"
1294
- }
1295
- },
1296
- "browserify-des": {
1297
- "version": "1.0.2",
1298
- "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
1299
- "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
1300
- "dev": true,
1301
- "requires": {
1302
- "cipher-base": "^1.0.1",
1303
- "des.js": "^1.0.0",
1304
- "inherits": "^2.0.1",
1305
- "safe-buffer": "^5.1.2"
1306
- }
1307
- },
1308
- "browserify-rsa": {
1309
- "version": "4.0.1",
1310
- "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
1311
- "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
1312
- "dev": true,
1313
- "requires": {
1314
- "bn.js": "^4.1.0",
1315
- "randombytes": "^2.0.1"
1316
- }
1317
- },
1318
- "browserify-sign": {
1319
- "version": "4.0.4",
1320
- "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
1321
- "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
1322
- "dev": true,
1323
- "requires": {
1324
- "bn.js": "^4.1.1",
1325
- "browserify-rsa": "^4.0.0",
1326
- "create-hash": "^1.1.0",
1327
- "create-hmac": "^1.1.2",
1328
- "elliptic": "^6.0.0",
1329
- "inherits": "^2.0.1",
1330
- "parse-asn1": "^5.0.0"
1331
- }
1332
- },
1333
- "browserify-zlib": {
1334
- "version": "0.2.0",
1335
- "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
1336
- "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
1337
- "dev": true,
1338
- "requires": {
1339
- "pako": "~1.0.5"
1340
- }
1341
- },
1342
- "browserslist": {
1343
- "version": "3.2.8",
1344
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
1345
- "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
1346
- "dev": true,
1347
- "requires": {
1348
- "caniuse-lite": "^1.0.30000844",
1349
- "electron-to-chromium": "^1.3.47"
1350
- }
1351
- },
1352
- "buffer": {
1353
- "version": "4.9.1",
1354
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
1355
- "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
1356
- "dev": true,
1357
- "requires": {
1358
- "base64-js": "^1.0.2",
1359
- "ieee754": "^1.1.4",
1360
- "isarray": "^1.0.0"
1361
- }
1362
- },
1363
- "buffer-xor": {
1364
- "version": "1.0.3",
1365
- "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
1366
- "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
1367
- "dev": true
1368
- },
1369
- "builtin-status-codes": {
1370
- "version": "3.0.0",
1371
- "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
1372
- "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
1373
- "dev": true
1374
- },
1375
- "bytes": {
1376
- "version": "1.0.0",
1377
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
1378
- "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
1379
- "dev": true
1380
- },
1381
- "cache-base": {
1382
- "version": "1.0.1",
1383
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
1384
- "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
1385
- "dev": true,
1386
- "requires": {
1387
- "collection-visit": "^1.0.0",
1388
- "component-emitter": "^1.2.1",
1389
- "get-value": "^2.0.6",
1390
- "has-value": "^1.0.0",
1391
- "isobject": "^3.0.1",
1392
- "set-value": "^2.0.0",
1393
- "to-object-path": "^0.3.0",
1394
- "union-value": "^1.0.0",
1395
- "unset-value": "^1.0.0"
1396
- }
1397
- },
1398
- "caller-callsite": {
1399
- "version": "2.0.0",
1400
- "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
1401
- "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
1402
- "requires": {
1403
- "callsites": "^2.0.0"
1404
- }
1405
- },
1406
- "caller-path": {
1407
- "version": "2.0.0",
1408
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
1409
- "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
1410
- "requires": {
1411
- "caller-callsite": "^2.0.0"
1412
- }
1413
- },
1414
- "callsites": {
1415
- "version": "2.0.0",
1416
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
1417
- "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA="
1418
- },
1419
- "camelcase": {
1420
- "version": "2.1.1",
1421
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
1422
- "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
1423
- "dev": true
1424
- },
1425
- "camelcase-keys": {
1426
- "version": "2.1.0",
1427
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
1428
- "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
1429
- "dev": true,
1430
- "requires": {
1431
- "camelcase": "^2.0.0",
1432
- "map-obj": "^1.0.0"
1433
- }
1434
- },
1435
- "caniuse-lite": {
1436
- "version": "1.0.30000939",
1437
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000939.tgz",
1438
- "integrity": "sha512-oXB23ImDJOgQpGjRv1tCtzAvJr4/OvrHi5SO2vUgB0g0xpdZZoA/BxfImiWfdwoYdUTtQrPsXsvYU/dmCSM8gg==",
1439
- "dev": true
1440
- },
1441
- "caseless": {
1442
- "version": "0.12.0",
1443
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
1444
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
1445
- "dev": true,
1446
- "optional": true
1447
- },
1448
- "center-align": {
1449
- "version": "0.1.3",
1450
- "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
1451
- "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
1452
- "dev": true,
1453
- "requires": {
1454
- "align-text": "^0.1.3",
1455
- "lazy-cache": "^1.0.3"
1456
- }
1457
- },
1458
- "chalk": {
1459
- "version": "1.1.3",
1460
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
1461
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
1462
- "dev": true,
1463
- "requires": {
1464
- "ansi-styles": "^2.2.1",
1465
- "escape-string-regexp": "^1.0.2",
1466
- "has-ansi": "^2.0.0",
1467
- "strip-ansi": "^3.0.0",
1468
- "supports-color": "^2.0.0"
1469
- }
1470
- },
1471
- "chokidar": {
1472
- "version": "2.1.2",
1473
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz",
1474
- "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==",
1475
- "dev": true,
1476
- "requires": {
1477
- "anymatch": "^2.0.0",
1478
- "async-each": "^1.0.1",
1479
- "braces": "^2.3.2",
1480
- "fsevents": "^1.2.7",
1481
- "glob-parent": "^3.1.0",
1482
- "inherits": "^2.0.3",
1483
- "is-binary-path": "^1.0.0",
1484
- "is-glob": "^4.0.0",
1485
- "normalize-path": "^3.0.0",
1486
- "path-is-absolute": "^1.0.0",
1487
- "readdirp": "^2.2.1",
1488
- "upath": "^1.1.0"
1489
- }
1490
- },
1491
- "cipher-base": {
1492
- "version": "1.0.4",
1493
- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
1494
- "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
1495
- "dev": true,
1496
- "requires": {
1497
- "inherits": "^2.0.1",
1498
- "safe-buffer": "^5.0.1"
1499
- }
1500
- },
1501
- "class-utils": {
1502
- "version": "0.3.6",
1503
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
1504
- "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
1505
- "dev": true,
1506
- "requires": {
1507
- "arr-union": "^3.1.0",
1508
- "define-property": "^0.2.5",
1509
- "isobject": "^3.0.0",
1510
- "static-extend": "^0.1.1"
1511
- },
1512
- "dependencies": {
1513
- "define-property": {
1514
- "version": "0.2.5",
1515
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
1516
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
1517
- "dev": true,
1518
- "requires": {
1519
- "is-descriptor": "^0.1.0"
1520
- }
1521
- }
1522
- }
1523
- },
1524
- "classnames": {
1525
- "version": "2.2.6",
1526
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
1527
- "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
1528
- },
1529
- "clean-css": {
1530
- "version": "4.2.1",
1531
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
1532
- "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
1533
- "dev": true,
1534
- "requires": {
1535
- "source-map": "~0.6.0"
1536
- },
1537
- "dependencies": {
1538
- "source-map": {
1539
- "version": "0.6.1",
1540
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1541
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1542
- "dev": true
1543
- }
1544
- }
1545
- },
1546
- "cliui": {
1547
- "version": "2.1.0",
1548
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
1549
- "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
1550
- "dev": true,
1551
- "requires": {
1552
- "center-align": "^0.1.1",
1553
- "right-align": "^0.1.1",
1554
- "wordwrap": "0.0.2"
1555
- }
1556
- },
1557
- "clone": {
1558
- "version": "2.1.2",
1559
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
1560
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
1561
- "dev": true
1562
- },
1563
- "code-point-at": {
1564
- "version": "1.1.0",
1565
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
1566
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
1567
- "dev": true
1568
- },
1569
- "coffeescript": {
1570
- "version": "1.10.0",
1571
- "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz",
1572
- "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=",
1573
- "dev": true
1574
- },
1575
- "collection-visit": {
1576
- "version": "1.0.0",
1577
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
1578
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
1579
- "dev": true,
1580
- "requires": {
1581
- "map-visit": "^1.0.0",
1582
- "object-visit": "^1.0.0"
1583
- }
1584
- },
1585
- "color-convert": {
1586
- "version": "1.9.3",
1587
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
1588
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
1589
- "dev": true,
1590
- "requires": {
1591
- "color-name": "1.1.3"
1592
- }
1593
- },
1594
- "color-name": {
1595
- "version": "1.1.3",
1596
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
1597
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
1598
- "dev": true
1599
- },
1600
- "colors": {
1601
- "version": "1.1.2",
1602
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
1603
- "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
1604
- "dev": true
1605
- },
1606
- "combined-stream": {
1607
- "version": "1.0.7",
1608
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
1609
- "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
1610
- "dev": true,
1611
- "optional": true,
1612
- "requires": {
1613
- "delayed-stream": "~1.0.0"
1614
- }
1615
- },
1616
- "commander": {
1617
- "version": "2.17.1",
1618
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
1619
- "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
1620
- "dev": true
1621
- },
1622
- "commondir": {
1623
- "version": "1.0.1",
1624
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
1625
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
1626
- "dev": true
1627
- },
1628
- "component-emitter": {
1629
- "version": "1.2.1",
1630
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
1631
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
1632
- "dev": true
1633
- },
1634
- "concat-map": {
1635
- "version": "0.0.1",
1636
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1637
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
1638
- "dev": true
1639
- },
1640
- "console-browserify": {
1641
- "version": "1.1.0",
1642
- "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
1643
- "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
1644
- "dev": true,
1645
- "requires": {
1646
- "date-now": "^0.1.4"
1647
- }
1648
- },
1649
- "constants-browserify": {
1650
- "version": "1.0.0",
1651
- "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
1652
- "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
1653
- "dev": true
1654
- },
1655
- "continuable-cache": {
1656
- "version": "0.3.1",
1657
- "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz",
1658
- "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
1659
- "dev": true
1660
- },
1661
- "convert-source-map": {
1662
- "version": "1.6.0",
1663
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
1664
- "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
1665
- "requires": {
1666
- "safe-buffer": "~5.1.1"
1667
- }
1668
- },
1669
- "copy-descriptor": {
1670
- "version": "0.1.1",
1671
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
1672
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
1673
- "dev": true
1674
- },
1675
- "core-js": {
1676
- "version": "2.6.5",
1677
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz",
1678
- "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==",
1679
- "dev": true
1680
- },
1681
- "core-util-is": {
1682
- "version": "1.0.2",
1683
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
1684
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
1685
- "dev": true
1686
- },
1687
- "cosmiconfig": {
1688
- "version": "5.1.0",
1689
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.1.0.tgz",
1690
- "integrity": "sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q==",
1691
- "requires": {
1692
- "import-fresh": "^2.0.0",
1693
- "is-directory": "^0.3.1",
1694
- "js-yaml": "^3.9.0",
1695
- "lodash.get": "^4.4.2",
1696
- "parse-json": "^4.0.0"
1697
- }
1698
- },
1699
- "create-ecdh": {
1700
- "version": "4.0.3",
1701
- "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
1702
- "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
1703
- "dev": true,
1704
- "requires": {
1705
- "bn.js": "^4.1.0",
1706
- "elliptic": "^6.0.0"
1707
- }
1708
- },
1709
- "create-emotion": {
1710
- "version": "9.2.12",
1711
- "resolved": "https://registry.npmjs.org/create-emotion/-/create-emotion-9.2.12.tgz",
1712
- "integrity": "sha512-P57uOF9NL2y98Xrbl2OuiDQUZ30GVmASsv5fbsjF4Hlraip2kyAvMm+2PoYUvFFw03Fhgtxk3RqZSm2/qHL9hA==",
1713
- "requires": {
1714
- "@emotion/hash": "^0.6.2",
1715
- "@emotion/memoize": "^0.6.1",
1716
- "@emotion/stylis": "^0.7.0",
1717
- "@emotion/unitless": "^0.6.2",
1718
- "csstype": "^2.5.2",
1719
- "stylis": "^3.5.0",
1720
- "stylis-rule-sheet": "^0.0.10"
1721
- }
1722
- },
1723
- "create-hash": {
1724
- "version": "1.2.0",
1725
- "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
1726
- "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
1727
- "dev": true,
1728
- "requires": {
1729
- "cipher-base": "^1.0.1",
1730
- "inherits": "^2.0.1",
1731
- "md5.js": "^1.3.4",
1732
- "ripemd160": "^2.0.1",
1733
- "sha.js": "^2.4.0"
1734
- }
1735
- },
1736
- "create-hmac": {
1737
- "version": "1.1.7",
1738
- "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
1739
- "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
1740
- "dev": true,
1741
- "requires": {
1742
- "cipher-base": "^1.0.3",
1743
- "create-hash": "^1.1.0",
1744
- "inherits": "^2.0.1",
1745
- "ripemd160": "^2.0.0",
1746
- "safe-buffer": "^5.0.1",
1747
- "sha.js": "^2.4.8"
1748
- }
1749
- },
1750
- "cross-env": {
1751
- "version": "5.2.0",
1752
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz",
1753
- "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==",
1754
- "dev": true,
1755
- "requires": {
1756
- "cross-spawn": "^6.0.5",
1757
- "is-windows": "^1.0.0"
1758
- }
1759
- },
1760
- "cross-spawn": {
1761
- "version": "6.0.5",
1762
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
1763
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
1764
- "dev": true,
1765
- "requires": {
1766
- "nice-try": "^1.0.4",
1767
- "path-key": "^2.0.1",
1768
- "semver": "^5.5.0",
1769
- "shebang-command": "^1.2.0",
1770
- "which": "^1.2.9"
1771
- }
1772
- },
1773
- "crypto-browserify": {
1774
- "version": "3.12.0",
1775
- "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
1776
- "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
1777
- "dev": true,
1778
- "requires": {
1779
- "browserify-cipher": "^1.0.0",
1780
- "browserify-sign": "^4.0.0",
1781
- "create-ecdh": "^4.0.0",
1782
- "create-hash": "^1.1.0",
1783
- "create-hmac": "^1.1.0",
1784
- "diffie-hellman": "^5.0.0",
1785
- "inherits": "^2.0.1",
1786
- "pbkdf2": "^3.0.3",
1787
- "public-encrypt": "^4.0.0",
1788
- "randombytes": "^2.0.0",
1789
- "randomfill": "^1.0.3"
1790
- }
1791
- },
1792
- "csstype": {
1793
- "version": "2.6.2",
1794
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.2.tgz",
1795
- "integrity": "sha512-Rl7PvTae0pflc1YtxtKbiSqq20Ts6vpIYOD5WBafl4y123DyHUeLrRdQP66sQW8/6gmX8jrYJLXwNeMqYVJcow=="
1796
- },
1797
- "currently-unhandled": {
1798
- "version": "0.4.1",
1799
- "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
1800
- "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
1801
- "dev": true,
1802
- "requires": {
1803
- "array-find-index": "^1.0.1"
1804
- }
1805
- },
1806
- "d": {
1807
- "version": "1.0.0",
1808
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
1809
- "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
1810
- "dev": true,
1811
- "requires": {
1812
- "es5-ext": "^0.10.9"
1813
- }
1814
- },
1815
- "dashdash": {
1816
- "version": "1.14.1",
1817
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
1818
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
1819
- "dev": true,
1820
- "optional": true,
1821
- "requires": {
1822
- "assert-plus": "^1.0.0"
1823
- }
1824
- },
1825
- "date-now": {
1826
- "version": "0.1.4",
1827
- "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
1828
- "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
1829
- "dev": true
1830
- },
1831
- "dateformat": {
1832
- "version": "1.0.12",
1833
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
1834
- "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
1835
- "dev": true,
1836
- "requires": {
1837
- "get-stdin": "^4.0.1",
1838
- "meow": "^3.3.0"
1839
- }
1840
- },
1841
- "debug": {
1842
- "version": "2.6.9",
1843
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1844
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1845
- "dev": true,
1846
- "requires": {
1847
- "ms": "2.0.0"
1848
- }
1849
- },
1850
- "decamelize": {
1851
- "version": "1.2.0",
1852
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
1853
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
1854
- "dev": true
1855
- },
1856
- "decode-uri-component": {
1857
- "version": "0.2.0",
1858
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
1859
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
1860
- "dev": true
1861
- },
1862
- "define-property": {
1863
- "version": "2.0.2",
1864
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
1865
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
1866
- "dev": true,
1867
- "requires": {
1868
- "is-descriptor": "^1.0.2",
1869
- "isobject": "^3.0.1"
1870
- },
1871
- "dependencies": {
1872
- "is-accessor-descriptor": {
1873
- "version": "1.0.0",
1874
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1875
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1876
- "dev": true,
1877
- "requires": {
1878
- "kind-of": "^6.0.0"
1879
- }
1880
- },
1881
- "is-data-descriptor": {
1882
- "version": "1.0.0",
1883
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1884
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1885
- "dev": true,
1886
- "requires": {
1887
- "kind-of": "^6.0.0"
1888
- }
1889
- },
1890
- "is-descriptor": {
1891
- "version": "1.0.2",
1892
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1893
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1894
- "dev": true,
1895
- "requires": {
1896
- "is-accessor-descriptor": "^1.0.0",
1897
- "is-data-descriptor": "^1.0.0",
1898
- "kind-of": "^6.0.2"
1899
- }
1900
- },
1901
- "kind-of": {
1902
- "version": "6.0.2",
1903
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
1904
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
1905
- "dev": true
1906
- }
1907
- }
1908
- },
1909
- "delayed-stream": {
1910
- "version": "1.0.0",
1911
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
1912
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
1913
- "dev": true,
1914
- "optional": true
1915
- },
1916
- "des.js": {
1917
- "version": "1.0.0",
1918
- "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
1919
- "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
1920
- "dev": true,
1921
- "requires": {
1922
- "inherits": "^2.0.1",
1923
- "minimalistic-assert": "^1.0.0"
1924
- }
1925
- },
1926
- "detect-indent": {
1927
- "version": "4.0.0",
1928
- "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
1929
- "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
1930
- "dev": true,
1931
- "requires": {
1932
- "repeating": "^2.0.0"
1933
- }
1934
- },
1935
- "diffie-hellman": {
1936
- "version": "5.0.3",
1937
- "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
1938
- "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
1939
- "dev": true,
1940
- "requires": {
1941
- "bn.js": "^4.1.0",
1942
- "miller-rabin": "^4.0.0",
1943
- "randombytes": "^2.0.0"
1944
- }
1945
- },
1946
- "dom-helpers": {
1947
- "version": "3.4.0",
1948
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
1949
- "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
1950
- "requires": {
1951
- "@babel/runtime": "^7.1.2"
1952
- }
1953
- },
1954
- "domain-browser": {
1955
- "version": "1.2.0",
1956
- "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
1957
- "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
1958
- "dev": true
1959
- },
1960
- "duplexer": {
1961
- "version": "0.1.1",
1962
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
1963
- "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
1964
- "dev": true
1965
- },
1966
- "ecc-jsbn": {
1967
- "version": "0.1.2",
1968
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
1969
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
1970
- "dev": true,
1971
- "optional": true,
1972
- "requires": {
1973
- "jsbn": "~0.1.0",
1974
- "safer-buffer": "^2.1.0"
1975
- }
1976
- },
1977
- "electron-to-chromium": {
1978
- "version": "1.3.113",
1979
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz",
1980
- "integrity": "sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==",
1981
- "dev": true
1982
- },
1983
- "elliptic": {
1984
- "version": "6.5.3",
1985
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
1986
- "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
1987
- "dev": true,
1988
- "requires": {
1989
- "bn.js": "^4.4.0",
1990
- "brorand": "^1.0.1",
1991
- "hash.js": "^1.0.0",
1992
- "hmac-drbg": "^1.0.0",
1993
- "inherits": "^2.0.1",
1994
- "minimalistic-assert": "^1.0.0",
1995
- "minimalistic-crypto-utils": "^1.0.0"
1996
- }
1997
- },
1998
- "emojis-list": {
1999
- "version": "2.1.0",
2000
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
2001
- "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
2002
- "dev": true
2003
- },
2004
- "emotion": {
2005
- "version": "9.2.12",
2006
- "resolved": "https://registry.npmjs.org/emotion/-/emotion-9.2.12.tgz",
2007
- "integrity": "sha512-hcx7jppaI8VoXxIWEhxpDW7I+B4kq9RNzQLmsrF6LY8BGKqe2N+gFAQr0EfuFucFlPs2A9HM4+xNj4NeqEWIOQ==",
2008
- "requires": {
2009
- "babel-plugin-emotion": "^9.2.11",
2010
- "create-emotion": "^9.2.12"
2011
- }
2012
- },
2013
- "encoding": {
2014
- "version": "0.1.12",
2015
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
2016
- "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
2017
- "requires": {
2018
- "iconv-lite": "~0.4.13"
2019
- }
2020
- },
2021
- "enhanced-resolve": {
2022
- "version": "3.4.1",
2023
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
2024
- "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
2025
- "dev": true,
2026
- "requires": {
2027
- "graceful-fs": "^4.1.2",
2028
- "memory-fs": "^0.4.0",
2029
- "object-assign": "^4.0.1",
2030
- "tapable": "^0.2.7"
2031
- }
2032
- },
2033
- "errno": {
2034
- "version": "0.1.7",
2035
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
2036
- "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
2037
- "dev": true,
2038
- "requires": {
2039
- "prr": "~1.0.1"
2040
- }
2041
- },
2042
- "error": {
2043
- "version": "7.0.2",
2044
- "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz",
2045
- "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=",
2046
- "dev": true,
2047
- "requires": {
2048
- "string-template": "~0.2.1",
2049
- "xtend": "~4.0.0"
2050
- }
2051
- },
2052
- "error-ex": {
2053
- "version": "1.3.2",
2054
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
2055
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
2056
- "requires": {
2057
- "is-arrayish": "^0.2.1"
2058
- }
2059
- },
2060
- "es5-ext": {
2061
- "version": "0.10.48",
2062
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.48.tgz",
2063
- "integrity": "sha512-CdRvPlX/24Mj5L4NVxTs4804sxiS2CjVprgCmrgoDkdmjdY4D+ySHa7K3jJf8R40dFg0tIm3z/dk326LrnuSGw==",
2064
- "dev": true,
2065
- "requires": {
2066
- "es6-iterator": "~2.0.3",
2067
- "es6-symbol": "~3.1.1",
2068
- "next-tick": "1"
2069
- }
2070
- },
2071
- "es6-iterator": {
2072
- "version": "2.0.3",
2073
- "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
2074
- "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
2075
- "dev": true,
2076
- "requires": {
2077
- "d": "1",
2078
- "es5-ext": "^0.10.35",
2079
- "es6-symbol": "^3.1.1"
2080
- }
2081
- },
2082
- "es6-map": {
2083
- "version": "0.1.5",
2084
- "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
2085
- "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
2086
- "dev": true,
2087
- "requires": {
2088
- "d": "1",
2089
- "es5-ext": "~0.10.14",
2090
- "es6-iterator": "~2.0.1",
2091
- "es6-set": "~0.1.5",
2092
- "es6-symbol": "~3.1.1",
2093
- "event-emitter": "~0.3.5"
2094
- }
2095
- },
2096
- "es6-set": {
2097
- "version": "0.1.5",
2098
- "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
2099
- "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
2100
- "dev": true,
2101
- "requires": {
2102
- "d": "1",
2103
- "es5-ext": "~0.10.14",
2104
- "es6-iterator": "~2.0.1",
2105
- "es6-symbol": "3.1.1",
2106
- "event-emitter": "~0.3.5"
2107
- }
2108
- },
2109
- "es6-symbol": {
2110
- "version": "3.1.1",
2111
- "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
2112
- "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
2113
- "dev": true,
2114
- "requires": {
2115
- "d": "1",
2116
- "es5-ext": "~0.10.14"
2117
- }
2118
- },
2119
- "es6-weak-map": {
2120
- "version": "2.0.2",
2121
- "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
2122
- "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
2123
- "dev": true,
2124
- "requires": {
2125
- "d": "1",
2126
- "es5-ext": "^0.10.14",
2127
- "es6-iterator": "^2.0.1",
2128
- "es6-symbol": "^3.1.1"
2129
- }
2130
- },
2131
- "escape-string-regexp": {
2132
- "version": "1.0.5",
2133
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
2134
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
2135
- "dev": true
2136
- },
2137
- "escope": {
2138
- "version": "3.6.0",
2139
- "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
2140
- "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
2141
- "dev": true,
2142
- "requires": {
2143
- "es6-map": "^0.1.3",
2144
- "es6-weak-map": "^2.0.1",
2145
- "esrecurse": "^4.1.0",
2146
- "estraverse": "^4.1.1"
2147
- }
2148
- },
2149
- "esprima": {
2150
- "version": "4.0.1",
2151
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
2152
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
2153
- },
2154
- "esrecurse": {
2155
- "version": "4.2.1",
2156
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
2157
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
2158
- "dev": true,
2159
- "requires": {
2160
- "estraverse": "^4.1.0"
2161
- }
2162
- },
2163
- "estraverse": {
2164
- "version": "4.2.0",
2165
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
2166
- "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
2167
- "dev": true
2168
- },
2169
- "esutils": {
2170
- "version": "2.0.2",
2171
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
2172
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
2173
- },
2174
- "event-emitter": {
2175
- "version": "0.3.5",
2176
- "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
2177
- "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
2178
- "dev": true,
2179
- "requires": {
2180
- "d": "1",
2181
- "es5-ext": "~0.10.14"
2182
- }
2183
- },
2184
- "eventemitter2": {
2185
- "version": "0.4.14",
2186
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
2187
- "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
2188
- "dev": true
2189
- },
2190
- "events": {
2191
- "version": "3.0.0",
2192
- "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz",
2193
- "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==",
2194
- "dev": true
2195
- },
2196
- "evp_bytestokey": {
2197
- "version": "1.0.3",
2198
- "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
2199
- "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
2200
- "dev": true,
2201
- "requires": {
2202
- "md5.js": "^1.3.4",
2203
- "safe-buffer": "^5.1.1"
2204
- }
2205
- },
2206
- "execa": {
2207
- "version": "0.7.0",
2208
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
2209
- "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
2210
- "dev": true,
2211
- "requires": {
2212
- "cross-spawn": "^5.0.1",
2213
- "get-stream": "^3.0.0",
2214
- "is-stream": "^1.1.0",
2215
- "npm-run-path": "^2.0.0",
2216
- "p-finally": "^1.0.0",
2217
- "signal-exit": "^3.0.0",
2218
- "strip-eof": "^1.0.0"
2219
- },
2220
- "dependencies": {
2221
- "cross-spawn": {
2222
- "version": "5.1.0",
2223
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
2224
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
2225
- "dev": true,
2226
- "requires": {
2227
- "lru-cache": "^4.0.1",
2228
- "shebang-command": "^1.2.0",
2229
- "which": "^1.2.9"
2230
- }
2231
- }
2232
- }
2233
- },
2234
- "exit": {
2235
- "version": "0.1.2",
2236
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
2237
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
2238
- "dev": true
2239
- },
2240
- "expand-brackets": {
2241
- "version": "2.1.4",
2242
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
2243
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
2244
- "dev": true,
2245
- "requires": {
2246
- "debug": "^2.3.3",
2247
- "define-property": "^0.2.5",
2248
- "extend-shallow": "^2.0.1",
2249
- "posix-character-classes": "^0.1.0",
2250
- "regex-not": "^1.0.0",
2251
- "snapdragon": "^0.8.1",
2252
- "to-regex": "^3.0.1"
2253
- },
2254
- "dependencies": {
2255
- "define-property": {
2256
- "version": "0.2.5",
2257
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
2258
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
2259
- "dev": true,
2260
- "requires": {
2261
- "is-descriptor": "^0.1.0"
2262
- }
2263
- },
2264
- "extend-shallow": {
2265
- "version": "2.0.1",
2266
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
2267
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
2268
- "dev": true,
2269
- "requires": {
2270
- "is-extendable": "^0.1.0"
2271
- }
2272
- }
2273
- }
2274
- },
2275
- "extend": {
2276
- "version": "3.0.2",
2277
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
2278
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
2279
- "dev": true,
2280
- "optional": true
2281
- },
2282
- "extend-shallow": {
2283
- "version": "3.0.2",
2284
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
2285
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
2286
- "dev": true,
2287
- "requires": {
2288
- "assign-symbols": "^1.0.0",
2289
- "is-extendable": "^1.0.1"
2290
- },
2291
- "dependencies": {
2292
- "is-extendable": {
2293
- "version": "1.0.1",
2294
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
2295
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
2296
- "dev": true,
2297
- "requires": {
2298
- "is-plain-object": "^2.0.4"
2299
- }
2300
- }
2301
- }
2302
- },
2303
- "extglob": {
2304
- "version": "2.0.4",
2305
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
2306
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
2307
- "dev": true,
2308
- "requires": {
2309
- "array-unique": "^0.3.2",
2310
- "define-property": "^1.0.0",
2311
- "expand-brackets": "^2.1.4",
2312
- "extend-shallow": "^2.0.1",
2313
- "fragment-cache": "^0.2.1",
2314
- "regex-not": "^1.0.0",
2315
- "snapdragon": "^0.8.1",
2316
- "to-regex": "^3.0.1"
2317
- },
2318
- "dependencies": {
2319
- "define-property": {
2320
- "version": "1.0.0",
2321
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
2322
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
2323
- "dev": true,
2324
- "requires": {
2325
- "is-descriptor": "^1.0.0"
2326
- }
2327
- },
2328
- "extend-shallow": {
2329
- "version": "2.0.1",
2330
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
2331
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
2332
- "dev": true,
2333
- "requires": {
2334
- "is-extendable": "^0.1.0"
2335
- }
2336
- },
2337
- "is-accessor-descriptor": {
2338
- "version": "1.0.0",
2339
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
2340
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
2341
- "dev": true,
2342
- "requires": {
2343
- "kind-of": "^6.0.0"
2344
- }
2345
- },
2346
- "is-data-descriptor": {
2347
- "version": "1.0.0",
2348
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
2349
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
2350
- "dev": true,
2351
- "requires": {
2352
- "kind-of": "^6.0.0"
2353
- }
2354
- },
2355
- "is-descriptor": {
2356
- "version": "1.0.2",
2357
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
2358
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
2359
- "dev": true,
2360
- "requires": {
2361
- "is-accessor-descriptor": "^1.0.0",
2362
- "is-data-descriptor": "^1.0.0",
2363
- "kind-of": "^6.0.2"
2364
- }
2365
- },
2366
- "kind-of": {
2367
- "version": "6.0.2",
2368
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
2369
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
2370
- "dev": true
2371
- }
2372
- }
2373
- },
2374
- "extsprintf": {
2375
- "version": "1.3.0",
2376
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
2377
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
2378
- "dev": true,
2379
- "optional": true
2380
- },
2381
- "fast-deep-equal": {
2382
- "version": "2.0.1",
2383
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
2384
- "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
2385
- "dev": true
2386
- },
2387
- "fast-json-stable-stringify": {
2388
- "version": "2.0.0",
2389
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
2390
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
2391
- "dev": true
2392
- },
2393
- "faye-websocket": {
2394
- "version": "0.10.0",
2395
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
2396
- "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
2397
- "dev": true,
2398
- "requires": {
2399
- "websocket-driver": ">=0.5.1"
2400
- }
2401
- },
2402
- "figures": {
2403
- "version": "1.7.0",
2404
- "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
2405
- "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
2406
- "dev": true,
2407
- "requires": {
2408
- "escape-string-regexp": "^1.0.5",
2409
- "object-assign": "^4.1.0"
2410
- }
2411
- },
2412
- "fill-range": {
2413
- "version": "4.0.0",
2414
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
2415
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
2416
- "dev": true,
2417
- "requires": {
2418
- "extend-shallow": "^2.0.1",
2419
- "is-number": "^3.0.0",
2420
- "repeat-string": "^1.6.1",
2421
- "to-regex-range": "^2.1.0"
2422
- },
2423
- "dependencies": {
2424
- "extend-shallow": {
2425
- "version": "2.0.1",
2426
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
2427
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
2428
- "dev": true,
2429
- "requires": {
2430
- "is-extendable": "^0.1.0"
2431
- }
2432
- }
2433
- }
2434
- },
2435
- "find-cache-dir": {
2436
- "version": "1.0.0",
2437
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
2438
- "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
2439
- "dev": true,
2440
- "requires": {
2441
- "commondir": "^1.0.1",
2442
- "make-dir": "^1.0.0",
2443
- "pkg-dir": "^2.0.0"
2444
- }
2445
- },
2446
- "find-root": {
2447
- "version": "1.1.0",
2448
- "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
2449
- "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
2450
- },
2451
- "find-up": {
2452
- "version": "2.1.0",
2453
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
2454
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
2455
- "dev": true,
2456
- "requires": {
2457
- "locate-path": "^2.0.0"
2458
- }
2459
- },
2460
- "findup-sync": {
2461
- "version": "0.3.0",
2462
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
2463
- "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
2464
- "dev": true,
2465
- "requires": {
2466
- "glob": "~5.0.0"
2467
- },
2468
- "dependencies": {
2469
- "glob": {
2470
- "version": "5.0.15",
2471
- "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
2472
- "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
2473
- "dev": true,
2474
- "requires": {
2475
- "inflight": "^1.0.4",
2476
- "inherits": "2",
2477
- "minimatch": "2 || 3",
2478
- "once": "^1.3.0",
2479
- "path-is-absolute": "^1.0.0"
2480
- }
2481
- }
2482
- }
2483
- },
2484
- "for-in": {
2485
- "version": "1.0.2",
2486
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
2487
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
2488
- "dev": true
2489
- },
2490
- "forever-agent": {
2491
- "version": "0.6.1",
2492
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
2493
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
2494
- "dev": true,
2495
- "optional": true
2496
- },
2497
- "form-data": {
2498
- "version": "2.3.3",
2499
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
2500
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
2501
- "dev": true,
2502
- "optional": true,
2503
- "requires": {
2504
- "asynckit": "^0.4.0",
2505
- "combined-stream": "^1.0.6",
2506
- "mime-types": "^2.1.12"
2507
- }
2508
- },
2509
- "fragment-cache": {
2510
- "version": "0.2.1",
2511
- "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
2512
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
2513
- "dev": true,
2514
- "requires": {
2515
- "map-cache": "^0.2.2"
2516
- }
2517
- },
2518
- "fs.realpath": {
2519
- "version": "1.0.0",
2520
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
2521
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
2522
- "dev": true
2523
- },
2524
- "fsevents": {
2525
- "version": "1.2.7",
2526
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz",
2527
- "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==",
2528
- "dev": true,
2529
- "optional": true,
2530
- "requires": {
2531
- "nan": "^2.9.2",
2532
- "node-pre-gyp": "^0.10.0"
2533
- },
2534
- "dependencies": {
2535
- "abbrev": {
2536
- "version": "1.1.1",
2537
- "bundled": true,
2538
- "dev": true,
2539
- "optional": true
2540
- },
2541
- "ansi-regex": {
2542
- "version": "2.1.1",
2543
- "bundled": true,
2544
- "dev": true,
2545
- "optional": true
2546
- },
2547
- "aproba": {
2548
- "version": "1.2.0",
2549
- "bundled": true,
2550
- "dev": true,
2551
- "optional": true
2552
- },
2553
- "are-we-there-yet": {
2554
- "version": "1.1.5",
2555
- "bundled": true,
2556
- "dev": true,
2557
- "optional": true,
2558
- "requires": {
2559
- "delegates": "^1.0.0",
2560
- "readable-stream": "^2.0.6"
2561
- }
2562
- },
2563
- "balanced-match": {
2564
- "version": "1.0.0",
2565
- "bundled": true,
2566
- "dev": true,
2567
- "optional": true
2568
- },
2569
- "brace-expansion": {
2570
- "version": "1.1.11",
2571
- "bundled": true,
2572
- "dev": true,
2573
- "optional": true,
2574
- "requires": {
2575
- "balanced-match": "^1.0.0",
2576
- "concat-map": "0.0.1"
2577
- }
2578
- },
2579
- "chownr": {
2580
- "version": "1.1.1",
2581
- "bundled": true,
2582
- "dev": true,
2583
- "optional": true
2584
- },
2585
- "code-point-at": {
2586
- "version": "1.1.0",
2587
- "bundled": true,
2588
- "dev": true,
2589
- "optional": true
2590
- },
2591
- "concat-map": {
2592
- "version": "0.0.1",
2593
- "bundled": true,
2594
- "dev": true,
2595
- "optional": true
2596
- },
2597
- "console-control-strings": {
2598
- "version": "1.1.0",
2599
- "bundled": true,
2600
- "dev": true,
2601
- "optional": true
2602
- },
2603
- "core-util-is": {
2604
- "version": "1.0.2",
2605
- "bundled": true,
2606
- "dev": true,
2607
- "optional": true
2608
- },
2609
- "debug": {
2610
- "version": "2.6.9",
2611
- "bundled": true,
2612
- "dev": true,
2613
- "optional": true,
2614
- "requires": {
2615
- "ms": "2.0.0"
2616
- }
2617
- },
2618
- "deep-extend": {
2619
- "version": "0.6.0",
2620
- "bundled": true,
2621
- "dev": true,
2622
- "optional": true
2623
- },
2624
- "delegates": {
2625
- "version": "1.0.0",
2626
- "bundled": true,
2627
- "dev": true,
2628
- "optional": true
2629
- },
2630
- "detect-libc": {
2631
- "version": "1.0.3",
2632
- "bundled": true,
2633
- "dev": true,
2634
- "optional": true
2635
- },
2636
- "fs-minipass": {
2637
- "version": "1.2.5",
2638
- "bundled": true,
2639
- "dev": true,
2640
- "optional": true,
2641
- "requires": {
2642
- "minipass": "^2.2.1"
2643
- }
2644
- },
2645
- "fs.realpath": {
2646
- "version": "1.0.0",
2647
- "bundled": true,
2648
- "dev": true,
2649
- "optional": true
2650
- },
2651
- "gauge": {
2652
- "version": "2.7.4",
2653
- "bundled": true,
2654
- "dev": true,
2655
- "optional": true,
2656
- "requires": {
2657
- "aproba": "^1.0.3",
2658
- "console-control-strings": "^1.0.0",
2659
- "has-unicode": "^2.0.0",
2660
- "object-assign": "^4.1.0",
2661
- "signal-exit": "^3.0.0",
2662
- "string-width": "^1.0.1",
2663
- "strip-ansi": "^3.0.1",
2664
- "wide-align": "^1.1.0"
2665
- }
2666
- },
2667
- "glob": {
2668
- "version": "7.1.3",
2669
- "bundled": true,
2670
- "dev": true,
2671
- "optional": true,
2672
- "requires": {
2673
- "fs.realpath": "^1.0.0",
2674
- "inflight": "^1.0.4",
2675
- "inherits": "2",
2676
- "minimatch": "^3.0.4",
2677
- "once": "^1.3.0",
2678
- "path-is-absolute": "^1.0.0"
2679
- }
2680
- },
2681
- "has-unicode": {
2682
- "version": "2.0.1",
2683
- "bundled": true,
2684
- "dev": true,
2685
- "optional": true
2686
- },
2687
- "iconv-lite": {
2688
- "version": "0.4.24",
2689
- "bundled": true,
2690
- "dev": true,
2691
- "optional": true,
2692
- "requires": {
2693
- "safer-buffer": ">= 2.1.2 < 3"
2694
- }
2695
- },
2696
- "ignore-walk": {
2697
- "version": "3.0.1",
2698
- "bundled": true,
2699
- "dev": true,
2700
- "optional": true,
2701
- "requires": {
2702
- "minimatch": "^3.0.4"
2703
- }
2704
- },
2705
- "inflight": {
2706
- "version": "1.0.6",
2707
- "bundled": true,
2708
- "dev": true,
2709
- "optional": true,
2710
- "requires": {
2711
- "once": "^1.3.0",
2712
- "wrappy": "1"
2713
- }
2714
- },
2715
- "inherits": {
2716
- "version": "2.0.3",
2717
- "bundled": true,
2718
- "dev": true,
2719
- "optional": true
2720
- },
2721
- "ini": {
2722
- "version": "1.3.5",
2723
- "bundled": true,
2724
- "dev": true,
2725
- "optional": true
2726
- },
2727
- "is-fullwidth-code-point": {
2728
- "version": "1.0.0",
2729
- "bundled": true,
2730
- "dev": true,
2731
- "optional": true,
2732
- "requires": {
2733
- "number-is-nan": "^1.0.0"
2734
- }
2735
- },
2736
- "isarray": {
2737
- "version": "1.0.0",
2738
- "bundled": true,
2739
- "dev": true,
2740
- "optional": true
2741
- },
2742
- "minimatch": {
2743
- "version": "3.0.4",
2744
- "bundled": true,
2745
- "dev": true,
2746
- "optional": true,
2747
- "requires": {
2748
- "brace-expansion": "^1.1.7"
2749
- }
2750
- },
2751
- "minimist": {
2752
- "version": "0.0.8",
2753
- "bundled": true,
2754
- "dev": true,
2755
- "optional": true
2756
- },
2757
- "minipass": {
2758
- "version": "2.3.5",
2759
- "bundled": true,
2760
- "dev": true,
2761
- "optional": true,
2762
- "requires": {
2763
- "safe-buffer": "^5.1.2",
2764
- "yallist": "^3.0.0"
2765
- }
2766
- },
2767
- "minizlib": {
2768
- "version": "1.2.1",
2769
- "bundled": true,
2770
- "dev": true,
2771
- "optional": true,
2772
- "requires": {
2773
- "minipass": "^2.2.1"
2774
- }
2775
- },
2776
- "mkdirp": {
2777
- "version": "0.5.1",
2778
- "bundled": true,
2779
- "dev": true,
2780
- "optional": true,
2781
- "requires": {
2782
- "minimist": "0.0.8"
2783
- }
2784
- },
2785
- "ms": {
2786
- "version": "2.0.0",
2787
- "bundled": true,
2788
- "dev": true,
2789
- "optional": true
2790
- },
2791
- "needle": {
2792
- "version": "2.2.4",
2793
- "bundled": true,
2794
- "dev": true,
2795
- "optional": true,
2796
- "requires": {
2797
- "debug": "^2.1.2",
2798
- "iconv-lite": "^0.4.4",
2799
- "sax": "^1.2.4"
2800
- }
2801
- },
2802
- "node-pre-gyp": {
2803
- "version": "0.10.3",
2804
- "bundled": true,
2805
- "dev": true,
2806
- "optional": true,
2807
- "requires": {
2808
- "detect-libc": "^1.0.2",
2809
- "mkdirp": "^0.5.1",
2810
- "needle": "^2.2.1",
2811
- "nopt": "^4.0.1",
2812
- "npm-packlist": "^1.1.6",
2813
- "npmlog": "^4.0.2",
2814
- "rc": "^1.2.7",
2815
- "rimraf": "^2.6.1",
2816
- "semver": "^5.3.0",
2817
- "tar": "^4"
2818
- }
2819
- },
2820
- "nopt": {
2821
- "version": "4.0.1",
2822
- "bundled": true,
2823
- "dev": true,
2824
- "optional": true,
2825
- "requires": {
2826
- "abbrev": "1",
2827
- "osenv": "^0.1.4"
2828
- }
2829
- },
2830
- "npm-bundled": {
2831
- "version": "1.0.5",
2832
- "bundled": true,
2833
- "dev": true,
2834
- "optional": true
2835
- },
2836
- "npm-packlist": {
2837
- "version": "1.2.0",
2838
- "bundled": true,
2839
- "dev": true,
2840
- "optional": true,
2841
- "requires": {
2842
- "ignore-walk": "^3.0.1",
2843
- "npm-bundled": "^1.0.1"
2844
- }
2845
- },
2846
- "npmlog": {
2847
- "version": "4.1.2",
2848
- "bundled": true,
2849
- "dev": true,
2850
- "optional": true,
2851
- "requires": {
2852
- "are-we-there-yet": "~1.1.2",
2853
- "console-control-strings": "~1.1.0",
2854
- "gauge": "~2.7.3",
2855
- "set-blocking": "~2.0.0"
2856
- }
2857
- },
2858
- "number-is-nan": {
2859
- "version": "1.0.1",
2860
- "bundled": true,
2861
- "dev": true,
2862
- "optional": true
2863
- },
2864
- "object-assign": {
2865
- "version": "4.1.1",
2866
- "bundled": true,
2867
- "dev": true,
2868
- "optional": true
2869
- },
2870
- "once": {
2871
- "version": "1.4.0",
2872
- "bundled": true,
2873
- "dev": true,
2874
- "optional": true,
2875
- "requires": {
2876
- "wrappy": "1"
2877
- }
2878
- },
2879
- "os-homedir": {
2880
- "version": "1.0.2",
2881
- "bundled": true,
2882
- "dev": true,
2883
- "optional": true
2884
- },
2885
- "os-tmpdir": {
2886
- "version": "1.0.2",
2887
- "bundled": true,
2888
- "dev": true,
2889
- "optional": true
2890
- },
2891
- "osenv": {
2892
- "version": "0.1.5",
2893
- "bundled": true,
2894
- "dev": true,
2895
- "optional": true,
2896
- "requires": {
2897
- "os-homedir": "^1.0.0",
2898
- "os-tmpdir": "^1.0.0"
2899
- }
2900
- },
2901
- "path-is-absolute": {
2902
- "version": "1.0.1",
2903
- "bundled": true,
2904
- "dev": true,
2905
- "optional": true
2906
- },
2907
- "process-nextick-args": {
2908
- "version": "2.0.0",
2909
- "bundled": true,
2910
- "dev": true,
2911
- "optional": true
2912
- },
2913
- "rc": {
2914
- "version": "1.2.8",
2915
- "bundled": true,
2916
- "dev": true,
2917
- "optional": true,
2918
- "requires": {
2919
- "deep-extend": "^0.6.0",
2920
- "ini": "~1.3.0",
2921
- "minimist": "^1.2.0",
2922
- "strip-json-comments": "~2.0.1"
2923
- },
2924
- "dependencies": {
2925
- "minimist": {
2926
- "version": "1.2.0",
2927
- "bundled": true,
2928
- "dev": true,
2929
- "optional": true
2930
- }
2931
- }
2932
- },
2933
- "readable-stream": {
2934
- "version": "2.3.6",
2935
- "bundled": true,
2936
- "dev": true,
2937
- "optional": true,
2938
- "requires": {
2939
- "core-util-is": "~1.0.0",
2940
- "inherits": "~2.0.3",
2941
- "isarray": "~1.0.0",
2942
- "process-nextick-args": "~2.0.0",
2943
- "safe-buffer": "~5.1.1",
2944
- "string_decoder": "~1.1.1",
2945
- "util-deprecate": "~1.0.1"
2946
- }
2947
- },
2948
- "rimraf": {
2949
- "version": "2.6.3",
2950
- "bundled": true,
2951
- "dev": true,
2952
- "optional": true,
2953
- "requires": {
2954
- "glob": "^7.1.3"
2955
- }
2956
- },
2957
- "safe-buffer": {
2958
- "version": "5.1.2",
2959
- "bundled": true,
2960
- "dev": true,
2961
- "optional": true
2962
- },
2963
- "safer-buffer": {
2964
- "version": "2.1.2",
2965
- "bundled": true,
2966
- "dev": true,
2967
- "optional": true
2968
- },
2969
- "sax": {
2970
- "version": "1.2.4",
2971
- "bundled": true,
2972
- "dev": true,
2973
- "optional": true
2974
- },
2975
- "semver": {
2976
- "version": "5.6.0",
2977
- "bundled": true,
2978
- "dev": true,
2979
- "optional": true
2980
- },
2981
- "set-blocking": {
2982
- "version": "2.0.0",
2983
- "bundled": true,
2984
- "dev": true,
2985
- "optional": true
2986
- },
2987
- "signal-exit": {
2988
- "version": "3.0.2",
2989
- "bundled": true,
2990
- "dev": true,
2991
- "optional": true
2992
- },
2993
- "string-width": {
2994
- "version": "1.0.2",
2995
- "bundled": true,
2996
- "dev": true,
2997
- "optional": true,
2998
- "requires": {
2999
- "code-point-at": "^1.0.0",
3000
- "is-fullwidth-code-point": "^1.0.0",
3001
- "strip-ansi": "^3.0.0"
3002
- }
3003
- },
3004
- "string_decoder": {
3005
- "version": "1.1.1",
3006
- "bundled": true,
3007
- "dev": true,
3008
- "optional": true,
3009
- "requires": {
3010
- "safe-buffer": "~5.1.0"
3011
- }
3012
- },
3013
- "strip-ansi": {
3014
- "version": "3.0.1",
3015
- "bundled": true,
3016
- "dev": true,
3017
- "optional": true,
3018
- "requires": {
3019
- "ansi-regex": "^2.0.0"
3020
- }
3021
- },
3022
- "strip-json-comments": {
3023
- "version": "2.0.1",
3024
- "bundled": true,
3025
- "dev": true,
3026
- "optional": true
3027
- },
3028
- "tar": {
3029
- "version": "4.4.8",
3030
- "bundled": true,
3031
- "dev": true,
3032
- "optional": true,
3033
- "requires": {
3034
- "chownr": "^1.1.1",
3035
- "fs-minipass": "^1.2.5",
3036
- "minipass": "^2.3.4",
3037
- "minizlib": "^1.1.1",
3038
- "mkdirp": "^0.5.0",
3039
- "safe-buffer": "^5.1.2",
3040
- "yallist": "^3.0.2"
3041
- }
3042
- },
3043
- "util-deprecate": {
3044
- "version": "1.0.2",
3045
- "bundled": true,
3046
- "dev": true,
3047
- "optional": true
3048
- },
3049
- "wide-align": {
3050
- "version": "1.1.3",
3051
- "bundled": true,
3052
- "dev": true,
3053
- "optional": true,
3054
- "requires": {
3055
- "string-width": "^1.0.2 || 2"
3056
- }
3057
- },
3058
- "wrappy": {
3059
- "version": "1.0.2",
3060
- "bundled": true,
3061
- "dev": true,
3062
- "optional": true
3063
- },
3064
- "yallist": {
3065
- "version": "3.0.3",
3066
- "bundled": true,
3067
- "dev": true,
3068
- "optional": true
3069
- }
3070
- }
3071
- },
3072
- "gaze": {
3073
- "version": "1.1.3",
3074
- "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
3075
- "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
3076
- "dev": true,
3077
- "requires": {
3078
- "globule": "^1.0.0"
3079
- }
3080
- },
3081
- "get-caller-file": {
3082
- "version": "1.0.3",
3083
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
3084
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
3085
- "dev": true
3086
- },
3087
- "get-stdin": {
3088
- "version": "4.0.1",
3089
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
3090
- "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
3091
- "dev": true
3092
- },
3093
- "get-stream": {
3094
- "version": "3.0.0",
3095
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
3096
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
3097
- "dev": true
3098
- },
3099
- "get-value": {
3100
- "version": "2.0.6",
3101
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
3102
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
3103
- "dev": true
3104
- },
3105
- "getobject": {
3106
- "version": "0.1.0",
3107
- "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
3108
- "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=",
3109
- "dev": true
3110
- },
3111
- "getpass": {
3112
- "version": "0.1.7",
3113
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
3114
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
3115
- "dev": true,
3116
- "optional": true,
3117
- "requires": {
3118
- "assert-plus": "^1.0.0"
3119
- }
3120
- },
3121
- "gettext-parser": {
3122
- "version": "1.4.0",
3123
- "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.4.0.tgz",
3124
- "integrity": "sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==",
3125
- "requires": {
3126
- "encoding": "^0.1.12",
3127
- "safe-buffer": "^5.1.1"
3128
- }
3129
- },
3130
- "glob": {
3131
- "version": "7.0.6",
3132
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
3133
- "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
3134
- "dev": true,
3135
- "requires": {
3136
- "fs.realpath": "^1.0.0",
3137
- "inflight": "^1.0.4",
3138
- "inherits": "2",
3139
- "minimatch": "^3.0.2",
3140
- "once": "^1.3.0",
3141
- "path-is-absolute": "^1.0.0"
3142
- }
3143
- },
3144
- "glob-parent": {
3145
- "version": "3.1.0",
3146
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
3147
- "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
3148
- "dev": true,
3149
- "requires": {
3150
- "is-glob": "^3.1.0",
3151
- "path-dirname": "^1.0.0"
3152
- },
3153
- "dependencies": {
3154
- "is-glob": {
3155
- "version": "3.1.0",
3156
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
3157
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
3158
- "dev": true,
3159
- "requires": {
3160
- "is-extglob": "^2.1.0"
3161
- }
3162
- }
3163
- }
3164
- },
3165
- "globals": {
3166
- "version": "9.18.0",
3167
- "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
3168
- "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
3169
- "dev": true
3170
- },
3171
- "globule": {
3172
- "version": "1.2.1",
3173
- "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
3174
- "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
3175
- "dev": true,
3176
- "requires": {
3177
- "glob": "~7.1.1",
3178
- "lodash": "~4.17.10",
3179
- "minimatch": "~3.0.2"
3180
- },
3181
- "dependencies": {
3182
- "glob": {
3183
- "version": "7.1.3",
3184
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
3185
- "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
3186
- "dev": true,
3187
- "requires": {
3188
- "fs.realpath": "^1.0.0",
3189
- "inflight": "^1.0.4",
3190
- "inherits": "2",
3191
- "minimatch": "^3.0.4",
3192
- "once": "^1.3.0",
3193
- "path-is-absolute": "^1.0.0"
3194
- }
3195
- }
3196
- }
3197
- },
3198
- "graceful-fs": {
3199
- "version": "4.1.15",
3200
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
3201
- "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
3202
- "dev": true
3203
- },
3204
- "grunt": {
3205
- "version": "1.0.3",
3206
- "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.3.tgz",
3207
- "integrity": "sha512-/JzmZNPfKorlCrrmxWqQO4JVodO+DVd5XX4DkocL/1WlLlKVLE9+SdEIempOAxDhWPysLle6afvn/hg7Ck2k9g==",
3208
- "dev": true,
3209
- "requires": {
3210
- "coffeescript": "~1.10.0",
3211
- "dateformat": "~1.0.12",
3212
- "eventemitter2": "~0.4.13",
3213
- "exit": "~0.1.1",
3214
- "findup-sync": "~0.3.0",
3215
- "glob": "~7.0.0",
3216
- "grunt-cli": "~1.2.0",
3217
- "grunt-known-options": "~1.1.0",
3218
- "grunt-legacy-log": "~2.0.0",
3219
- "grunt-legacy-util": "~1.1.1",
3220
- "iconv-lite": "~0.4.13",
3221
- "js-yaml": "~3.5.2",
3222
- "minimatch": "~3.0.2",
3223
- "mkdirp": "~0.5.1",
3224
- "nopt": "~3.0.6",
3225
- "path-is-absolute": "~1.0.0",
3226
- "rimraf": "~2.6.2"
3227
- },
3228
- "dependencies": {
3229
- "esprima": {
3230
- "version": "2.7.3",
3231
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
3232
- "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
3233
- "dev": true
3234
- },
3235
- "grunt-cli": {
3236
- "version": "1.2.0",
3237
- "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
3238
- "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=",
3239
- "dev": true,
3240
- "requires": {
3241
- "findup-sync": "~0.3.0",
3242
- "grunt-known-options": "~1.1.0",
3243
- "nopt": "~3.0.6",
3244
- "resolve": "~1.1.0"
3245
- }
3246
- },
3247
- "js-yaml": {
3248
- "version": "3.5.5",
3249
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz",
3250
- "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=",
3251
- "dev": true,
3252
- "requires": {
3253
- "argparse": "^1.0.2",
3254
- "esprima": "^2.6.0"
3255
- }
3256
- },
3257
- "nopt": {
3258
- "version": "3.0.6",
3259
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
3260
- "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
3261
- "dev": true,
3262
- "requires": {
3263
- "abbrev": "1"
3264
- }
3265
- },
3266
- "resolve": {
3267
- "version": "1.1.7",
3268
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
3269
- "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
3270
- "dev": true
3271
- }
3272
- }
3273
- },
3274
- "grunt-checktextdomain": {
3275
- "version": "1.0.1",
3276
- "resolved": "https://registry.npmjs.org/grunt-checktextdomain/-/grunt-checktextdomain-1.0.1.tgz",
3277
- "integrity": "sha1-slTQHh3pEwBdTbHFMD2QI7mD4Zs=",
3278
- "dev": true,
3279
- "requires": {
3280
- "chalk": "~0.2.1",
3281
- "text-table": "~0.2.0"
3282
- },
3283
- "dependencies": {
3284
- "ansi-styles": {
3285
- "version": "0.2.0",
3286
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.2.0.tgz",
3287
- "integrity": "sha1-NZq0sV3NZLptdHNLcsNjYKmvLBk=",
3288
- "dev": true
3289
- },
3290
- "chalk": {
3291
- "version": "0.2.1",
3292
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.2.1.tgz",
3293
- "integrity": "sha1-dhPhV1FFshOGSD9/SFql/6jL0Qw=",
3294
- "dev": true,
3295
- "requires": {
3296
- "ansi-styles": "~0.2.0",
3297
- "has-color": "~0.1.0"
3298
- }
3299
- }
3300
- }
3301
- },
3302
- "grunt-contrib-clean": {
3303
- "version": "2.0.0",
3304
- "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.0.tgz",
3305
- "integrity": "sha512-g5ZD3ORk6gMa5ugZosLDQl3dZO7cI3R14U75hTM+dVLVxdMNJCPVmwf9OUt4v4eWgpKKWWoVK9DZc1amJp4nQw==",
3306
- "dev": true,
3307
- "requires": {
3308
- "async": "^2.6.1",
3309
- "rimraf": "^2.6.2"
3310
- },
3311
- "dependencies": {
3312
- "async": {
3313
- "version": "2.6.2",
3314
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
3315
- "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
3316
- "dev": true,
3317
- "requires": {
3318
- "lodash": "^4.17.11"
3319
- }
3320
- }
3321
- }
3322
- },
3323
- "grunt-contrib-cssmin": {
3324
- "version": "3.0.0",
3325
- "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-3.0.0.tgz",
3326
- "integrity": "sha512-eXpooYmVGKMs/xV7DzTLgJFPVOfMuawPD3x0JwhlH0mumq2NtH3xsxaHxp1Y3NKxp0j0tRhFS6kSBRsz6TuTGg==",
3327
- "dev": true,
3328
- "requires": {
3329
- "chalk": "^2.4.1",
3330
- "clean-css": "~4.2.1",
3331
- "maxmin": "^2.1.0"
3332
- },
3333
- "dependencies": {
3334
- "ansi-styles": {
3335
- "version": "3.2.1",
3336
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
3337
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
3338
- "dev": true,
3339
- "requires": {
3340
- "color-convert": "^1.9.0"
3341
- }
3342
- },
3343
- "chalk": {
3344
- "version": "2.4.2",
3345
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
3346
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
3347
- "dev": true,
3348
- "requires": {
3349
- "ansi-styles": "^3.2.1",
3350
- "escape-string-regexp": "^1.0.5",
3351
- "supports-color": "^5.3.0"
3352
- }
3353
- },
3354
- "supports-color": {
3355
- "version": "5.5.0",
3356
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
3357
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
3358
- "dev": true,
3359
- "requires": {
3360
- "has-flag": "^3.0.0"
3361
- }
3362
- }
3363
- }
3364
- },
3365
- "grunt-contrib-less": {
3366
- "version": "2.0.0",
3367
- "resolved": "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-2.0.0.tgz",
3368
- "integrity": "sha512-nsaODoEMjVn61OuqPaFeFQpb4Qd/EbfxQDeYnh2oONXm8L5Gnuchtv59kl0V3hjiFdOkZlPILDc3ZrkoZI0PNw==",
3369
- "dev": true,
3370
- "requires": {
3371
- "async": "^2.0.0",
3372
- "chalk": "^1.0.0",
3373
- "less": "^3.0.4",
3374
- "lodash": "^4.17.10"
3375
- },
3376
- "dependencies": {
3377
- "async": {
3378
- "version": "2.6.2",
3379
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
3380
- "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
3381
- "dev": true,
3382
- "requires": {
3383
- "lodash": "^4.17.11"
3384
- }
3385
- }
3386
- }
3387
- },
3388
- "grunt-contrib-rename": {
3389
- "version": "0.2.0",
3390
- "resolved": "https://registry.npmjs.org/grunt-contrib-rename/-/grunt-contrib-rename-0.2.0.tgz",
3391
- "integrity": "sha1-1CPU+SqZpYcncEX4MikdmM4V/co=",
3392
- "dev": true
3393
- },
3394
- "grunt-contrib-uglify": {
3395
- "version": "4.0.0",
3396
- "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-4.0.0.tgz",
3397
- "integrity": "sha512-vy3Vop2KDqdiwcGOGAjyKvjHFrRD/YK4KPQWR3Yt6OdYlgFw1z7HCuk66+IJ9s7oJmp9uRQXuuSHyawKRAgiMw==",
3398
- "dev": true,
3399
- "requires": {
3400
- "chalk": "^2.4.1",
3401
- "maxmin": "^2.1.0",
3402
- "uglify-js": "~3.4.8",
3403
- "uri-path": "^1.0.0"
3404
- },
3405
- "dependencies": {
3406
- "ansi-styles": {
3407
- "version": "3.2.1",
3408
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
3409
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
3410
- "dev": true,
3411
- "requires": {
3412
- "color-convert": "^1.9.0"
3413
- }
3414
- },
3415
- "chalk": {
3416
- "version": "2.4.2",
3417
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
3418
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
3419
- "dev": true,
3420
- "requires": {
3421
- "ansi-styles": "^3.2.1",
3422
- "escape-string-regexp": "^1.0.5",
3423
- "supports-color": "^5.3.0"
3424
- }
3425
- },
3426
- "supports-color": {
3427
- "version": "5.5.0",
3428
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
3429
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
3430
- "dev": true,
3431
- "requires": {
3432
- "has-flag": "^3.0.0"
3433
- }
3434
- }
3435
- }
3436
- },
3437
- "grunt-contrib-watch": {
3438
- "version": "1.1.0",
3439
- "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz",
3440
- "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==",
3441
- "dev": true,
3442
- "requires": {
3443
- "async": "^2.6.0",
3444
- "gaze": "^1.1.0",
3445
- "lodash": "^4.17.10",
3446
- "tiny-lr": "^1.1.1"
3447
- },
3448
- "dependencies": {
3449
- "async": {
3450
- "version": "2.6.2",
3451
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
3452
- "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
3453
- "dev": true,
3454
- "requires": {
3455
- "lodash": "^4.17.11"
3456
- }
3457
- }
3458
- }
3459
- },
3460
- "grunt-known-options": {
3461
- "version": "1.1.1",
3462
- "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
3463
- "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==",
3464
- "dev": true
3465
- },
3466
- "grunt-legacy-log": {
3467
- "version": "2.0.0",
3468
- "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz",
3469
- "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==",
3470
- "dev": true,
3471
- "requires": {
3472
- "colors": "~1.1.2",
3473
- "grunt-legacy-log-utils": "~2.0.0",
3474
- "hooker": "~0.2.3",
3475
- "lodash": "~4.17.5"
3476
- }
3477
- },
3478
- "grunt-legacy-log-utils": {
3479
- "version": "2.0.1",
3480
- "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz",
3481
- "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==",
3482
- "dev": true,
3483
- "requires": {
3484
- "chalk": "~2.4.1",
3485
- "lodash": "~4.17.10"
3486
- },
3487
- "dependencies": {
3488
- "ansi-styles": {
3489
- "version": "3.2.1",
3490
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
3491
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
3492
- "dev": true,
3493
- "requires": {
3494
- "color-convert": "^1.9.0"
3495
- }
3496
- },
3497
- "chalk": {
3498
- "version": "2.4.2",
3499
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
3500
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
3501
- "dev": true,
3502
- "requires": {
3503
- "ansi-styles": "^3.2.1",
3504
- "escape-string-regexp": "^1.0.5",
3505
- "supports-color": "^5.3.0"
3506
- }
3507
- },
3508
- "supports-color": {
3509
- "version": "5.5.0",
3510
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
3511
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
3512
- "dev": true,
3513
- "requires": {
3514
- "has-flag": "^3.0.0"
3515
- }
3516
- }
3517
- }
3518
- },
3519
- "grunt-legacy-util": {
3520
- "version": "1.1.1",
3521
- "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz",
3522
- "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==",
3523
- "dev": true,
3524
- "requires": {
3525
- "async": "~1.5.2",
3526
- "exit": "~0.1.1",
3527
- "getobject": "~0.1.0",
3528
- "hooker": "~0.2.3",
3529
- "lodash": "~4.17.10",
3530
- "underscore.string": "~3.3.4",
3531
- "which": "~1.3.0"
3532
- }
3533
- },
3534
- "grunt-po2json": {
3535
- "version": "0.3.0",
3536
- "resolved": "https://registry.npmjs.org/grunt-po2json/-/grunt-po2json-0.3.0.tgz",
3537
- "integrity": "sha1-y4hZOErUzFokTHfMAm846sayhMM=",
3538
- "dev": true,
3539
- "requires": {
3540
- "po2json": "*"
3541
- }
3542
- },
3543
- "grunt-shell": {
3544
- "version": "2.1.0",
3545
- "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-2.1.0.tgz",
3546
- "integrity": "sha1-Q595FZ7RHmSmUaacyKPQK+v17MI=",
3547
- "dev": true,
3548
- "requires": {
3549
- "chalk": "^1.0.0",
3550
- "npm-run-path": "^2.0.0"
3551
- }
3552
- },
3553
- "grunt-wp-i18n": {
3554
- "version": "1.0.3",
3555
- "resolved": "https://registry.npmjs.org/grunt-wp-i18n/-/grunt-wp-i18n-1.0.3.tgz",
3556
- "integrity": "sha512-CJNbEKeBeOSAPeaJ9B8iCgSwtaG63UR9/uT46a4OsIqnFhOJpeAi138JTlvjfIbnDVoBrzvdrKJe1svveLjUtA==",
3557
- "dev": true,
3558
- "requires": {
3559
- "grunt": "^1.0.3",
3560
- "node-wp-i18n": "^1.2.2"
3561
- }
3562
- },
3563
- "gzip-size": {
3564
- "version": "3.0.0",
3565
- "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz",
3566
- "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
3567
- "dev": true,
3568
- "requires": {
3569
- "duplexer": "^0.1.1"
3570
- }
3571
- },
3572
- "har-schema": {
3573
- "version": "2.0.0",
3574
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
3575
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
3576
- "dev": true,
3577
- "optional": true
3578
- },
3579
- "har-validator": {
3580
- "version": "5.1.3",
3581
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
3582
- "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
3583
- "dev": true,
3584
- "optional": true,
3585
- "requires": {
3586
- "ajv": "^6.5.5",
3587
- "har-schema": "^2.0.0"
3588
- }
3589
- },
3590
- "has-ansi": {
3591
- "version": "2.0.0",
3592
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
3593
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
3594
- "dev": true,
3595
- "requires": {
3596
- "ansi-regex": "^2.0.0"
3597
- }
3598
- },
3599
- "has-color": {
3600
- "version": "0.1.7",
3601
- "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
3602
- "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
3603
- "dev": true
3604
- },
3605
- "has-flag": {
3606
- "version": "3.0.0",
3607
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
3608
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
3609
- "dev": true
3610
- },
3611
- "has-value": {
3612
- "version": "1.0.0",
3613
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
3614
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
3615
- "dev": true,
3616
- "requires": {
3617
- "get-value": "^2.0.6",
3618
- "has-values": "^1.0.0",
3619
- "isobject": "^3.0.0"
3620
- }
3621
- },
3622
- "has-values": {
3623
- "version": "1.0.0",
3624
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
3625
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
3626
- "dev": true,
3627
- "requires": {
3628
- "is-number": "^3.0.0",
3629
- "kind-of": "^4.0.0"
3630
- },
3631
- "dependencies": {
3632
- "kind-of": {
3633
- "version": "4.0.0",
3634
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
3635
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
3636
- "dev": true,
3637
- "requires": {
3638
- "is-buffer": "^1.1.5"
3639
- }
3640
- }
3641
- }
3642
- },
3643
- "hash-base": {
3644
- "version": "3.0.4",
3645
- "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
3646
- "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
3647
- "dev": true,
3648
- "requires": {
3649
- "inherits": "^2.0.1",
3650
- "safe-buffer": "^5.0.1"
3651
- }
3652
- },
3653
- "hash.js": {
3654
- "version": "1.1.7",
3655
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
3656
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
3657
- "dev": true,
3658
- "requires": {
3659
- "inherits": "^2.0.3",
3660
- "minimalistic-assert": "^1.0.1"
3661
- }
3662
- },
3663
- "hmac-drbg": {
3664
- "version": "1.0.1",
3665
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
3666
- "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
3667
- "dev": true,
3668
- "requires": {
3669
- "hash.js": "^1.0.3",
3670
- "minimalistic-assert": "^1.0.0",
3671
- "minimalistic-crypto-utils": "^1.0.1"
3672
- }
3673
- },
3674
- "home-or-tmp": {
3675
- "version": "2.0.0",
3676
- "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
3677
- "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
3678
- "dev": true,
3679
- "requires": {
3680
- "os-homedir": "^1.0.0",
3681
- "os-tmpdir": "^1.0.1"
3682
- }
3683
- },
3684
- "hooker": {
3685
- "version": "0.2.3",
3686
- "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
3687
- "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
3688
- "dev": true
3689
- },
3690
- "hosted-git-info": {
3691
- "version": "2.7.1",
3692
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
3693
- "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
3694
- "dev": true
3695
- },
3696
- "http-parser-js": {
3697
- "version": "0.5.0",
3698
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
3699
- "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==",
3700
- "dev": true
3701
- },
3702
- "http-signature": {
3703
- "version": "1.2.0",
3704
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
3705
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
3706
- "dev": true,
3707
- "optional": true,
3708
- "requires": {
3709
- "assert-plus": "^1.0.0",
3710
- "jsprim": "^1.2.2",
3711
- "sshpk": "^1.7.0"
3712
- }
3713
- },
3714
- "https-browserify": {
3715
- "version": "1.0.0",
3716
- "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
3717
- "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
3718
- "dev": true
3719
- },
3720
- "iconv-lite": {
3721
- "version": "0.4.24",
3722
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
3723
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
3724
- "requires": {
3725
- "safer-buffer": ">= 2.1.2 < 3"
3726
- }
3727
- },
3728
- "ieee754": {
3729
- "version": "1.1.12",
3730
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
3731
- "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
3732
- "dev": true
3733
- },
3734
- "image-size": {
3735
- "version": "0.5.5",
3736
- "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
3737
- "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
3738
- "dev": true,
3739
- "optional": true
3740
- },
3741
- "import-fresh": {
3742
- "version": "2.0.0",
3743
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
3744
- "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
3745
- "requires": {
3746
- "caller-path": "^2.0.0",
3747
- "resolve-from": "^3.0.0"
3748
- }
3749
- },
3750
- "indent-string": {
3751
- "version": "2.1.0",
3752
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
3753
- "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
3754
- "dev": true,
3755
- "requires": {
3756
- "repeating": "^2.0.0"
3757
- }
3758
- },
3759
- "indexof": {
3760
- "version": "0.0.1",
3761
- "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
3762
- "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
3763
- "dev": true
3764
- },
3765
- "inflight": {
3766
- "version": "1.0.6",
3767
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
3768
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
3769
- "dev": true,
3770
- "requires": {
3771
- "once": "^1.3.0",
3772
- "wrappy": "1"
3773
- }
3774
- },
3775
- "inherits": {
3776
- "version": "2.0.3",
3777
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
3778
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
3779
- "dev": true
3780
- },
3781
- "interpret": {
3782
- "version": "1.2.0",
3783
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
3784
- "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
3785
- "dev": true
3786
- },
3787
- "invariant": {
3788
- "version": "2.2.4",
3789
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
3790
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
3791
- "dev": true,
3792
- "requires": {
3793
- "loose-envify": "^1.0.0"
3794
- }
3795
- },
3796
- "invert-kv": {
3797
- "version": "1.0.0",
3798
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
3799
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
3800
- "dev": true
3801
- },
3802
- "is-accessor-descriptor": {
3803
- "version": "0.1.6",
3804
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
3805
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
3806
- "dev": true,
3807
- "requires": {
3808
- "kind-of": "^3.0.2"
3809
- }
3810
- },
3811
- "is-arrayish": {
3812
- "version": "0.2.1",
3813
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
3814
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
3815
- },
3816
- "is-binary-path": {
3817
- "version": "1.0.1",
3818
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
3819
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
3820
- "dev": true,
3821
- "requires": {
3822
- "binary-extensions": "^1.0.0"
3823
- }
3824
- },
3825
- "is-buffer": {
3826
- "version": "1.1.6",
3827
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
3828
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
3829
- "dev": true
3830
- },
3831
- "is-data-descriptor": {
3832
- "version": "0.1.4",
3833
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
3834
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
3835
- "dev": true,
3836
- "requires": {
3837
- "kind-of": "^3.0.2"
3838
- }
3839
- },
3840
- "is-descriptor": {
3841
- "version": "0.1.6",
3842
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
3843
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
3844
- "dev": true,
3845
- "requires": {
3846
- "is-accessor-descriptor": "^0.1.6",
3847
- "is-data-descriptor": "^0.1.4",
3848
- "kind-of": "^5.0.0"
3849
- },
3850
- "dependencies": {
3851
- "kind-of": {
3852
- "version": "5.1.0",
3853
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
3854
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
3855
- "dev": true
3856
- }
3857
- }
3858
- },
3859
- "is-directory": {
3860
- "version": "0.3.1",
3861
- "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
3862
- "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
3863
- },
3864
- "is-extendable": {
3865
- "version": "0.1.1",
3866
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
3867
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
3868
- "dev": true
3869
- },
3870
- "is-extglob": {
3871
- "version": "2.1.1",
3872
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
3873
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
3874
- "dev": true
3875
- },
3876
- "is-finite": {
3877
- "version": "1.0.2",
3878
- "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
3879
- "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
3880
- "dev": true,
3881
- "requires": {
3882
- "number-is-nan": "^1.0.0"
3883
- }
3884
- },
3885
- "is-fullwidth-code-point": {
3886
- "version": "1.0.0",
3887
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
3888
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
3889
- "dev": true,
3890
- "requires": {
3891
- "number-is-nan": "^1.0.0"
3892
- }
3893
- },
3894
- "is-glob": {
3895
- "version": "4.0.0",
3896
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
3897
- "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
3898
- "dev": true,
3899
- "requires": {
3900
- "is-extglob": "^2.1.1"
3901
- }
3902
- },
3903
- "is-number": {
3904
- "version": "3.0.0",
3905
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
3906
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
3907
- "dev": true,
3908
- "requires": {
3909
- "kind-of": "^3.0.2"
3910
- }
3911
- },
3912
- "is-plain-object": {
3913
- "version": "2.0.4",
3914
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
3915
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
3916
- "dev": true,
3917
- "requires": {
3918
- "isobject": "^3.0.1"
3919
- }
3920
- },
3921
- "is-stream": {
3922
- "version": "1.1.0",
3923
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
3924
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
3925
- "dev": true
3926
- },
3927
- "is-typedarray": {
3928
- "version": "1.0.0",
3929
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
3930
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
3931
- "dev": true,
3932
- "optional": true
3933
- },
3934
- "is-utf8": {
3935
- "version": "0.2.1",
3936
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
3937
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
3938
- "dev": true
3939
- },
3940
- "is-windows": {
3941
- "version": "1.0.2",
3942
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
3943
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
3944
- "dev": true
3945
- },
3946
- "isarray": {
3947
- "version": "1.0.0",
3948
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
3949
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
3950
- "dev": true
3951
- },
3952
- "isexe": {
3953
- "version": "2.0.0",
3954
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
3955
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
3956
- "dev": true
3957
- },
3958
- "isobject": {
3959
- "version": "3.0.1",
3960
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
3961
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
3962
- "dev": true
3963
- },
3964
- "isstream": {
3965
- "version": "0.1.2",
3966
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
3967
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
3968
- "dev": true,
3969
- "optional": true
3970
- },
3971
- "js-tokens": {
3972
- "version": "4.0.0",
3973
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
3974
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
3975
- },
3976
- "js-yaml": {
3977
- "version": "3.12.2",
3978
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz",
3979
- "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==",
3980
- "requires": {
3981
- "argparse": "^1.0.7",
3982
- "esprima": "^4.0.0"
3983
- }
3984
- },
3985
- "jsbn": {
3986
- "version": "0.1.1",
3987
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
3988
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
3989
- "dev": true,
3990
- "optional": true
3991
- },
3992
- "jsesc": {
3993
- "version": "1.3.0",
3994
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
3995
- "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
3996
- "dev": true
3997
- },
3998
- "json-loader": {
3999
- "version": "0.5.7",
4000
- "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz",
4001
- "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==",
4002
- "dev": true
4003
- },
4004
- "json-parse-better-errors": {
4005
- "version": "1.0.2",
4006
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
4007
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
4008
- },
4009
- "json-schema": {
4010
- "version": "0.2.3",
4011
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
4012
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
4013
- "dev": true,
4014
- "optional": true
4015
- },
4016
- "json-schema-traverse": {
4017
- "version": "0.4.1",
4018
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
4019
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
4020
- "dev": true
4021
- },
4022
- "json-stringify-safe": {
4023
- "version": "5.0.1",
4024
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
4025
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
4026
- "dev": true,
4027
- "optional": true
4028
- },
4029
- "json5": {
4030
- "version": "0.5.1",
4031
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
4032
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
4033
- "dev": true
4034
- },
4035
- "jsprim": {
4036
- "version": "1.4.1",
4037
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
4038
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
4039
- "dev": true,
4040
- "optional": true,
4041
- "requires": {
4042
- "assert-plus": "1.0.0",
4043
- "extsprintf": "1.3.0",
4044
- "json-schema": "0.2.3",
4045
- "verror": "1.10.0"
4046
- }
4047
- },
4048
- "kind-of": {
4049
- "version": "3.2.2",
4050
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
4051
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
4052
- "dev": true,
4053
- "requires": {
4054
- "is-buffer": "^1.1.5"
4055
- }
4056
- },
4057
- "lazy-cache": {
4058
- "version": "1.0.4",
4059
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
4060
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
4061
- "dev": true
4062
- },
4063
- "lcid": {
4064
- "version": "1.0.0",
4065
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
4066
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
4067
- "dev": true,
4068
- "requires": {
4069
- "invert-kv": "^1.0.0"
4070
- }
4071
- },
4072
- "less": {
4073
- "version": "3.9.0",
4074
- "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz",
4075
- "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==",
4076
- "dev": true,
4077
- "requires": {
4078
- "clone": "^2.1.2",
4079
- "errno": "^0.1.1",
4080
- "graceful-fs": "^4.1.2",
4081
- "image-size": "~0.5.0",
4082
- "mime": "^1.4.1",
4083
- "mkdirp": "^0.5.0",
4084
- "promise": "^7.1.1",
4085
- "request": "^2.83.0",
4086
- "source-map": "~0.6.0"
4087
- },
4088
- "dependencies": {
4089
- "source-map": {
4090
- "version": "0.6.1",
4091
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
4092
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
4093
- "dev": true,
4094
- "optional": true
4095
- }
4096
- }
4097
- },
4098
- "livereload-js": {
4099
- "version": "2.4.0",
4100
- "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz",
4101
- "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==",
4102
- "dev": true
4103
- },
4104
- "load-json-file": {
4105
- "version": "1.1.0",
4106
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
4107
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
4108
- "dev": true,
4109
- "requires": {
4110
- "graceful-fs": "^4.1.2",
4111
- "parse-json": "^2.2.0",
4112
- "pify": "^2.0.0",
4113
- "pinkie-promise": "^2.0.0",
4114
- "strip-bom": "^2.0.0"
4115
- },
4116
- "dependencies": {
4117
- "parse-json": {
4118
- "version": "2.2.0",
4119
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
4120
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
4121
- "dev": true,
4122
- "requires": {
4123
- "error-ex": "^1.2.0"
4124
- }
4125
- },
4126
- "pify": {
4127
- "version": "2.3.0",
4128
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
4129
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
4130
- "dev": true
4131
- }
4132
- }
4133
- },
4134
- "loader-runner": {
4135
- "version": "2.4.0",
4136
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
4137
- "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
4138
- "dev": true
4139
- },
4140
- "loader-utils": {
4141
- "version": "1.2.3",
4142
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
4143
- "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
4144
- "dev": true,
4145
- "requires": {
4146
- "big.js": "^5.2.2",
4147
- "emojis-list": "^2.0.0",
4148
- "json5": "^1.0.1"
4149
- },
4150
- "dependencies": {
4151
- "json5": {
4152
- "version": "1.0.1",
4153
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
4154
- "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
4155
- "dev": true,
4156
- "requires": {
4157
- "minimist": "^1.2.0"
4158
- }
4159
- },
4160
- "minimist": {
4161
- "version": "1.2.0",
4162
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
4163
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
4164
- "dev": true
4165
- }
4166
- }
4167
- },
4168
- "locate-path": {
4169
- "version": "2.0.0",
4170
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
4171
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
4172
- "dev": true,
4173
- "requires": {
4174
- "p-locate": "^2.0.0",
4175
- "path-exists": "^3.0.0"
4176
- }
4177
- },
4178
- "lodash": {
4179
- "version": "4.17.19",
4180
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
4181
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
4182
- },
4183
- "lodash.get": {
4184
- "version": "4.4.2",
4185
- "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
4186
- "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
4187
- },
4188
- "longest": {
4189
- "version": "1.0.1",
4190
- "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
4191
- "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
4192
- "dev": true
4193
- },
4194
- "loose-envify": {
4195
- "version": "1.4.0",
4196
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
4197
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
4198
- "requires": {
4199
- "js-tokens": "^3.0.0 || ^4.0.0"
4200
- }
4201
- },
4202
- "loud-rejection": {
4203
- "version": "1.6.0",
4204
- "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
4205
- "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
4206
- "dev": true,
4207
- "requires": {
4208
- "currently-unhandled": "^0.4.1",
4209
- "signal-exit": "^3.0.0"
4210
- }
4211
- },
4212
- "lru-cache": {
4213
- "version": "4.1.5",
4214
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
4215
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
4216
- "dev": true,
4217
- "requires": {
4218
- "pseudomap": "^1.0.2",
4219
- "yallist": "^2.1.2"
4220
- }
4221
- },
4222
- "make-dir": {
4223
- "version": "1.3.0",
4224
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
4225
- "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
4226
- "dev": true,
4227
- "requires": {
4228
- "pify": "^3.0.0"
4229
- }
4230
- },
4231
- "map-cache": {
4232
- "version": "0.2.2",
4233
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
4234
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
4235
- "dev": true
4236
- },
4237
- "map-obj": {
4238
- "version": "1.0.1",
4239
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
4240
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
4241
- "dev": true
4242
- },
4243
- "map-visit": {
4244
- "version": "1.0.0",
4245
- "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
4246
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
4247
- "dev": true,
4248
- "requires": {
4249
- "object-visit": "^1.0.0"
4250
- }
4251
- },
4252
- "maxmin": {
4253
- "version": "2.1.0",
4254
- "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz",
4255
- "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=",
4256
- "dev": true,
4257
- "requires": {
4258
- "chalk": "^1.0.0",
4259
- "figures": "^1.0.1",
4260
- "gzip-size": "^3.0.0",
4261
- "pretty-bytes": "^3.0.0"
4262
- }
4263
- },
4264
- "md5.js": {
4265
- "version": "1.3.5",
4266
- "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
4267
- "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
4268
- "dev": true,
4269
- "requires": {
4270
- "hash-base": "^3.0.0",
4271
- "inherits": "^2.0.1",
4272
- "safe-buffer": "^5.1.2"
4273
- }
4274
- },
4275
- "mem": {
4276
- "version": "1.1.0",
4277
- "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
4278
- "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
4279
- "dev": true,
4280
- "requires": {
4281
- "mimic-fn": "^1.0.0"
4282
- }
4283
- },
4284
- "memize": {
4285
- "version": "1.0.5",
4286
- "resolved": "https://registry.npmjs.org/memize/-/memize-1.0.5.tgz",
4287
- "integrity": "sha512-Dm8Jhb5kiC4+ynYsVR4QDXKt+o2dfqGuY4hE2x+XlXZkdndlT80bJxfcMv5QGp/FCy6MhG7f5ElpmKPFKOSEpg=="
4288
- },
4289
- "memoize-one": {
4290
- "version": "5.0.0",
4291
- "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.0.0.tgz",
4292
- "integrity": "sha512-7g0+ejkOaI9w5x6LvQwmj68kUj6rxROywPSCqmclG/HBacmFnZqhVscQ8kovkn9FBCNJmOz6SY42+jnvZzDWdw=="
4293
- },
4294
- "memory-fs": {
4295
- "version": "0.4.1",
4296
- "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
4297
- "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
4298
- "dev": true,
4299
- "requires": {
4300
- "errno": "^0.1.3",
4301
- "readable-stream": "^2.0.1"
4302
- },
4303
- "dependencies": {
4304
- "readable-stream": {
4305
- "version": "2.3.6",
4306
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
4307
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
4308
- "dev": true,
4309
- "requires": {
4310
- "core-util-is": "~1.0.0",
4311
- "inherits": "~2.0.3",
4312
- "isarray": "~1.0.0",
4313
- "process-nextick-args": "~2.0.0",
4314
- "safe-buffer": "~5.1.1",
4315
- "string_decoder": "~1.1.1",
4316
- "util-deprecate": "~1.0.1"
4317
- }
4318
- },
4319
- "string_decoder": {
4320
- "version": "1.1.1",
4321
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
4322
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
4323
- "dev": true,
4324
- "requires": {
4325
- "safe-buffer": "~5.1.0"
4326
- }
4327
- }
4328
- }
4329
- },
4330
- "meow": {
4331
- "version": "3.7.0",
4332
- "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
4333
- "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
4334
- "dev": true,
4335
- "requires": {
4336
- "camelcase-keys": "^2.0.0",
4337
- "decamelize": "^1.1.2",
4338
- "loud-rejection": "^1.0.0",
4339
- "map-obj": "^1.0.1",
4340
- "minimist": "^1.1.3",
4341
- "normalize-package-data": "^2.3.4",
4342
- "object-assign": "^4.0.1",
4343
- "read-pkg-up": "^1.0.1",
4344
- "redent": "^1.0.0",
4345
- "trim-newlines": "^1.0.0"
4346
- },
4347
- "dependencies": {
4348
- "minimist": {
4349
- "version": "1.2.0",
4350
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
4351
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
4352
- "dev": true
4353
- }
4354
- }
4355
- },
4356
- "micromatch": {
4357
- "version": "3.1.10",
4358
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
4359
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
4360
- "dev": true,
4361
- "requires": {
4362
- "arr-diff": "^4.0.0",
4363
- "array-unique": "^0.3.2",
4364
- "braces": "^2.3.1",
4365
- "define-property": "^2.0.2",
4366
- "extend-shallow": "^3.0.2",
4367
- "extglob": "^2.0.4",
4368
- "fragment-cache": "^0.2.1",
4369
- "kind-of": "^6.0.2",
4370
- "nanomatch": "^1.2.9",
4371
- "object.pick": "^1.3.0",
4372
- "regex-not": "^1.0.0",
4373
- "snapdragon": "^0.8.1",
4374
- "to-regex": "^3.0.2"
4375
- },
4376
- "dependencies": {
4377
- "kind-of": {
4378
- "version": "6.0.2",
4379
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
4380
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
4381
- "dev": true
4382
- }
4383
- }
4384
- },
4385
- "miller-rabin": {
4386
- "version": "4.0.1",
4387
- "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
4388
- "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
4389
- "dev": true,
4390
- "requires": {
4391
- "bn.js": "^4.0.0",
4392
- "brorand": "^1.0.1"
4393
- }
4394
- },
4395
- "mime": {
4396
- "version": "1.6.0",
4397
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
4398
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
4399
- "dev": true,
4400
- "optional": true
4401
- },
4402
- "mime-db": {
4403
- "version": "1.38.0",
4404
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz",
4405
- "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==",
4406
- "dev": true,
4407
- "optional": true
4408
- },
4409
- "mime-types": {
4410
- "version": "2.1.22",
4411
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz",
4412
- "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==",
4413
- "dev": true,
4414
- "optional": true,
4415
- "requires": {
4416
- "mime-db": "~1.38.0"
4417
- }
4418
- },
4419
- "mimic-fn": {
4420
- "version": "1.2.0",
4421
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
4422
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
4423
- "dev": true
4424
- },
4425
- "minimalistic-assert": {
4426
- "version": "1.0.1",
4427
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
4428
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
4429
- "dev": true
4430
- },
4431
- "minimalistic-crypto-utils": {
4432
- "version": "1.0.1",
4433
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
4434
- "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
4435
- "dev": true
4436
- },
4437
- "minimatch": {
4438
- "version": "3.0.4",
4439
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
4440
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
4441
- "dev": true,
4442
- "requires": {
4443
- "brace-expansion": "^1.1.7"
4444
- }
4445
- },
4446
- "minimist": {
4447
- "version": "0.0.8",
4448
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
4449
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
4450
- },
4451
- "mixin-deep": {
4452
- "version": "1.3.2",
4453
- "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
4454
- "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
4455
- "dev": true,
4456
- "requires": {
4457
- "for-in": "^1.0.2",
4458
- "is-extendable": "^1.0.1"
4459
- },
4460
- "dependencies": {
4461
- "is-extendable": {
4462
- "version": "1.0.1",
4463
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
4464
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
4465
- "dev": true,
4466
- "requires": {
4467
- "is-plain-object": "^2.0.4"
4468
- }
4469
- }
4470
- }
4471
- },
4472
- "mkdirp": {
4473
- "version": "0.5.1",
4474
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
4475
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
4476
- "requires": {
4477
- "minimist": "0.0.8"
4478
- }
4479
- },
4480
- "ms": {
4481
- "version": "2.0.0",
4482
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
4483
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
4484
- "dev": true
4485
- },
4486
- "nan": {
4487
- "version": "2.12.1",
4488
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz",
4489
- "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==",
4490
- "dev": true,
4491
- "optional": true
4492
- },
4493
- "nanomatch": {
4494
- "version": "1.2.13",
4495
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
4496
- "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
4497
- "dev": true,
4498
- "requires": {
4499
- "arr-diff": "^4.0.0",
4500
- "array-unique": "^0.3.2",
4501
- "define-property": "^2.0.2",
4502
- "extend-shallow": "^3.0.2",
4503
- "fragment-cache": "^0.2.1",
4504
- "is-windows": "^1.0.2",
4505
- "kind-of": "^6.0.2",
4506
- "object.pick": "^1.3.0",
4507
- "regex-not": "^1.0.0",
4508
- "snapdragon": "^0.8.1",
4509
- "to-regex": "^3.0.1"
4510
- },
4511
- "dependencies": {
4512
- "kind-of": {
4513
- "version": "6.0.2",
4514
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
4515
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
4516
- "dev": true
4517
- }
4518
- }
4519
- },
4520
- "neo-async": {
4521
- "version": "2.6.0",
4522
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",
4523
- "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==",
4524
- "dev": true
4525
- },
4526
- "next-tick": {
4527
- "version": "1.0.0",
4528
- "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
4529
- "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
4530
- "dev": true
4531
- },
4532
- "nice-try": {
4533
- "version": "1.0.5",
4534
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
4535
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
4536
- "dev": true
4537
- },
4538
- "node-libs-browser": {
4539
- "version": "2.2.0",
4540
- "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz",
4541
- "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==",
4542
- "dev": true,
4543
- "requires": {
4544
- "assert": "^1.1.1",
4545
- "browserify-zlib": "^0.2.0",
4546
- "buffer": "^4.3.0",
4547
- "console-browserify": "^1.1.0",
4548
- "constants-browserify": "^1.0.0",
4549
- "crypto-browserify": "^3.11.0",
4550
- "domain-browser": "^1.1.1",
4551
- "events": "^3.0.0",
4552
- "https-browserify": "^1.0.0",
4553
- "os-browserify": "^0.3.0",
4554
- "path-browserify": "0.0.0",
4555
- "process": "^0.11.10",
4556
- "punycode": "^1.2.4",
4557
- "querystring-es3": "^0.2.0",
4558
- "readable-stream": "^2.3.3",
4559
- "stream-browserify": "^2.0.1",
4560
- "stream-http": "^2.7.2",
4561
- "string_decoder": "^1.0.0",
4562
- "timers-browserify": "^2.0.4",
4563
- "tty-browserify": "0.0.0",
4564
- "url": "^0.11.0",
4565
- "util": "^0.11.0",
4566
- "vm-browserify": "0.0.4"
4567
- },
4568
- "dependencies": {
4569
- "punycode": {
4570
- "version": "1.4.1",
4571
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
4572
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
4573
- "dev": true
4574
- },
4575
- "readable-stream": {
4576
- "version": "2.3.6",
4577
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
4578
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
4579
- "dev": true,
4580
- "requires": {
4581
- "core-util-is": "~1.0.0",
4582
- "inherits": "~2.0.3",
4583
- "isarray": "~1.0.0",
4584
- "process-nextick-args": "~2.0.0",
4585
- "safe-buffer": "~5.1.1",
4586
- "string_decoder": "~1.1.1",
4587
- "util-deprecate": "~1.0.1"
4588
- },
4589
- "dependencies": {
4590
- "string_decoder": {
4591
- "version": "1.1.1",
4592
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
4593
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
4594
- "dev": true,
4595
- "requires": {
4596
- "safe-buffer": "~5.1.0"
4597
- }
4598
- }
4599
- }
4600
- },
4601
- "string_decoder": {
4602
- "version": "1.2.0",
4603
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz",
4604
- "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==",
4605
- "dev": true,
4606
- "requires": {
4607
- "safe-buffer": "~5.1.0"
4608
- }
4609
- }
4610
- }
4611
- },
4612
- "node-wp-i18n": {
4613
- "version": "1.2.3",
4614
- "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.3.tgz",
4615
- "integrity": "sha512-YMzMcsjXbGYDB9vHyb289CYXAGmXhcNLbeTlOnWgPNkZd9xrovcbRd7cQyKd9BQHOjS7Nw8WCbJ7nvtR7rc0rg==",
4616
- "dev": true,
4617
- "requires": {
4618
- "bluebird": "^3.4.1",
4619
- "gettext-parser": "^3.1.0",
4620
- "glob": "^7.0.5",
4621
- "lodash": "^4.14.2",
4622
- "minimist": "^1.2.0",
4623
- "mkdirp": "^0.5.1",
4624
- "tmp": "^0.0.33"
4625
- },
4626
- "dependencies": {
4627
- "gettext-parser": {
4628
- "version": "3.1.0",
4629
- "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.0.tgz",
4630
- "integrity": "sha512-eVD8RxFMeHg8pjl5zsk7xlEDaKdcYlotLztiMaYGLvI13LMXwWlybLg7rg6eagct79vyGkPGZrMPBsdjsQOnWg==",
4631
- "dev": true,
4632
- "requires": {
4633
- "encoding": "^0.1.12",
4634
- "readable-stream": "^3.0.6",
4635
- "safe-buffer": "^5.1.2"
4636
- }
4637
- },
4638
- "minimist": {
4639
- "version": "1.2.0",
4640
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
4641
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
4642
- "dev": true
4643
- }
4644
- }
4645
- },
4646
- "nomnom": {
4647
- "version": "1.8.1",
4648
- "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
4649
- "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
4650
- "dev": true,
4651
- "requires": {
4652
- "chalk": "~0.4.0",
4653
- "underscore": "~1.6.0"
4654
- },
4655
- "dependencies": {
4656
- "ansi-styles": {
4657
- "version": "1.0.0",
4658
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
4659
- "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
4660
- "dev": true
4661
- },
4662
- "chalk": {
4663
- "version": "0.4.0",
4664
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
4665
- "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
4666
- "dev": true,
4667
- "requires": {
4668
- "ansi-styles": "~1.0.0",
4669
- "has-color": "~0.1.0",
4670
- "strip-ansi": "~0.1.0"
4671
- }
4672
- },
4673
- "strip-ansi": {
4674
- "version": "0.1.1",
4675
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
4676
- "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
4677
- "dev": true
4678
- }
4679
- }
4680
- },
4681
- "nopt": {
4682
- "version": "1.0.10",
4683
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
4684
- "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
4685
- "requires": {
4686
- "abbrev": "1"
4687
- }
4688
- },
4689
- "normalize-package-data": {
4690
- "version": "2.5.0",
4691
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
4692
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
4693
- "dev": true,
4694
- "requires": {
4695
- "hosted-git-info": "^2.1.4",
4696
- "resolve": "^1.10.0",
4697
- "semver": "2 || 3 || 4 || 5",
4698
- "validate-npm-package-license": "^3.0.1"
4699
- }
4700
- },
4701
- "normalize-path": {
4702
- "version": "3.0.0",
4703
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
4704
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
4705
- "dev": true
4706
- },
4707
- "npm-run-path": {
4708
- "version": "2.0.2",
4709
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
4710
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
4711
- "dev": true,
4712
- "requires": {
4713
- "path-key": "^2.0.0"
4714
- }
4715
- },
4716
- "number-is-nan": {
4717
- "version": "1.0.1",
4718
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
4719
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
4720
- "dev": true
4721
- },
4722
- "oauth-sign": {
4723
- "version": "0.9.0",
4724
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
4725
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
4726
- "dev": true,
4727
- "optional": true
4728
- },
4729
- "object-assign": {
4730
- "version": "4.1.1",
4731
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
4732
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
4733
- },
4734
- "object-copy": {
4735
- "version": "0.1.0",
4736
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
4737
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
4738
- "dev": true,
4739
- "requires": {
4740
- "copy-descriptor": "^0.1.0",
4741
- "define-property": "^0.2.5",
4742
- "kind-of": "^3.0.3"
4743
- },
4744
- "dependencies": {
4745
- "define-property": {
4746
- "version": "0.2.5",
4747
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
4748
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
4749
- "dev": true,
4750
- "requires": {
4751
- "is-descriptor": "^0.1.0"
4752
- }
4753
- }
4754
- }
4755
- },
4756
- "object-visit": {
4757
- "version": "1.0.1",
4758
- "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
4759
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
4760
- "dev": true,
4761
- "requires": {
4762
- "isobject": "^3.0.0"
4763
- }
4764
- },
4765
- "object.pick": {
4766
- "version": "1.3.0",
4767
- "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
4768
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
4769
- "dev": true,
4770
- "requires": {
4771
- "isobject": "^3.0.1"
4772
- }
4773
- },
4774
- "once": {
4775
- "version": "1.4.0",
4776
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
4777
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
4778
- "dev": true,
4779
- "requires": {
4780
- "wrappy": "1"
4781
- }
4782
- },
4783
- "os-browserify": {
4784
- "version": "0.3.0",
4785
- "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
4786
- "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
4787
- "dev": true
4788
- },
4789
- "os-homedir": {
4790
- "version": "1.0.2",
4791
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
4792
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
4793
- "dev": true
4794
- },
4795
- "os-locale": {
4796
- "version": "2.1.0",
4797
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
4798
- "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
4799
- "dev": true,
4800
- "requires": {
4801
- "execa": "^0.7.0",
4802
- "lcid": "^1.0.0",
4803
- "mem": "^1.1.0"
4804
- }
4805
- },
4806
- "os-tmpdir": {
4807
- "version": "1.0.2",
4808
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
4809
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
4810
- "dev": true
4811
- },
4812
- "p-finally": {
4813
- "version": "1.0.0",
4814
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
4815
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
4816
- "dev": true
4817
- },
4818
- "p-limit": {
4819
- "version": "1.3.0",
4820
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
4821
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
4822
- "dev": true,
4823
- "requires": {
4824
- "p-try": "^1.0.0"
4825
- }
4826
- },
4827
- "p-locate": {
4828
- "version": "2.0.0",
4829
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
4830
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
4831
- "dev": true,
4832
- "requires": {
4833
- "p-limit": "^1.1.0"
4834
- }
4835
- },
4836
- "p-try": {
4837
- "version": "1.0.0",
4838
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
4839
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
4840
- "dev": true
4841
- },
4842
- "pako": {
4843
- "version": "1.0.8",
4844
- "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz",
4845
- "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==",
4846
- "dev": true
4847
- },
4848
- "parse-asn1": {
4849
- "version": "5.1.4",
4850
- "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz",
4851
- "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==",
4852
- "dev": true,
4853
- "requires": {
4854
- "asn1.js": "^4.0.0",
4855
- "browserify-aes": "^1.0.0",
4856
- "create-hash": "^1.1.0",
4857
- "evp_bytestokey": "^1.0.0",
4858
- "pbkdf2": "^3.0.3",
4859
- "safe-buffer": "^5.1.1"
4860
- }
4861
- },
4862
- "parse-json": {
4863
- "version": "4.0.0",
4864
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
4865
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
4866
- "requires": {
4867
- "error-ex": "^1.3.1",
4868
- "json-parse-better-errors": "^1.0.1"
4869
- }
4870
- },
4871
- "pascalcase": {
4872
- "version": "0.1.1",
4873
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
4874
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
4875
- "dev": true
4876
- },
4877
- "path-browserify": {
4878
- "version": "0.0.0",
4879
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
4880
- "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
4881
- "dev": true
4882
- },
4883
- "path-dirname": {
4884
- "version": "1.0.2",
4885
- "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
4886
- "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
4887
- "dev": true
4888
- },
4889
- "path-exists": {
4890
- "version": "3.0.0",
4891
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
4892
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
4893
- "dev": true
4894
- },
4895
- "path-is-absolute": {
4896
- "version": "1.0.1",
4897
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
4898
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
4899
- "dev": true
4900
- },
4901
- "path-key": {
4902
- "version": "2.0.1",
4903
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
4904
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
4905
- "dev": true
4906
- },
4907
- "path-parse": {
4908
- "version": "1.0.6",
4909
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
4910
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
4911
- },
4912
- "path-type": {
4913
- "version": "1.1.0",
4914
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
4915
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
4916
- "dev": true,
4917
- "requires": {
4918
- "graceful-fs": "^4.1.2",
4919
- "pify": "^2.0.0",
4920
- "pinkie-promise": "^2.0.0"
4921
- },
4922
- "dependencies": {
4923
- "pify": {
4924
- "version": "2.3.0",
4925
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
4926
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
4927
- "dev": true
4928
- }
4929
- }
4930
- },
4931
- "pbkdf2": {
4932
- "version": "3.0.17",
4933
- "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
4934
- "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
4935
- "dev": true,
4936
- "requires": {
4937
- "create-hash": "^1.1.2",
4938
- "create-hmac": "^1.1.4",
4939
- "ripemd160": "^2.0.1",
4940
- "safe-buffer": "^5.0.1",
4941
- "sha.js": "^2.4.8"
4942
- }
4943
- },
4944
- "performance-now": {
4945
- "version": "2.1.0",
4946
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
4947
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
4948
- },
4949
- "pify": {
4950
- "version": "3.0.0",
4951
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
4952
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
4953
- "dev": true
4954
- },
4955
- "pinkie": {
4956
- "version": "2.0.4",
4957
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
4958
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
4959
- "dev": true
4960
- },
4961
- "pinkie-promise": {
4962
- "version": "2.0.1",
4963
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
4964
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
4965
- "dev": true,
4966
- "requires": {
4967
- "pinkie": "^2.0.0"
4968
- }
4969
- },
4970
- "pkg-dir": {
4971
- "version": "2.0.0",
4972
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
4973
- "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
4974
- "dev": true,
4975
- "requires": {
4976
- "find-up": "^2.1.0"
4977
- }
4978
- },
4979
- "po2json": {
4980
- "version": "0.4.5",
4981
- "resolved": "https://registry.npmjs.org/po2json/-/po2json-0.4.5.tgz",
4982
- "integrity": "sha1-R7spUtoy1Yob4vJWpZjuvAt0URg=",
4983
- "dev": true,
4984
- "requires": {
4985
- "gettext-parser": "1.1.0",
4986
- "nomnom": "1.8.1"
4987
- },
4988
- "dependencies": {
4989
- "gettext-parser": {
4990
- "version": "1.1.0",
4991
- "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.1.0.tgz",
4992
- "integrity": "sha1-LFpmONiTk0ubVQN9CtgstwBLJnk=",
4993
- "dev": true,
4994
- "requires": {
4995
- "encoding": "^0.1.11"
4996
- }
4997
- }
4998
- }
4999
- },
5000
- "posix-character-classes": {
5001
- "version": "0.1.1",
5002
- "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
5003
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
5004
- "dev": true
5005
- },
5006
- "pretty-bytes": {
5007
- "version": "3.0.1",
5008
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz",
5009
- "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=",
5010
- "dev": true,
5011
- "requires": {
5012
- "number-is-nan": "^1.0.0"
5013
- }
5014
- },
5015
- "private": {
5016
- "version": "0.1.8",
5017
- "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
5018
- "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
5019
- "dev": true
5020
- },
5021
- "process": {
5022
- "version": "0.11.10",
5023
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
5024
- "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
5025
- "dev": true
5026
- },
5027
- "process-nextick-args": {
5028
- "version": "2.0.0",
5029
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
5030
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
5031
- "dev": true
5032
- },
5033
- "promise": {
5034
- "version": "7.3.1",
5035
- "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
5036
- "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
5037
- "dev": true,
5038
- "optional": true,
5039
- "requires": {
5040
- "asap": "~2.0.3"
5041
- }
5042
- },
5043
- "prop-types": {
5044
- "version": "15.7.2",
5045
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
5046
- "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
5047
- "requires": {
5048
- "loose-envify": "^1.4.0",
5049
- "object-assign": "^4.1.1",
5050
- "react-is": "^16.8.1"
5051
- }
5052
- },
5053
- "prr": {
5054
- "version": "1.0.1",
5055
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
5056
- "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
5057
- "dev": true
5058
- },
5059
- "pseudomap": {
5060
- "version": "1.0.2",
5061
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
5062
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
5063
- "dev": true
5064
- },
5065
- "psl": {
5066
- "version": "1.1.31",
5067
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
5068
- "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==",
5069
- "dev": true,
5070
- "optional": true
5071
- },
5072
- "public-encrypt": {
5073
- "version": "4.0.3",
5074
- "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
5075
- "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
5076
- "dev": true,
5077
- "requires": {
5078
- "bn.js": "^4.1.0",
5079
- "browserify-rsa": "^4.0.0",
5080
- "create-hash": "^1.1.0",
5081
- "parse-asn1": "^5.0.0",
5082
- "randombytes": "^2.0.1",
5083
- "safe-buffer": "^5.1.2"
5084
- }
5085
- },
5086
- "punycode": {
5087
- "version": "2.1.1",
5088
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
5089
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
5090
- "dev": true
5091
- },
5092
- "qs": {
5093
- "version": "6.6.0",
5094
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.6.0.tgz",
5095
- "integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA=="
5096
- },
5097
- "querystring": {
5098
- "version": "0.2.0",
5099
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
5100
- "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
5101
- "dev": true
5102
- },
5103
- "querystring-es3": {
5104
- "version": "0.2.1",
5105
- "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
5106
- "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
5107
- "dev": true
5108
- },
5109
- "raf": {
5110
- "version": "3.4.1",
5111
- "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
5112
- "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
5113
- "requires": {
5114
- "performance-now": "^2.1.0"
5115
- }
5116
- },
5117
- "randombytes": {
5118
- "version": "2.1.0",
5119
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
5120
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
5121
- "dev": true,
5122
- "requires": {
5123
- "safe-buffer": "^5.1.0"
5124
- }
5125
- },
5126
- "randomfill": {
5127
- "version": "1.0.4",
5128
- "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
5129
- "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
5130
- "dev": true,
5131
- "requires": {
5132
- "randombytes": "^2.0.5",
5133
- "safe-buffer": "^5.1.0"
5134
- }
5135
- },
5136
- "raw-body": {
5137
- "version": "1.1.7",
5138
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz",
5139
- "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=",
5140
- "dev": true,
5141
- "requires": {
5142
- "bytes": "1",
5143
- "string_decoder": "0.10"
5144
- }
5145
- },
5146
- "react": {
5147
- "version": "16.8.3",
5148
- "resolved": "https://registry.npmjs.org/react/-/react-16.8.3.tgz",
5149
- "integrity": "sha512-3UoSIsEq8yTJuSu0luO1QQWYbgGEILm+eJl2QN/VLDi7hL+EN18M3q3oVZwmVzzBJ3DkM7RMdRwBmZZ+b4IzSA==",
5150
- "requires": {
5151
- "loose-envify": "^1.1.0",
5152
- "object-assign": "^4.1.1",
5153
- "prop-types": "^15.6.2",
5154
- "scheduler": "^0.13.3"
5155
- }
5156
- },
5157
- "react-dom": {
5158
- "version": "16.8.3",
5159
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.3.tgz",
5160
- "integrity": "sha512-ttMem9yJL4/lpItZAQ2NTFAbV7frotHk5DZEHXUOws2rMmrsvh1Na7ThGT0dTzUIl6pqTOi5tYREfL8AEna3lA==",
5161
- "requires": {
5162
- "loose-envify": "^1.1.0",
5163
- "object-assign": "^4.1.1",
5164
- "prop-types": "^15.6.2",
5165
- "scheduler": "^0.13.3"
5166
- }
5167
- },
5168
- "react-input-autosize": {
5169
- "version": "2.2.1",
5170
- "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.1.tgz",
5171
- "integrity": "sha512-3+K4CD13iE4lQQ2WlF8PuV5htfmTRLH6MDnfndHM6LuBRszuXnuyIfE7nhSKt8AzRBZ50bu0sAhkNMeS5pxQQA==",
5172
- "requires": {
5173
- "prop-types": "^15.5.8"
5174
- }
5175
- },
5176
- "react-is": {
5177
- "version": "16.8.3",
5178
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.3.tgz",
5179
- "integrity": "sha512-Y4rC1ZJmsxxkkPuMLwvKvlL1Zfpbcu+Bf4ZigkHup3v9EfdYhAlWAaVyA19olXq2o2mGn0w+dFKvk3pVVlYcIA=="
5180
- },
5181
- "react-lifecycles-compat": {
5182
- "version": "3.0.4",
5183
- "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
5184
- "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
5185
- },
5186
- "react-select": {
5187
- "version": "2.4.1",
5188
- "resolved": "https://registry.npmjs.org/react-select/-/react-select-2.4.1.tgz",
5189
- "integrity": "sha512-je1cVAFsyQrGxkruQnNCuwo3+P0+1dyq7M4/gTlSwhO4ptPeTjf0eNrvCJ9iurVyorrnI88zgx2/yxrr2/oLLQ==",
5190
- "requires": {
5191
- "classnames": "^2.2.5",
5192
- "emotion": "^9.1.2",
5193
- "memoize-one": "^5.0.0",
5194
- "prop-types": "^15.6.0",
5195
- "raf": "^3.4.0",
5196
- "react-input-autosize": "^2.2.1",
5197
- "react-transition-group": "^2.2.1"
5198
- }
5199
- },
5200
- "react-transition-group": {
5201
- "version": "2.6.0",
5202
- "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.6.0.tgz",
5203
- "integrity": "sha512-VzZ+6k/adL3pJHo4PU/MHEPjW59/TGQtRsXC+wnxsx2mxjQKNHnDdJL/GpYuPJIsyHGjYbBQfIJ2JNOAdPc8GQ==",
5204
- "requires": {
5205
- "dom-helpers": "^3.3.1",
5206
- "loose-envify": "^1.4.0",
5207
- "prop-types": "^15.6.2",
5208
- "react-lifecycles-compat": "^3.0.4"
5209
- }
5210
- },
5211
- "read-pkg": {
5212
- "version": "1.1.0",
5213
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
5214
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
5215
- "dev": true,
5216
- "requires": {
5217
- "load-json-file": "^1.0.0",
5218
- "normalize-package-data": "^2.3.2",
5219
- "path-type": "^1.0.0"
5220
- }
5221
- },
5222
- "read-pkg-up": {
5223
- "version": "1.0.1",
5224
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
5225
- "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
5226
- "dev": true,
5227
- "requires": {
5228
- "find-up": "^1.0.0",
5229
- "read-pkg": "^1.0.0"
5230
- },
5231
- "dependencies": {
5232
- "find-up": {
5233
- "version": "1.1.2",
5234
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
5235
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
5236
- "dev": true,
5237
- "requires": {
5238
- "path-exists": "^2.0.0",
5239
- "pinkie-promise": "^2.0.0"
5240
- }
5241
- },
5242
- "path-exists": {
5243
- "version": "2.1.0",
5244
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
5245
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
5246
- "dev": true,
5247
- "requires": {
5248
- "pinkie-promise": "^2.0.0"
5249
- }
5250
- }
5251
- }
5252
- },
5253
- "readable-stream": {
5254
- "version": "3.1.1",
5255
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz",
5256
- "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==",
5257
- "dev": true,
5258
- "requires": {
5259
- "inherits": "^2.0.3",
5260
- "string_decoder": "^1.1.1",
5261
- "util-deprecate": "^1.0.1"
5262
- },
5263
- "dependencies": {
5264
- "string_decoder": {
5265
- "version": "1.2.0",
5266
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz",
5267
- "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==",
5268
- "dev": true,
5269
- "requires": {
5270
- "safe-buffer": "~5.1.0"
5271
- }
5272
- }
5273
- }
5274
- },
5275
- "readdirp": {
5276
- "version": "2.2.1",
5277
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
5278
- "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
5279
- "dev": true,
5280
- "requires": {
5281
- "graceful-fs": "^4.1.11",
5282
- "micromatch": "^3.1.10",
5283
- "readable-stream": "^2.0.2"
5284
- },
5285
- "dependencies": {
5286
- "readable-stream": {
5287
- "version": "2.3.6",
5288
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
5289
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
5290
- "dev": true,
5291
- "requires": {
5292
- "core-util-is": "~1.0.0",
5293
- "inherits": "~2.0.3",
5294
- "isarray": "~1.0.0",
5295
- "process-nextick-args": "~2.0.0",
5296
- "safe-buffer": "~5.1.1",
5297
- "string_decoder": "~1.1.1",
5298
- "util-deprecate": "~1.0.1"
5299
- }
5300
- },
5301
- "string_decoder": {
5302
- "version": "1.1.1",
5303
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
5304
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
5305
- "dev": true,
5306
- "requires": {
5307
- "safe-buffer": "~5.1.0"
5308
- }
5309
- }
5310
- }
5311
- },
5312
- "redent": {
5313
- "version": "1.0.0",
5314
- "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
5315
- "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
5316
- "dev": true,
5317
- "requires": {
5318
- "indent-string": "^2.1.0",
5319
- "strip-indent": "^1.0.1"
5320
- }
5321
- },
5322
- "regenerate": {
5323
- "version": "1.4.0",
5324
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
5325
- "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
5326
- "dev": true
5327
- },
5328
- "regenerator-runtime": {
5329
- "version": "0.12.1",
5330
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz",
5331
- "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg=="
5332
- },
5333
- "regenerator-transform": {
5334
- "version": "0.10.1",
5335
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
5336
- "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
5337
- "dev": true,
5338
- "requires": {
5339
- "babel-runtime": "^6.18.0",
5340
- "babel-types": "^6.19.0",
5341
- "private": "^0.1.6"
5342
- }
5343
- },
5344
- "regex-not": {
5345
- "version": "1.0.2",
5346
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
5347
- "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
5348
- "dev": true,
5349
- "requires": {
5350
- "extend-shallow": "^3.0.2",
5351
- "safe-regex": "^1.1.0"
5352
- }
5353
- },
5354
- "regexpu-core": {
5355
- "version": "2.0.0",
5356
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
5357
- "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
5358
- "dev": true,
5359
- "requires": {
5360
- "regenerate": "^1.2.1",
5361
- "regjsgen": "^0.2.0",
5362
- "regjsparser": "^0.1.4"
5363
- }
5364
- },
5365
- "regjsgen": {
5366
- "version": "0.2.0",
5367
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
5368
- "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
5369
- "dev": true
5370
- },
5371
- "regjsparser": {
5372
- "version": "0.1.5",
5373
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
5374
- "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
5375
- "dev": true,
5376
- "requires": {
5377
- "jsesc": "~0.5.0"
5378
- },
5379
- "dependencies": {
5380
- "jsesc": {
5381
- "version": "0.5.0",
5382
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
5383
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
5384
- "dev": true
5385
- }
5386
- }
5387
- },
5388
- "remove-trailing-separator": {
5389
- "version": "1.1.0",
5390
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
5391
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
5392
- "dev": true
5393
- },
5394
- "repeat-element": {
5395
- "version": "1.1.3",
5396
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
5397
- "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
5398
- "dev": true
5399
- },
5400
- "repeat-string": {
5401
- "version": "1.6.1",
5402
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
5403
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
5404
- "dev": true
5405
- },
5406
- "repeating": {
5407
- "version": "2.0.1",
5408
- "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
5409
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
5410
- "dev": true,
5411
- "requires": {
5412
- "is-finite": "^1.0.0"
5413
- }
5414
- },
5415
- "request": {
5416
- "version": "2.88.0",
5417
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
5418
- "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
5419
- "dev": true,
5420
- "optional": true,
5421
- "requires": {
5422
- "aws-sign2": "~0.7.0",
5423
- "aws4": "^1.8.0",
5424
- "caseless": "~0.12.0",
5425
- "combined-stream": "~1.0.6",
5426
- "extend": "~3.0.2",
5427
- "forever-agent": "~0.6.1",
5428
- "form-data": "~2.3.2",
5429
- "har-validator": "~5.1.0",
5430
- "http-signature": "~1.2.0",
5431
- "is-typedarray": "~1.0.0",
5432
- "isstream": "~0.1.2",
5433
- "json-stringify-safe": "~5.0.1",
5434
- "mime-types": "~2.1.19",
5435
- "oauth-sign": "~0.9.0",
5436
- "performance-now": "^2.1.0",
5437
- "qs": "~6.5.2",
5438
- "safe-buffer": "^5.1.2",
5439
- "tough-cookie": "~2.4.3",
5440
- "tunnel-agent": "^0.6.0",
5441
- "uuid": "^3.3.2"
5442
- },
5443
- "dependencies": {
5444
- "qs": {
5445
- "version": "6.5.2",
5446
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
5447
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
5448
- "dev": true,
5449
- "optional": true
5450
- }
5451
- }
5452
- },
5453
- "require-directory": {
5454
- "version": "2.1.1",
5455
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
5456
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
5457
- "dev": true
5458
- },
5459
- "require-main-filename": {
5460
- "version": "1.0.1",
5461
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
5462
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
5463
- "dev": true
5464
- },
5465
- "resolve": {
5466
- "version": "1.10.0",
5467
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
5468
- "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
5469
- "requires": {
5470
- "path-parse": "^1.0.6"
5471
- }
5472
- },
5473
- "resolve-from": {
5474
- "version": "3.0.0",
5475
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
5476
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
5477
- },
5478
- "resolve-url": {
5479
- "version": "0.2.1",
5480
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
5481
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
5482
- "dev": true
5483
- },
5484
- "ret": {
5485
- "version": "0.1.15",
5486
- "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
5487
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
5488
- "dev": true
5489
- },
5490
- "right-align": {
5491
- "version": "0.1.3",
5492
- "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
5493
- "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
5494
- "dev": true,
5495
- "requires": {
5496
- "align-text": "^0.1.1"
5497
- }
5498
- },
5499
- "rimraf": {
5500
- "version": "2.6.3",
5501
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
5502
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
5503
- "dev": true,
5504
- "requires": {
5505
- "glob": "^7.1.3"
5506
- },
5507
- "dependencies": {
5508
- "glob": {
5509
- "version": "7.1.3",
5510
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
5511
- "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
5512
- "dev": true,
5513
- "requires": {
5514
- "fs.realpath": "^1.0.0",
5515
- "inflight": "^1.0.4",
5516
- "inherits": "2",
5517
- "minimatch": "^3.0.4",
5518
- "once": "^1.3.0",
5519
- "path-is-absolute": "^1.0.0"
5520
- }
5521
- }
5522
- }
5523
- },
5524
- "ripemd160": {
5525
- "version": "2.0.2",
5526
- "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
5527
- "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
5528
- "dev": true,
5529
- "requires": {
5530
- "hash-base": "^3.0.0",
5531
- "inherits": "^2.0.1"
5532
- }
5533
- },
5534
- "safe-buffer": {
5535
- "version": "5.1.2",
5536
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
5537
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
5538
- },
5539
- "safe-json-parse": {
5540
- "version": "1.0.1",
5541
- "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz",
5542
- "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=",
5543
- "dev": true
5544
- },
5545
- "safe-regex": {
5546
- "version": "1.1.0",
5547
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
5548
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
5549
- "dev": true,
5550
- "requires": {
5551
- "ret": "~0.1.10"
5552
- }
5553
- },
5554
- "safer-buffer": {
5555
- "version": "2.1.2",
5556
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
5557
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
5558
- },
5559
- "scheduler": {
5560
- "version": "0.13.3",
5561
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.3.tgz",
5562
- "integrity": "sha512-UxN5QRYWtpR1egNWzJcVLk8jlegxAugswQc984lD3kU7NuobsO37/sRfbpTdBjtnD5TBNFA2Q2oLV5+UmPSmEQ==",
5563
- "requires": {
5564
- "loose-envify": "^1.1.0",
5565
- "object-assign": "^4.1.1"
5566
- }
5567
- },
5568
- "semver": {
5569
- "version": "5.6.0",
5570
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
5571
- "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
5572
- "dev": true
5573
- },
5574
- "set-blocking": {
5575
- "version": "2.0.0",
5576
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
5577
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
5578
- "dev": true
5579
- },
5580
- "set-value": {
5581
- "version": "2.0.0",
5582
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
5583
- "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
5584
- "dev": true,
5585
- "requires": {
5586
- "extend-shallow": "^2.0.1",
5587
- "is-extendable": "^0.1.1",
5588
- "is-plain-object": "^2.0.3",
5589
- "split-string": "^3.0.1"
5590
- },
5591
- "dependencies": {
5592
- "extend-shallow": {
5593
- "version": "2.0.1",
5594
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
5595
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
5596
- "dev": true,
5597
- "requires": {
5598
- "is-extendable": "^0.1.0"
5599
- }
5600
- }
5601
- }
5602
- },
5603
- "setimmediate": {
5604
- "version": "1.0.5",
5605
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
5606
- "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
5607
- "dev": true
5608
- },
5609
- "sha.js": {
5610
- "version": "2.4.11",
5611
- "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
5612
- "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
5613
- "dev": true,
5614
- "requires": {
5615
- "inherits": "^2.0.1",
5616
- "safe-buffer": "^5.0.1"
5617
- }
5618
- },
5619
- "shebang-command": {
5620
- "version": "1.2.0",
5621
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
5622
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
5623
- "dev": true,
5624
- "requires": {
5625
- "shebang-regex": "^1.0.0"
5626
- }
5627
- },
5628
- "shebang-regex": {
5629
- "version": "1.0.0",
5630
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
5631
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
5632
- "dev": true
5633
- },
5634
- "signal-exit": {
5635
- "version": "3.0.2",
5636
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
5637
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
5638
- "dev": true
5639
- },
5640
- "slash": {
5641
- "version": "1.0.0",
5642
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
5643
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
5644
- "dev": true
5645
- },
5646
- "snapdragon": {
5647
- "version": "0.8.2",
5648
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
5649
- "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
5650
- "dev": true,
5651
- "requires": {
5652
- "base": "^0.11.1",
5653
- "debug": "^2.2.0",
5654
- "define-property": "^0.2.5",
5655
- "extend-shallow": "^2.0.1",
5656
- "map-cache": "^0.2.2",
5657
- "source-map": "^0.5.6",
5658
- "source-map-resolve": "^0.5.0",
5659
- "use": "^3.1.0"
5660
- },
5661
- "dependencies": {
5662
- "define-property": {
5663
- "version": "0.2.5",
5664
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
5665
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
5666
- "dev": true,
5667
- "requires": {
5668
- "is-descriptor": "^0.1.0"
5669
- }
5670
- },
5671
- "extend-shallow": {
5672
- "version": "2.0.1",
5673
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
5674
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
5675
- "dev": true,
5676
- "requires": {
5677
- "is-extendable": "^0.1.0"
5678
- }
5679
- }
5680
- }
5681
- },
5682
- "snapdragon-node": {
5683
- "version": "2.1.1",
5684
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
5685
- "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
5686
- "dev": true,
5687
- "requires": {
5688
- "define-property": "^1.0.0",
5689
- "isobject": "^3.0.0",
5690
- "snapdragon-util": "^3.0.1"
5691
- },
5692
- "dependencies": {
5693
- "define-property": {
5694
- "version": "1.0.0",
5695
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
5696
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
5697
- "dev": true,
5698
- "requires": {
5699
- "is-descriptor": "^1.0.0"
5700
- }
5701
- },
5702
- "is-accessor-descriptor": {
5703
- "version": "1.0.0",
5704
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
5705
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
5706
- "dev": true,
5707
- "requires": {
5708
- "kind-of": "^6.0.0"
5709
- }
5710
- },
5711
- "is-data-descriptor": {
5712
- "version": "1.0.0",
5713
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
5714
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
5715
- "dev": true,
5716
- "requires": {
5717
- "kind-of": "^6.0.0"
5718
- }
5719
- },
5720
- "is-descriptor": {
5721
- "version": "1.0.2",
5722
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
5723
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
5724
- "dev": true,
5725
- "requires": {
5726
- "is-accessor-descriptor": "^1.0.0",
5727
- "is-data-descriptor": "^1.0.0",
5728
- "kind-of": "^6.0.2"
5729
- }
5730
- },
5731
- "kind-of": {
5732
- "version": "6.0.2",
5733
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
5734
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
5735
- "dev": true
5736
- }
5737
- }
5738
- },
5739
- "snapdragon-util": {
5740
- "version": "3.0.1",
5741
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
5742
- "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
5743
- "dev": true,
5744
- "requires": {
5745
- "kind-of": "^3.2.0"
5746
- }
5747
- },
5748
- "source-list-map": {
5749
- "version": "2.0.1",
5750
- "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
5751
- "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
5752
- "dev": true
5753
- },
5754
- "source-map": {
5755
- "version": "0.5.7",
5756
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
5757
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
5758
- },
5759
- "source-map-resolve": {
5760
- "version": "0.5.2",
5761
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
5762
- "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
5763
- "dev": true,
5764
- "requires": {
5765
- "atob": "^2.1.1",
5766
- "decode-uri-component": "^0.2.0",
5767
- "resolve-url": "^0.2.1",
5768
- "source-map-url": "^0.4.0",
5769
- "urix": "^0.1.0"
5770
- }
5771
- },
5772
- "source-map-support": {
5773
- "version": "0.4.18",
5774
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
5775
- "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
5776
- "dev": true,
5777
- "requires": {
5778
- "source-map": "^0.5.6"
5779
- }
5780
- },
5781
- "source-map-url": {
5782
- "version": "0.4.0",
5783
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
5784
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
5785
- "dev": true
5786
- },
5787
- "spdx-correct": {
5788
- "version": "3.1.0",
5789
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
5790
- "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
5791
- "dev": true,
5792
- "requires": {
5793
- "spdx-expression-parse": "^3.0.0",
5794
- "spdx-license-ids": "^3.0.0"
5795
- }
5796
- },
5797
- "spdx-exceptions": {
5798
- "version": "2.2.0",
5799
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
5800
- "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
5801
- "dev": true
5802
- },
5803
- "spdx-expression-parse": {
5804
- "version": "3.0.0",
5805
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
5806
- "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
5807
- "dev": true,
5808
- "requires": {
5809
- "spdx-exceptions": "^2.1.0",
5810
- "spdx-license-ids": "^3.0.0"
5811
- }
5812
- },
5813
- "spdx-license-ids": {
5814
- "version": "3.0.3",
5815
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz",
5816
- "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==",
5817
- "dev": true
5818
- },
5819
- "split-string": {
5820
- "version": "3.1.0",
5821
- "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
5822
- "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
5823
- "dev": true,
5824
- "requires": {
5825
- "extend-shallow": "^3.0.0"
5826
- }
5827
- },
5828
- "sprintf-js": {
5829
- "version": "1.1.2",
5830
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
5831
- "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug=="
5832
- },
5833
- "sshpk": {
5834
- "version": "1.16.1",
5835
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
5836
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
5837
- "dev": true,
5838
- "optional": true,
5839
- "requires": {
5840
- "asn1": "~0.2.3",
5841
- "assert-plus": "^1.0.0",
5842
- "bcrypt-pbkdf": "^1.0.0",
5843
- "dashdash": "^1.12.0",
5844
- "ecc-jsbn": "~0.1.1",
5845
- "getpass": "^0.1.1",
5846
- "jsbn": "~0.1.0",
5847
- "safer-buffer": "^2.0.2",
5848
- "tweetnacl": "~0.14.0"
5849
- }
5850
- },
5851
- "static-extend": {
5852
- "version": "0.1.2",
5853
- "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
5854
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
5855
- "dev": true,
5856
- "requires": {
5857
- "define-property": "^0.2.5",
5858
- "object-copy": "^0.1.0"
5859
- },
5860
- "dependencies": {
5861
- "define-property": {
5862
- "version": "0.2.5",
5863
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
5864
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
5865
- "dev": true,
5866
- "requires": {
5867
- "is-descriptor": "^0.1.0"
5868
- }
5869
- }
5870
- }
5871
- },
5872
- "stream-browserify": {
5873
- "version": "2.0.2",
5874
- "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
5875
- "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
5876
- "dev": true,
5877
- "requires": {
5878
- "inherits": "~2.0.1",
5879
- "readable-stream": "^2.0.2"
5880
- },
5881
- "dependencies": {
5882
- "readable-stream": {
5883
- "version": "2.3.6",
5884
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
5885
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
5886
- "dev": true,
5887
- "requires": {
5888
- "core-util-is": "~1.0.0",
5889
- "inherits": "~2.0.3",
5890
- "isarray": "~1.0.0",
5891
- "process-nextick-args": "~2.0.0",
5892
- "safe-buffer": "~5.1.1",
5893
- "string_decoder": "~1.1.1",
5894
- "util-deprecate": "~1.0.1"
5895
- }
5896
- },
5897
- "string_decoder": {
5898
- "version": "1.1.1",
5899
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
5900
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
5901
- "dev": true,
5902
- "requires": {
5903
- "safe-buffer": "~5.1.0"
5904
- }
5905
- }
5906
- }
5907
- },
5908
- "stream-http": {
5909
- "version": "2.8.3",
5910
- "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
5911
- "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
5912
- "dev": true,
5913
- "requires": {
5914
- "builtin-status-codes": "^3.0.0",
5915
- "inherits": "^2.0.1",
5916
- "readable-stream": "^2.3.6",
5917
- "to-arraybuffer": "^1.0.0",
5918
- "xtend": "^4.0.0"
5919
- },
5920
- "dependencies": {
5921
- "readable-stream": {
5922
- "version": "2.3.6",
5923
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
5924
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
5925
- "dev": true,
5926
- "requires": {
5927
- "core-util-is": "~1.0.0",
5928
- "inherits": "~2.0.3",
5929
- "isarray": "~1.0.0",
5930
- "process-nextick-args": "~2.0.0",
5931
- "safe-buffer": "~5.1.1",
5932
- "string_decoder": "~1.1.1",
5933
- "util-deprecate": "~1.0.1"
5934
- }
5935
- },
5936
- "string_decoder": {
5937
- "version": "1.1.1",
5938
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
5939
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
5940
- "dev": true,
5941
- "requires": {
5942
- "safe-buffer": "~5.1.0"
5943
- }
5944
- }
5945
- }
5946
- },
5947
- "string-template": {
5948
- "version": "0.2.1",
5949
- "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
5950
- "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=",
5951
- "dev": true
5952
- },
5953
- "string-width": {
5954
- "version": "2.1.1",
5955
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
5956
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
5957
- "dev": true,
5958
- "requires": {
5959
- "is-fullwidth-code-point": "^2.0.0",
5960
- "strip-ansi": "^4.0.0"
5961
- },
5962
- "dependencies": {
5963
- "ansi-regex": {
5964
- "version": "3.0.0",
5965
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
5966
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
5967
- "dev": true
5968
- },
5969
- "is-fullwidth-code-point": {
5970
- "version": "2.0.0",
5971
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
5972
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
5973
- "dev": true
5974
- },
5975
- "strip-ansi": {
5976
- "version": "4.0.0",
5977
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
5978
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
5979
- "dev": true,
5980
- "requires": {
5981
- "ansi-regex": "^3.0.0"
5982
- }
5983
- }
5984
- }
5985
- },
5986
- "string_decoder": {
5987
- "version": "0.10.31",
5988
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
5989
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
5990
- "dev": true
5991
- },
5992
- "strip-ansi": {
5993
- "version": "3.0.1",
5994
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
5995
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
5996
- "dev": true,
5997
- "requires": {
5998
- "ansi-regex": "^2.0.0"
5999
- }
6000
- },
6001
- "strip-bom": {
6002
- "version": "2.0.0",
6003
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
6004
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
6005
- "dev": true,
6006
- "requires": {
6007
- "is-utf8": "^0.2.0"
6008
- }
6009
- },
6010
- "strip-eof": {
6011
- "version": "1.0.0",
6012
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
6013
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
6014
- "dev": true
6015
- },
6016
- "strip-indent": {
6017
- "version": "1.0.1",
6018
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
6019
- "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
6020
- "dev": true,
6021
- "requires": {
6022
- "get-stdin": "^4.0.1"
6023
- }
6024
- },
6025
- "stylis": {
6026
- "version": "3.5.4",
6027
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz",
6028
- "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q=="
6029
- },
6030
- "stylis-rule-sheet": {
6031
- "version": "0.0.10",
6032
- "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz",
6033
- "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw=="
6034
- },
6035
- "supports-color": {
6036
- "version": "2.0.0",
6037
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
6038
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
6039
- "dev": true
6040
- },
6041
- "tannin": {
6042
- "version": "1.0.2",
6043
- "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.0.2.tgz",
6044
- "integrity": "sha512-5pqwELzsIO+zO3V3/jjlMR/ykzK41YNFLvb4SwPeAgrTiCjXwL/P3Om5uOiJk/iKdq6lBIO94rYAfBsEHu2vlA==",
6045
- "requires": {
6046
- "@tannin/plural-forms": "^1.0.2"
6047
- }
6048
- },
6049
- "tapable": {
6050
- "version": "0.2.9",
6051
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz",
6052
- "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==",
6053
- "dev": true
6054
- },
6055
- "text-table": {
6056
- "version": "0.2.0",
6057
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
6058
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
6059
- "dev": true
6060
- },
6061
- "timers-browserify": {
6062
- "version": "2.0.10",
6063
- "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
6064
- "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
6065
- "dev": true,
6066
- "requires": {
6067
- "setimmediate": "^1.0.4"
6068
- }
6069
- },
6070
- "tiny-lr": {
6071
- "version": "1.1.1",
6072
- "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz",
6073
- "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==",
6074
- "dev": true,
6075
- "requires": {
6076
- "body": "^5.1.0",
6077
- "debug": "^3.1.0",
6078
- "faye-websocket": "~0.10.0",
6079
- "livereload-js": "^2.3.0",
6080
- "object-assign": "^4.1.0",
6081
- "qs": "^6.4.0"
6082
- },
6083
- "dependencies": {
6084
- "debug": {
6085
- "version": "3.2.6",
6086
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
6087
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
6088
- "dev": true,
6089
- "requires": {
6090
- "ms": "^2.1.1"
6091
- }
6092
- },
6093
- "ms": {
6094
- "version": "2.1.1",
6095
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
6096
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
6097
- "dev": true
6098
- }
6099
- }
6100
- },
6101
- "tmp": {
6102
- "version": "0.0.33",
6103
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
6104
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
6105
- "dev": true,
6106
- "requires": {
6107
- "os-tmpdir": "~1.0.2"
6108
- }
6109
- },
6110
- "to-arraybuffer": {
6111
- "version": "1.0.1",
6112
- "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
6113
- "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
6114
- "dev": true
6115
- },
6116
- "to-fast-properties": {
6117
- "version": "2.0.0",
6118
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
6119
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
6120
- },
6121
- "to-object-path": {
6122
- "version": "0.3.0",
6123
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
6124
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
6125
- "dev": true,
6126
- "requires": {
6127
- "kind-of": "^3.0.2"
6128
- }
6129
- },
6130
- "to-regex": {
6131
- "version": "3.0.2",
6132
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
6133
- "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
6134
- "dev": true,
6135
- "requires": {
6136
- "define-property": "^2.0.2",
6137
- "extend-shallow": "^3.0.2",
6138
- "regex-not": "^1.0.2",
6139
- "safe-regex": "^1.1.0"
6140
- }
6141
- },
6142
- "to-regex-range": {
6143
- "version": "2.1.1",
6144
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
6145
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
6146
- "dev": true,
6147
- "requires": {
6148
- "is-number": "^3.0.0",
6149
- "repeat-string": "^1.6.1"
6150
- }
6151
- },
6152
- "touch": {
6153
- "version": "2.0.2",
6154
- "resolved": "https://registry.npmjs.org/touch/-/touch-2.0.2.tgz",
6155
- "integrity": "sha512-qjNtvsFXTRq7IuMLweVgFxmEuQ6gLbRs2jQxL80TtZ31dEKWYIxRXquij6w6VimyDek5hD3PytljHmEtAs2u0A==",
6156
- "requires": {
6157
- "nopt": "~1.0.10"
6158
- }
6159
- },
6160
- "tough-cookie": {
6161
- "version": "2.4.3",
6162
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
6163
- "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
6164
- "dev": true,
6165
- "optional": true,
6166
- "requires": {
6167
- "psl": "^1.1.24",
6168
- "punycode": "^1.4.1"
6169
- },
6170
- "dependencies": {
6171
- "punycode": {
6172
- "version": "1.4.1",
6173
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
6174
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
6175
- "dev": true,
6176
- "optional": true
6177
- }
6178
- }
6179
- },
6180
- "trim-newlines": {
6181
- "version": "1.0.0",
6182
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
6183
- "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
6184
- "dev": true
6185
- },
6186
- "trim-right": {
6187
- "version": "1.0.1",
6188
- "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
6189
- "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
6190
- "dev": true
6191
- },
6192
- "tty-browserify": {
6193
- "version": "0.0.0",
6194
- "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
6195
- "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
6196
- "dev": true
6197
- },
6198
- "tunnel-agent": {
6199
- "version": "0.6.0",
6200
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
6201
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
6202
- "dev": true,
6203
- "optional": true,
6204
- "requires": {
6205
- "safe-buffer": "^5.0.1"
6206
- }
6207
- },
6208
- "tweetnacl": {
6209
- "version": "0.14.5",
6210
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
6211
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
6212
- "dev": true,
6213
- "optional": true
6214
- },
6215
- "uglify-js": {
6216
- "version": "3.4.9",
6217
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
6218
- "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
6219
- "dev": true,
6220
- "requires": {
6221
- "commander": "~2.17.1",
6222
- "source-map": "~0.6.1"
6223
- },
6224
- "dependencies": {
6225
- "source-map": {
6226
- "version": "0.6.1",
6227
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
6228
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
6229
- "dev": true
6230
- }
6231
- }
6232
- },
6233
- "uglify-to-browserify": {
6234
- "version": "1.0.2",
6235
- "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
6236
- "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
6237
- "dev": true,
6238
- "optional": true
6239
- },
6240
- "uglifyjs-webpack-plugin": {
6241
- "version": "0.4.6",
6242
- "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz",
6243
- "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
6244
- "dev": true,
6245
- "requires": {
6246
- "source-map": "^0.5.6",
6247
- "uglify-js": "^2.8.29",
6248
- "webpack-sources": "^1.0.1"
6249
- },
6250
- "dependencies": {
6251
- "camelcase": {
6252
- "version": "1.2.1",
6253
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
6254
- "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
6255
- "dev": true
6256
- },
6257
- "uglify-js": {
6258
- "version": "2.8.29",
6259
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
6260
- "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
6261
- "dev": true,
6262
- "requires": {
6263
- "source-map": "~0.5.1",
6264
- "uglify-to-browserify": "~1.0.0",
6265
- "yargs": "~3.10.0"
6266
- }
6267
- },
6268
- "yargs": {
6269
- "version": "3.10.0",
6270
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
6271
- "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
6272
- "dev": true,
6273
- "requires": {
6274
- "camelcase": "^1.0.2",
6275
- "cliui": "^2.1.0",
6276
- "decamelize": "^1.0.0",
6277
- "window-size": "0.1.0"
6278
- }
6279
- }
6280
- }
6281
- },
6282
- "underscore": {
6283
- "version": "1.6.0",
6284
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
6285
- "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
6286
- "dev": true
6287
- },
6288
- "underscore.string": {
6289
- "version": "3.3.5",
6290
- "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
6291
- "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
6292
- "dev": true,
6293
- "requires": {
6294
- "sprintf-js": "^1.0.3",
6295
- "util-deprecate": "^1.0.2"
6296
- }
6297
- },
6298
- "union-value": {
6299
- "version": "1.0.0",
6300
- "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
6301
- "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
6302
- "dev": true,
6303
- "requires": {
6304
- "arr-union": "^3.1.0",
6305
- "get-value": "^2.0.6",
6306
- "is-extendable": "^0.1.1",
6307
- "set-value": "^0.4.3"
6308
- },
6309
- "dependencies": {
6310
- "extend-shallow": {
6311
- "version": "2.0.1",
6312
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
6313
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
6314
- "dev": true,
6315
- "requires": {
6316
- "is-extendable": "^0.1.0"
6317
- }
6318
- },
6319
- "set-value": {
6320
- "version": "0.4.3",
6321
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
6322
- "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
6323
- "dev": true,
6324
- "requires": {
6325
- "extend-shallow": "^2.0.1",
6326
- "is-extendable": "^0.1.1",
6327
- "is-plain-object": "^2.0.1",
6328
- "to-object-path": "^0.3.0"
6329
- }
6330
- }
6331
- }
6332
- },
6333
- "unset-value": {
6334
- "version": "1.0.0",
6335
- "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
6336
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
6337
- "dev": true,
6338
- "requires": {
6339
- "has-value": "^0.3.1",
6340
- "isobject": "^3.0.0"
6341
- },
6342
- "dependencies": {
6343
- "has-value": {
6344
- "version": "0.3.1",
6345
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
6346
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
6347
- "dev": true,
6348
- "requires": {
6349
- "get-value": "^2.0.3",
6350
- "has-values": "^0.1.4",
6351
- "isobject": "^2.0.0"
6352
- },
6353
- "dependencies": {
6354
- "isobject": {
6355
- "version": "2.1.0",
6356
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
6357
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
6358
- "dev": true,
6359
- "requires": {
6360
- "isarray": "1.0.0"
6361
- }
6362
- }
6363
- }
6364
- },
6365
- "has-values": {
6366
- "version": "0.1.4",
6367
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
6368
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
6369
- "dev": true
6370
- }
6371
- }
6372
- },
6373
- "upath": {
6374
- "version": "1.1.0",
6375
- "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
6376
- "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
6377
- "dev": true
6378
- },
6379
- "uri-js": {
6380
- "version": "4.2.2",
6381
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
6382
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
6383
- "dev": true,
6384
- "requires": {
6385
- "punycode": "^2.1.0"
6386
- }
6387
- },
6388
- "uri-path": {
6389
- "version": "1.0.0",
6390
- "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz",
6391
- "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=",
6392
- "dev": true
6393
- },
6394
- "urix": {
6395
- "version": "0.1.0",
6396
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
6397
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
6398
- "dev": true
6399
- },
6400
- "url": {
6401
- "version": "0.11.0",
6402
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
6403
- "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
6404
- "dev": true,
6405
- "requires": {
6406
- "punycode": "1.3.2",
6407
- "querystring": "0.2.0"
6408
- },
6409
- "dependencies": {
6410
- "punycode": {
6411
- "version": "1.3.2",
6412
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
6413
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
6414
- "dev": true
6415
- }
6416
- }
6417
- },
6418
- "use": {
6419
- "version": "3.1.1",
6420
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
6421
- "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
6422
- "dev": true
6423
- },
6424
- "util": {
6425
- "version": "0.11.1",
6426
- "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
6427
- "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
6428
- "dev": true,
6429
- "requires": {
6430
- "inherits": "2.0.3"
6431
- }
6432
- },
6433
- "util-deprecate": {
6434
- "version": "1.0.2",
6435
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
6436
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
6437
- "dev": true
6438
- },
6439
- "uuid": {
6440
- "version": "3.3.2",
6441
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
6442
- "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
6443
- "dev": true,
6444
- "optional": true
6445
- },
6446
- "validate-npm-package-license": {
6447
- "version": "3.0.4",
6448
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
6449
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
6450
- "dev": true,
6451
- "requires": {
6452
- "spdx-correct": "^3.0.0",
6453
- "spdx-expression-parse": "^3.0.0"
6454
- }
6455
- },
6456
- "verror": {
6457
- "version": "1.10.0",
6458
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
6459
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
6460
- "dev": true,
6461
- "optional": true,
6462
- "requires": {
6463
- "assert-plus": "^1.0.0",
6464
- "core-util-is": "1.0.2",
6465
- "extsprintf": "^1.2.0"
6466
- }
6467
- },
6468
- "vm-browserify": {
6469
- "version": "0.0.4",
6470
- "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
6471
- "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
6472
- "dev": true,
6473
- "requires": {
6474
- "indexof": "0.0.1"
6475
- }
6476
- },
6477
- "watchpack": {
6478
- "version": "1.6.0",
6479
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
6480
- "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
6481
- "dev": true,
6482
- "requires": {
6483
- "chokidar": "^2.0.2",
6484
- "graceful-fs": "^4.1.2",
6485
- "neo-async": "^2.5.0"
6486
- }
6487
- },
6488
- "webpack": {
6489
- "version": "3.12.0",
6490
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz",
6491
- "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==",
6492
- "dev": true,
6493
- "requires": {
6494
- "acorn": "^5.0.0",
6495
- "acorn-dynamic-import": "^2.0.0",
6496
- "ajv": "^6.1.0",
6497
- "ajv-keywords": "^3.1.0",
6498
- "async": "^2.1.2",
6499
- "enhanced-resolve": "^3.4.0",
6500
- "escope": "^3.6.0",
6501
- "interpret": "^1.0.0",
6502
- "json-loader": "^0.5.4",
6503
- "json5": "^0.5.1",
6504
- "loader-runner": "^2.3.0",
6505
- "loader-utils": "^1.1.0",
6506
- "memory-fs": "~0.4.1",
6507
- "mkdirp": "~0.5.0",
6508
- "node-libs-browser": "^2.0.0",
6509
- "source-map": "^0.5.3",
6510
- "supports-color": "^4.2.1",
6511
- "tapable": "^0.2.7",
6512
- "uglifyjs-webpack-plugin": "^0.4.6",
6513
- "watchpack": "^1.4.0",
6514
- "webpack-sources": "^1.0.1",
6515
- "yargs": "^8.0.2"
6516
- },
6517
- "dependencies": {
6518
- "async": {
6519
- "version": "2.6.2",
6520
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
6521
- "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
6522
- "dev": true,
6523
- "requires": {
6524
- "lodash": "^4.17.11"
6525
- }
6526
- },
6527
- "has-flag": {
6528
- "version": "2.0.0",
6529
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
6530
- "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
6531
- "dev": true
6532
- },
6533
- "supports-color": {
6534
- "version": "4.5.0",
6535
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
6536
- "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
6537
- "dev": true,
6538
- "requires": {
6539
- "has-flag": "^2.0.0"
6540
- }
6541
- }
6542
- }
6543
- },
6544
- "webpack-sources": {
6545
- "version": "1.3.0",
6546
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
6547
- "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
6548
- "dev": true,
6549
- "requires": {
6550
- "source-list-map": "^2.0.0",
6551
- "source-map": "~0.6.1"
6552
- },
6553
- "dependencies": {
6554
- "source-map": {
6555
- "version": "0.6.1",
6556
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
6557
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
6558
- "dev": true
6559
- }
6560
- }
6561
- },
6562
- "websocket-driver": {
6563
- "version": "0.7.0",
6564
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
6565
- "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
6566
- "dev": true,
6567
- "requires": {
6568
- "http-parser-js": ">=0.4.0",
6569
- "websocket-extensions": ">=0.1.1"
6570
- }
6571
- },
6572
- "websocket-extensions": {
6573
- "version": "0.1.4",
6574
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
6575
- "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
6576
- "dev": true
6577
- },
6578
- "whatwg-fetch": {
6579
- "version": "3.0.0",
6580
- "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz",
6581
- "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q=="
6582
- },
6583
- "which": {
6584
- "version": "1.3.1",
6585
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
6586
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
6587
- "dev": true,
6588
- "requires": {
6589
- "isexe": "^2.0.0"
6590
- }
6591
- },
6592
- "which-module": {
6593
- "version": "2.0.0",
6594
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
6595
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
6596
- "dev": true
6597
- },
6598
- "window-size": {
6599
- "version": "0.1.0",
6600
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
6601
- "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
6602
- "dev": true
6603
- },
6604
- "wordwrap": {
6605
- "version": "0.0.2",
6606
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
6607
- "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
6608
- "dev": true
6609
- },
6610
- "wrap-ansi": {
6611
- "version": "2.1.0",
6612
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
6613
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
6614
- "dev": true,
6615
- "requires": {
6616
- "string-width": "^1.0.1",
6617
- "strip-ansi": "^3.0.1"
6618
- },
6619
- "dependencies": {
6620
- "string-width": {
6621
- "version": "1.0.2",
6622
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
6623
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
6624
- "dev": true,
6625
- "requires": {
6626
- "code-point-at": "^1.0.0",
6627
- "is-fullwidth-code-point": "^1.0.0",
6628
- "strip-ansi": "^3.0.0"
6629
- }
6630
- }
6631
- }
6632
- },
6633
- "wrappy": {
6634
- "version": "1.0.2",
6635
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
6636
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
6637
- "dev": true
6638
- },
6639
- "xtend": {
6640
- "version": "4.0.1",
6641
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
6642
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
6643
- "dev": true
6644
- },
6645
- "y18n": {
6646
- "version": "3.2.1",
6647
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
6648
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
6649
- "dev": true
6650
- },
6651
- "yallist": {
6652
- "version": "2.1.2",
6653
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
6654
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
6655
- "dev": true
6656
- },
6657
- "yargs": {
6658
- "version": "8.0.2",
6659
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
6660
- "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
6661
- "dev": true,
6662
- "requires": {
6663
- "camelcase": "^4.1.0",
6664
- "cliui": "^3.2.0",
6665
- "decamelize": "^1.1.1",
6666
- "get-caller-file": "^1.0.1",
6667
- "os-locale": "^2.0.0",
6668
- "read-pkg-up": "^2.0.0",
6669
- "require-directory": "^2.1.1",
6670
- "require-main-filename": "^1.0.1",
6671
- "set-blocking": "^2.0.0",
6672
- "string-width": "^2.0.0",
6673
- "which-module": "^2.0.0",
6674
- "y18n": "^3.2.1",
6675
- "yargs-parser": "^7.0.0"
6676
- },
6677
- "dependencies": {
6678
- "camelcase": {
6679
- "version": "4.1.0",
6680
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
6681
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
6682
- "dev": true
6683
- },
6684
- "cliui": {
6685
- "version": "3.2.0",
6686
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
6687
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
6688
- "dev": true,
6689
- "requires": {
6690
- "string-width": "^1.0.1",
6691
- "strip-ansi": "^3.0.1",
6692
- "wrap-ansi": "^2.0.0"
6693
- },
6694
- "dependencies": {
6695
- "string-width": {
6696
- "version": "1.0.2",
6697
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
6698
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
6699
- "dev": true,
6700
- "requires": {
6701
- "code-point-at": "^1.0.0",
6702
- "is-fullwidth-code-point": "^1.0.0",
6703
- "strip-ansi": "^3.0.0"
6704
- }
6705
- }
6706
- }
6707
- },
6708
- "load-json-file": {
6709
- "version": "2.0.0",
6710
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
6711
- "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
6712
- "dev": true,
6713
- "requires": {
6714
- "graceful-fs": "^4.1.2",
6715
- "parse-json": "^2.2.0",
6716
- "pify": "^2.0.0",
6717
- "strip-bom": "^3.0.0"
6718
- }
6719
- },
6720
- "parse-json": {
6721
- "version": "2.2.0",
6722
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
6723
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
6724
- "dev": true,
6725
- "requires": {
6726
- "error-ex": "^1.2.0"
6727
- }
6728
- },
6729
- "path-type": {
6730
- "version": "2.0.0",
6731
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
6732
- "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
6733
- "dev": true,
6734
- "requires": {
6735
- "pify": "^2.0.0"
6736
- }
6737
- },
6738
- "pify": {
6739
- "version": "2.3.0",
6740
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
6741
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
6742
- "dev": true
6743
- },
6744
- "read-pkg": {
6745
- "version": "2.0.0",
6746
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
6747
- "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
6748
- "dev": true,
6749
- "requires": {
6750
- "load-json-file": "^2.0.0",
6751
- "normalize-package-data": "^2.3.2",
6752
- "path-type": "^2.0.0"
6753
- }
6754
- },
6755
- "read-pkg-up": {
6756
- "version": "2.0.0",
6757
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
6758
- "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
6759
- "dev": true,
6760
- "requires": {
6761
- "find-up": "^2.0.0",
6762
- "read-pkg": "^2.0.0"
6763
- }
6764
- },
6765
- "strip-bom": {
6766
- "version": "3.0.0",
6767
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
6768
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
6769
- "dev": true
6770
- }
6771
- }
6772
- },
6773
- "yargs-parser": {
6774
- "version": "7.0.0",
6775
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
6776
- "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
6777
- "dev": true,
6778
- "requires": {
6779
- "camelcase": "^4.1.0"
6780
- },
6781
- "dependencies": {
6782
- "camelcase": {
6783
- "version": "4.1.0",
6784
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
6785
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
6786
- "dev": true
6787
- }
6788
- }
6789
- }
6790
- }
6791
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: wpchill, silkalns, barrykooij, mikejolley
3
  Tags: download, downloads, monitor, hits, download monitor, tracking, admin, count, files, versions, logging, digital, documents, download category, download manager, download template, downloadmanager, file manager, file tree, grid, hits, ip-address, manager, media, monitor, password, protect downloads, tracker, sell, shop, ecommerce, paypal
4
  Requires at least: 5.4
5
- Tested up to: 5.8
6
- Stable tag: 4.4.4
7
  License: GPLv3
8
  Text Domain: -
9
  Requires PHP: 5.6
@@ -117,6 +117,23 @@ More documentation can be found in our [Knowledge Base](https://www.download-mon
117
 
118
  == Changelog ==
119
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  = 4.4.4: October 19, 2020 =
121
  * Tweak: Fixed PHP 7.4 notices.
122
  * Tweak: Check if download variable is set in content-download template. This prevents a fatal error in odd case no download is given.
2
  Contributors: wpchill, silkalns, barrykooij, mikejolley
3
  Tags: download, downloads, monitor, hits, download monitor, tracking, admin, count, files, versions, logging, digital, documents, download category, download manager, download template, downloadmanager, file manager, file tree, grid, hits, ip-address, manager, media, monitor, password, protect downloads, tracker, sell, shop, ecommerce, paypal
4
  Requires at least: 5.4
5
+ Tested up to: 5.7
6
+ Stable tag: 4.4.5
7
  License: GPLv3
8
  Text Domain: -
9
  Requires PHP: 5.6
117
 
118
  == Changelog ==
119
 
120
+ = 4.4.5 - 20.10.2021 =
121
+ Fixed: PHP 8 bug - slow query ( https://github.com/WPChill/download-monitor/issues/685 )
122
+ Fixed: Deprecated PHP 8 notice (https://github.com/WPChill/download-monitor/issues/682 thanks to @ashleyfae )
123
+ Fixed: PHP templates errors ( https://github.com/WPChill/download-monitor/issues/691 )
124
+ Fixed: Single shop download error ( https://github.com/WPChill/download-monitor/issues/690 )
125
+ Fixed: Permalink errors - retrieved permalinks on archives didn't show the correct URL ( https://github.com/WPChill/download-monitor/issues/689 )
126
+ Fixed : [downloads] shortcode now displays both featured and not featured downloads when left as is ( thanks to @kadimi https://github.com/WPChill/download-monitor/pull/526 )
127
+ Added : Size filter in the placeholder image ( thanks to @jamesgol https://github.com/WPChill/download-monitor/pull/507 )
128
+ Fixed : Sha256 support added when new files are added ( thanks to @jamesgol https://github.com/WPChill/download-monitor/pull/633 )
129
+ Added: Upsells
130
+ Fixed: Fix download from CDN where uploads folder is replaced ( https://github.com/WPChill/download-monitor/issues/698 )
131
+ Fixed: Fatal error on URL with version param ( https://github.com/WPChill/download-monitor/issues/709 )
132
+ Changed: Notice display
133
+ Changed: Tab reconstruction and settings structure
134
+ Changed: TinyMCE interface for short description ( https://github.com/WPChill/download-monitor/issues/708 )
135
+ Fixed : Added layer of security against certain SQL Injections
136
+
137
  = 4.4.4: October 19, 2020 =
138
  * Tweak: Fixed PHP 7.4 notices.
139
  * Tweak: Check if download variable is set in content-download template. This prevents a fatal error in odd case no download is given.
src/Admin/Admin.php CHANGED
@@ -29,13 +29,15 @@ class DLM_Admin {
29
 
30
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
31
 
 
 
32
  // Admin menus
33
- add_action( 'admin_menu', array( $this, 'admin_menu_extensions' ), 20 );
34
 
35
  // setup settings
36
  $settings = new DLM_Admin_Settings();
37
  add_action( 'admin_init', array( $settings, 'register_settings' ) );
38
- add_filter( 'dlm_settings', array( $settings, 'backwards_compatibility_settings' ), 99, 1 );
39
  $settings->register_lazy_load_callbacks();
40
 
41
  // setup settings page
@@ -235,22 +237,52 @@ class DLM_Admin {
235
  /**
236
  * Add the admin menu on later hook so extensions can be add before this menu item
237
  */
238
- public function admin_menu_extensions() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
239
  // Extensions page
240
- add_submenu_page( 'edit.php?post_type=dlm_download', __( 'Download Monitor Extensions', 'download-monitor' ), '<span style="color:#419CCB;font-weight:bold;">' . __( 'Extensions', 'download-monitor' ) . '</span>', 'manage_options', 'dlm-extensions', array(
241
- $this,
242
- 'extensions_page'
243
- ) );
 
 
 
244
  }
245
 
246
  /**
247
- * Output extensions page
248
  */
249
- public function extensions_page() {
250
- $admin_extensions = new DLM_Admin_Extensions();
251
- $admin_extensions->output();
 
 
 
 
 
 
 
 
 
252
  }
253
 
 
254
  /**
255
  * admin_dashboard function.
256
  *
29
 
30
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
31
 
32
+ add_action( 'init', array( $this, 'required_classes' ), 30 );
33
+
34
  // Admin menus
35
+ add_action( 'admin_menu', array( $this, 'admin_menu' ), 20 );
36
 
37
  // setup settings
38
  $settings = new DLM_Admin_Settings();
39
  add_action( 'admin_init', array( $settings, 'register_settings' ) );
40
+
41
  $settings->register_lazy_load_callbacks();
42
 
43
  // setup settings page
237
  /**
238
  * Add the admin menu on later hook so extensions can be add before this menu item
239
  */
240
+ public function admin_menu() {
241
+
242
+ /**
243
+ * Hook for menu link
244
+ *
245
+ * @hooked DLM_Settings_Page add_settings_page() - 30
246
+ * @hooked DLM_Admin_Extensions extensions_pages() - 30
247
+ * @hooked DLM_Reports_Page add_admin_menu() - 30
248
+ * @hooked DLM_Log_Page add_logs_menu() - 30
249
+ * @hooked Orders orders_menu() - 30
250
+ *
251
+ */
252
+ $links = apply_filters(
253
+ 'dlm_admin_menu_links',
254
+ array()
255
+ );
256
+
257
+ uasort( $links, array( 'DLM_Admin_Helper', 'sort_data_by_priority' ) );
258
  // Extensions page
259
+
260
+ if ( ! empty( $links ) ) {
261
+ foreach ( $links as $link ) {
262
+ add_submenu_page( 'edit.php?post_type=dlm_download', $link['page_title'], $link['menu_title'], $link['capability'], $link['menu_slug'], $link['function'], $link['priority'] );
263
+ }
264
+ }
265
+
266
  }
267
 
268
  /**
269
+ * Load our classes
270
  */
271
+ public function required_classes() {
272
+
273
+ // Loads the DLM Admin Extensions class
274
+ // Add Extensions pages
275
+ DLM_Admin_Extensions::get_instance();
276
+
277
+ // Load the DLM Admin Helper class
278
+ DLM_Admin_Helper::get_instance();
279
+
280
+ // Load the DLM Uninstall class
281
+ DLM_Uninstall::get_instance();
282
+
283
  }
284
 
285
+
286
  /**
287
  * admin_dashboard function.
288
  *
src/Admin/AdminScripts.php CHANGED
@@ -109,8 +109,8 @@ class DLM_Admin_Scripts {
109
 
110
  // Enqueue Reports JS
111
  wp_enqueue_script(
112
- 'dlm_reports_frappe_charts',
113
- plugins_url( '/assets/js/reports/frappe-charts.min.js', $dlm->get_plugin_file() ),
114
  array( 'jquery' ),
115
  DLM_VERSION,
116
  true
@@ -118,7 +118,7 @@ class DLM_Admin_Scripts {
118
 
119
  wp_enqueue_script(
120
  'dlm_reports',
121
- plugins_url( '/assets/js/reports/reports' . ( ( ! SCRIPT_DEBUG ) ? '.min' : '' ) . '.js', $dlm->get_plugin_file() ),
122
  array( 'jquery' ),
123
  DLM_VERSION,
124
  true
@@ -153,16 +153,18 @@ class DLM_Admin_Scripts {
153
  'settings_url' => DLM_Admin_Settings::get_url()
154
  ) );
155
 
156
- if ( 'dlm-extensions' === $_GET['page'] ) {
157
- // Enqueue Extesions JS
158
- wp_enqueue_script(
159
- 'dlm_extensions',
160
- plugins_url( '/assets/js/extensions' . ( ( ! SCRIPT_DEBUG ) ? '.min' : '' ) . '.js', $dlm->get_plugin_file() ),
161
- array( 'jquery' ),
162
- DLM_VERSION
163
- );
164
- }
165
 
 
 
 
 
 
 
 
 
 
 
166
  }
167
 
168
  if ( 'options.php' == $pagenow && isset( $_GET['page'] ) && 'dlm_legacy_upgrade' === $_GET['page'] ) {
109
 
110
  // Enqueue Reports JS
111
  wp_enqueue_script(
112
+ 'dlm_reports_chartjs',
113
+ plugins_url( '/assets/js/reports/charts.min.js', $dlm->get_plugin_file() ),
114
  array( 'jquery' ),
115
  DLM_VERSION,
116
  true
118
 
119
  wp_enqueue_script(
120
  'dlm_reports',
121
+ plugins_url( '/assets/js/reports/reports.js', $dlm->get_plugin_file() ),
122
  array( 'jquery' ),
123
  DLM_VERSION,
124
  true
153
  'settings_url' => DLM_Admin_Settings::get_url()
154
  ) );
155
 
156
+ }
 
 
 
 
 
 
 
 
157
 
158
+ // This should handle all extensions activation and deactivation single-handed
159
+ if ( isset($_GET['page']) && 'dlm-installed-extensions' === $_GET['page'] ) {
160
+
161
+ // Enqueue Extesions JS
162
+ wp_enqueue_script(
163
+ 'dlm_extensions',
164
+ plugins_url( '/assets/js/extensions' . ( ( ! SCRIPT_DEBUG ) ? '.min' : '' ) . '.js', $dlm->get_plugin_file() ),
165
+ array( 'jquery' ),
166
+ DLM_VERSION
167
+ );
168
  }
169
 
170
  if ( 'options.php' == $pagenow && isset( $_GET['page'] ) && 'dlm_legacy_upgrade' === $_GET['page'] ) {
src/Admin/Extensions.php CHANGED
@@ -15,150 +15,460 @@ use \Never5\DownloadMonitor\Util;
15
  class DLM_Admin_Extensions {
16
 
17
  /**
18
- * Handles output of the reports page in admin.
 
 
 
 
19
  */
20
- public function output() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
  // Allow user to reload extensions
23
  if ( isset( $_GET['dlm-force-recheck'] ) ) {
24
  delete_transient( 'dlm_extension_json' );
25
  }
26
 
27
- // Load extension json
28
- $extension_loader = new Util\ExtensionLoader();
29
- $extension_json = $extension_loader->fetch();
30
-
31
  ?>
32
- <div class="wrap dlm_extensions_wrap">
33
- <div class="icon32 icon32-posts-dlm_download" id="icon-edit"><br/></div>
34
- <h1><?php _e( 'Download Monitor Extensions', 'download-monitor' ); ?> <a
35
- href="<?php echo add_query_arg( 'dlm-force-recheck', '1', admin_url( 'edit.php?post_type=dlm_download&page=dlm-extensions' ) ); ?>"
36
- class="button dlm-reload-button">Reload Extensions</a></h1>
 
 
 
 
37
  <?php
38
 
39
- if ( false !== $extension_json ) {
40
-
41
- // Get all extensions
42
- $response = json_decode( $extension_json );
43
 
44
  // Display message if it's there
45
- if ( isset( $response->message ) && '' !== $response->message ) {
46
- echo '<div id="message" class="updated">' . $response->message . '</div>' . PHP_EOL;
47
  }
48
 
49
- if ( isset( $response ) > 0 && isset( $response->extensions ) && count( $response->extensions ) > 0 ) {
50
 
51
- // Extensions
52
- $extensions = $response->extensions;
53
 
54
- // Get products
55
- $products = DLM_Product_Manager::get()->get_products();
56
 
57
- // Loop through extensions
58
- $installed_extensions = array();
 
59
 
60
- foreach ( $extensions as $extension_key => $extension ) {
61
- if ( isset( $products[ $extension->product_id ] ) ) {
62
- $installed_extensions[] = $extension;
63
- unset( $extensions[ $extension_key ] );
64
- }
65
- }
 
 
 
 
 
 
 
 
 
 
 
66
 
67
- echo '<p>' . sprintf( __( 'Extend Download Monitor with its powerful free and paid extensions. %sClick here to browse all extensions%s', 'download-monitor' ), '<a href="https://www.download-monitor.com/extensions/?utm_source=plugin&utm_medium=link&utm_campaign=extensions-top" target="_blank">', '</a>' ) . '</p>' . PHP_EOL;
68
- ?>
69
- <h2 class="nav-tab-wrapper">
70
- <a href="#available-extensions" class="nav-tab nav-tab-active"
71
- id="dlm-tab-available-extensions">Available Extensions</a>
72
- <?php if ( count( $installed_extensions ) > 0 ) { ?><a href="#installed-extensions"
73
- class="nav-tab"
74
- id="dlm-tab-installed-extensions">Installed
75
- Extensions</a><?php } ?>
76
- </h2>
77
- <?php
78
-
79
-
80
- // Available Extensions
81
- if ( count( $extensions ) > 0 ) {
82
-
83
- echo '<div id="available-extensions" class="settings_panel">' . PHP_EOL;
84
- echo '<div class="theme-browser dlm_extensions">';
85
-
86
- foreach ( $extensions as $extension ) {
87
-
88
- $sale = false;
89
- if ( $extension->price > 0 ) {
90
- $price_display = '$' . $extension->price;
91
- if ( '' != $extension->sale_price && $extension->sale_price > 0 ) {
92
- $price_display = '<strike>$' . $extension->price . '</strike> $' . $extension->sale_price;
93
- $sale = true;
94
- }
95
- } else {
96
- $price_display = 'FREE';
97
  }
 
98
 
99
- //$price_display = ( ( $extension->price > 0 ) ? '$' . $extension->price : 'FREE' );
100
-
101
- echo '<div class="theme dlm_extension">';
102
- echo '<a href="' . esc_attr( $extension->url ) . '?utm_source=plugin&utm_medium=extension-block&utm_campaign=' . esc_attr( $extension->name ) . '" target="_blank">';
103
- echo '<div class="dlm_extension_img_wrapper"><img src="' . esc_attr( $extension->image ) . '" alt="' . esc_attr( $extension->name ) . '" /></div>' . PHP_EOL;
104
- echo '<h3>' . esc_html( $extension->name ) . '</h3>' . PHP_EOL;
105
- echo '<p class="extension-desc">' . esc_html( $extension->desc ) . '</p>';
106
- echo '<div class="product_footer">';
107
- echo '<span class="loop_price' . ( ( $sale ) ? ' sale' : '' ) . '">' . esc_html( $price_display ) . ' / year</span>';
108
- echo '<span class="loop_more">Get This Extension</span>';
109
- echo '</div>';
110
- echo '</a>';
111
- echo '</div>';
112
  }
113
 
 
 
 
 
 
 
 
 
114
  echo '</div>';
 
115
  echo '</div>';
 
116
 
 
 
117
 
118
- } else if ( count( $installed_extensions ) > 0 ) {
119
- echo '<p>Wow, looks like you installed all our extensions. Thanks, you rock!</p>';
120
- }
121
 
122
- // Installed Extensions
123
- if ( count( $installed_extensions ) > 0 ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
 
125
- echo '<div id="installed-extensions" class="settings_panel">' . PHP_EOL;
126
 
127
- echo '<div class="theme-browser dlm_extensions">';
128
- foreach ( $installed_extensions as $extension ) {
 
129
 
130
- // Get the product
131
- $license = $products[ $extension->product_id ]->get_license();
132
 
133
- echo '<div class="theme dlm_extension">';
134
 
135
- echo '<div class="dlm_extension_img_wrapper"><img src="' . esc_attr( $extension->image ) . '" alt="' . esc_attr( $extension->name ) . '" /></div>' . PHP_EOL;
136
- echo '<h3>' . esc_html( $extension->name ) . '</h3>' . PHP_EOL;
137
 
138
- echo '<div class="extension_license">' . PHP_EOL;
139
- echo '<p class="license-status' . ( ( $license->is_active() ) ? ' active' : '' ) . '">' . esc_html( strtoupper( $license->get_status() ) ) . '</p>' . PHP_EOL;
140
- echo '<input type="hidden" id="dlm-ajax-nonce" value="' . wp_create_nonce( 'dlm-ajax-nonce' ) . '" />' . PHP_EOL;
141
- echo '<input type="hidden" id="status" value="' . esc_attr( $license->get_status() ) . '" />' . PHP_EOL;
142
- echo '<input type="hidden" id="product_id" value="' . esc_attr( $extension->product_id ) . '" />' . PHP_EOL;
143
- echo '<input type="text" name="key" id="key" value="' . esc_attr( $license->get_key() ) . '" placeholder="License Key"' . ( ( $license->is_active() ) ? ' disabled="disabled"' : '' ) . ' />' . PHP_EOL;
144
- echo '<input type="text" name="email" id="email" value="' . esc_attr( $license->get_email() ) . '" placeholder="License Email"' . ( ( $license->is_active() ) ? ' disabled="disabled"' : '' ) . ' />' . PHP_EOL;
145
- echo '<a href="javascript:;" class="button button-primary">' . ( ( $license->is_active() ) ? 'Deactivate' : 'Activate' ) . '</a>';
146
- echo '</div>' . PHP_EOL;
147
 
148
- echo '</div>';
149
- }
150
- echo '</div>';
151
- echo '</div>' . PHP_EOL;
152
 
153
- }
154
 
155
- }
156
 
157
- } else {
158
- echo "<p>Couldn't load extensions, please try again later.</p>" . PHP_EOL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
159
  }
160
- ?>
161
- </div>
162
- <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  }
164
  }
15
  class DLM_Admin_Extensions {
16
 
17
  /**
18
+ * Holds the class object.
19
+ *
20
+ * @since 4.4.5
21
+ *
22
+ * @var object
23
  */
24
+ public static $instance;
25
+
26
+ /**
27
+ * Json response
28
+ *
29
+ * @var
30
+ *
31
+ * @since 4.4.5
32
+ */
33
+ private $response;
34
+
35
+ /**
36
+ * DLM's extensions
37
+ *
38
+ * @var array
39
+ *
40
+ * @since 4.4.5
41
+ */
42
+ private $extensions = array();
43
+
44
+ /**
45
+ * DLM's extensions tabs
46
+ *
47
+ * @var array
48
+ *
49
+ * @since 4.4.5
50
+ */
51
+ private $tabs = array();
52
+
53
+ /**
54
+ * DLM's installed extensions
55
+ *
56
+ * @var array
57
+ *
58
+ * @since 4.4.5
59
+ */
60
+ private $installed_extensions = array();
61
+
62
+ /**
63
+ * Json
64
+ *
65
+ * @var mixed|string
66
+ *
67
+ * @since 4.4.5
68
+ */
69
+ private $json;
70
+
71
+ /**
72
+ * Our Products
73
+ *
74
+ * @var
75
+ *
76
+ * @since 4.4.5
77
+ */
78
+ private $products;
79
+
80
+
81
+ public function __construct() {
82
+
83
+ // Add the extensions menu links
84
+ add_filter( 'dlm_admin_menu_links', array( $this, 'extensions_pages' ), 30 );
85
+
86
+ // Remove not needed menu link from appearing in dashboard
87
+ add_filter( 'submenu_file', array( $this, 'remove_submenu_item' ) );
88
+
89
+ // Load our required data
90
+ add_action( 'admin_init', array( $this, 'load_data' ), 15 );
91
+
92
+ add_filter( 'dlm_add_edit_tabs', array( $this, 'dlm_cpt_tabs' ) );
93
+
94
+
95
+ }
96
+
97
+ /**
98
+ * Add the installed extensions tab to DLM CPT
99
+ *
100
+ * @param $tabs
101
+ *
102
+ * @since 4.4.5
103
+ */
104
+ public function dlm_cpt_tabs( $tabs ) {
105
+
106
+ if ( count( $this->installed_extensions ) > 0 ) {
107
+
108
+ $tabs['dlm-installed-extensions'] = array(
109
+ 'name' => esc_html__( 'Installed Extensions', 'download-monitor' ),
110
+ 'url' => admin_url( 'edit.php?post_type=dlm_download&page=dlm-installed-extensions' ),
111
+ 'target' => '',
112
+ 'priority' => '20',
113
+ );
114
+ }
115
+
116
+ return $tabs;
117
+ }
118
+
119
+
120
+ /**
121
+ * Loads required data and sets tabs
122
+ *
123
+ * @since 4.4.5
124
+ */
125
+ public function load_data() {
126
+
127
+ $loader = new Util\ExtensionLoader();
128
+ $this->json = $loader->fetch();
129
+
130
+ $this->products = DLM_Product_Manager::get()->get_products();
131
+
132
+ // Set the extensions
133
+ $this->set_response();
134
+
135
+ $this->set_tabs();
136
+
137
+ }
138
+
139
+ /**
140
+ * Returns the singleton instance of the class.
141
+ *
142
+ * @return object The DLM_Admin_Extensions object.
143
+ * @since 4.4.5
144
+ *
145
+ */
146
+ public static function get_instance() {
147
+
148
+ if ( ! isset( self::$instance ) && ! ( self::$instance instanceof DLM_Admin_Extensions ) ) {
149
+ self::$instance = new DLM_Admin_Extensions();
150
+ }
151
+
152
+ return self::$instance;
153
+
154
+ }
155
+
156
+ /**
157
+ * Add extensions menu links
158
+ *
159
+ * @param $links
160
+ *
161
+ * @return mixed
162
+ */
163
+ public function extensions_pages( $links ) {
164
+
165
+ $links[] = array(
166
+ 'page_title' => __( 'Download Monitor Extensions', 'download-monitor' ),
167
+ 'menu_title' => '<span style="color:#419CCB;font-weight:bold;">' . __( 'Extensions', 'download-monitor' ) . '</span>',
168
+ 'capability' => 'manage_options',
169
+ 'menu_slug' => 'dlm-extensions',
170
+ 'function' => array( $this, 'available_extensions' ),
171
+ 'priority' => 50,
172
+ );
173
+
174
+ $links[] = array(
175
+ 'page_title' => __( 'Download Monitor Installed Extensions', 'download-monitor' ),
176
+ 'menu_title' => __( 'Installed Extensions', 'download-monitor' ),
177
+ 'capability' => 'manage_options',
178
+ 'menu_slug' => 'dlm-installed-extensions',
179
+ 'function' => array( $this, 'installed_extensions_page' ),
180
+ 'priority' => 65,
181
+ );
182
+
183
+ return $links;
184
+ }
185
+
186
+ /**
187
+ * Remove the submenus we don't want to show
188
+ *
189
+ * @param $submenu_file
190
+ *
191
+ * @return mixed
192
+ *
193
+ * @since 4.4.5
194
+ */
195
+ public function remove_submenu_item( $submenu_file ) {
196
+
197
+ remove_submenu_page( 'edit.php?post_type=dlm_download', 'dlm-installed-extensions' );
198
+
199
+ return $submenu_file;
200
+ }
201
+
202
+
203
+ /**
204
+ * Set DLM's extensions
205
+ *
206
+ * @since 4.4.5
207
+ */
208
+ public function set_response() {
209
+
210
+ $this->response = json_decode( $this->json );
211
+
212
+ if ( ! isset( $this->response ) ) {
213
+ return;
214
+ }
215
+
216
+ // Get all extensions
217
+ $this->extensions = $this->response->extensions;
218
+
219
+ // Loop through extensions
220
+ foreach ( $this->extensions as $extension_key => $extension ) {
221
+ if ( isset( $this->products[ $extension->product_id ] ) ) {
222
+ $this->installed_extensions[] = $extension;
223
+ unset( $this->extensions[ $extension_key ] );
224
+ }
225
+ }
226
+
227
+ }
228
+
229
+
230
+ /**
231
+ * Output DLM's extensions page
232
+ *
233
+ * @since 4.4.5
234
+ */
235
+ public function available_extensions() {
236
 
237
  // Allow user to reload extensions
238
  if ( isset( $_GET['dlm-force-recheck'] ) ) {
239
  delete_transient( 'dlm_extension_json' );
240
  }
241
 
 
 
 
 
242
  ?>
243
+ <div class="wrap dlm_extensions_wrap">
244
+ <div class="icon32 icon32-posts-dlm_download" id="icon-edit"><br/></div>
245
+ <h1>
246
+ <?php _e( 'Download Monitor Extensions', 'download-monitor' ); ?>
247
+ <a href="<?php echo add_query_arg( 'dlm-force-recheck', '1', admin_url( 'edit.php?post_type=dlm_download&page=dlm-extensions' ) ); ?>"
248
+ class="button dlm-reload-button">
249
+ <?php esc_html_e( 'Reload Extensions', 'download-monitor' ); ?>
250
+ </a>
251
+ </h1>
252
  <?php
253
 
254
+ if ( false !== $this->json ) {
 
 
 
255
 
256
  // Display message if it's there
257
+ if ( isset( $this->response->message ) && '' !== $this->response->message ) {
258
+ echo '<div id="message" class="updated">' . esc_html( $this->response->message ) . '</div>';
259
  }
260
 
261
+ // Extensions
262
 
263
+ echo '<p>' . sprintf( __( 'Extend Download Monitor with its powerful free and paid extensions. %sClick here to browse all extensions%s', 'download-monitor' ), '<a href="https://www.download-monitor.com/extensions/?utm_source=plugin&utm_medium=link&utm_campaign=extensions-top" target="_blank">', '</a>' ) . '</p>';
 
264
 
265
+ $active_tab = 'dlm-extensions';
 
266
 
267
+ if ( isset( $_GET['page'] ) && isset( $tabs[ $_GET['page'] ] ) ) {
268
+ $active_tab = $_GET['page'];
269
+ }
270
 
271
+ ?>
272
+ <h2 class="nav-tab-wrapper">
273
+ <?php DLM_Admin_Helper::dlm_tab_navigation( $this->tabs, $active_tab ); ?>
274
+ </h2>
275
+ <?php
276
+
277
+ // Available Extensions
278
+ if ( count( $this->extensions ) > 0 ) {
279
+
280
+ echo '<div id="available-extensions" class="settings_panel">';
281
+ echo '<div class="theme-browser dlm_extensions">';
282
+
283
+ foreach ( $this->extensions as $extension ) {
284
+
285
+ $sale = false;
286
+
287
+ if ( $extension->price > 0 ) {
288
 
289
+ $price_display = '$' . $extension->price;
290
+
291
+ if ( '' != $extension->sale_price && $extension->sale_price > 0 ) {
292
+
293
+ $price_display = '<strike>$' . $extension->price . '</strike> $' . $extension->sale_price;
294
+ $sale = true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  }
296
+ } else {
297
 
298
+ $price_display = __( 'FREE', 'download-monitor' );
 
 
 
 
 
 
 
 
 
 
 
 
299
  }
300
 
301
+ echo '<div class="theme dlm_extension">';
302
+ echo '<a href="' . esc_url( $extension->url ) . '?utm_source=plugin&utm_medium=extension-block&utm_campaign=' . esc_attr( $extension->name ) . '" target="_blank">';
303
+ echo '<div class="dlm_extension_img_wrapper"><img src="' . esc_url( $extension->image ) . '" alt="' . esc_attr( $extension->name ) . '" /></div>';
304
+ echo '<h3>' . esc_html( $extension->name ) . '</h3>';
305
+ echo '<p class="extension-desc">' . esc_html( $extension->desc ) . '</p>';
306
+ echo '<div class="product_footer">';
307
+ echo '<span class="loop_price' . ( ( $sale ) ? ' sale' : '' ) . '">' . esc_html( $price_display ) . ' / ' . esc_html__( 'year', 'download-monitor' ) . '</span>';
308
+ echo '<span class="loop_more">' . esc_html__( 'Get This Extension', 'download-monitor' ) . '</span>';
309
  echo '</div>';
310
+ echo '</a>';
311
  echo '</div>';
312
+ }
313
 
314
+ echo '</div>';
315
+ echo '</div>';
316
 
 
 
 
317
 
318
+ } else if ( count( $this->installed_extensions ) > 0 ) {
319
+ echo '<p>' . esc_html__( 'Wow, looks like you installed all our extensions. Thanks, you rock!', 'download-monitor' ) . '</p>';
320
+ }
321
+
322
+ } else {
323
+ echo '<p>' . esc_html__( 'Couldn\'t load extensions, please try again later.', 'download-monitor' ) . '</p>';
324
+ }
325
+ ?>
326
+ </div>
327
+ <?php
328
+ }
329
+
330
+ /**
331
+ * Output installed extensions page
332
+ *
333
+ * @since 4.4.5
334
+ */
335
+ public function installed_extensions_page() {
336
+
337
+ // Allow user to reload extensions
338
+ if ( isset( $_GET['dlm-force-recheck'] ) ) {
339
+ delete_transient( 'dlm_extension_json' );
340
+ }
341
+
342
+ ?>
343
+ <div class="wrap dlm_extensions_wrap">
344
+ <div class="icon32 icon32-posts-dlm_download" id="icon-edit"><br/></div>
345
+ <h1>
346
+ <?php _e( 'Download Monitor Installed Extensions', 'download-monitor' ); ?>
347
+ <a href="<?php echo add_query_arg( 'dlm-force-recheck', '1', admin_url( 'edit.php?post_type=dlm_download&page=dlm-extensions' ) ); ?>"
348
+ class="button dlm-reload-button">
349
+ <?php esc_html_e( 'Reload Extensions', 'download-monitor' ); ?>
350
+ </a>
351
+ </h1>
352
+ <?php
353
 
354
+ $active_tab = 'dlm-installed-extensions';
355
 
356
+ if ( isset( $_GET['page'] ) && isset( $this->tabs[ $_GET['page'] ] ) ) {
357
+ $active_tab = $_GET['page'];
358
+ }
359
 
360
+ echo '<h2 class="nav-tab-wrapper">';
 
361
 
362
+ DLM_Admin_Helper::dlm_tab_navigation( $this->tabs, $active_tab );
363
 
364
+ echo '</h2>';
 
365
 
366
+ // Installed Extensions
367
+ if ( count( $this->installed_extensions ) > 0 ) {
 
 
 
 
 
 
 
368
 
369
+ echo '<div id="installed-extensions" class="settings_panel">';
 
 
 
370
 
371
+ echo '<div class="theme-browser dlm_extensions">';
372
 
373
+ foreach ( $this->installed_extensions as $extension ) {
374
 
375
+ // Get the product
376
+ $license = $this->products[ $extension->product_id ]->get_license();
377
+
378
+ echo '<div class="theme dlm_extension">';
379
+
380
+ echo '<div class="dlm_extension_img_wrapper"><img src="' . esc_url( $extension->image ) . '" alt="' . esc_attr( $extension->name ) . '" /></div>';
381
+ echo '<h3>' . esc_html( $extension->name ) . '</h3>';
382
+
383
+ echo '<div class="extension_license">';
384
+ echo '<p class="license-status' . ( ( $license->is_active() ) ? ' active' : '' ) . '">' . esc_html( strtoupper( $license->get_status() ) ) . '</p>';
385
+ echo '<input type="hidden" id="dlm-ajax-nonce" value="' . wp_create_nonce( 'dlm-ajax-nonce' ) . '" />';
386
+ echo '<input type="hidden" id="status" value="' . esc_attr( $license->get_status() ) . '" />';
387
+ echo '<input type="hidden" id="product_id" value="' . esc_attr( $extension->product_id ) . '" />';
388
+ echo '<input type="text" name="key" id="key" value="' . esc_attr( $license->get_key() ) . '" placeholder="License Key"' . ( ( $license->is_active() ) ? ' disabled="disabled"' : '' ) . ' />';
389
+ echo '<input type="text" name="email" id="email" value="' . esc_attr( $license->get_email() ) . '" placeholder="License Email"' . ( ( $license->is_active() ) ? ' disabled="disabled"' : '' ) . ' />';
390
+ echo '<a href="javascript:;" class="button button-primary">' . ( ( $license->is_active() ) ? 'Deactivate' : 'Activate' ) . '</a>';
391
+ echo '</div>';
392
+
393
+ echo '</div>';
394
  }
395
+
396
+ echo '</div>';
397
+ echo '</div>';
398
+
399
+ }
400
+
401
+ echo '</div>';
402
+ }
403
+
404
+ /**
405
+ * Set DLM's extensions tabs
406
+ *
407
+ * @since 4.4.5
408
+ */
409
+ public function set_tabs() {
410
+
411
+ $tabs = array(
412
+ 'dlm_downloads' => array(
413
+ 'name' => esc_html__( 'Downloads', 'download-monitor' ),
414
+ 'url' => admin_url( 'edit.php?post_type=dlm_download' ),
415
+ 'target' => '',
416
+ 'priority' => '1',
417
+ ),
418
+ 'dlm-extensions' => array(
419
+ 'name' => esc_html__( 'Extensions', 'download-monitor' ),
420
+ 'url' => admin_url( 'edit.php?post_type=dlm_download&page=dlm-extensions' ),
421
+ 'target' => '',
422
+ 'priority' => '10',
423
+ ),
424
+ 'suggest_feature' => array(
425
+ 'name' => esc_html__( 'Suggest a feature', 'download-monitor' ),
426
+ 'url' => 'https://forms.gle/3igARBBzrbp6M8Fc7',
427
+ 'icon' => 'dashicons dashicons-external',
428
+ 'target' => '_blank',
429
+ 'priority' => '90',
430
+ )
431
+ );
432
+
433
+ if ( count( $this->installed_extensions ) > 0 ) {
434
+
435
+ $tabs['dlm-installed-extensions'] = array(
436
+ 'name' => esc_html__( 'Installed Extensions', 'download-monitor' ),
437
+ 'url' => admin_url( 'edit.php?post_type=dlm_download&page=dlm-installed-extensions' ),
438
+ 'target' => '',
439
+ 'priority' => '20',
440
+ );
441
+ }
442
+
443
+ /**
444
+ * Hook for Extension tabs
445
+ */
446
+ $this->tabs = apply_filters( 'dlm_settings_tabs', $tabs );
447
+
448
+ // Sort tabs based on priority.
449
+ uasort( $this->tabs, array( 'DLM_Admin_Helper', 'sort_data_by_priority' ) );
450
+ }
451
+
452
+ /**
453
+ * Get DLM's extensions tabs
454
+ *
455
+ * @return array
456
+ *
457
+ * @since 4.4.5
458
+ */
459
+ public function get_tabs() {
460
+
461
+ return $this->tabs;
462
+ }
463
+
464
+ /**
465
+ * Get extensions
466
+ *
467
+ * @return array
468
+ *
469
+ * @since 4.4.5
470
+ */
471
+ public function get_extensions(){
472
+ return $this->installed_extensions;
473
  }
474
  }
src/Admin/MediaInsert.php CHANGED
@@ -128,6 +128,7 @@ class DLM_Admin_Media_Insert {
128
  // Set hashes
129
  update_post_meta( $file_id, '_md5', $hashes['md5'] );
130
  update_post_meta( $file_id, '_sha1', $hashes['sha1'] );
 
131
  update_post_meta( $file_id, '_crc32', $hashes['crc32b'] );
132
 
133
  // Success message
128
  // Set hashes
129
  update_post_meta( $file_id, '_md5', $hashes['md5'] );
130
  update_post_meta( $file_id, '_sha1', $hashes['sha1'] );
131
+ update_post_meta( $file_id, '_sha256', $hashes['sha256'] );
132
  update_post_meta( $file_id, '_crc32', $hashes['crc32b'] );
133
 
134
  // Success message
src/Admin/Reports/Ajax.php CHANGED
@@ -98,7 +98,7 @@ class DLM_Reports_Ajax {
98
  /** @var DLM_Download_Repository $download_repo */
99
  $download_repo = download_monitor()->service( 'download_repository' );
100
 
101
- $response[] = array( "Download Title", "Times Downloaded", "%" );
102
  foreach ( $data as $row ) {
103
 
104
  $percentage = round( 100 * ( absint( $row->amount ) / absint( $total ) ), 2 );
@@ -107,15 +107,17 @@ class DLM_Reports_Ajax {
107
 
108
  $download = $download_repo->retrieve_single( $row->value );
109
  $response[] = array(
110
- sprintf( "%s (#%d)", $download->get_title(), $download->get_id() ),
 
111
  $row->amount,
112
  $percentage . "%"
113
  );
114
 
115
  } catch ( Exception $e ) {
116
  $response[] = array(
117
- sprintf( "Download no longer exists (#%d)", $row->value, $percentage . "%" ),
118
- $row->amount
 
119
  );
120
  }
121
 
@@ -123,50 +125,8 @@ class DLM_Reports_Ajax {
123
  }
124
  }
125
  break;
126
- case 'total_downloads_browser_table':
127
-
128
- // get total
129
- $total = $repo->num_rows( $filters );
130
-
131
- // get data
132
- $data = $repo->retrieve_grouped_count( $filters, $period, "user_agent", 0, 0, "amount", "DESC" );
133
-
134
- // UA parser
135
- $ua_parser = new UAParser();
136
-
137
- // header row
138
- $response[] = array( "Browser", "Downloaded", "%" );
139
-
140
- // we need to parse raw UA data
141
- $formatted_data = array();
142
-
143
- if ( ! empty( $data ) ) {
144
- foreach ( $data as $row ) {
145
-
146
- $ua = $ua_parser->parse( $row->value );
147
-
148
- if ( ! isset( $formatted_data[ $ua->ua->family ] ) ) {
149
- $formatted_data[ $ua->ua->family ] = 0;
150
- }
151
-
152
- $formatted_data[ $ua->ua->family ] += $row->amount;
153
-
154
- }
155
- }
156
-
157
- if ( ! empty( $formatted_data ) ) {
158
-
159
- foreach ( $formatted_data as $ua => $amount ) {
160
-
161
- $percentage = round( 100 * ( absint( $amount ) / absint( $total ) ), 2 );
162
-
163
- $response[] = array( $ua, $amount, $percentage . "%" );
164
- }
165
- }
166
- break;
167
  }
168
  }
169
-
170
  wp_send_json( $response );
171
  exit;
172
  }
98
  /** @var DLM_Download_Repository $download_repo */
99
  $download_repo = download_monitor()->service( 'download_repository' );
100
 
101
+ $response[] = array( "ID", "Download Title", "Times Downloaded", "%" );
102
  foreach ( $data as $row ) {
103
 
104
  $percentage = round( 100 * ( absint( $row->amount ) / absint( $total ) ), 2 );
107
 
108
  $download = $download_repo->retrieve_single( $row->value );
109
  $response[] = array(
110
+ '<a href="' . esc_url( get_edit_post_link($download->get_id()) ) . '" target="_blank">' . $download->get_id() . '</a>',
111
+ sprintf( "%s", $download->get_title() ),
112
  $row->amount,
113
  $percentage . "%"
114
  );
115
 
116
  } catch ( Exception $e ) {
117
  $response[] = array(
118
+ sprintf( "Download no longer exists (#%d)", $row->value ),
119
+ $row->amount,
120
+ $percentage . "%"
121
  );
122
  }
123
 
125
  }
126
  }
127
  break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  }
129
  }
 
130
  wp_send_json( $response );
131
  exit;
132
  }
src/Admin/Reports/Chart.php CHANGED
@@ -86,7 +86,7 @@ class DLM_Reports_Chart {
86
  $startDate->modify( "+1 " . $this->current_period );
87
  }
88
 
89
- return array( 'title' => '', 'color' => 'blue', 'values' => $data_formatted );
90
  }
91
 
92
  }
86
  $startDate->modify( "+1 " . $this->current_period );
87
  }
88
 
89
+ return array( 'backgroundColor' => '#f05b4f', 'borderColor' => '#f05b4f', 'data' => $data_formatted );
90
  }
91
 
92
  }
src/Admin/Reports/Page.php CHANGED
@@ -8,7 +8,7 @@ class DLM_Reports_Page {
8
  public function setup() {
9
 
10
  // menu item
11
- add_action( 'admin_menu', array( $this, 'add_admin_menu' ), 12 );
12
 
13
  // setup Reports AJAX calls
14
  $ajax = new DLM_Reports_Ajax();
@@ -18,12 +18,19 @@ class DLM_Reports_Page {
18
  /**
19
  * Add settings menu item
20
  */
21
- public function add_admin_menu() {
22
- // Settings page
23
- add_submenu_page( 'edit.php?post_type=dlm_download', __( 'Reports', 'download-monitor' ), __( 'Reports', 'download-monitor' ), 'dlm_view_reports', 'download-monitor-reports', array(
24
- $this,
25
- 'view'
26
- ) );
 
 
 
 
 
 
 
27
  }
28
 
29
  /**
@@ -201,11 +208,7 @@ class DLM_Reports_Page {
201
  ?>
202
 
203
  <?php do_action( 'dlm_reports_page_start' ); ?>
204
-
205
- <div class="dlm-reports-block dlm-reports-block-chart"
206
- id="total_downloads_chart"<?php echo $this->generate_js_data(); ?>></div>
207
-
208
- <div class="dlm-reports-block dlm-reports-block-summary"
209
  id="total_downloads_summary"<?php echo $this->generate_js_data(); ?>>
210
  <ul>
211
  <li id="total"><label>Total Downloads</label><span>...</span></li>
@@ -213,17 +216,15 @@ class DLM_Reports_Page {
213
  <li id="popular"><label>Most Popular Download</label><span>...</span></li>
214
  </ul>
215
  </div>
 
 
 
216
 
217
- <div class="dlm-reports-block dlm-reports-block-table dlm-reports-block-half"
218
  id="total_downloads_table"<?php echo $this->generate_js_data(); ?>>
219
  <span class="dlm-reports-placeholder-no-data">NO DATA</span>
220
  </div>
221
 
222
- <div class="dlm-reports-block dlm-reports-block-table dlm-reports-block-half-right"
223
- id="total_downloads_browser_table"<?php echo $this->generate_js_data(); ?>>
224
- <span class="dlm-reports-placeholder-no-data">NO DATA</span>
225
- </div>
226
-
227
  <?php do_action( 'dlm_reports_page_end' ); ?>
228
 
229
  <script type="text/javascript">
8
  public function setup() {
9
 
10
  // menu item
11
+ add_filter( 'dlm_admin_menu_links', array( $this, 'add_admin_menu' ), 30 );
12
 
13
  // setup Reports AJAX calls
14
  $ajax = new DLM_Reports_Ajax();
18
  /**
19
  * Add settings menu item
20
  */
21
+ public function add_admin_menu( $links ) {
22
+
23
+ // Reports page page
24
+ $links[] = array(
25
+ 'page_title' => __( 'Reports', 'download-monitor' ),
26
+ 'menu_title' => __( 'Reports', 'download-monitor' ),
27
+ 'capability' => 'dlm_view_reports',
28
+ 'menu_slug' => 'download-monitor-reports',
29
+ 'function' => array( $this, 'view' ),
30
+ 'priority' => 50,
31
+ );
32
+
33
+ return $links;
34
  }
35
 
36
  /**
208
  ?>
209
 
210
  <?php do_action( 'dlm_reports_page_start' ); ?>
211
+ <div class="dlm-reports-block dlm-reports-block-summary"
 
 
 
 
212
  id="total_downloads_summary"<?php echo $this->generate_js_data(); ?>>
213
  <ul>
214
  <li id="total"><label>Total Downloads</label><span>...</span></li>
216
  <li id="popular"><label>Most Popular Download</label><span>...</span></li>
217
  </ul>
218
  </div>
219
+ <div class="total_downloads_chart-wrapper">
220
+ <canvas class="dlm-reports-block dlm-reports-block-chart" id="total_downloads_chart"<?php echo $this->generate_js_data(); ?>></canvas>
221
+ </div>
222
 
223
+ <div class="dlm-reports-block dlm-reports-block-table"
224
  id="total_downloads_table"<?php echo $this->generate_js_data(); ?>>
225
  <span class="dlm-reports-placeholder-no-data">NO DATA</span>
226
  </div>
227
 
 
 
 
 
 
228
  <?php do_action( 'dlm_reports_page_end' ); ?>
229
 
230
  <script type="text/javascript">
src/Admin/Settings/Page.php CHANGED
@@ -8,7 +8,7 @@ class DLM_Settings_Page {
8
  public function setup() {
9
 
10
  // menu item
11
- add_action( 'admin_menu', array( $this, 'add_admin_menu' ), 12 );
12
 
13
  // catch setting actions
14
  add_action( 'admin_init', array( $this, 'catch_admin_actions' ) );
@@ -17,12 +17,18 @@ class DLM_Settings_Page {
17
  /**
18
  * Add settings menu item
19
  */
20
- public function add_admin_menu() {
21
  // Settings page
22
- add_submenu_page( 'edit.php?post_type=dlm_download', __( 'Settings', 'download-monitor' ), __( 'Settings', 'download-monitor' ), 'manage_options', 'download-monitor-settings', array(
23
- $this,
24
- 'settings_page'
25
- ) );
 
 
 
 
 
 
26
  }
27
 
28
  /**
@@ -60,7 +66,7 @@ class DLM_Settings_Page {
60
  */
61
  public function display_admin_action_message() {
62
  ?>
63
- <div class="notice notice-success">
64
  <?php
65
  switch ( $_GET['dlm_action_done'] ) {
66
  case 'dlm_clear_transients':
@@ -68,7 +74,7 @@ class DLM_Settings_Page {
68
  break;
69
  }
70
  ?>
71
- </div>
72
  <?php
73
  }
74
 
@@ -89,179 +95,201 @@ class DLM_Settings_Page {
89
  // print global notices
90
  $this->print_global_notices();
91
  ?>
92
- <div class="wrap dlm-admin-settings">
93
- <form method="post" action="options.php">
94
 
95
- <?php $this->generate_tabs( $settings ); ?>
96
 
97
- <?php
98
 
99
- if ( ! empty( $_GET['settings-updated'] ) ) {
100
- $this->need_rewrite_flush = true;
101
- echo '<div class="updated notice is-dismissible"><p>' . __( 'Settings successfully saved', 'download-monitor' ) . '</p></div>';
102
 
103
- $dlm_settings_tab_saved = get_option( 'dlm_settings_tab_saved', 'general' );
104
 
105
- echo '<script type="text/javascript">var dlm_settings_tab_saved = "' . $dlm_settings_tab_saved . '";</script>';
106
- }
107
 
108
- // loop fields for this tab
109
- if ( isset( $settings[ $tab ] ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
 
111
- $active_section = $this->get_active_section( $settings[ $tab ]['sections'] );
112
 
113
- // output correct settings_fields
114
- $option_name = "dlm_" . $tab . "_" . $active_section;
115
- settings_fields( $option_name );
116
 
117
- if ( count( $settings[ $tab ]['sections'] ) > 1 ) {
118
- ?>
119
- <ul class="nav-section-wrapper">
120
- <?php foreach ( $settings[ $tab ]['sections'] as $section_key => $section ) : ?>
121
- <?php echo "<li" . ( ( $active_section == $section_key ) ? " class='active-section'" : "" ) . ">"; ?>
122
- <a href = "<?php echo add_query_arg( array( 'tab' => $tab,
123
- 'section' => $section_key
124
- ), DLM_Admin_Settings::get_url() ); ?>" ><?php echo $section['title']; ?></a></liM>
125
- <?php endforeach; ?>
126
- </ul>
127
- <h2><?php echo esc_html( $settings[ $tab ]['sections'][ $active_section ]['title'] ); ?></h2>
128
- <?php
129
- }
130
 
131
- //echo '<div id="settings-' . sanitize_title( $key ) . '" class="settings_panel">';
132
- echo '<table class="form-table">';
133
- foreach ( $settings[ $tab ]['sections'][ $active_section ]['fields'] as $option ) {
134
 
 
135
 
136
- $cs = 1;
137
 
138
- echo '<tr valign="top">';
139
- if ( isset( $option['label'] ) && '' !== $option['label'] ) {
140
- echo '<th scope="row"><label for="setting-' . $option['name'] . '">' . $option['label'] . '</a></th>';
141
- } else {
142
- $cs ++;
143
- }
144
 
145
 
146
- echo '<td colspan="' . $cs . '">';
147
 
148
- if ( ! isset( $option['type'] ) ) {
149
- $option['type'] = '';
150
- }
151
 
152
- // make new field object
153
- $field = DLM_Admin_Fields_Field_Factory::make( $option );
154
 
155
- // check if factory made a field
156
- if ( null !== $field ) {
157
- // render field
158
- $field->render();
 
 
 
 
 
 
 
159
 
160
- if ( isset( $option['desc'] ) && '' !== $option['desc'] ) {
161
- echo ' <p class="dlm-description description">' . $option['desc'] . '</p>';
162
  }
 
 
163
  }
164
 
165
- echo '</td></tr>';
166
 
 
167
 
168
- }
169
- echo '</table>';
170
 
171
- //echo '</div>';
172
  }
173
 
 
 
 
 
 
 
 
 
 
 
174
 
175
- ?>
176
- <p class="submit">
177
- <input type="submit" class="button-primary"
178
- value="<?php _e( 'Save Changes', 'download-monitor' ); ?>"/>
179
- </p>
180
- </form>
181
- </div>
182
- <?php
183
- }
184
-
185
- /**
186
- * Print global notices
187
- */
188
- private
189
- function print_global_notices() {
190
-
191
- // check for nginx
192
- if ( isset( $_SERVER['SERVER_SOFTWARE'] ) && stristr( $_SERVER['SERVER_SOFTWARE'], 'nginx' ) !== false && 1 != get_option( 'dlm_hide_notice-nginx_rules', 0 ) ) {
193
-
194
- // get upload dir
195
- $upload_dir = wp_upload_dir();
196
-
197
- // replace document root because nginx uses path from document root
198
- $upload_path = str_replace( $_SERVER['DOCUMENT_ROOT'], '', $upload_dir['basedir'] );
199
-
200
- // form nginx rules
201
- $nginx_rules = "location " . $upload_path . "/dlm_uploads {<br/>deny all;<br/>return 403;<br/>}";
202
- echo '<div class="error notice is-dismissible dlm-notice" id="nginx_rules" data-nonce="' . wp_create_nonce( 'dlm_hide_notice-nginx_rules' ) . '">';
203
- echo '<p>' . __( "Because your server is running on nginx, our .htaccess file can't protect your downloads.", 'download-monitor' );
204
- echo '<br/>' . sprintf( __( "Please add the following rules to your nginx config to disable direct file access: %s", 'download-monitor' ), '<br/><br/><code class="dlm-code-nginx-rules">' . $nginx_rules . '</code>' ) . '</p>';
205
- echo '</div>';
206
  }
207
 
208
- }
 
 
 
 
209
 
210
- /**
211
- * @param array $settings
212
- */
213
- private
214
- function generate_tabs( $settings ) {
215
- ?>
216
- <h2 class="nav-tab-wrapper">
217
- <?php
218
- foreach ( $settings as $key => $section ) {
219
 
220
- // backwards compatibility for when $section did not have 'title' index yet (it simply had the title set at 0)
221
- $title = ( isset( $section['title'] ) ? $section['title'] : $section[0] );
222
 
223
- echo '<a href="' . add_query_arg( 'tab', $key, DLM_Admin_Settings::get_url() ) . '" class="nav-tab' . ( ( $this->get_active_tab() === $key ) ? ' nav-tab-active' : '' ) . '">' . esc_html( $title ) . '</a>';
 
 
 
 
 
224
  }
 
 
 
 
 
 
 
 
225
  ?>
226
- </h2><br/>
227
- <?php
228
- }
229
-
230
- /**
231
- * Returns first key of array
232
- *
233
- * @param $a
234
- *
235
- * @return string
236
- */
237
- private
238
- function array_first_key( $a ) {
239
- reset( $a );
240
-
241
- return key( $a );
242
- }
243
-
244
- /**
245
- * Return active tab
246
- *
247
- * @return string
248
- */
249
- private
250
- function get_active_tab() {
251
- return ( ! empty( $_GET['tab'] ) ? sanitize_title( $_GET['tab'] ) : 'general' );
252
- }
253
-
254
- /**
255
- * Return active section
256
- *
257
- * @param $sections
258
- *
259
- * @return string
260
- */
261
- private
262
- function get_active_section( $sections ) {
263
- return ( ! empty( $_GET['section'] ) ? sanitize_title( $_GET['section'] ) : $this->array_first_key( $sections ) );
264
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
265
 
266
 
267
  }
8
  public function setup() {
9
 
10
  // menu item
11
+ add_filter( 'dlm_admin_menu_links', array( $this, 'add_settings_page' ), 30 );
12
 
13
  // catch setting actions
14
  add_action( 'admin_init', array( $this, 'catch_admin_actions' ) );
17
  /**
18
  * Add settings menu item
19
  */
20
+ public function add_settings_page( $links ) {
21
  // Settings page
22
+ $links[] = array(
23
+ 'page_title' => __( 'Settings', 'download-monitor' ),
24
+ 'menu_title' => __( 'Settings', 'download-monitor' ),
25
+ 'capability' => 'manage_options',
26
+ 'menu_slug' => 'download-monitor-settings',
27
+ 'function' => array( $this, 'settings_page' ),
28
+ 'priority' => 20,
29
+ );
30
+
31
+ return $links;
32
  }
33
 
34
  /**
66
  */
67
  public function display_admin_action_message() {
68
  ?>
69
+ <div class="notice notice-success">
70
  <?php
71
  switch ( $_GET['dlm_action_done'] ) {
72
  case 'dlm_clear_transients':
74
  break;
75
  }
76
  ?>
77
+ </div>
78
  <?php
79
  }
80
 
95
  // print global notices
96
  $this->print_global_notices();
97
  ?>
98
+ <div class="wrap dlm-admin-settings">
99
+ <form method="post" action="options.php">
100
 
101
+ <?php $this->generate_tabs( $settings ); ?>
102
 
103
+ <?php
104
 
105
+ if ( ! empty( $_GET['settings-updated'] ) ) {
106
+ $this->need_rewrite_flush = true;
107
+ echo '<div class="updated notice is-dismissible"><p>' . __( 'Settings successfully saved', 'download-monitor' ) . '</p></div>';
108
 
109
+ $dlm_settings_tab_saved = get_option( 'dlm_settings_tab_saved', 'general' );
110
 
111
+ echo '<script type="text/javascript">var dlm_settings_tab_saved = "' . $dlm_settings_tab_saved . '";</script>';
112
+ }
113
 
114
+ // loop fields for this tab
115
+ if ( isset( $settings[ $tab ] ) ) {
116
+
117
+ $active_section = $this->get_active_section( $settings[ $tab ]['sections'] );
118
+
119
+ if ( count( $settings[ $tab ]['sections'] ) > 1 ) {
120
+
121
+ ?>
122
+ <ul class="nav-section-wrapper">
123
+ <?php foreach ( $settings[ $tab ]['sections'] as $section_key => $section ) : ?>
124
+ <?php echo "<li" . ( ( $active_section == $section_key ) ? " class='active-section'" : "" ) . ">"; ?>
125
+ <a href="<?php echo add_query_arg( array(
126
+ 'tab' => $tab,
127
+ 'section' => $section_key
128
+ ), DLM_Admin_Settings::get_url() ); ?>"><?php echo $section['title']; ?></a></liM>
129
+ <?php endforeach; ?>
130
+ </ul>
131
+ <h2><?php echo esc_html( $settings[ $tab ]['sections'][ $active_section ]['title'] ); ?></h2>
132
+ <?php
133
+ }
134
 
135
+ //echo '<div id="settings-' . sanitize_title( $key ) . '" class="settings_panel">';
136
 
137
+ if ( isset( $settings[ $tab ]['sections'][ $active_section ]['fields'] ) && ! empty( $settings[ $tab ]['sections'][ $active_section ]['fields'] ) ) {
 
 
138
 
139
+ // output correct settings_fields
140
+ // We change the output location so that it won't interfere with our upsells
141
+ $option_name = "dlm_" . $tab . "_" . $active_section;
142
+ settings_fields( $option_name );
 
 
 
 
 
 
 
 
 
143
 
144
+ echo '<table class="form-table">';
 
 
145
 
146
+ foreach ( $settings[ $tab ]['sections'][ $active_section ]['fields'] as $option ) {
147
 
148
+ $cs = 1;
149
 
150
+ echo '<tr valign="top">';
151
+ if ( isset( $option['label'] ) && '' !== $option['label'] ) {
152
+ echo '<th scope="row"><label for="setting-' . $option['name'] . '">' . $option['label'] . '</a></th>';
153
+ } else {
154
+ $cs ++;
155
+ }
156
 
157
 
158
+ echo '<td colspan="' . $cs . '">';
159
 
160
+ if ( ! isset( $option['type'] ) ) {
161
+ $option['type'] = '';
162
+ }
163
 
164
+ // make new field object
165
+ $field = DLM_Admin_Fields_Field_Factory::make( $option );
166
 
167
+ // check if factory made a field
168
+ if ( null !== $field ) {
169
+ // render field
170
+ $field->render();
171
+
172
+ if ( isset( $option['desc'] ) && '' !== $option['desc'] ) {
173
+ echo ' <p class="dlm-description description">' . $option['desc'] . '</p>';
174
+ }
175
+ }
176
+
177
+ echo '</td></tr>';
178
 
 
 
179
  }
180
+
181
+ echo '</table>';
182
  }
183
 
 
184
 
185
+ echo '<div class="wpchill-upsells-wrapper">';
186
 
187
+ do_action( 'dlm_tab_content_' . $tab, $settings );
 
188
 
189
+ echo '</div>';
190
  }
191
 
192
+ ?>
193
+ <div class="wp-clearfix"></div>
194
+ <?php
195
+ if ( isset( $settings[ $tab ] ) && ( isset( $settings[ $tab ]['sections'][ $active_section ]['fields'] ) && ! empty( $settings[ $tab ]['sections'][ $active_section ]['fields'] ) ) ) {
196
+
197
+ ?>
198
+ <p class="submit">
199
+ <input type="submit" class="button-primary"
200
+ value="<?php _e( 'Save Changes', 'download-monitor' ); ?>"/>
201
+ </p>
202
 
203
+ <?php } ?>
204
+ </form>
205
+ </div>
206
+ <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
207
  }
208
 
209
+ /**
210
+ * Print global notices
211
+ */
212
+ private
213
+ function print_global_notices() {
214
 
215
+ // check for nginx
216
+ if ( isset( $_SERVER['SERVER_SOFTWARE'] ) && stristr( $_SERVER['SERVER_SOFTWARE'], 'nginx' ) !== false && 1 != get_option( 'dlm_hide_notice-nginx_rules', 0 ) ) {
217
+
218
+ // get upload dir
219
+ $upload_dir = wp_upload_dir();
 
 
 
 
220
 
221
+ // replace document root because nginx uses path from document root
222
+ $upload_path = str_replace( $_SERVER['DOCUMENT_ROOT'], '', $upload_dir['basedir'] );
223
 
224
+ // form nginx rules
225
+ $nginx_rules = "location " . $upload_path . "/dlm_uploads {<br/>deny all;<br/>return 403;<br/>}";
226
+ echo '<div class="error notice is-dismissible dlm-notice" id="nginx_rules" data-nonce="' . wp_create_nonce( 'dlm_hide_notice-nginx_rules' ) . '">';
227
+ echo '<p>' . __( "Because your server is running on nginx, our .htaccess file can't protect your downloads.", 'download-monitor' );
228
+ echo '<br/>' . sprintf( __( "Please add the following rules to your nginx config to disable direct file access: %s", 'download-monitor' ), '<br/><br/><code class="dlm-code-nginx-rules">' . $nginx_rules . '</code>' ) . '</p>';
229
+ echo '</div>';
230
  }
231
+
232
+ }
233
+
234
+ /**
235
+ * @param array $settings
236
+ */
237
+ private
238
+ function generate_tabs( $settings ) {
239
  ?>
240
+ <h2 class="nav-tab-wrapper">
241
+ <?php
242
+ foreach ( $settings as $key => $section ) {
243
+
244
+ // backwards compatibility for when $section did not have 'title' index yet (it simply had the title set at 0)
245
+ $title = ( isset( $section['title'] ) ? $section['title'] : $section[0] );
246
+
247
+ echo '<a href="' . add_query_arg( 'tab', $key, DLM_Admin_Settings::get_url() ) . '" class="nav-tab' . ( ( $this->get_active_tab() === $key ) ? ' nav-tab-active' : '' ) . '">' . esc_html( $title ) . ( isset( $section['badge'] ) ? ' <span class="dlm-upsell-badge">PRO</span>' : '' ) . '</a>';
248
+ }
249
+ ?>
250
+ </h2><br/>
251
+ <?php
252
+ }
253
+
254
+ /**
255
+ * Returns first key of array
256
+ *
257
+ * @param $a
258
+ *
259
+ * @return string
260
+ */
261
+ private
262
+ function array_first_key(
263
+ $a
264
+ ) {
265
+ reset( $a );
266
+
267
+ return key( $a );
268
+ }
269
+
270
+ /**
271
+ * Return active tab
272
+ *
273
+ * @return string
274
+ */
275
+ private
276
+ function get_active_tab() {
277
+ return ( ! empty( $_GET['tab'] ) ? sanitize_title( $_GET['tab'] ) : 'general' );
278
+ }
279
+
280
+ /**
281
+ * Return active section
282
+ *
283
+ * @param $sections
284
+ *
285
+ * @return string
286
+ */
287
+ private
288
+ function get_active_section(
289
+ $sections
290
+ ) {
291
+ return ( ! empty( $_GET['section'] ) ? sanitize_title( $_GET['section'] ) : $this->array_first_key( $sections ) );
292
+ }
293
 
294
 
295
  }
src/Admin/Settings/Settings.php CHANGED
@@ -24,16 +24,20 @@ class DLM_Admin_Settings {
24
 
25
  // register our options and settings
26
  foreach ( $settings as $tab_key => $tab ) {
 
27
  foreach ( $tab['sections'] as $section_key => $section ) {
28
 
29
  $option_group = "dlm_" . $tab_key . "_" . $section_key;
30
 
31
- foreach ( $section['fields'] as $field ) {
32
- if ( ! empty( $field['name'] ) && ! in_array( $field['type'], apply_filters( 'dlm_settings_display_only_fields', array( 'action_button' ) ) ) ) {
33
- if ( isset( $field['std'] ) ) {
34
- add_option( $field['name'], $field['std'] );
 
 
 
 
35
  }
36
- register_setting( $option_group, $field['name'] );
37
  }
38
  }
39
 
@@ -61,10 +65,11 @@ class DLM_Admin_Settings {
61
  public function get_settings() {
62
 
63
  $settings = array(
64
- 'general' => array(
65
  'title' => __( 'General', 'download-monitor' ),
66
  'sections' => array(
67
  'general' => array(
 
68
  'fields' => array(
69
  array(
70
  'name' => 'dlm_default_template',
@@ -122,13 +127,14 @@ class DLM_Admin_Settings {
122
  'type' => 'checkbox'
123
  ),
124
  )
125
- )
126
  )
127
  ),
128
- 'endpoints' => array(
129
- 'title' => __( 'Endpoint', 'download-monitor' ),
130
  'sections' => array(
131
- 'endpoints' => array(
 
132
  'fields' => array(
133
  array(
134
  'name' => 'dlm_download_endpoint',
@@ -148,15 +154,48 @@ class DLM_Admin_Settings {
148
  'ID' => __( 'Download ID', 'download-monitor' ),
149
  'slug' => __( 'Download slug', 'download-monitor' )
150
  )
151
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  )
153
- )
154
- )
155
- ),
156
- 'hash' => array(
157
- 'title' => __( 'Hashes', 'download-monitor' ),
158
- 'sections' => array(
159
- 'hash' => array(
160
  'fields' => array(
161
  array(
162
  'name' => 'dlm_hash_desc',
@@ -184,7 +223,6 @@ class DLM_Admin_Settings {
184
  'std' => '0',
185
  'label' => __( 'SHA256 hashes', 'download-monitor' ),
186
  'cb_label' => __( 'Generate SHA256 hash for uploaded files', 'download-monitor' ),
187
- 'desc' => __( 'Hashes can optionally be output via shortcodes, but may cause performance issues with large files.', 'download-monitor' ),
188
  'type' => 'checkbox'
189
  ),
190
  array(
@@ -192,17 +230,12 @@ class DLM_Admin_Settings {
192
  'std' => '0',
193
  'label' => __( 'CRC32B hashes', 'download-monitor' ),
194
  'cb_label' => __( 'Generate CRC32B hash for uploaded files', 'download-monitor' ),
195
- 'desc' => __( 'Hashes can optionally be output via shortcodes, but may cause performance issues with large files.', 'download-monitor' ),
196
  'type' => 'checkbox'
197
  )
198
  )
199
- )
200
- )
201
- ),
202
- 'logging' => array(
203
- 'title' => __( 'Logging', 'download-monitor' ),
204
- 'sections' => array(
205
- 'logging' => array(
206
  'fields' => array(
207
  array(
208
  'name' => 'dlm_enable_logging',
@@ -241,65 +274,91 @@ class DLM_Admin_Settings {
241
  'type' => 'checkbox'
242
  ),
243
  )
244
- )
245
  )
246
  ),
247
- 'access' => array(
248
- 'title' => __( 'Access', 'download-monitor' ),
249
- 'sections' => array(
250
- 'access' => array(
251
- 'fields' => array(
252
- array(
253
- 'name' => 'dlm_no_access_error',
254
- 'std' => sprintf( __( 'You do not have permission to access this download. %sGo to homepage%s', 'download-monitor' ), '<a href="' . home_url() . '">', '</a>' ),
255
- 'placeholder' => '',
256
- 'label' => __( 'No access message', 'download-monitor' ),
257
- 'desc' => __( "The message that will be displayed to visitors when they don't have access to a file.", 'download-monitor' ),
258
- 'type' => 'textarea'
259
- ),
260
- array(
261
- 'name' => 'dlm_ip_blacklist',
262
- 'std' => '192.168.0.0/24',
263
- 'label' => __( 'Blacklist IPs', 'download-monitor' ),
264
- 'desc' => __( 'List IP Addresses to blacklist, 1 per line. Use IP/CIDR netmask format for ranges. IPv4 examples: <code>198.51.100.1</code> or <code>198.51.100.0/24</code>. IPv6 examples: <code>2001:db8::1</code> or <code>2001:db8::/32</code>.', 'download-monitor' ),
265
- 'placeholder' => '',
266
- 'type' => 'textarea'
267
- ),
268
- array(
269
- 'name' => 'dlm_user_agent_blacklist',
270
- 'std' => 'Googlebot',
271
- 'label' => __( 'Blacklist user agents', 'download-monitor' ),
272
- 'desc' => __( 'List browser user agents to blacklist, 1 per line. Partial matches are sufficient. Regex matching is allowed by surrounding the pattern with forward slashes, e.g. <code>/^Mozilla.+Googlebot/</code>', 'download-monitor' ),
273
- 'placeholder' => '',
274
- 'type' => 'textarea'
275
- ),
276
- )
277
- )
278
- )
279
  ),
280
- 'pages' => array(
281
- 'title' => __( 'Pages', 'download-monitor' ),
282
- 'sections' => array(
283
- 'pages' => array(
284
- 'fields' => array(
285
- array(
286
- 'name' => 'dlm_no_access_page',
287
- 'std' => '',
288
- 'label' => __( 'No Access Page', 'download-monitor' ),
289
- 'desc' => __( "Choose what page is displayed when the user has no access to a file. Don't forget to add the <code>[dlm_no_access]</code> shortcode to the page.", 'download-monitor' ),
290
- 'type' => 'lazy_select',
291
- 'options' => array()
292
- )
293
- )
294
- )
295
- )
296
  )
297
-
298
  );
299
 
300
  if ( dlm_is_shop_enabled() ) {
301
 
302
- $settings['pages']['sections']['pages']['fields'][] = array(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
303
  'name' => 'dlm_page_cart',
304
  'std' => '',
305
  'label' => __( 'Cart page', 'download-monitor' ),
@@ -308,7 +367,7 @@ class DLM_Admin_Settings {
308
  'options' => array()
309
  );
310
 
311
- $settings['pages']['sections']['pages']['fields'][] = array(
312
  'name' => 'dlm_page_checkout',
313
  'std' => '',
314
  'label' => __( 'Checkout page', 'download-monitor' ),
@@ -317,107 +376,21 @@ class DLM_Admin_Settings {
317
  'options' => array()
318
  );
319
 
320
- $settings['shop'] = array(
321
- 'title' => __( 'Shop', 'download-monitor' ),
322
- 'sections' => array(
323
- 'general' => array(
324
- 'title' => __( 'General', 'download-monitor' ),
325
- 'fields' => array(
326
- array(
327
- 'name' => 'dlm_base_country',
328
- 'std' => 'US',
329
- 'label' => __( 'Base Country', 'download-monitor' ),
330
- 'desc' => __( 'Where is your store located?', 'download-monitor' ),
331
- 'type' => 'select',
332
- 'options' => Services::get()->service( "country" )->get_countries()
333
- ),
334
- array(
335
- 'name' => 'dlm_currency',
336
- 'std' => 'USD',
337
- 'label' => __( 'Currency', 'download-monitor' ),
338
- 'desc' => __( 'In what currency are you selling?', 'download-monitor' ),
339
- 'type' => 'select',
340
- 'options' => $this->get_currency_list_with_symbols()
341
- ),
342
- array(
343
- 'name' => 'dlm_currency_pos',
344
- 'std' => 'left',
345
- 'label' => __( 'Currency Position', 'download-monitor' ),
346
- 'desc' => __( 'The position of the currency symbol.', 'download-monitor' ),
347
- 'type' => 'select',
348
- 'options' => array(
349
- 'left' => sprintf( __( 'Left (%s)', 'download-monitor' ), Services::get()->service( 'format' )->money( 9.99, array( 'currency_position' => 'left' ) ) ),
350
- 'right' => sprintf( __( 'Right (%s)', 'download-monitor' ), Services::get()->service( 'format' )->money( 9.99, array( 'currency_position' => 'right' ) ) ),
351
- 'left_space' => sprintf( __( 'Left with space (%s)', 'download-monitor' ), Services::get()->service( 'format' )->money( 9.99, array( 'currency_position' => 'left_space' ) ) ),
352
- 'right_space' => sprintf( __( 'Right with space (%s)', 'download-monitor' ), Services::get()->service( 'format' )->money( 9.99, array( 'currency_position' => 'right_space' ) ) )
353
- )
354
- ),
355
- array(
356
- 'name' => 'dlm_decimal_separator',
357
- 'type' => 'text',
358
- 'std' => '.',
359
- 'label' => __( 'Decimal Separator', 'download-monitor' ),
360
- 'desc' => __( 'The decimal separator of displayed prices.', 'download-monitor' )
361
- ),
362
- array(
363
- 'name' => 'dlm_thousand_separator',
364
- 'type' => 'text',
365
- 'std' => ',',
366
- 'label' => __( 'Thousand Separator', 'download-monitor' ),
367
- 'desc' => __( 'The thousand separator of displayed prices.', 'download-monitor' )
368
- ),
369
- array(
370
- 'name' => 'dlm_disable_cart',
371
- 'std' => '',
372
- 'label' => __( 'Disable Cart', 'download-monitor' ),
373
- 'cb_label' => __( 'Disable', 'download-monitor' ),
374
- 'desc' => __( 'If checked, your customers will be send to your checkout page directly.', 'download-monitor' ),
375
- 'type' => 'checkbox'
376
- ),
377
- )
378
- )
379
- )
380
- );
381
-
382
  $settings['payments'] = array(
383
  'title' => __( 'Payment Methods', 'download-monitor' ),
384
  'sections' => $this->get_payment_methods_sections()
385
  );
386
  }
387
 
388
-
389
- $settings['misc'] = array(
390
- 'title' => __( 'Misc', 'download-monitor' ),
391
- 'sections' => array(
392
- 'misc' => array(
393
- 'fields' => array(
394
- array(
395
- 'name' => 'dlm_clean_on_uninstall',
396
- 'std' => '0',
397
- 'label' => __( 'Remove Data on Uninstall?', 'download-monitor' ),
398
- 'cb_label' => __( 'Enable', 'download-monitor' ),
399
- 'desc' => __( 'Check this box if you would like to completely remove all Download Monitor data when the plugin is deleted.', 'download-monitor' ),
400
- 'type' => 'checkbox'
401
- ),
402
- array(
403
- 'name' => 'dlm_clear_transients',
404
- 'std' => '0',
405
- 'label' => __( 'Clear all transients', 'download-monitor' ),
406
- 'desc' => __( 'Remove all Download Monitor transients, this can solve version caching issues.', 'download-monitor' ),
407
- 'type' => 'action_button',
408
- 'link' => self::get_url() . '#settings-misc'
409
- ),
410
- )
411
- )
412
- )
413
- );
414
-
415
  // this is here to maintain backwards compatibility, use 'dlm_settings' instead
416
- $settings = apply_filters( 'download_monitor_settings', $settings );
417
 
418
  // This is the correct filter
419
  $settings = apply_filters( 'dlm_settings', $settings );
420
 
 
 
 
421
  return $settings;
422
  }
423
 
@@ -442,37 +415,124 @@ class DLM_Admin_Settings {
442
  }
443
 
444
  /**
445
- * Settings format changed in 4.3
446
- * This method formats old settings added via filters to work with new format
447
- * This method is hooked into dlm_settings(priority:99) in Admin.php
448
  *
449
- * @param array $settings
 
450
  *
451
- * @return array
 
452
  */
453
- public function backwards_compatibility_settings( $settings ) {
454
 
455
- foreach ( $settings as $tab_key => $tab ) {
 
456
 
457
- // if 'sections' is not set, it's most likely old format
458
- if ( ! isset( $tab['sections'] ) ) {
459
 
460
- $new_tab = array(
461
- 'title' => $tab[0], // old format just had title as first key
462
- 'sections' => array(
463
- $tab_key => array(
464
- 'fields' => $tab[1] // old format had fields on index 1
465
- )
466
- )
467
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
468
 
469
- $settings[ $tab_key ] = $new_tab;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
470
  }
471
  }
472
 
 
 
 
 
 
473
  return $settings;
474
  }
475
 
 
476
  /**
477
  * Return pages with ID => Page title format
478
  *
24
 
25
  // register our options and settings
26
  foreach ( $settings as $tab_key => $tab ) {
27
+
28
  foreach ( $tab['sections'] as $section_key => $section ) {
29
 
30
  $option_group = "dlm_" . $tab_key . "_" . $section_key;
31
 
32
+ // Check to see if $section['fields'] is set, we could be using it for upsells
33
+ if ( isset( $section['fields'] ) ) {
34
+ foreach ( $section['fields'] as $field ) {
35
+ if ( ! empty( $field['name'] ) && ! in_array( $field['type'], apply_filters( 'dlm_settings_display_only_fields', array( 'action_button' ) ) ) ) {
36
+ if ( isset( $field['std'] ) ) {
37
+ add_option( $field['name'], $field['std'] );
38
+ }
39
+ register_setting( $option_group, $field['name'] );
40
  }
 
41
  }
42
  }
43
 
65
  public function get_settings() {
66
 
67
  $settings = array(
68
+ 'general' => array(
69
  'title' => __( 'General', 'download-monitor' ),
70
  'sections' => array(
71
  'general' => array(
72
+ 'title' => __( 'Download', 'download-monitor' ),
73
  'fields' => array(
74
  array(
75
  'name' => 'dlm_default_template',
127
  'type' => 'checkbox'
128
  ),
129
  )
130
+ ),
131
  )
132
  ),
133
+ 'advanced' => array(
134
+ 'title' => __( 'Advanced', 'download-monitor' ),
135
  'sections' => array(
136
+ 'page_setup' => array(
137
+ 'title' => __( 'Pages Setup', 'download-monitor' ),
138
  'fields' => array(
139
  array(
140
  'name' => 'dlm_download_endpoint',
154
  'ID' => __( 'Download ID', 'download-monitor' ),
155
  'slug' => __( 'Download slug', 'download-monitor' )
156
  )
157
+ ),
158
+ array(
159
+ 'name' => 'dlm_no_access_page',
160
+ 'std' => '',
161
+ 'label' => __( 'No Access Page', 'download-monitor' ),
162
+ 'desc' => __( "Choose what page is displayed when the user has no access to a file. Don't forget to add the <code>[dlm_no_access]</code> shortcode to the page.", 'download-monitor' ),
163
+ 'type' => 'lazy_select',
164
+ 'options' => array()
165
+ ),
166
+ ),
167
+ ),
168
+ 'access' => array(
169
+ 'title' => __( 'Access', 'download-monitor' ),
170
+ 'fields' => array(
171
+ array(
172
+ 'name' => 'dlm_no_access_error',
173
+ 'std' => sprintf( __( 'You do not have permission to access this download. %sGo to homepage%s', 'download-monitor' ), '<a href="' . home_url() . '">', '</a>' ),
174
+ 'placeholder' => '',
175
+ 'label' => __( 'No access message', 'download-monitor' ),
176
+ 'desc' => __( "The message that will be displayed to visitors when they don't have access to a file.", 'download-monitor' ),
177
+ 'type' => 'textarea'
178
+ ),
179
+ array(
180
+ 'name' => 'dlm_ip_blacklist',
181
+ 'std' => '192.168.0.0/24',
182
+ 'label' => __( 'Blacklist IPs', 'download-monitor' ),
183
+ 'desc' => __( 'List IP Addresses to blacklist, 1 per line. Use IP/CIDR netmask format for ranges. IPv4 examples: <code>198.51.100.1</code> or <code>198.51.100.0/24</code>. IPv6 examples: <code>2001:db8::1</code> or <code>2001:db8::/32</code>.', 'download-monitor' ),
184
+ 'placeholder' => '',
185
+ 'type' => 'textarea'
186
+ ),
187
+ array(
188
+ 'name' => 'dlm_user_agent_blacklist',
189
+ 'std' => 'Googlebot',
190
+ 'label' => __( 'Blacklist user agents', 'download-monitor' ),
191
+ 'desc' => __( 'List browser user agents to blacklist, 1 per line. Partial matches are sufficient. Regex matching is allowed by surrounding the pattern with forward slashes, e.g. <code>/^Mozilla.+Googlebot/</code>', 'download-monitor' ),
192
+ 'placeholder' => '',
193
+ 'type' => 'textarea'
194
+ ),
195
  )
196
+ ),
197
+ 'hash' => array(
198
+ 'title' => __( 'Hashes', 'download-monitor' ),
 
 
 
 
199
  'fields' => array(
200
  array(
201
  'name' => 'dlm_hash_desc',
223
  'std' => '0',
224
  'label' => __( 'SHA256 hashes', 'download-monitor' ),
225
  'cb_label' => __( 'Generate SHA256 hash for uploaded files', 'download-monitor' ),
 
226
  'type' => 'checkbox'
227
  ),
228
  array(
230
  'std' => '0',
231
  'label' => __( 'CRC32B hashes', 'download-monitor' ),
232
  'cb_label' => __( 'Generate CRC32B hash for uploaded files', 'download-monitor' ),
 
233
  'type' => 'checkbox'
234
  )
235
  )
236
+ ),
237
+ 'logging' => array(
238
+ 'title' => __( 'Logging', 'download-monitor' ),
 
 
 
 
239
  'fields' => array(
240
  array(
241
  'name' => 'dlm_enable_logging',
274
  'type' => 'checkbox'
275
  ),
276
  )
277
+ ),
278
  )
279
  ),
280
+ 'lead_generation' => array(
281
+ 'title' => esc_html__( 'Lead Generation', 'download-monitor' ),
282
+ 'sections' => array()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
  ),
284
+ 'external_hosting' => array(
285
+ 'title' => esc_html__( 'External Hosting', 'download-monitor' ),
286
+ 'sections' => array()
287
+ ),
288
+ 'integration' => array(
289
+ 'title' => esc_html__( 'Integration', 'download-monitor' ),
290
+ 'sections' => array()
291
+ ),
292
+ 'email_notification' => array(
293
+ 'title' => esc_html__( 'Emails', 'download-monitor' ),
294
+ 'sections' => array()
295
+ ),
296
+ 'terns_and_conditions' => array(
297
+ 'title' => esc_html__( 'Terms and Conditions', 'download-monitor' ),
298
+ 'sections' => array()
 
299
  )
 
300
  );
301
 
302
  if ( dlm_is_shop_enabled() ) {
303
 
304
+ $settings['general']['sections']['shop'] = array(
305
+ 'title' => __( 'Shop', 'download-monitor' ),
306
+ 'fields' => array(
307
+ array(
308
+ 'name' => 'dlm_base_country',
309
+ 'std' => 'US',
310
+ 'label' => __( 'Base Country', 'download-monitor' ),
311
+ 'desc' => __( 'Where is your store located?', 'download-monitor' ),
312
+ 'type' => 'select',
313
+ 'options' => Services::get()->service( "country" )->get_countries()
314
+ ),
315
+ array(
316
+ 'name' => 'dlm_currency',
317
+ 'std' => 'USD',
318
+ 'label' => __( 'Currency', 'download-monitor' ),
319
+ 'desc' => __( 'In what currency are you selling?', 'download-monitor' ),
320
+ 'type' => 'select',
321
+ 'options' => $this->get_currency_list_with_symbols()
322
+ ),
323
+ array(
324
+ 'name' => 'dlm_currency_pos',
325
+ 'std' => 'left',
326
+ 'label' => __( 'Currency Position', 'download-monitor' ),
327
+ 'desc' => __( 'The position of the currency symbol.', 'download-monitor' ),
328
+ 'type' => 'select',
329
+ 'options' => array(
330
+ 'left' => sprintf( __( 'Left (%s)', 'download-monitor' ), Services::get()->service( 'format' )->money( 9.99, array( 'currency_position' => 'left' ) ) ),
331
+ 'right' => sprintf( __( 'Right (%s)', 'download-monitor' ), Services::get()->service( 'format' )->money( 9.99, array( 'currency_position' => 'right' ) ) ),
332
+ 'left_space' => sprintf( __( 'Left with space (%s)', 'download-monitor' ), Services::get()->service( 'format' )->money( 9.99, array( 'currency_position' => 'left_space' ) ) ),
333
+ 'right_space' => sprintf( __( 'Right with space (%s)', 'download-monitor' ), Services::get()->service( 'format' )->money( 9.99, array( 'currency_position' => 'right_space' ) ) )
334
+ )
335
+ ),
336
+ array(
337
+ 'name' => 'dlm_decimal_separator',
338
+ 'type' => 'text',
339
+ 'std' => '.',
340
+ 'label' => __( 'Decimal Separator', 'download-monitor' ),
341
+ 'desc' => __( 'The decimal separator of displayed prices.', 'download-monitor' )
342
+ ),
343
+ array(
344
+ 'name' => 'dlm_thousand_separator',
345
+ 'type' => 'text',
346
+ 'std' => ',',
347
+ 'label' => __( 'Thousand Separator', 'download-monitor' ),
348
+ 'desc' => __( 'The thousand separator of displayed prices.', 'download-monitor' )
349
+ ),
350
+ array(
351
+ 'name' => 'dlm_disable_cart',
352
+ 'std' => '',
353
+ 'label' => __( 'Disable Cart', 'download-monitor' ),
354
+ 'cb_label' => __( 'Disable', 'download-monitor' ),
355
+ 'desc' => __( 'If checked, your customers will be send to your checkout page directly.', 'download-monitor' ),
356
+ 'type' => 'checkbox'
357
+ ),
358
+ )
359
+ );
360
+
361
+ $settings['advanced']['sections']['page_setup']['fields'][] = array(
362
  'name' => 'dlm_page_cart',
363
  'std' => '',
364
  'label' => __( 'Cart page', 'download-monitor' ),
367
  'options' => array()
368
  );
369
 
370
+ $settings['advanced']['sections']['page_setup']['fields'][] = array(
371
  'name' => 'dlm_page_checkout',
372
  'std' => '',
373
  'label' => __( 'Checkout page', 'download-monitor' ),
376
  'options' => array()
377
  );
378
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
379
  $settings['payments'] = array(
380
  'title' => __( 'Payment Methods', 'download-monitor' ),
381
  'sections' => $this->get_payment_methods_sections()
382
  );
383
  }
384
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
385
  // this is here to maintain backwards compatibility, use 'dlm_settings' instead
386
+ $old_settings = apply_filters( 'download_monitor_settings', array() );
387
 
388
  // This is the correct filter
389
  $settings = apply_filters( 'dlm_settings', $settings );
390
 
391
+ // Backwards compatibility for 4.3 and 4.4.4
392
+ $settings = $this->backwards_compatibility_settings( $old_settings, $settings );
393
+
394
  return $settings;
395
  }
396
 
415
  }
416
 
417
  /**
418
+ * Backwards compatibility for settings
 
 
419
  *
420
+ * @param $old_settings
421
+ * @param $settings
422
  *
423
+ * @return mixed
424
+ * @since 4.4.5
425
  */
426
+ public function backwards_compatibility_settings( $old_settings, $settings ) {
427
 
428
+ // First we check if there is info in $old_settings
429
+ if ( empty( $old_settings ) ) {
430
 
431
+ return $settings;
432
+ }
433
 
434
+ $compatibility_tabs = array(
435
+ 'access',
436
+ 'amazon_s3',
437
+ 'captcha',
438
+ 'downloading_page',
439
+ 'email_lock',
440
+ 'email_notification',
441
+ 'gravity_forms',
442
+ 'ninja_forms',
443
+ 'terns_and_conditions',
444
+ 'twitter_lock',
445
+ 'page_addon'
446
+ );
447
+
448
+ foreach ( $old_settings as $tab_key => $tab ) {
449
+ // $tab[1] contains the fields inside the setting, not being set means it doesn't have any fields
450
+ if ( ! empty( $tab[1] ) ) {
451
+
452
+ if ( in_array( $tab_key, $compatibility_tabs ) ) {
453
+
454
+ $tab_title = false;
455
+ $tab_section = $tab_key;
456
+
457
+ if ( 'access' == $tab_key ) {
458
+ $tab_parent = 'advanced';
459
+ }
460
+
461
+ if ( 'amazon_s3' == $tab_key ) {
462
+ $tab_parent = 'external_hosting';
463
+ }
464
+
465
+ if ( 'captcha' == $tab_key ) {
466
+ $tab_parent = 'integration';
467
+ }
468
+
469
+ if ( 'downloading_page' == $tab_key || 'page_addon' == $tab_key ) {
470
+ $tab_parent = 'advanced';
471
+ $tab_section = 'page_setup';
472
+ $tab_title = true;
473
+ }
474
 
475
+ if ( 'email_lock' == $tab_key || 'twitter_lock' == $tab_key || 'gravity_forms' == $tab_key || 'ninja_forms' == $tab_key ) {
476
+ $tab_parent = 'lead_generation';
477
+ }
478
+
479
+ if ( 'email_notification' == $tab_key ) {
480
+ $tab_parent = 'email_notification';
481
+ $tab_title = true;
482
+
483
+ // Reassign the title because the extension overwrittens it
484
+ $settings['email_notification'] = array(
485
+ 'title' => esc_html__( 'Emails', 'download-monitor' )
486
+ );
487
+
488
+ }
489
+
490
+ if ( 'terns_and_conditions' == $tab_key ) {
491
+ $tab_parent = 'terns_and_conditions';
492
+ $tab_title = true;
493
+ }
494
+
495
+ if ( isset( $tab[0] ) && ! $tab_title ) {
496
+
497
+ $settings[ $tab_parent ]['sections'][ $tab_section ] = array(
498
+ 'title' => $tab[0],
499
+ 'sections' => array()
500
+ );
501
+ }
502
+
503
+ // Let's check if there are sections or fields so we can add other fields and not overwrite them
504
+ if ( isset( $settings[ $tab_parent ]['sections'] ) && isset( $settings[ $tab_parent ]['sections'][ $tab_section ]['fields'] ) ) {
505
+
506
+ $settings[ $tab_parent ]['sections'][ $tab_section ]['fields'] = array_merge( $settings[ $tab_parent ]['sections'][ $tab_section ]['fields'], $tab[1] );
507
+ } else {
508
+ $settings[ $tab_parent ]['sections'][ $tab_section ]['fields'] = $tab[1];
509
+ }
510
+
511
+ // Unset the previous used tab - new tabs are already provided thanks to upsells
512
+ if ( 'email_notification' != $tab_key && 'terns_and_conditions' != $tab_key ) {
513
+ unset( $settings[ $tab_key ] );
514
+ }
515
+
516
+ } else {
517
+
518
+ foreach ( $tab[1] as $other_tab_fields ) {
519
+
520
+ $settings['other']['sections']['other']['fields'][] = $other_tab_fields;
521
+ }
522
+
523
+ }
524
  }
525
  }
526
 
527
+ // Check to see if there is any info in Other tab
528
+ if ( isset( $settings['other'] ) ) {
529
+ $settings['other']['title'] = esc_html__( 'Other', 'download-monitor' );
530
+ }
531
+
532
  return $settings;
533
  }
534
 
535
+
536
  /**
537
  * Return pages with ID => Page title format
538
  *
src/Admin/WritePanels.php CHANGED
@@ -15,7 +15,7 @@ class DLM_Admin_Writepanels {
15
  * @access public
16
  */
17
  public function __construct() {
18
- add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
19
  add_action( 'save_post', array( $this, 'save_post' ), 1, 2 );
20
  add_action( 'dlm_save_meta_boxes', array( $this, 'save_meta_boxes' ), 1, 2 );
21
  }
@@ -28,23 +28,60 @@ class DLM_Admin_Writepanels {
28
  */
29
  public function add_meta_boxes() {
30
 
31
- // Download Information
32
- add_meta_box( 'download-monitor-information', __( 'Download Information', 'download-monitor' ), array(
33
- $this,
34
- 'download_information'
35
- ), 'dlm_download', 'side', 'high' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
- // Download Options
38
- add_meta_box( 'download-monitor-options', __( 'Download Options', 'download-monitor' ), array(
39
- $this,
40
- 'download_options'
41
- ), 'dlm_download', 'side', 'high' );
42
 
43
- // Versions / Files
44
- add_meta_box( 'download-monitor-file', __( 'Downloadable Files/Versions', 'download-monitor' ), array(
45
- $this,
46
- 'download_files'
47
- ), 'dlm_download', 'normal', 'high' );
48
 
49
  // Excerpt
50
  if ( function_exists( 'wp_editor' ) ) {
@@ -233,9 +270,13 @@ class DLM_Admin_Writepanels {
233
  public function short_description( $post ) {
234
  $settings = array(
235
  'textarea_name' => 'excerpt',
236
- 'quicktags' => true,
 
 
237
  'tinymce' => true,
238
- 'editor_css' => '<style>#wp-excerpt-editor-container .wp-editor-area{height:200px; width:100%;}</style>'
 
 
239
  );
240
 
241
  wp_editor( htmlspecialchars_decode( $post->post_excerpt ), 'excerpt', $settings );
15
  * @access public
16
  */
17
  public function __construct() {
18
+ add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ), 15 );
19
  add_action( 'save_post', array( $this, 'save_post' ), 1, 2 );
20
  add_action( 'dlm_save_meta_boxes', array( $this, 'save_meta_boxes' ), 1, 2 );
21
  }
28
  */
29
  public function add_meta_boxes() {
30
 
31
+ // We remove the Publish metabox and add to our queue
32
+ remove_meta_box( 'submitdiv', 'dlm_download', 'side' );
33
+
34
+ $meta_boxes = apply_filters( 'dlm_download_metaboxes', array(
35
+ array(
36
+ 'id' => 'submitdiv',
37
+ 'title' => __( 'Publish' ),
38
+ 'callback' => 'post_submit_meta_box',
39
+ 'screen' => 'dlm_download',
40
+ 'context' => 'side',
41
+ 'priority' => 1
42
+ ),
43
+ array(
44
+ 'id' => 'download-monitor-information',
45
+ 'title' => __( 'Download Information', 'download-monitor' ),
46
+ 'callback' => array(
47
+ $this,
48
+ 'download_information'
49
+ ),
50
+ 'screen' => 'dlm_download',
51
+ 'context' => 'side',
52
+ 'priority' => 5
53
+ ),
54
+ array(
55
+ 'id' => 'download-monitor-options',
56
+ 'title' => __( 'Download Options', 'download-monitor' ),
57
+ 'callback' => array(
58
+ $this,
59
+ 'download_options'
60
+ ),
61
+ 'screen' => 'dlm_download',
62
+ 'context' => 'side',
63
+ 'priority' => 10
64
+ ),
65
+ array(
66
+ 'id' => 'download-monitor-file',
67
+ 'title' => __( 'Downloadable Files/Versions', 'download-monitor' ),
68
+ 'callback' => array(
69
+ $this,
70
+ 'download_files'
71
+ ),
72
+ 'screen' => 'dlm_download',
73
+ 'context' => 'normal',
74
+ 'priority' => 20
75
+ ),
76
+ )
77
+ );
78
 
79
+ uasort( $meta_boxes, array( 'DLM_Admin_Helper', 'sort_data_by_priority' ) );
 
 
 
 
80
 
81
+ foreach($meta_boxes as $metabox){
82
+ // Priority is left out as we prioritise based on our sorting function
83
+ add_meta_box( $metabox['id'], $metabox['title'], $metabox['callback'], $metabox['screen'], $metabox['context'],'high' );
84
+ }
 
85
 
86
  // Excerpt
87
  if ( function_exists( 'wp_editor' ) ) {
270
  public function short_description( $post ) {
271
  $settings = array(
272
  'textarea_name' => 'excerpt',
273
+ 'editor_css' => '<style>#wp-excerpt-editor-container .wp-editor-area{height:200px; width:100%;}</style>',
274
+ 'teeny' => true,
275
+ 'dfw' => false,
276
  'tinymce' => true,
277
+ 'quicktags' => false,
278
+ 'wpautop' => false,
279
+ 'media_buttons' => false,
280
  );
281
 
282
  wp_editor( htmlspecialchars_decode( $post->post_excerpt ), 'excerpt', $settings );
src/Admin/class-dlm-admin-helper.php ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ class DLM_Admin_Helper {
5
+
6
+ /**
7
+ * Holds the class object.
8
+ *
9
+ * @since 1.0.0
10
+ *
11
+ * @var object
12
+ */
13
+ public static $instance;
14
+
15
+ /**
16
+ * Primary class constructor.
17
+ *
18
+ * @since 1.0.0
19
+ */
20
+ public function __construct() {
21
+
22
+ }
23
+
24
+ /**
25
+ * Returns the singleton instance of the class.
26
+ *
27
+ * @return object The DLM_Admin_Helper object.
28
+ * @since 1.0.0
29
+ *
30
+ */
31
+ public static function get_instance() {
32
+
33
+ if ( ! isset( self::$instance ) && ! ( self::$instance instanceof DLM_Admin_Helper ) ) {
34
+ self::$instance = new DLM_Admin_Helper();
35
+ }
36
+
37
+ return self::$instance;
38
+
39
+ }
40
+
41
+ /**
42
+ * Tab navigation display
43
+ *
44
+ * @param $tabs
45
+ * @param $active_tab
46
+ */
47
+ public static function dlm_tab_navigation( $tabs, $active_tab ) {
48
+
49
+ if ( $tabs ) {
50
+
51
+ $i = count( $tabs );
52
+ $j = 1;
53
+
54
+ foreach ( $tabs as $tab_id => $tab ) {
55
+
56
+ $last_tab = ( $i == $j ) ? ' last_tab' : '';
57
+ $active = ( $active_tab == $tab_id ? ' nav-tab-active' : '' );
58
+ $j ++;
59
+
60
+ if ( isset( $tab['url'] ) ) {
61
+ // For Extensions and Gallery list tabs
62
+ $url = $tab['url'];
63
+ } else {
64
+ // For Settings tabs
65
+ $url = admin_url( 'edit.php?post_type=dlm_download&page=download-monitor-settings&tab=' . $tab_id );
66
+ }
67
+
68
+ echo '<a href="' . esc_url( $url ) . '" class="nav-tab' . esc_attr( $active ) . esc_attr( $last_tab ) . '" ' . ( isset( $tab['target'] ) ? 'target="' . esc_attr( $tab['target'] ) . '"' : '' ) . '>';
69
+
70
+ if ( isset( $tab['icon'] ) ) {
71
+ echo '<span class="dashicons ' . esc_attr( $tab['icon'] ) . '"></span>';
72
+ }
73
+
74
+ // For Extensions and Gallery list tabs
75
+ if ( isset( $tab['name'] ) ) {
76
+ echo esc_html( $tab['name'] );
77
+ }
78
+
79
+ // For Settings tabs
80
+ if ( isset( $tab['label'] ) ) {
81
+ echo esc_html( $tab['label'] );
82
+ }
83
+
84
+ if ( isset( $tab['badge'] ) ) {
85
+ echo '<span class="dlm-badge">' . esc_html( $tab['badge'] ) . '</span>';
86
+ }
87
+
88
+ echo '</a>';
89
+ }
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Callback to sort tabs/fields on priority.
95
+ *
96
+ * @return bool
97
+ *
98
+ */
99
+ public static function sort_data_by_priority( $a, $b ) {
100
+ if ( ! isset( $a['priority'], $b['priority'] ) ) {
101
+ return - 1;
102
+ }
103
+ if ( $a['priority'] == $b['priority'] ) {
104
+ return 0;
105
+ }
106
+
107
+ return $a['priority'] < $b['priority'] ? - 1 : 1;
108
+ }
109
+
110
+ }
src/DLM.php CHANGED
@@ -199,6 +199,9 @@ class WP_DLM {
199
  add_action( 'the_post', array( $this, 'setup_download_data' ) );
200
  add_action( 'wp_enqueue_scripts', array( $this, 'frontend_scripts' ) );
201
 
 
 
 
202
  // setup product manager
203
  DLM_Product_Manager::get()->setup();
204
  }
@@ -509,4 +512,32 @@ class WP_DLM {
509
  return $file_manager->json_unscaped_unicode_fallback( $matches );
510
  }
511
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
512
  }
199
  add_action( 'the_post', array( $this, 'setup_download_data' ) );
200
  add_action( 'wp_enqueue_scripts', array( $this, 'frontend_scripts' ) );
201
 
202
+ // Get the correct download link in archive pages or when retrieving download permalink
203
+ add_filter( 'post_type_link', array( $this, 'archive_filter_download_link' ), 20, 2 );
204
+
205
  // setup product manager
206
  DLM_Product_Manager::get()->setup();
207
  }
512
  return $file_manager->json_unscaped_unicode_fallback( $matches );
513
  }
514
 
515
+ /**
516
+ * Filter the download link so that it retrieves the corresponding download link in archive pages
517
+ *
518
+ * @param $post_link
519
+ * @param $post
520
+ *
521
+ * @return mixed|String
522
+ *
523
+ * @since 4.4.5
524
+ */
525
+ public function archive_filter_download_link( $post_link, $post ) {
526
+
527
+ // We exclude the search because there is a specific option for this
528
+ if ( 'dlm_download' == $post->post_type && !is_search() ) {
529
+ // fetch download object
530
+ try{
531
+ /** @var DLM_Download $download */
532
+ $download = download_monitor()->service( 'download_repository' )->retrieve_single( $post->ID );
533
+
534
+ return $download->get_the_download_link();
535
+ }
536
+ catch ( Exception $e ){
537
+ }
538
+ }
539
+
540
+ return $post_link;
541
+ }
542
+
543
  }
src/Download/Download.php CHANGED
@@ -201,7 +201,14 @@ class DLM_Download {
201
  * Prints the excerpt
202
  */
203
  public function the_excerpt() {
204
- echo $this->get_excerpt();
 
 
 
 
 
 
 
205
  }
206
 
207
  /**
@@ -296,7 +303,7 @@ class DLM_Download {
296
  if ( has_post_thumbnail( $this->id ) ) {
297
  return get_the_post_thumbnail( $this->id, $size );
298
  } else {
299
- return '<img alt="Placeholder" class="wp-post-image" src="' . apply_filters( 'dlm_placeholder_image_src', download_monitor()->get_plugin_url() . '/assets/images/placeholder.png', $this->id, $this ) . '" />';
300
  }
301
  }
302
 
201
  * Prints the excerpt
202
  */
203
  public function the_excerpt() {
204
+ echo wpautop( do_shortcode( $this->get_excerpt() ) );
205
+ }
206
+
207
+ /**
208
+ * Returns the excerpt with wpautop and do_shortcode
209
+ */
210
+ public function get_the_excerpt() {
211
+ return wpautop( do_shortcode( $this->get_excerpt() ) );
212
  }
213
 
214
  /**
303
  if ( has_post_thumbnail( $this->id ) ) {
304
  return get_the_post_thumbnail( $this->id, $size );
305
  } else {
306
+ return '<img alt="Placeholder" class="wp-post-image" src="' . apply_filters( 'dlm_placeholder_image_src', download_monitor()->get_plugin_url() . '/assets/images/placeholder.png', $this->id, $this, $size ) . '" />';
307
  }
308
  }
309
 
src/Download/WordPressDownloadRepository.php CHANGED
@@ -66,6 +66,7 @@ class DLM_WordPress_Download_Repository implements DLM_Download_Repository {
66
  * @throws Exception
67
  */
68
  public function retrieve_single( $id ) {
 
69
  $downloads = $this->retrieve( array( 'p' => absint( $id ) ) );
70
 
71
  if ( count( $downloads ) != 1 ) {
@@ -86,10 +87,16 @@ class DLM_WordPress_Download_Repository implements DLM_Download_Repository {
86
  */
87
  public function retrieve( $filters = array(), $limit = 0, $offset = 0 ) {
88
 
89
- $items = array();
 
 
 
 
 
 
90
 
 
91
  $q = new WP_Query();
92
-
93
  $posts = $q->query( $this->filter_query_args( $filters, $limit, $offset ) );
94
 
95
  if ( count( $posts ) > 0 ) {
@@ -107,7 +114,7 @@ class DLM_WordPress_Download_Repository implements DLM_Download_Repository {
107
  $download->set_slug( $post->post_name );
108
  $download->set_author( $post->post_author );
109
  $download->set_description( $post->post_content );
110
- $download->set_excerpt( wpautop( do_shortcode( $post->post_excerpt ) ) );
111
  $download->set_redirect_only( ( 'yes' == get_post_meta( $post->ID, '_redirect_only', true ) ) );
112
  $download->set_featured( ( 'yes' == get_post_meta( $post->ID, '_featured', true ) ) );
113
  $download->set_members_only( ( 'yes' == get_post_meta( $post->ID, '_members_only', true ) ) );
66
  * @throws Exception
67
  */
68
  public function retrieve_single( $id ) {
69
+
70
  $downloads = $this->retrieve( array( 'p' => absint( $id ) ) );
71
 
72
  if ( count( $downloads ) != 1 ) {
87
  */
88
  public function retrieve( $filters = array(), $limit = 0, $offset = 0 ) {
89
 
90
+ // WPML gives original website language in AJAX Requests
91
+ // So we handle all the languages, as the download will be searched based on the post ID which will be unique
92
+ // First, let's check if WPML is installed and activated - check for it's class -
93
+ if ( class_exists( 'SitePress' ) ) {
94
+ global $sitepress;
95
+ $sitepress->switch_lang( 'all' );
96
+ }
97
 
98
+ $items = array();
99
  $q = new WP_Query();
 
100
  $posts = $q->query( $this->filter_query_args( $filters, $limit, $offset ) );
101
 
102
  if ( count( $posts ) > 0 ) {
114
  $download->set_slug( $post->post_name );
115
  $download->set_author( $post->post_author );
116
  $download->set_description( $post->post_content );
117
+ $download->set_excerpt( $post->post_excerpt );
118
  $download->set_redirect_only( ( 'yes' == get_post_meta( $post->ID, '_redirect_only', true ) ) );
119
  $download->set_featured( ( 'yes' == get_post_meta( $post->ID, '_featured', true ) ) );
120
  $download->set_members_only( ( 'yes' == get_post_meta( $post->ID, '_members_only', true ) ) );
src/DownloadHandler.php CHANGED
@@ -278,14 +278,16 @@ class DLM_Download_Handler {
278
 
279
  /** @var DLM_Download $download */
280
  $download = null;
281
-
282
  if ( $download_id > 0 ) {
283
  try {
284
  $download = download_monitor()->service( 'download_repository' )->retrieve_single( $download_id );
285
  } catch ( Exception $e ) {
286
- // download not found
287
  }
 
288
 
 
 
289
  }
290
 
291
  // Handle version (if set)
@@ -299,7 +301,8 @@ class DLM_Download_Handler {
299
  $version_id = absint( $_GET['v'] );
300
  }
301
 
302
- if ( null != $download && $version_id ) {
 
303
  try {
304
  $version = download_monitor()->service( 'version_repository' )->retrieve_single( $version_id );
305
  $download->set_version( $version );
@@ -309,10 +312,11 @@ class DLM_Download_Handler {
309
  }
310
 
311
  // Action on found download
312
- if ( ! is_null( $download ) && $download->exists() ) {
313
  if ( post_password_required( $download_id ) ) {
314
  wp_die( get_the_password_form( $download_id ), __( 'Password Required', 'download-monitor' ) );
315
  }
 
316
  $this->trigger( $download );
317
  } elseif ( $redirect = apply_filters( 'dlm_404_redirect', false ) ) {
318
  wp_redirect( $redirect );
@@ -333,7 +337,7 @@ class DLM_Download_Handler {
333
  * @param DLM_Download $download
334
  * @param DLM_Download_Version $version
335
  */
336
- private function log( $type = '', $status = '', $message = '', $download, $version ) {
337
 
338
  // Logging object
339
  $logging = new DLM_Logging();
278
 
279
  /** @var DLM_Download $download */
280
  $download = null;
 
281
  if ( $download_id > 0 ) {
282
  try {
283
  $download = download_monitor()->service( 'download_repository' )->retrieve_single( $download_id );
284
  } catch ( Exception $e ) {
285
+ wp_die( __( 'Download does not exist.', 'download-monitor' ) . ' <a href="' . home_url() . '">' . __( 'Go to homepage &rarr;', 'download-monitor' ) . '</a>', __( 'Download Error', 'download-monitor' ), array( 'response' => 404 ) );
286
  }
287
+ }
288
 
289
+ if ( ! $download ) {
290
+ wp_die( __( 'Download does not exist.', 'download-monitor' ) . ' <a href="' . home_url() . '">' . __( 'Go to homepage &rarr;', 'download-monitor' ) . '</a>', __( 'Download Error', 'download-monitor' ), array( 'response' => 404 ) );
291
  }
292
 
293
  // Handle version (if set)
301
  $version_id = absint( $_GET['v'] );
302
  }
303
 
304
+
305
+ if ( $version_id ) {
306
  try {
307
  $version = download_monitor()->service( 'version_repository' )->retrieve_single( $version_id );
308
  $download->set_version( $version );
312
  }
313
 
314
  // Action on found download
315
+ if ( $download->exists() ) {
316
  if ( post_password_required( $download_id ) ) {
317
  wp_die( get_the_password_form( $download_id ), __( 'Password Required', 'download-monitor' ) );
318
  }
319
+
320
  $this->trigger( $download );
321
  } elseif ( $redirect = apply_filters( 'dlm_404_redirect', false ) ) {
322
  wp_redirect( $redirect );
337
  * @param DLM_Download $download
338
  * @param DLM_Download_Version $version
339
  */
340
+ private function log( $type, $status, $message, $download, $version ) {
341
 
342
  // Logging object
343
  $logging = new DLM_Logging();
src/FileManager.php CHANGED
@@ -53,6 +53,11 @@ class DLM_File_Manager {
53
  $wp_uploads_dir = $wp_uploads['basedir'];
54
  $wp_uploads_url = $wp_uploads['baseurl'];
55
 
 
 
 
 
 
56
  if ( ( ! isset( $parsed_file_path['scheme'] ) || ! in_array( $parsed_file_path['scheme'], array(
57
  'http',
58
  'https',
@@ -70,6 +75,7 @@ class DLM_File_Manager {
70
  $file_path = trim( str_replace( $wp_uploads_url, $wp_uploads_dir, $file_path ) );
71
  $file_path = realpath( $file_path );
72
 
 
73
  } elseif ( is_multisite() && ( ( strpos( $file_path, network_site_url( '/', 'http' ) ) !== false ) || ( strpos( $file_path, network_site_url( '/', 'https' ) ) !== false ) ) ) {
74
 
75
  /** This is a local file outside of wp-content so figure out the path */
53
  $wp_uploads_dir = $wp_uploads['basedir'];
54
  $wp_uploads_url = $wp_uploads['baseurl'];
55
 
56
+ // Fix for plugins that modify the uploads dir
57
+ if ( ! strpos( get_site_url(), $wp_uploads_url ) ) {
58
+ return array( $file_path, $remote_file );
59
+ }
60
+
61
  if ( ( ! isset( $parsed_file_path['scheme'] ) || ! in_array( $parsed_file_path['scheme'], array(
62
  'http',
63
  'https',
75
  $file_path = trim( str_replace( $wp_uploads_url, $wp_uploads_dir, $file_path ) );
76
  $file_path = realpath( $file_path );
77
 
78
+
79
  } elseif ( is_multisite() && ( ( strpos( $file_path, network_site_url( '/', 'http' ) ) !== false ) || ( strpos( $file_path, network_site_url( '/', 'https' ) ) !== false ) ) ) {
80
 
81
  /** This is a local file outside of wp-content so figure out the path */
src/Gutenberg.php CHANGED
@@ -72,28 +72,35 @@ class DLM_Gutenberg {
72
  $template = dlm_get_default_download_template();
73
 
74
  // try fetching the download from the attributes
75
- if ( isset( $attributes['download_id'] ) ) {
76
 
77
- try {
78
- /** @var DLM_Download $download */
79
- $download = download_monitor()->service( 'download_repository' )->retrieve_single( absint( $attributes['download_id'] ) );
80
 
 
 
81
 
82
- if ( isset( $attributes['version_id'] ) ) {
 
 
 
 
 
 
 
 
83
 
84
- try {
85
- /** @var DLM_Download_Version $version */
86
- $version = download_monitor()->service( 'version_repository' )->retrieve_single( absint( $attributes['version_id'] ) );
87
- $download->set_version( $version );
88
- } catch ( Exception $exception ) {
89
  // no version found, don't do anything.
90
- }
91
  }
 
92
 
93
 
94
- } catch ( Exception $exception ) {
95
  // no download found, don't do anything.
96
- }
97
  }
98
 
99
  if ( isset( $attributes['template'] ) ) {
@@ -108,7 +115,10 @@ class DLM_Gutenberg {
108
 
109
  // do the output
110
  ob_start();
111
- $template_handler->get_template_part( 'content-download', $template, '', array( 'dlm_download' => $download ) );
 
 
 
112
  $output = ob_get_clean();
113
 
114
  if ( isset( $attributes['autop'] ) && $attributes['autop'] == "1" ) {
@@ -117,4 +127,4 @@ class DLM_Gutenberg {
117
 
118
  return $output;
119
  }
120
- }
72
  $template = dlm_get_default_download_template();
73
 
74
  // try fetching the download from the attributes
75
+ if ( ! isset( $attributes['download_id'] ) ) {
76
 
77
+ if ( current_user_can( 'manage_options' ) ) {
 
 
78
 
79
+ return esc_html__( 'Please select a download id','download-monitor' );
80
+ } else {
81
 
82
+ return;
83
+ }
84
+ }
85
+ try {
86
+ /** @var DLM_Download $download */
87
+ $download = download_monitor()->service( 'download_repository' )->retrieve_single( absint( $attributes['download_id'] ) );
88
+
89
+
90
+ if ( isset( $attributes['version_id'] ) ) {
91
 
92
+ try {
93
+ /** @var DLM_Download_Version $version */
94
+ $version = download_monitor()->service( 'version_repository' )->retrieve_single( absint( $attributes['version_id'] ) );
95
+ $download->set_version( $version );
96
+ } catch ( Exception $exception ) {
97
  // no version found, don't do anything.
 
98
  }
99
+ }
100
 
101
 
102
+ } catch ( Exception $exception ) {
103
  // no download found, don't do anything.
 
104
  }
105
 
106
  if ( isset( $attributes['template'] ) ) {
115
 
116
  // do the output
117
  ob_start();
118
+ if($download)
119
+ {
120
+ $template_handler->get_template_part( 'content-download', $template, '', array( 'dlm_download' => $download ) );
121
+ }
122
  $output = ob_get_clean();
123
 
124
  if ( isset( $attributes['autop'] ) && $attributes['autop'] == "1" ) {
127
 
128
  return $output;
129
  }
130
+ }
src/Libs/uaparser/CHANGELOG DELETED
@@ -1,169 +0,0 @@
1
- THIS CHANGELOG IS AN ATTEMPT TO DOCUMENT CHANGES TO THIS PROJECT.
2
- SUPER MINOR REVISION NUMBERS WON'T SHOW UP IN GITHUB BUT IT'LL HELP
3
- ME ORGANIZE WHEN I MADE A SET OF FIXES
4
-
5
- UAP-2.1.1
6
- - FIX: making sure patch minor is being populated correctly when showing a mismatch
7
-
8
- UAP-2.1.0
9
- - ADD: support for custom regexes.json files (via @pravindahal)
10
- - FIX: formerly private vars/functions are now protected (via @pravindahal)
11
- - FIX: command line tool gets 'pretty' option for PHP 5.4 users (via @skyzyx)
12
- - FIX: refactored the regexes.yaml test suite
13
- - FIX: now check to see if allow_url_fopen is set to 'On' before trying to download the YAML file from the command line
14
- - THX: thanks to @pravindahal and @skyzyx for the pull requests
15
-
16
- UAP-2.0.1
17
- - FIX: renamed uaParser, osParser, & deviceParser to uaParse, osParse, & deviceParse to address a bug with uaParser being recognized as the contruct function for the overall lib
18
- - FIX: updated the test lib so that device failures are properly formatted
19
-
20
- UAP-2.0.0
21
- - ADD: toString() converts the version bits and family into a simple string
22
- - ADD: toVersionString() converts the version bits into a simple string
23
- - ADD: toFullString() combines the UA and OS family and version bits
24
- - ADD: "convert" flag for uaparser-cli.php
25
- - ADD: "pull & save just regexes.yaml" flag for uaparser-cli.php
26
- - FIX: library is now a dynamic class
27
- - FIX: attributes are now nested & populated like the other ua-parser libraries (e.g. $result->family is now $result->ua->family)
28
- - FIX: uaParser(), osParser(), and deviceParser() are now public functions
29
- - FIX: saves regexes.yaml as JSON for better performance
30
- - FIX: removed the __DIR__ "fix"
31
- - FIX: Apache log parsing now returns results when UA or OS families are set to "Other" and the device is listed as a smartphone or generic feature phone
32
- - FIX: all tabs are now spaces
33
- - FIX: a UA is now run against all three parsers
34
- - FIX: renamed $debug var to $log to better reflect what it does
35
- - DEL: is* boolean attributes (e.g. isMobile) have been removed
36
- - DEL: will no longer auto-parse $_SERVER['HTTP_USER_AGENT'] if available
37
- - DEL: tests no longer run against pgts_browser_list.yaml
38
- - THX: thanks to @rjd22 for the dynamic class code/fix
39
-
40
- UAP-1.5.0
41
- - ADD: command line interface is now in its own file (via @Synchro)
42
- - ADD: command line utility now supports parsing an Apache log file & recording the results
43
- - ADD: command line utility can now parse a supplied user-agent string and push out a simple list or JSON
44
- - ADD: test suite that uses the ua-parser project's test resources
45
- - FIX: numerous comment & spacing fixes (via @Synchro & @Krinkle)
46
- - FIX: remove PHP4 version of spyc (via @Synchro)
47
- - FIX: remove .svn dirs in spyc (via @lopezdonaque)
48
- - FIX: notes that the PHP 5.2 fix really was for 5.1 (via @Synchro) (knew this, i was lazy)
49
- - FIX: lib now returns an object no matter what. now matches other ua-parser libs (via @Krinkle)
50
- - FIX: checks that $_SERVER attr is set before including it. should be better for command line use.
51
- - FIX: family attr now properly set in an edge case
52
- - FIX: if regexes.yaml picks up bad slashes the PHP lib will account for it (e.g. GoogleTV regex)
53
- - THX: thanks to @Krinkle and @Synchro for the numerous fixes
54
-
55
- UAP-1.4.5
56
- - FIX: an embarrassing debug print survived the last edit
57
- - THX: thanks to @memakeit for dropping the bug report
58
-
59
- UAP-1.4.4
60
- - FIX: made sure that the regex file is only loaded once if running the library multiple times. performance boost.
61
- - FIX: added support for identifying various game devices as mobile devices
62
- - THX: thanks to @rjd22 for pointing out the perf issue
63
-
64
- UAP-1.4.3
65
- - FIX: added support for patch & family attributes to sort of match the other libraries
66
-
67
- UAP-1.4.2
68
- - FIX: notice if regexes.yaml is missing parens (e.g. match $1) for device & os names
69
-
70
- UAP-1.4.1
71
- - FIX: notice when using UAParser from the command line
72
-
73
- UAP-1.4.0
74
- - ADD: silent mode for the UA::get() method
75
- - ADD: nobackup mode for the UA::get() method
76
- - ADD: example of how to do a redirect with ua-parser-php
77
- - The following were changes to regexes.yaml:
78
- ---- ADD: support for Google Earth browser
79
- ---- ADD: another regex for Firefox Mobile
80
- ---- ADD: support for Firefox Alpha builds
81
- ---- ADD: support for Sogou Explorer
82
- ---- ADD: support for the Raven for Mac browser
83
- ---- ADD: support for WebKit Nightly builds (though slightly pointless)
84
- ---- FIX: better pattern matching for the Pale Moon browser
85
-
86
- UAP-v1.3.2
87
- - FIX: addressed false "tablet" classification for opera mobile & mini on android
88
- - The following were changes to regexes.yaml:
89
- ---- ADD: support for Tizen Browser (aka SLP Browser) from Samsung
90
- ---- FIX: support for a new look Polaris 8.0 user agent string
91
- ---- FIX: modified where the Epiphany Browser check happens
92
-
93
- UAP-v1.3.1
94
- - FIX: now doing some sanity cleaning on the user agent strings
95
- - FIX: added a smarter default if the user agent isn't recognized at all
96
-
97
- UAP-v1.3.0
98
- - FIX: now points to Tobie's ua-parser project for the latest greatest YAML file
99
- - FIX: YAML file is now standardized as regexes.yaml instead of user_agents_regex.yaml
100
- - FIX: minor NOTICE issues resolved for very select UAs
101
-
102
- UAP-v1.2.2
103
- - The following were changes to user_agents_regex.yaml:
104
- ---- ADD: support for UC Browser
105
-
106
- UAP-v1.2.1
107
- - The following were changes to user_agents_regex.yaml:
108
- ---- ADD: support for android 4 user agents that have a dash in them
109
-
110
- UAP-v1.2.0
111
- - FIX: should be compatible with PHP 5.2
112
- - FIX: addressed STRICT mode errors
113
- - FIX: addressed NOTICE for a missing variable
114
- - FIX: if isTablet is set to true then isMobile is set to false (mobile to me means phone)
115
- - THX: Thanks to Mike Bond of WVU Libraries for pointing out the 5.2 incompatibility
116
-
117
- UAP-v1.1.0
118
- - FIX: a number of fixes from bryan shelton
119
- - The following were changes to user_agents_regex.yaml:
120
- ---- ADD: support for Chrome Mobile
121
-
122
- UAP-v1.0.0
123
- - just because i don't expect to update this anytime soon and ppl report it's working
124
-
125
- UAP-v0.3.1
126
- - FIX: swapped nil for null in parse()
127
- - FIX: smarter/saner defaults
128
- - FIX: now using isset() for family_replacement
129
- - THX: thanks to bryan shelton for these fixes
130
-
131
- UAP-v0.3.0
132
- - ADD: can now supply a specific UA to be checked
133
- - ADD: if the UA contains 'tablet' isTablet is marked true
134
- - ADD: for certain mobile OSs they report a desktop browser. marking them mobile now.
135
- - FIX: tablet listing should now be better
136
- - FIX: the list of mobile browsers was updated
137
- - FIX: made sure that certain checks won't fail as "false" if a version number was a 0
138
- - FIX: for the device check, if it returns spider as a result it no longer marks it as mobile
139
- - FIX: added more mobile browsers to that specific check
140
- - The following were changes to user_agents_regex.yaml:
141
- ---- ADD: symphony, minimo, teleca, semc, up.browser, bunjaloo, jasmine, & brew browsers supported
142
- ---- ADD: windows mobile 6.5 os support
143
- ---- ADD: amoi, asus, bird, dell, docomo, huawei, i-mate, kyocera, lenovo, lg, microsoft kind,
144
- motorola, philips, samsung, softbank, & sony ericsson device checks
145
- ---- FIX: mobile firefox, opera mobile & mini, obigo, polaris, nokiabrowser, ie mobile,
146
- android, & mobile safari browser checks
147
- ---- FIX: iOS support
148
- ---- FIX: htc, android, palm/hp, kindle, ios, generic feature phones & spider device checks
149
-
150
- UAP-v0.2.0
151
- - ADD: added isMobile support
152
- - ADD: added isTablet support
153
- - ADD: added isComputer support
154
- - ADD: added isSpider support
155
-
156
- UAP-v0.1.0
157
- - The following were changes to user_agents_regex.yaml:
158
- ---- expanded support for Symbia & Nokia Devices,
159
- ---- cleaned up some slashies,
160
- ---- added Mobile Safari as the family replacement for iOS devices,
161
- ---- better support for longer HTC device names
162
- ---- added feature phones to the device check
163
- ---- added generic smartphones to the device check
164
- ---- added AvantGo to the ua check
165
- ---- tweaked a lot of the nokia checks
166
- ---- added kindle support to the device section
167
- ---- added a generic catch for android devices.
168
- ---- added support for blackberry devices
169
- ---- changed the blackberry family to 'blackberry webkit' when it's a webkit browser
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/LICENSE DELETED
@@ -1,11 +0,0 @@
1
- Copyright (c) 2011-2012 Dave Olsen, http://dmolsen.com
2
- Licensed under the MIT license
3
-
4
- ua-parser-php is a PHP-based pseudo-port of the ua-parser project. Learn more about the ua-parser project at:
5
-
6
- http://code.google.com/p/ua-parser/
7
-
8
- The user agents data from the ua-parser project is licensed under the Apache license.
9
- spyc-0.5, for loading the YAML, is licensed under the MIT license.
10
- The initial list of generic feature phones & smartphones came from Mobile Web OSP under the MIT license
11
- The initial list of spiders was taken from Yiibu's profile project under the MIT license.
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/README.md DELETED
@@ -1,125 +0,0 @@
1
- # ua-parser PHP Library #
2
-
3
- This is the PHP library for the [ua-parser](https://github.com/tobie/ua-parser) project.
4
-
5
- ## v2.0 Changes ##
6
-
7
- v2.0 of the PHP library, released in December 2012, marked a huge transition from the previous pseudo-port of `ua-parser` to a true port that matches up well with the other libraries in the `ua-parser` repo. The primary changes:
8
-
9
- * the `UAParser` class is now dynamic
10
- * properties are nested _(e.g. $result->family is now $result->ua->family)_
11
- * a user agent string is now required when using `parse()`. the auto-magical "use the server provided UA" is no longer supported.
12
- * `uaParse()`, `osParse()`, and `deviceParse()` are public and can be used to just return those select bits for a given user agent string.
13
- * the `is*` boolean properties _(e.g. isMobile)_ have been dropped. they now exist as part of the `ua-classifier` project.
14
-
15
- Please refer to the `CHANGELOG` for the full list of changes.
16
-
17
- ## Demo ##
18
-
19
- You can [test the PHP library](http://uaparser.dmolsen.com/) with your browser.
20
-
21
- ## Usage ##
22
-
23
- Straightforward:
24
-
25
- ```php
26
- require("uaparser.php");
27
-
28
- $ua = "Mozilla/5.0 (Macintosh; Intel Ma...";
29
-
30
- $parser = new UAParser;
31
- $result = $parser->parse($ua);
32
-
33
- print $result->ua->family; // Safari
34
- print $result->ua->major; // 6
35
- print $result->ua->minor; // 0
36
- print $result->ua->patch; // 2
37
- print $result->ua->toString; // Safari 6.0.2
38
- print $result->ua->toVersionString; // 6.0.2
39
-
40
- print $result->os->family; // Mac OS X
41
- print $result->os->major; // 10
42
- print $result->os->minor; // 7
43
- print $result->os->patch; // 5
44
- print $result->os->patch_minor; // [null]
45
- print $result->os->toString; // Mac OS X 10.7.5
46
- print $result->os->toVersionString; // 10.7.5
47
-
48
- print $result->device->family; // Other
49
-
50
- print $result->toFullString; // Safari 6.0.2/Mac OS X 10.7.5
51
- print $result->uaOriginal; // Mozilla/5.0 (Macintosh; Intel Ma...
52
- ```
53
-
54
- ## Using Your Own Custom regexes.json File ##
55
-
56
- You can use your own `regexes.json` file if you've customized the official file. I *strongly* encourage you to push back any changes you may have so others can benefit. That said, to use your own do the following:
57
-
58
- ```php
59
- require("uaparser.php");
60
-
61
- $parser = new UAParser("path/to/custom/regexes.json");
62
- ```
63
-
64
- ## Using ua-parser PHP Library from the Command Line ##
65
-
66
- A command line utility is now included with the PHP library. The following commands are supported:
67
-
68
- ### Get Usage Info
69
-
70
- Provides simple usage information:
71
-
72
- php uaparser-cli.php
73
-
74
- ### Update the regexes.json File
75
-
76
- Fetches an updated YAML file for `ua-parser` and overwrites the current JSON file. You can use the following as part of a cron job that runs nightly.
77
-
78
- php uaparser-cli.php -g [-s] [-n]
79
-
80
- By default is verbose. Use `-s` to turn that feature off. By default creates a back-up. Use `-n` to turn that feature off.
81
-
82
- ### Convert an Existing regexes.yaml File to regexes.json
83
-
84
- With the change to v2.0 you may have an existing and customized YAML file for `ua-parser`. Use the following to convert it to JSON.
85
-
86
- php uaparser-cli.php -c [-s] [-n]
87
-
88
- By default is verbose. Use `-s` to turn that feature off. By default creates a back-up. Use `-n` to turn that feature off.
89
-
90
- ### Grab Just the Latest regexes.yaml File From the Repository
91
-
92
- If you need to add a new UA it's easier to edit the original YAML and then convert it to JSON.
93
-
94
- php uaparser-cli.php -y
95
-
96
- Fetches an updated YAML file. *Warning:* This method overwrites any existing `regexes.yaml` file.
97
-
98
- ### Parse an Apache Log File
99
-
100
- Parses the supplied Apache log file to test UAParser.php. Saves the UA to a file when the UA or OS family aren't recognized or when the UA is listed as a generic smartphone or as a generic feature phone.
101
-
102
- php uaparser-cli.php -l "/path/to/apache/logfile"
103
-
104
-
105
- ### Parse a Single User Agent String
106
-
107
- Parses a user agent string and dumps the results as a list.
108
-
109
- php uaparser-cli.php [-p] [-j] "your user agent string"
110
-
111
- Use the `-j` flag to print the result as JSON. Use the `-p` flag to pretty print the JSON result when using PHP 5.4+.
112
-
113
- ## Credits ##
114
-
115
- Thanks to the [original ua-parser team](http://code.google.com/p/ua-parser/people/list) for making the YAML file available for others to build upon.
116
-
117
- Also, many thanks to the following major contributors to the PHP library:
118
-
119
- * Bryan Shelton
120
- * Michael Bond
121
- * @rjd22
122
- * Timo Tijhof
123
- * Marcus Bointon
124
- * Ryan Parman
125
- * Pravin Dahal
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/lib/spyc-0.5/COPYING DELETED
@@ -1,21 +0,0 @@
1
- The MIT License
2
-
3
- Copyright (c) 2011 Vladimir Andersen
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/lib/spyc-0.5/README DELETED
@@ -1,159 +0,0 @@
1
- #
2
- # S P Y C
3
- # a simple php yaml class
4
- #
5
- # Load this README!
6
- # >> $readme = Spyc::YAMLLoad('README');
7
- #
8
- --- %YAML:1.1
9
- title: Spyc -- a Simple PHP YAML Class
10
- version: 0.5
11
- authors: [chris wanstrath (chris@ozmm.org), vlad andersen (vlad.andersen@gmail.com)]
12
- websites: [http://www.yaml.org, http://spyc.sourceforge.net]
13
- license: [MIT License, http://www.opensource.org/licenses/mit-license.php]
14
- copyright: "(c) 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen"
15
- tested on: [php 5.2.x]
16
-
17
- installation: >
18
- Copy spyc.php to a directory you can
19
- access with your YAML-ready PHP script.
20
-
21
- That's it!
22
-
23
- about: >
24
- From www.yaml.org:
25
-
26
- "YAML(tm) (rhymes with 'camel') is a human-friendly, cross language,
27
- Unicode based data serialization language designed around the common
28
- native data structures of agile programming languages. It is broadly
29
- useful for programming needs ranging from configuration files to
30
- Internet messaging to object persistence to data auditing. Together
31
- with the Unicode standard for characters, the YAML specification provides
32
- all the information necessary to understand YAML Version 1.1 and to
33
- creating programs that process YAML information.
34
-
35
- YAML(tm) is a balance of the following design goals:
36
- - YAML documents are very readable by humans.
37
- - YAML interacts well with scripting languages.
38
- - YAML uses host languages' native data structures.
39
- - YAML has a consistent information model.
40
- - YAML enables stream-based processing.
41
- - YAML is expressive and extensible.
42
- - YAML is easy to implement."
43
-
44
- YAML makes a lot of sense. It's easy to use, easy to learn, and cool.
45
- As the lucky stiff named why once said, "YAML is a beacon of light."
46
-
47
- If you're new to YAML, may we suggest YAML In Five Minutes:
48
- - http://yaml.kwiki.org/?YamlInFiveMinutes
49
-
50
- If you don't have five minutes, realize that this README is a completely
51
- valid YAML document. Dig in, load this or any YAML file into an array
52
- with Spyc and see how easy it is to translate friendly text into usable
53
- data.
54
-
55
- The purpose of Spyc is to provide a pure PHP alternative to Syck, a
56
- simple API for loading and dumping YAML documents, a YAML loader which
57
- understands a usable subset of the YAML spec, and to further spread
58
- the glory of YAML to the PHP masses.
59
-
60
- If you're at all hesitant ("usable subset of YAML?!"), navigate
61
- http://yaml.org/start.html. Spyc completely understands the YAML
62
- document shown there, a document which has features way beyond the
63
- scope of what normal config files might require. Try it for yourself,
64
- and then start enjoying the peace of mind YAML brings to your life.
65
-
66
- meat and a few potatoes:
67
- - concept: Loading a YAML document into PHP
68
- brief: >
69
- $yaml will become an array of all the data in wicked.yaml
70
- code: |
71
-
72
- include('spyc.php');
73
-
74
- $yaml = Spyc::YAMLLoad('wicked.yaml');
75
-
76
- - concept: Loading a YAML string into PHP
77
- brief: >
78
- $array will look like this:
79
- array('A YAML','document in a','string')
80
- code: |
81
-
82
- include('spyc.php');
83
-
84
- $yaml = '- A YAML\n- document in a\n- string.';
85
- $array = Spyc::YAMLLoad($yaml);
86
-
87
- - concept: Dumping a PHP array to YAML
88
- brief: >
89
- $yaml will become a string of a YAML document created from
90
- $array.
91
- code: |
92
-
93
- include('spyc.php');
94
-
95
- $array['name'] = 'chris';
96
- $array['sport'] = 'curbing';
97
-
98
- $yaml = Spyc::YAMLDump($array);
99
-
100
- prior art:
101
- - who: [Brian Ingerson, Clark Evans, Oren Ben-Kiki]
102
- why?: >
103
- The YAML spec is really a piece of work, and these guys
104
- did a great job on it. A simple and elegant language like
105
- YAML was a long time coming and it's refreshing to know
106
- such able minded individuals took the task to heart and
107
- executed it with cunning and strength. In addition to
108
- their various noteworthy contributions to YAML parsers
109
- and related projects, YAML.pm's README is a treasure trove
110
- of information for knowledge seekers. Thanks, guys.
111
-
112
- - who: why the lucky stiff
113
- why?: >
114
- As the author of Syck, the code used in Ruby for the language's
115
- YAML class and methods, why is indirectly (directly?) responsible
116
- for my first exposure to YAML (as a config file in a Ruby web-app)
117
- and the countless hours I spent playing with this sheik new data
118
- format afterwards. Syck's README is a YAML file and thus the
119
- inspiration for this file and, even, this very piece of software.
120
-
121
- - who: Steve Howell
122
- why?: >
123
- Python's YAML implementation. PyYAML's README file is also YAML,
124
- so it too inspired the YAML format of this README file.
125
-
126
- - who: [Rasmus Lerdorf, Zeev Suraski, Andi Gutmans, et al]
127
- why?: >
128
- PHP is great at what it does best. It's also paid a lot of my bills.
129
- Thanks.
130
-
131
- bugs:
132
- report: >
133
- Please see Spyc's Sourceforge project page for information on reporting bugs.
134
- speed: >
135
- This implementation was not designed for speed. Rather, it
136
- was designed for those who need a pure PHP implementation of
137
- a YAML parser and who are not overly concerned with performance.
138
- If you want speed, check out Syck.
139
- depth: >
140
- This parser is by no means a comprehensive YAML parser. For supported
141
- features and future plans, check the website.
142
- unicode: >
143
- YAML is supposed to be unicode, but for now we're just using ASCII.
144
- PHP has crappy unicode support but who knows what the future holds.
145
-
146
- resources:
147
- - http://www.yaml.org
148
- - http://www.yaml.org/spec/
149
- - http://yaml.kwiki.org/?YamlInFiveMinutes
150
- - http://www.whytheluckystiff.net/syck/
151
- - http://yaml4r.sourceforge.net/cookbook/
152
-
153
- thanks:
154
- - Adam Wood
155
- - Daniel Ferreira
156
- - Aaron Jensen
157
- - Mike Thornton
158
- - Fabien Potencier
159
- - Mustafa Kumas
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/lib/spyc-0.5/examples/yaml-dump.php DELETED
@@ -1,25 +0,0 @@
1
- <?php
2
-
3
- #
4
- # S P Y C
5
- # a simple php yaml class
6
- #
7
- # Feel free to dump an array to YAML, and then to load that YAML back into an
8
- # array. This is a good way to test the limitations of the parser and maybe
9
- # learn some basic YAML.
10
- #
11
-
12
- include('../spyc.php');
13
-
14
- $array[] = 'Sequence item';
15
- $array['The Key'] = 'Mapped value';
16
- $array[] = array('A sequence','of a sequence');
17
- $array[] = array('first' => 'A sequence','second' => 'of mapped values');
18
- $array['Mapped'] = array('A sequence','which is mapped');
19
- $array['A Note'] = 'What if your text is too long?';
20
- $array['Another Note'] = 'If that is the case, the dumper will probably fold your text by using a block. Kinda like this.';
21
- $array['The trick?'] = 'The trick is that we overrode the default indent, 2, to 4 and the default wordwrap, 40, to 60.';
22
- $array['Old Dog'] = "And if you want\n to preserve line breaks, \ngo ahead!";
23
- $array['key:withcolon'] = "Should support this to";
24
-
25
- $yaml = Spyc::YAMLDump($array,4,60);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/lib/spyc-0.5/examples/yaml-load.php DELETED
@@ -1,21 +0,0 @@
1
- <?php
2
-
3
- #
4
- # S P Y C
5
- # a simple php yaml class
6
- #
7
- # license: [MIT License, http://www.opensource.org/licenses/mit-license.php]
8
- #
9
-
10
- include('../spyc.php');
11
-
12
- $array = Spyc::YAMLLoad('../spyc.yaml');
13
-
14
- echo '<pre><a href="spyc.yaml">spyc.yaml</a> loaded into PHP:<br/>';
15
- print_r($array);
16
- echo '</pre>';
17
-
18
-
19
- echo '<pre>YAML Data dumped back:<br/>';
20
- echo Spyc::YAMLDump($array);
21
- echo '</pre>';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/lib/spyc-0.5/spyc.php DELETED
@@ -1,1046 +0,0 @@
1
- <?php
2
- /**
3
- * Spyc -- A Simple PHP YAML Class
4
- * @version 0.5
5
- * @author Vlad Andersen <vlad.andersen@gmail.com>
6
- * @author Chris Wanstrath <chris@ozmm.org>
7
- * @link http://code.google.com/p/spyc/
8
- * @copyright Copyright 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen
9
- * @license http://www.opensource.org/licenses/mit-license.php MIT License
10
- * @package Spyc
11
- */
12
-
13
- if (!function_exists('spyc_load')) {
14
- /**
15
- * Parses YAML to array.
16
- * @param string $string YAML string.
17
- * @return array
18
- */
19
- function spyc_load ($string) {
20
- return Spyc::YAMLLoadString($string);
21
- }
22
- }
23
-
24
- if (!function_exists('spyc_load_file')) {
25
- /**
26
- * Parses YAML to array.
27
- * @param string $file Path to YAML file.
28
- * @return array
29
- */
30
- function spyc_load_file ($file) {
31
- return Spyc::YAMLLoad($file);
32
- }
33
- }
34
-
35
- /**
36
- * The Simple PHP YAML Class.
37
- *
38
- * This class can be used to read a YAML file and convert its contents
39
- * into a PHP array. It currently supports a very limited subsection of
40
- * the YAML spec.
41
- *
42
- * Usage:
43
- * <code>
44
- * $Spyc = new Spyc;
45
- * $array = $Spyc->load($file);
46
- * </code>
47
- * or:
48
- * <code>
49
- * $array = Spyc::YAMLLoad($file);
50
- * </code>
51
- * or:
52
- * <code>
53
- * $array = spyc_load_file($file);
54
- * </code>
55
- * @package Spyc
56
- */
57
- class Spyc {
58
-
59
- // SETTINGS
60
-
61
- const REMPTY = "\0\0\0\0\0";
62
-
63
- /**
64
- * Setting this to true will force YAMLDump to enclose any string value in
65
- * quotes. False by default.
66
- *
67
- * @var bool
68
- */
69
- public $setting_dump_force_quotes = false;
70
-
71
- /**
72
- * Setting this to true will forse YAMLLoad to use syck_load function when
73
- * possible. False by default.
74
- * @var bool
75
- */
76
- public $setting_use_syck_is_possible = false;
77
-
78
-
79
-
80
- /**#@+
81
- * @access private
82
- * @var mixed
83
- */
84
- private $_dumpIndent;
85
- private $_dumpWordWrap;
86
- private $_containsGroupAnchor = false;
87
- private $_containsGroupAlias = false;
88
- private $path;
89
- private $result;
90
- private $LiteralPlaceHolder = '___YAML_Literal_Block___';
91
- private $SavedGroups = array();
92
- private $indent;
93
- /**
94
- * Path modifier that should be applied after adding current element.
95
- * @var array
96
- */
97
- private $delayedPath = array();
98
-
99
- /**#@+
100
- * @access public
101
- * @var mixed
102
- */
103
- public $_nodeId;
104
-
105
- /**
106
- * Load a valid YAML string to Spyc.
107
- * @param string $input
108
- * @return array
109
- */
110
- public function load ($input) {
111
- return $this->__loadString($input);
112
- }
113
-
114
- /**
115
- * Load a valid YAML file to Spyc.
116
- * @param string $file
117
- * @return array
118
- */
119
- public function loadFile ($file) {
120
- return $this->__load($file);
121
- }
122
-
123
- /**
124
- * Load YAML into a PHP array statically
125
- *
126
- * The load method, when supplied with a YAML stream (string or file),
127
- * will do its best to convert YAML in a file into a PHP array. Pretty
128
- * simple.
129
- * Usage:
130
- * <code>
131
- * $array = Spyc::YAMLLoad('lucky.yaml');
132
- * print_r($array);
133
- * </code>
134
- * @access public
135
- * @return array
136
- * @param string $input Path of YAML file or string containing YAML
137
- */
138
- public static function YAMLLoad($input) {
139
- $Spyc = new Spyc;
140
- return $Spyc->__load($input);
141
- }
142
-
143
- /**
144
- * Load a string of YAML into a PHP array statically
145
- *
146
- * The load method, when supplied with a YAML string, will do its best
147
- * to convert YAML in a string into a PHP array. Pretty simple.
148
- *
149
- * Note: use this function if you don't want files from the file system
150
- * loaded and processed as YAML. This is of interest to people concerned
151
- * about security whose input is from a string.
152
- *
153
- * Usage:
154
- * <code>
155
- * $array = Spyc::YAMLLoadString("---\n0: hello world\n");
156
- * print_r($array);
157
- * </code>
158
- * @access public
159
- * @return array
160
- * @param string $input String containing YAML
161
- */
162
- public static function YAMLLoadString($input) {
163
- $Spyc = new Spyc;
164
- return $Spyc->__loadString($input);
165
- }
166
-
167
- /**
168
- * Dump YAML from PHP array statically
169
- *
170
- * The dump method, when supplied with an array, will do its best
171
- * to convert the array into friendly YAML. Pretty simple. Feel free to
172
- * save the returned string as nothing.yaml and pass it around.
173
- *
174
- * Oh, and you can decide how big the indent is and what the wordwrap
175
- * for folding is. Pretty cool -- just pass in 'false' for either if
176
- * you want to use the default.
177
- *
178
- * Indent's default is 2 spaces, wordwrap's default is 40 characters. And
179
- * you can turn off wordwrap by passing in 0.
180
- *
181
- * @access public
182
- * @return string
183
- * @param array $array PHP array
184
- * @param int $indent Pass in false to use the default, which is 2
185
- * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40)
186
- */
187
- public static function YAMLDump($array,$indent = false,$wordwrap = false) {
188
- $spyc = new Spyc;
189
- return $spyc->dump($array,$indent,$wordwrap);
190
- }
191
-
192
-
193
- /**
194
- * Dump PHP array to YAML
195
- *
196
- * The dump method, when supplied with an array, will do its best
197
- * to convert the array into friendly YAML. Pretty simple. Feel free to
198
- * save the returned string as tasteful.yaml and pass it around.
199
- *
200
- * Oh, and you can decide how big the indent is and what the wordwrap
201
- * for folding is. Pretty cool -- just pass in 'false' for either if
202
- * you want to use the default.
203
- *
204
- * Indent's default is 2 spaces, wordwrap's default is 40 characters. And
205
- * you can turn off wordwrap by passing in 0.
206
- *
207
- * @access public
208
- * @return string
209
- * @param array $array PHP array
210
- * @param int $indent Pass in false to use the default, which is 2
211
- * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40)
212
- */
213
- public function dump($array,$indent = false,$wordwrap = false) {
214
- // Dumps to some very clean YAML. We'll have to add some more features
215
- // and options soon. And better support for folding.
216
-
217
- // New features and options.
218
- if ($indent === false or !is_numeric($indent)) {
219
- $this->_dumpIndent = 2;
220
- } else {
221
- $this->_dumpIndent = $indent;
222
- }
223
-
224
- if ($wordwrap === false or !is_numeric($wordwrap)) {
225
- $this->_dumpWordWrap = 40;
226
- } else {
227
- $this->_dumpWordWrap = $wordwrap;
228
- }
229
-
230
- // New YAML document
231
- $string = "---\n";
232
-
233
- // Start at the base of the array and move through it.
234
- if ($array) {
235
- $array = (array)$array;
236
- $previous_key = -1;
237
- foreach ($array as $key => $value) {
238
- if (!isset($first_key)) $first_key = $key;
239
- $string .= $this->_yamlize($key,$value,0,$previous_key, $first_key, $array);
240
- $previous_key = $key;
241
- }
242
- }
243
- return $string;
244
- }
245
-
246
- /**
247
- * Attempts to convert a key / value array item to YAML
248
- * @access private
249
- * @return string
250
- * @param $key The name of the key
251
- * @param $value The value of the item
252
- * @param $indent The indent of the current node
253
- */
254
- private function _yamlize($key,$value,$indent, $previous_key = -1, $first_key = 0, $source_array = null) {
255
- if (is_array($value)) {
256
- if (empty ($value))
257
- return $this->_dumpNode($key, array(), $indent, $previous_key, $first_key, $source_array);
258
- // It has children. What to do?
259
- // Make it the right kind of item
260
- $string = $this->_dumpNode($key, self::REMPTY, $indent, $previous_key, $first_key, $source_array);
261
- // Add the indent
262
- $indent += $this->_dumpIndent;
263
- // Yamlize the array
264
- $string .= $this->_yamlizeArray($value,$indent);
265
- } elseif (!is_array($value)) {
266
- // It doesn't have children. Yip.
267
- $string = $this->_dumpNode($key, $value, $indent, $previous_key, $first_key, $source_array);
268
- }
269
- return $string;
270
- }
271
-
272
- /**
273
- * Attempts to convert an array to YAML
274
- * @access private
275
- * @return string
276
- * @param $array The array you want to convert
277
- * @param $indent The indent of the current level
278
- */
279
- private function _yamlizeArray($array,$indent) {
280
- if (is_array($array)) {
281
- $string = '';
282
- $previous_key = -1;
283
- foreach ($array as $key => $value) {
284
- if (!isset($first_key)) $first_key = $key;
285
- $string .= $this->_yamlize($key, $value, $indent, $previous_key, $first_key, $array);
286
- $previous_key = $key;
287
- }
288
- return $string;
289
- } else {
290
- return false;
291
- }
292
- }
293
-
294
- /**
295
- * Returns YAML from a key and a value
296
- * @access private
297
- * @return string
298
- * @param $key The name of the key
299
- * @param $value The value of the item
300
- * @param $indent The indent of the current node
301
- */
302
- private function _dumpNode($key, $value, $indent, $previous_key = -1, $first_key = 0, $source_array = null) {
303
- // do some folding here, for blocks
304
- if (is_string ($value) && ((strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false ||
305
- strpos($value,"*") !== false || strpos($value,"#") !== false || strpos($value,"<") !== false || strpos($value,">") !== false || strpos ($value, ' ') !== false ||
306
- strpos($value,"[") !== false || strpos($value,"]") !== false || strpos($value,"{") !== false || strpos($value,"}") !== false) || strpos($value,"&") !== false || strpos($value, "'") !== false || strpos($value, "!") === 0 ||
307
- substr ($value, -1, 1) == ':')
308
- ) {
309
- $value = $this->_doLiteralBlock($value,$indent);
310
- } else {
311
- $value = $this->_doFolding($value,$indent);
312
- }
313
-
314
- if ($value === array()) $value = '[ ]';
315
- if (in_array ($value, array ('true', 'TRUE', 'false', 'FALSE', 'y', 'Y', 'n', 'N', 'null', 'NULL'), true)) {
316
- $value = $this->_doLiteralBlock($value,$indent);
317
- }
318
- if (trim ($value) != $value)
319
- $value = $this->_doLiteralBlock($value,$indent);
320
-
321
- if (is_bool($value)) {
322
- $value = ($value) ? "true" : "false";
323
- }
324
-
325
- if ($value === null) $value = 'null';
326
- if ($value === "'" . self::REMPTY . "'") $value = null;
327
-
328
- $spaces = str_repeat(' ',$indent);
329
-
330
- //if (is_int($key) && $key - 1 == $previous_key && $first_key===0) {
331
- if (is_array ($source_array) && array_keys($source_array) === range(0, count($source_array) - 1)) {
332
- // It's a sequence
333
- $string = $spaces.'- '.$value."\n";
334
- } else {
335
- // if ($first_key===0) throw new Exception('Keys are all screwy. The first one was zero, now it\'s "'. $key .'"');
336
- // It's mapped
337
- if (strpos($key, ":") !== false || strpos($key, "#") !== false) { $key = '"' . $key . '"'; }
338
- $string = rtrim ($spaces.$key.': '.$value)."\n";
339
- }
340
- return $string;
341
- }
342
-
343
- /**
344
- * Creates a literal block for dumping
345
- * @access private
346
- * @return string
347
- * @param $value
348
- * @param $indent int The value of the indent
349
- */
350
- private function _doLiteralBlock($value,$indent) {
351
- if ($value === "\n") return '\n';
352
- if (strpos($value, "\n") === false && strpos($value, "'") === false) {
353
- return sprintf ("'%s'", $value);
354
- }
355
- if (strpos($value, "\n") === false && strpos($value, '"') === false) {
356
- return sprintf ('"%s"', $value);
357
- }
358
- $exploded = explode("\n",$value);
359
- $newValue = '|';
360
- $indent += $this->_dumpIndent;
361
- $spaces = str_repeat(' ',$indent);
362
- foreach ($exploded as $line) {
363
- $newValue .= "\n" . $spaces . ($line);
364
- }
365
- return $newValue;
366
- }
367
-
368
- /**
369
- * Folds a string of text, if necessary
370
- * @access private
371
- * @return string
372
- * @param $value The string you wish to fold
373
- */
374
- private function _doFolding($value,$indent) {
375
- // Don't do anything if wordwrap is set to 0
376
-
377
- if ($this->_dumpWordWrap !== 0 && is_string ($value) && strlen($value) > $this->_dumpWordWrap) {
378
- $indent += $this->_dumpIndent;
379
- $indent = str_repeat(' ',$indent);
380
- $wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent");
381
- $value = ">\n".$indent.$wrapped;
382
- } else {
383
- if ($this->setting_dump_force_quotes && is_string ($value) && $value !== self::REMPTY)
384
- $value = '"' . $value . '"';
385
- }
386
-
387
-
388
- return $value;
389
- }
390
-
391
- // LOADING FUNCTIONS
392
-
393
- private function __load($input) {
394
- $Source = $this->loadFromSource($input);
395
- return $this->loadWithSource($Source);
396
- }
397
-
398
- private function __loadString($input) {
399
- $Source = $this->loadFromString($input);
400
- return $this->loadWithSource($Source);
401
- }
402
-
403
- private function loadWithSource($Source) {
404
- if (empty ($Source)) return array();
405
- if ($this->setting_use_syck_is_possible && function_exists ('syck_load')) {
406
- $array = syck_load (implode ('', $Source));
407
- return is_array($array) ? $array : array();
408
- }
409
-
410
- $this->path = array();
411
- $this->result = array();
412
-
413
- $cnt = count($Source);
414
- for ($i = 0; $i < $cnt; $i++) {
415
- $line = $Source[$i];
416
-
417
- $this->indent = strlen($line) - strlen(ltrim($line));
418
- $tempPath = $this->getParentPathByIndent($this->indent);
419
- $line = self::stripIndent($line, $this->indent);
420
- if (self::isComment($line)) continue;
421
- if (self::isEmpty($line)) continue;
422
- $this->path = $tempPath;
423
-
424
- $literalBlockStyle = self::startsLiteralBlock($line);
425
- if ($literalBlockStyle) {
426
- $line = rtrim ($line, $literalBlockStyle . " \n");
427
- $literalBlock = '';
428
- $line .= $this->LiteralPlaceHolder;
429
- $literal_block_indent = strlen($Source[$i+1]) - strlen(ltrim($Source[$i+1]));
430
- while (++$i < $cnt && $this->literalBlockContinues($Source[$i], $this->indent)) {
431
- $literalBlock = $this->addLiteralLine($literalBlock, $Source[$i], $literalBlockStyle, $literal_block_indent);
432
- }
433
- $i--;
434
- }
435
-
436
- while (++$i < $cnt && self::greedilyNeedNextLine($line)) {
437
- $line = rtrim ($line, " \n\t\r") . ' ' . ltrim ($Source[$i], " \t");
438
- }
439
- $i--;
440
-
441
-
442
-
443
- if (strpos ($line, '#')) {
444
- if (strpos ($line, '"') === false && strpos ($line, "'") === false)
445
- $line = preg_replace('/\s+#(.+)$/','',$line);
446
- }
447
-
448
- $lineArray = $this->_parseLine($line);
449
-
450
- if ($literalBlockStyle)
451
- $lineArray = $this->revertLiteralPlaceHolder ($lineArray, $literalBlock);
452
-
453
- $this->addArray($lineArray, $this->indent);
454
-
455
- foreach ($this->delayedPath as $indent => $delayedPath)
456
- $this->path[$indent] = $delayedPath;
457
-
458
- $this->delayedPath = array();
459
-
460
- }
461
- return $this->result;
462
- }
463
-
464
- private function loadFromSource ($input) {
465
- if (!empty($input) && strpos($input, "\n") === false && file_exists($input))
466
- return file($input);
467
-
468
- return $this->loadFromString($input);
469
- }
470
-
471
- private function loadFromString ($input) {
472
- $lines = explode("\n",$input);
473
- foreach ($lines as $k => $_) {
474
- $lines[$k] = rtrim ($_, "\r");
475
- }
476
- return $lines;
477
- }
478
-
479
- /**
480
- * Parses YAML code and returns an array for a node
481
- * @access private
482
- * @return array
483
- * @param string $line A line from the YAML file
484
- */
485
- private function _parseLine($line) {
486
- if (!$line) return array();
487
- $line = trim($line);
488
- if (!$line) return array();
489
-
490
- $array = array();
491
-
492
- $group = $this->nodeContainsGroup($line);
493
- if ($group) {
494
- $this->addGroup($line, $group);
495
- $line = $this->stripGroup ($line, $group);
496
- }
497
-
498
- if ($this->startsMappedSequence($line))
499
- return $this->returnMappedSequence($line);
500
-
501
- if ($this->startsMappedValue($line))
502
- return $this->returnMappedValue($line);
503
-
504
- if ($this->isArrayElement($line))
505
- return $this->returnArrayElement($line);
506
-
507
- if ($this->isPlainArray($line))
508
- return $this->returnPlainArray($line);
509
-
510
-
511
- return $this->returnKeyValuePair($line);
512
-
513
- }
514
-
515
- /**
516
- * Finds the type of the passed value, returns the value as the new type.
517
- * @access private
518
- * @param string $value
519
- * @return mixed
520
- */
521
- private function _toType($value) {
522
- if ($value === '') return null;
523
- $first_character = $value[0];
524
- $last_character = substr($value, -1, 1);
525
-
526
- $is_quoted = false;
527
- do {
528
- if (!$value) break;
529
- if ($first_character != '"' && $first_character != "'") break;
530
- if ($last_character != '"' && $last_character != "'") break;
531
- $is_quoted = true;
532
- } while (0);
533
-
534
- if ($is_quoted)
535
- return strtr(substr ($value, 1, -1), array ('\\"' => '"', '\'\'' => '\'', '\\\'' => '\''));
536
-
537
- if (strpos($value, ' #') !== false && !$is_quoted)
538
- $value = preg_replace('/\s+#(.+)$/','',$value);
539
-
540
- if (!$is_quoted) $value = str_replace('\n', "\n", $value);
541
-
542
- if ($first_character == '[' && $last_character == ']') {
543
- // Take out strings sequences and mappings
544
- $innerValue = trim(substr ($value, 1, -1));
545
- if ($innerValue === '') return array();
546
- $explode = $this->_inlineEscape($innerValue);
547
- // Propagate value array
548
- $value = array();
549
- foreach ($explode as $v) {
550
- $value[] = $this->_toType($v);
551
- }
552
- return $value;
553
- }
554
-
555
- if (strpos($value,': ')!==false && $first_character != '{') {
556
- $array = explode(': ',$value);
557
- $key = trim($array[0]);
558
- array_shift($array);
559
- $value = trim(implode(': ',$array));
560
- $value = $this->_toType($value);
561
- return array($key => $value);
562
- }
563
-
564
- if ($first_character == '{' && $last_character == '}') {
565
- $innerValue = trim(substr ($value, 1, -1));
566
- if ($innerValue === '') return array();
567
- // Inline Mapping
568
- // Take out strings sequences and mappings
569
- $explode = $this->_inlineEscape($innerValue);
570
- // Propagate value array
571
- $array = array();
572
- foreach ($explode as $v) {
573
- $SubArr = $this->_toType($v);
574
- if (empty($SubArr)) continue;
575
- if (is_array ($SubArr)) {
576
- $array[key($SubArr)] = $SubArr[key($SubArr)]; continue;
577
- }
578
- $array[] = $SubArr;
579
- }
580
- return $array;
581
- }
582
-
583
- if ($value == 'null' || $value == 'NULL' || $value == 'Null' || $value == '' || $value == '~') {
584
- return null;
585
- }
586
-
587
- if ( is_numeric($value) && preg_match ('/^(-|)[1-9]+[0-9]*$/', $value) ){
588
- $intvalue = (int)$value;
589
- if ($intvalue != PHP_INT_MAX)
590
- $value = $intvalue;
591
- return $value;
592
- }
593
-
594
- if (in_array($value,
595
- array('true', 'on', '+', 'yes', 'y', 'True', 'TRUE', 'On', 'ON', 'YES', 'Yes', 'Y'))) {
596
- return true;
597
- }
598
-
599
- if (in_array(strtolower($value),
600
- array('false', 'off', '-', 'no', 'n'))) {
601
- return false;
602
- }
603
-
604
- if (is_numeric($value)) {
605
- if ($value === '0') return 0;
606
- if (rtrim ($value, 0) === $value)
607
- $value = (float)$value;
608
- return $value;
609
- }
610
-
611
- return $value;
612
- }
613
-
614
- /**
615
- * Used in inlines to check for more inlines or quoted strings
616
- * @access private
617
- * @return array
618
- */
619
- private function _inlineEscape($inline) {
620
- // There's gotta be a cleaner way to do this...
621
- // While pure sequences seem to be nesting just fine,
622
- // pure mappings and mappings with sequences inside can't go very
623
- // deep. This needs to be fixed.
624
-
625
- $seqs = array();
626
- $maps = array();
627
- $saved_strings = array();
628
-
629
- // Check for strings
630
- $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/';
631
- if (preg_match_all($regex,$inline,$strings)) {
632
- $saved_strings = $strings[0];
633
- $inline = preg_replace($regex,'YAMLString',$inline);
634
- }
635
- unset($regex);
636
-
637
- $i = 0;
638
- do {
639
-
640
- // Check for sequences
641
- while (preg_match('/\[([^{}\[\]]+)\]/U',$inline,$matchseqs)) {
642
- $seqs[] = $matchseqs[0];
643
- $inline = preg_replace('/\[([^{}\[\]]+)\]/U', ('YAMLSeq' . (count($seqs) - 1) . 's'), $inline, 1);
644
- }
645
-
646
- // Check for mappings
647
- while (preg_match('/{([^\[\]{}]+)}/U',$inline,$matchmaps)) {
648
- $maps[] = $matchmaps[0];
649
- $inline = preg_replace('/{([^\[\]{}]+)}/U', ('YAMLMap' . (count($maps) - 1) . 's'), $inline, 1);
650
- }
651
-
652
- if ($i++ >= 10) break;
653
-
654
- } while (strpos ($inline, '[') !== false || strpos ($inline, '{') !== false);
655
-
656
- $explode = explode(', ',$inline);
657
- $stringi = 0; $i = 0;
658
-
659
- while (1) {
660
-
661
- // Re-add the sequences
662
- if (!empty($seqs)) {
663
- foreach ($explode as $key => $value) {
664
- if (strpos($value,'YAMLSeq') !== false) {
665
- foreach ($seqs as $seqk => $seq) {
666
- $explode[$key] = str_replace(('YAMLSeq'.$seqk.'s'),$seq,$value);
667
- $value = $explode[$key];
668
- }
669
- }
670
- }
671
- }
672
-
673
- // Re-add the mappings
674
- if (!empty($maps)) {
675
- foreach ($explode as $key => $value) {
676
- if (strpos($value,'YAMLMap') !== false) {
677
- foreach ($maps as $mapk => $map) {
678
- $explode[$key] = str_replace(('YAMLMap'.$mapk.'s'), $map, $value);
679
- $value = $explode[$key];
680
- }
681
- }
682
- }
683
- }
684
-
685
-
686
- // Re-add the strings
687
- if (!empty($saved_strings)) {
688
- foreach ($explode as $key => $value) {
689
- while (strpos($value,'YAMLString') !== false) {
690
- $explode[$key] = preg_replace('/YAMLString/',$saved_strings[$stringi],$value, 1);
691
- unset($saved_strings[$stringi]);
692
- ++$stringi;
693
- $value = $explode[$key];
694
- }
695
- }
696
- }
697
-
698
- $finished = true;
699
- foreach ($explode as $key => $value) {
700
- if (strpos($value,'YAMLSeq') !== false) {
701
- $finished = false; break;
702
- }
703
- if (strpos($value,'YAMLMap') !== false) {
704
- $finished = false; break;
705
- }
706
- if (strpos($value,'YAMLString') !== false) {
707
- $finished = false; break;
708
- }
709
- }
710
- if ($finished) break;
711
-
712
- $i++;
713
- if ($i > 10)
714
- break; // Prevent infinite loops.
715
- }
716
-
717
- return $explode;
718
- }
719
-
720
- private function literalBlockContinues ($line, $lineIndent) {
721
- if (!trim($line)) return true;
722
- if (strlen($line) - strlen(ltrim($line)) > $lineIndent) return true;
723
- return false;
724
- }
725
-
726
- private function referenceContentsByAlias ($alias) {
727
- do {
728
- if (!isset($this->SavedGroups[$alias])) { echo "Bad group name: $alias."; break; }
729
- $groupPath = $this->SavedGroups[$alias];
730
- $value = $this->result;
731
- foreach ($groupPath as $k) {
732
- $value = $value[$k];
733
- }
734
- } while (false);
735
- return $value;
736
- }
737
-
738
- private function addArrayInline ($array, $indent) {
739
- $CommonGroupPath = $this->path;
740
- if (empty ($array)) return false;
741
-
742
- foreach ($array as $k => $_) {
743
- $this->addArray(array($k => $_), $indent);
744
- $this->path = $CommonGroupPath;
745
- }
746
- return true;
747
- }
748
-
749
- private function addArray ($incoming_data, $incoming_indent) {
750
-
751
- // print_r ($incoming_data);
752
-
753
- if (count ($incoming_data) > 1)
754
- return $this->addArrayInline ($incoming_data, $incoming_indent);
755
-
756
- $key = key ($incoming_data);
757
- $value = isset($incoming_data[$key]) ? $incoming_data[$key] : null;
758
- if ($key === '__!YAMLZero') $key = '0';
759
-
760
- if ($incoming_indent == 0 && !$this->_containsGroupAlias && !$this->_containsGroupAnchor) { // Shortcut for root-level values.
761
- if ($key || $key === '' || $key === '0') {
762
- $this->result[$key] = $value;
763
- } else {
764
- $this->result[] = $value; end ($this->result); $key = key ($this->result);
765
- }
766
- $this->path[$incoming_indent] = $key;
767
- return;
768
- }
769
-
770
-
771
-
772
- $history = array();
773
- // Unfolding inner array tree.
774
- $history[] = $_arr = $this->result;
775
- foreach ($this->path as $k) {
776
- $history[] = $_arr = $_arr[$k];
777
- }
778
-
779
- if ($this->_containsGroupAlias) {
780
- $value = $this->referenceContentsByAlias($this->_containsGroupAlias);
781
- $this->_containsGroupAlias = false;
782
- }
783
-
784
-
785
- // Adding string or numeric key to the innermost level or $this->arr.
786
- if (is_string($key) && $key == '<<') {
787
- if (!is_array ($_arr)) { $_arr = array (); }
788
-
789
- $_arr = array_merge ($_arr, $value);
790
- } else if ($key || $key === '' || $key === '0') {
791
- if (!is_array ($_arr))
792
- $_arr = array ($key=>$value);
793
- else
794
- $_arr[$key] = $value;
795
- } else {
796
- if (!is_array ($_arr)) { $_arr = array ($value); $key = 0; }
797
- else { $_arr[] = $value; end ($_arr); $key = key ($_arr); }
798
- }
799
-
800
- $reverse_path = array_reverse($this->path);
801
- $reverse_history = array_reverse ($history);
802
- $reverse_history[0] = $_arr;
803
- $cnt = count($reverse_history) - 1;
804
- for ($i = 0; $i < $cnt; $i++) {
805
- $reverse_history[$i+1][$reverse_path[$i]] = $reverse_history[$i];
806
- }
807
- $this->result = $reverse_history[$cnt];
808
-
809
- $this->path[$incoming_indent] = $key;
810
-
811
- if ($this->_containsGroupAnchor) {
812
- $this->SavedGroups[$this->_containsGroupAnchor] = $this->path;
813
- if (is_array ($value)) {
814
- $k = key ($value);
815
- if (!is_int ($k)) {
816
- $this->SavedGroups[$this->_containsGroupAnchor][$incoming_indent + 2] = $k;
817
- }
818
- }
819
- $this->_containsGroupAnchor = false;
820
- }
821
-
822
- }
823
-
824
- private static function startsLiteralBlock ($line) {
825
- $lastChar = substr (trim($line), -1);
826
- if ($lastChar != '>' && $lastChar != '|') return false;
827
- if ($lastChar == '|') return $lastChar;
828
- // HTML tags should not be counted as literal blocks.
829
- if (preg_match ('#<.*?>$#', $line)) return false;
830
- return $lastChar;
831
- }
832
-
833
- private static function greedilyNeedNextLine($line) {
834
- $line = trim ($line);
835
- if (!strlen($line)) return false;
836
- if (substr ($line, -1, 1) == ']') return false;
837
- if ($line[0] == '[') return true;
838
- if (preg_match ('#^[^:]+?:\s*\[#', $line)) return true;
839
- return false;
840
- }
841
-
842
- private function addLiteralLine ($literalBlock, $line, $literalBlockStyle, $indent = -1) {
843
- $line = self::stripIndent($line, $indent);
844
- if ($literalBlockStyle !== '|') {
845
- $line = self::stripIndent($line);
846
- }
847
- $line = rtrim ($line, "\r\n\t ") . "\n";
848
- if ($literalBlockStyle == '|') {
849
- return $literalBlock . $line;
850
- }
851
- if (strlen($line) == 0)
852
- return rtrim($literalBlock, ' ') . "\n";
853
- if ($line == "\n" && $literalBlockStyle == '>') {
854
- return rtrim ($literalBlock, " \t") . "\n";
855
- }
856
- if ($line != "\n")
857
- $line = trim ($line, "\r\n ") . " ";
858
- return $literalBlock . $line;
859
- }
860
-
861
- function revertLiteralPlaceHolder ($lineArray, $literalBlock) {
862
- foreach ($lineArray as $k => $_) {
863
- if (is_array($_))
864
- $lineArray[$k] = $this->revertLiteralPlaceHolder ($_, $literalBlock);
865
- else if (substr($_, -1 * strlen ($this->LiteralPlaceHolder)) == $this->LiteralPlaceHolder)
866
- $lineArray[$k] = rtrim ($literalBlock, " \r\n");
867
- }
868
- return $lineArray;
869
- }
870
-
871
- private static function stripIndent ($line, $indent = -1) {
872
- if ($indent == -1) $indent = strlen($line) - strlen(ltrim($line));
873
- return substr ($line, $indent);
874
- }
875
-
876
- private function getParentPathByIndent ($indent) {
877
- if ($indent == 0) return array();
878
- $linePath = $this->path;
879
- do {
880
- end($linePath); $lastIndentInParentPath = key($linePath);
881
- if ($indent <= $lastIndentInParentPath) array_pop ($linePath);
882
- } while ($indent <= $lastIndentInParentPath);
883
- return $linePath;
884
- }
885
-
886
-
887
- private function clearBiggerPathValues ($indent) {
888
-
889
-
890
- if ($indent == 0) $this->path = array();
891
- if (empty ($this->path)) return true;
892
-
893
- foreach ($this->path as $k => $_) {
894
- if ($k > $indent) unset ($this->path[$k]);
895
- }
896
-
897
- return true;
898
- }
899
-
900
-
901
- private static function isComment ($line) {
902
- if (!$line) return false;
903
- if ($line[0] == '#') return true;
904
- if (trim($line, " \r\n\t") == '---') return true;
905
- return false;
906
- }
907
-
908
- private static function isEmpty ($line) {
909
- return (trim ($line) === '');
910
- }
911
-
912
-
913
- private function isArrayElement ($line) {
914
- if (!$line) return false;
915
- if ($line[0] != '-') return false;
916
- if (strlen ($line) > 3)
917
- if (substr($line,0,3) == '---') return false;
918
-
919
- return true;
920
- }
921
-
922
- private function isHashElement ($line) {
923
- return strpos($line, ':');
924
- }
925
-
926
- private function isLiteral ($line) {
927
- if ($this->isArrayElement($line)) return false;
928
- if ($this->isHashElement($line)) return false;
929
- return true;
930
- }
931
-
932
-
933
- private static function unquote ($value) {
934
- if (!$value) return $value;
935
- if (!is_string($value)) return $value;
936
- if ($value[0] == '\'') return trim ($value, '\'');
937
- if ($value[0] == '"') return trim ($value, '"');
938
- return $value;
939
- }
940
-
941
- private function startsMappedSequence ($line) {
942
- return ($line[0] == '-' && substr ($line, -1, 1) == ':');
943
- }
944
-
945
- private function returnMappedSequence ($line) {
946
- $array = array();
947
- $key = self::unquote(trim(substr($line,1,-1)));
948
- $array[$key] = array();
949
- $this->delayedPath = array(strpos ($line, $key) + $this->indent => $key);
950
- return array($array);
951
- }
952
-
953
- private function returnMappedValue ($line) {
954
- $array = array();
955
- $key = self::unquote (trim(substr($line,0,-1)));
956
- $array[$key] = '';
957
- return $array;
958
- }
959
-
960
- private function startsMappedValue ($line) {
961
- return (substr ($line, -1, 1) == ':');
962
- }
963
-
964
- private function isPlainArray ($line) {
965
- return ($line[0] == '[' && substr ($line, -1, 1) == ']');
966
- }
967
-
968
- private function returnPlainArray ($line) {
969
- return $this->_toType($line);
970
- }
971
-
972
- private function returnKeyValuePair ($line) {
973
- $array = array();
974
- $key = '';
975
- if (strpos ($line, ':')) {
976
- // It's a key/value pair most likely
977
- // If the key is in double quotes pull it out
978
- if (($line[0] == '"' || $line[0] == "'") && preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) {
979
- $value = trim(str_replace($matches[1],'',$line));
980
- $key = $matches[2];
981
- } else {
982
- // Do some guesswork as to the key and the value
983
- $explode = explode(':',$line);
984
- $key = trim($explode[0]);
985
- array_shift($explode);
986
- $value = trim(implode(':',$explode));
987
- }
988
- // Set the type of the value. Int, string, etc
989
- $value = $this->_toType($value);
990
- if ($key === '0') $key = '__!YAMLZero';
991
- $array[$key] = $value;
992
- } else {
993
- $array = array ($line);
994
- }
995
- return $array;
996
-
997
- }
998
-
999
-
1000
- private function returnArrayElement ($line) {
1001
- if (strlen($line) <= 1) return array(array()); // Weird %)
1002
- $array = array();
1003
- $value = trim(substr($line,1));
1004
- $value = $this->_toType($value);
1005
- $array[] = $value;
1006
- return $array;
1007
- }
1008
-
1009
-
1010
- private function nodeContainsGroup ($line) {
1011
- $symbolsForReference = 'A-z0-9_\-';
1012
- if (strpos($line, '&') === false && strpos($line, '*') === false) return false; // Please die fast ;-)
1013
- if ($line[0] == '&' && preg_match('/^(&['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1];
1014
- if ($line[0] == '*' && preg_match('/^(\*['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1];
1015
- if (preg_match('/(&['.$symbolsForReference.']+)$/', $line, $matches)) return $matches[1];
1016
- if (preg_match('/(\*['.$symbolsForReference.']+$)/', $line, $matches)) return $matches[1];
1017
- if (preg_match ('#^\s*<<\s*:\s*(\*[^\s]+).*$#', $line, $matches)) return $matches[1];
1018
- return false;
1019
-
1020
- }
1021
-
1022
- private function addGroup ($line, $group) {
1023
- if ($group[0] == '&') $this->_containsGroupAnchor = substr ($group, 1);
1024
- if ($group[0] == '*') $this->_containsGroupAlias = substr ($group, 1);
1025
- //print_r ($this->path);
1026
- }
1027
-
1028
- private function stripGroup ($line, $group) {
1029
- $line = trim(str_replace($group, '', $line));
1030
- return $line;
1031
- }
1032
- }
1033
-
1034
- // Enable use of Spyc from command line
1035
- // The syntax is the following: php spyc.php spyc.yaml
1036
-
1037
- define ('SPYC_FROM_COMMAND_LINE', false);
1038
-
1039
- do {
1040
- if (!SPYC_FROM_COMMAND_LINE) break;
1041
- if (empty ($_SERVER['argc']) || $_SERVER['argc'] < 2) break;
1042
- if (empty ($_SERVER['PHP_SELF']) || $_SERVER['PHP_SELF'] != 'spyc.php') break;
1043
- $file = $argv[1];
1044
- printf ("Spyc loading file: %s\n", $file);
1045
- print_r (spyc_load_file ($file));
1046
- } while (0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/lib/spyc-0.5/spyc.yaml DELETED
@@ -1,203 +0,0 @@
1
- #
2
- # S P Y C
3
- # a simple php yaml class
4
- #
5
- # authors: [vlad andersen (vlad.andersen@gmail.com), chris wanstrath (chris@ozmm.org)]
6
- # websites: [http://www.yaml.org, http://spyc.sourceforge.net/]
7
- # license: [MIT License, http://www.opensource.org/licenses/mit-license.php]
8
- # copyright: (c) 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen
9
- #
10
- # spyc.yml - A file containing the YAML that Spyc understands.
11
-
12
- ---
13
-
14
- # Mappings - with proper types
15
- String: Anyone's name, really.
16
- Int: 13
17
- True: true
18
- False: false
19
- Zero: 0
20
- Null: NULL
21
- NotNull: 'null'
22
- NotTrue: 'y'
23
- NotBoolTrue: 'true'
24
- NotInt: '5'
25
- Float: 5.34
26
- Negative: -90
27
- SmallFloat: 0.7
28
- NewLine: \n
29
-
30
- # A sequence
31
- - PHP Class
32
- - Basic YAML Loader
33
- - Very Basic YAML Dumper
34
-
35
- # A sequence of a sequence
36
- -
37
- - YAML is so easy to learn.
38
- - Your config files will never be the same.
39
-
40
- # Sequence of mappings
41
- -
42
- cpu: 1.5ghz
43
- ram: 1 gig
44
- os : os x 10.4.1
45
-
46
- # Mapped sequence
47
- domains:
48
- - yaml.org
49
- - php.net
50
-
51
- # A sequence like this.
52
- - program: Adium
53
- platform: OS X
54
- type: Chat Client
55
-
56
- # A folded block as a mapped value
57
- no time: >
58
- There isn't any time
59
- for your tricks!
60
-
61
- Do you understand?
62
-
63
- # A literal block as a mapped value
64
- some time: |
65
- There is nothing but time
66
- for your tricks.
67
-
68
- # Crazy combinations
69
- databases:
70
- - name: spartan
71
- notes:
72
- - Needs to be backed up
73
- - Needs to be normalized
74
- type: mysql
75
-
76
- # You can be a bit tricky
77
- "if: you'd": like
78
-
79
- # Inline sequences
80
- - [One, Two, Three, Four]
81
-
82
- # Nested Inline Sequences
83
- - [One, [Two, And, Three], Four, Five]
84
-
85
- # Nested Nested Inline Sequences
86
- - [This, [Is, Getting, [Ridiculous, Guys]], Seriously, [Show, Mercy]]
87
-
88
- # Inline mappings
89
- - {name: chris, age: young, brand: lucky strike}
90
-
91
- # Nested inline mappings
92
- - {name: mark, age: older than chris, brand: [marlboro, lucky strike]}
93
-
94
- # References -- they're shaky, but functional
95
- dynamic languages: &DLANGS
96
- - Perl
97
- - Python
98
- - PHP
99
- - Ruby
100
- compiled languages: &CLANGS
101
- - C/C++
102
- - Java
103
- all languages:
104
- - *DLANGS
105
- - *CLANGS
106
-
107
- # Added in .2.2: Escaped quotes
108
- - you know, this shouldn't work. but it does.
109
- - 'that''s my value.'
110
- - 'again, that\'s my value.'
111
- - "here's to \"quotes\", boss."
112
-
113
- # added in .2.3
114
- - {name: "Foo, Bar's", age: 20}
115
-
116
- # Added in .2.4: bug [ 1418193 ] Quote Values in Nested Arrays
117
- - [a, ['1', "2"], b]
118
-
119
- # Added in .2.4: malformed YAML
120
- all
121
- javascripts: [dom1.js, dom.js]
122
-
123
- # Added in .2
124
- 1040: Ooo, a numeric key! # And working comments? Wow! Colons in comments: a menace (0.3).
125
-
126
- hash_1: Hash #and a comment
127
- hash_2: "Hash #and a comment"
128
- "hash#3": "Hash (#) can appear in key too"
129
-
130
- float_test: 1.0
131
- float_test_with_quotes: '1.0'
132
- float_inverse_test: 001
133
-
134
- a_really_large_number: 115792089237316195423570985008687907853269984665640564039457584007913129639936 # 2^256
135
-
136
- int array: [ 1, 2, 3 ]
137
-
138
- array on several lines:
139
- [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
140
- 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ]
141
-
142
- morelesskey: "<value>"
143
-
144
- array_of_zero: [0]
145
- sophisticated_array_of_zero: {rx: {tx: [0]} }
146
-
147
- switches:
148
- - { row: 0, col: 0, func: {tx: [0, 1]} }
149
-
150
- empty_sequence: [ ]
151
- empty_hash: { }
152
-
153
- special_characters: "[{]]{{]]"
154
-
155
- asterisks: "*"
156
-
157
- empty_key:
158
- :
159
- key: value
160
-
161
- trailing_colon: "foo:"
162
-
163
- multiline_items:
164
- - type: SomeItem
165
- values: [blah, blah, blah,
166
- blah]
167
- ints: [2, 54, 12,
168
- 2143]
169
-
170
- many_lines: |
171
- A quick
172
- fox
173
-
174
-
175
- jumped
176
- over
177
-
178
-
179
-
180
-
181
-
182
- a lazy
183
-
184
-
185
-
186
- dog
187
-
188
-
189
- werte:
190
- 1: nummer 1
191
- 0: Stunde 0
192
-
193
- noindent_records:
194
- - record1: value1
195
- - record2: value2
196
-
197
- "a:1": [1000]
198
- "a:2":
199
- - 2000
200
-
201
- # [Endloop]
202
- endloop: |
203
- Does this line in the end indeed make Spyc go to an infinite loop?
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/lib/spyc-0.5/tests/DumpTest.php DELETED
@@ -1,130 +0,0 @@
1
- <?php
2
-
3
- require_once ("../spyc.php");
4
-
5
- class DumpTest extends PHPUnit_Framework_TestCase {
6
-
7
- private $files_to_test = array();
8
-
9
- public function setUp() {
10
- $this->files_to_test = array ('../spyc.yaml', 'failing1.yaml', 'indent_1.yaml', 'quotes.yaml');
11
- }
12
-
13
- public function testDump() {
14
- foreach ($this->files_to_test as $file) {
15
- $yaml = spyc_load(file_get_contents($file));
16
- $dump = Spyc::YAMLDump ($yaml);
17
- $yaml_after_dump = Spyc::YAMLLoad ($dump);
18
- $this->assertEquals ($yaml, $yaml_after_dump);
19
- }
20
- }
21
-
22
- public function testDumpWithQuotes() {
23
- $Spyc = new Spyc();
24
- $Spyc->setting_dump_force_quotes = true;
25
- foreach ($this->files_to_test as $file) {
26
- $yaml = $Spyc->load(file_get_contents($file));
27
- $dump = $Spyc->dump ($yaml);
28
- $yaml_after_dump = Spyc::YAMLLoad ($dump);
29
- $this->assertEquals ($yaml, $yaml_after_dump);
30
- }
31
- }
32
-
33
- public function testDumpArrays() {
34
- $dump = Spyc::YAMLDump(array ('item1', 'item2', 'item3'));
35
- $awaiting = "---\n- item1\n- item2\n- item3\n";
36
- $this->assertEquals ($awaiting, $dump);
37
- }
38
-
39
- public function testNull() {
40
- $dump = Spyc::YAMLDump(array('a' => 1, 'b' => null, 'c' => 3));
41
- $awaiting = "---\na: 1\nb: null\nc: 3\n";
42
- $this->assertEquals ($awaiting, $dump);
43
- }
44
-
45
- public function testNext() {
46
- $array = array("aaa", "bbb", "ccc");
47
- #set arrays internal pointer to next element
48
- next($array);
49
- $dump = Spyc::YAMLDump($array);
50
- $awaiting = "---\n- aaa\n- bbb\n- ccc\n";
51
- $this->assertEquals ($awaiting, $dump);
52
- }
53
-
54
- public function testDumpingMixedArrays() {
55
- $array = array();
56
- $array[] = 'Sequence item';
57
- $array['The Key'] = 'Mapped value';
58
- $array[] = array('A sequence','of a sequence');
59
- $array[] = array('first' => 'A sequence','second' => 'of mapped values');
60
- $array['Mapped'] = array('A sequence','which is mapped');
61
- $array['A Note'] = 'What if your text is too long?';
62
- $array['Another Note'] = 'If that is the case, the dumper will probably fold your text by using a block. Kinda like this.';
63
- $array['The trick?'] = 'The trick is that we overrode the default indent, 2, to 4 and the default wordwrap, 40, to 60.';
64
- $array['Old Dog'] = "And if you want\n to preserve line breaks, \ngo ahead!";
65
- $array['key:withcolon'] = "Should support this to";
66
-
67
- $yaml = Spyc::YAMLDump($array,4,60);
68
- }
69
-
70
- public function testMixed() {
71
- $dump = Spyc::YAMLDump(array(0 => 1, 'b' => 2, 1 => 3));
72
- $awaiting = "---\n0: 1\nb: 2\n1: 3\n";
73
- $this->assertEquals ($awaiting, $dump);
74
- }
75
-
76
- public function testDumpNumerics() {
77
- $dump = Spyc::YAMLDump(array ('404', '405', '500'));
78
- $awaiting = "---\n- 404\n- 405\n- 500\n";
79
- $this->assertEquals ($awaiting, $dump);
80
- }
81
-
82
- public function testDumpAsterisks() {
83
- $dump = Spyc::YAMLDump(array ('*'));
84
- $awaiting = "---\n- '*'\n";
85
- $this->assertEquals ($awaiting, $dump);
86
- }
87
-
88
- public function testDumpAmpersands() {
89
- $dump = Spyc::YAMLDump(array ('some' => '&foo'));
90
- $awaiting = "---\nsome: '&foo'\n";
91
- $this->assertEquals ($awaiting, $dump);
92
- }
93
-
94
- public function testDumpExclamations() {
95
- $dump = Spyc::YAMLDump(array ('some' => '!foo'));
96
- $awaiting = "---\nsome: '!foo'\n";
97
- $this->assertEquals ($awaiting, $dump);
98
- }
99
-
100
- public function testDumpExclamations2() {
101
- $dump = Spyc::YAMLDump(array ('some' => 'foo!'));
102
- $awaiting = "---\nsome: foo!\n";
103
- $this->assertEquals ($awaiting, $dump);
104
- }
105
-
106
- public function testDumpApostrophes() {
107
- $dump = Spyc::YAMLDump(array ('some' => "'Biz' pimpt bedrijventerreinen"));
108
- $awaiting = "---\nsome: \"'Biz' pimpt bedrijventerreinen\"\n";
109
- $this->assertEquals ($awaiting, $dump);
110
- }
111
-
112
- public function testDumpNumericHashes() {
113
- $dump = Spyc::YAMLDump(array ("titel"=> array("0" => "", 1 => "Dr.", 5 => "Prof.", 6 => "Prof. Dr.")));
114
- $awaiting = "---\ntitel:\n 0:\n 1: Dr.\n 5: Prof.\n 6: Prof. Dr.\n";
115
- $this->assertEquals ($awaiting, $dump);
116
- }
117
-
118
- public function testEmpty() {
119
- $dump = Spyc::YAMLDump(array("foo" => array()));
120
- $awaiting = "---\nfoo: [ ]\n";
121
- $this->assertEquals ($awaiting, $dump);
122
- }
123
-
124
- public function testHashesInKeys() {
125
- $dump = Spyc::YAMLDump(array ('#color' => '#ffffff'));
126
- $awaiting = "---\n\"#color\": '#ffffff'\n";
127
- $this->assertEquals ($awaiting, $dump);
128
- }
129
-
130
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/lib/spyc-0.5/tests/IndentTest.php DELETED
@@ -1,65 +0,0 @@
1
- <?php
2
-
3
- require_once ("../spyc.php");
4
-
5
- class IndentTest extends PHPUnit_Framework_TestCase {
6
-
7
- protected $Y;
8
-
9
- protected function setUp() {
10
- $this->Y = Spyc::YAMLLoad("indent_1.yaml");
11
- }
12
-
13
- public function testIndent_1() {
14
- $this->assertEquals (array ('child_1' => 2, 'child_2' => 0, 'child_3' => 1), $this->Y['root']);
15
- }
16
-
17
- public function testIndent_2() {
18
- $this->assertEquals (array ('child_1' => 1, 'child_2' => 2), $this->Y['root2']);
19
- }
20
-
21
- public function testIndent_3() {
22
- $this->assertEquals (array (array ('resolutions' => array (1024 => 768, 1920 => 1200), 'producer' => 'Nec')), $this->Y['display']);
23
- }
24
-
25
- public function testIndent_4() {
26
- $this->assertEquals (array (
27
- array ('resolutions' => array (1024 => 768)),
28
- array ('resolutions' => array (1920 => 1200)),
29
- ), $this->Y['displays']);
30
- }
31
-
32
- public function testIndent_5() {
33
- $this->assertEquals (array (array (
34
- 'row' => 0,
35
- 'col' => 0,
36
- 'headsets_affected' => array (
37
- array (
38
- 'ports' => array (0),
39
- 'side' => 'left',
40
- )
41
- ),
42
- 'switch_function' => array (
43
- 'ics_ptt' => true
44
- )
45
- )), $this->Y['nested_hashes_and_seqs']);
46
- }
47
-
48
- public function testIndent_6() {
49
- $this->assertEquals (array (
50
- 'h' => array (
51
- array ('a' => 'b', 'a1' => 'b1'),
52
- array ('c' => 'd')
53
- )
54
- ), $this->Y['easier_nest']);
55
- }
56
-
57
- public function testIndent_space() {
58
- $this->assertEquals ("By four\n spaces", $this->Y['one_space']);
59
- }
60
-
61
- public function testListAndComment() {
62
- $this->assertEquals (array ('one', 'two', 'three'), $this->Y['list_and_comment']);
63
- }
64
-
65
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/lib/spyc-0.5/tests/ParseTest.php DELETED
@@ -1,322 +0,0 @@
1
- <?php
2
-
3
- require_once 'PHPUnit/Framework.php';
4
- require_once ("../spyc.php");
5
-
6
- class ParseTest extends PHPUnit_Framework_TestCase {
7
-
8
- protected $yaml;
9
-
10
- protected function setUp() {
11
- $this->yaml = spyc_load_file('../spyc.yaml');
12
- }
13
-
14
- public function testMergeHashKeys() {
15
- $Expected = array (
16
- array ('step' => array('instrument' => 'Lasik 2000', 'pulseEnergy' => 5.4, 'pulseDuration' => 12, 'repetition' => 1000, 'spotSize' => '1mm')),
17
- array ('step' => array('instrument' => 'Lasik 2000', 'pulseEnergy' => 5.4, 'pulseDuration' => 12, 'repetition' => 1000, 'spotSize' => '2mm')),
18
- );
19
- $Actual = spyc_load_file ('indent_1.yaml');
20
- $this->assertEquals ($Expected, $Actual['steps']);
21
- }
22
-
23
- public function testDeathMasks() {
24
- $Expected = array ('sad' => 2, 'magnificent' => 4);
25
- $Actual = spyc_load_file ('indent_1.yaml');
26
- $this->assertEquals ($Expected, $Actual['death masks are']);
27
- }
28
-
29
- public function testDevDb() {
30
- $Expected = array ('adapter' => 'mysql', 'host' => 'localhost', 'database' => 'rails_dev');
31
- $Actual = spyc_load_file ('indent_1.yaml');
32
- $this->assertEquals ($Expected, $Actual['development']);
33
- }
34
-
35
- public function testNumericKey() {
36
- $this->assertEquals ("Ooo, a numeric key!", $this->yaml[1040]);
37
- }
38
-
39
- public function testMappingsString() {
40
- $this->assertEquals ("Anyone's name, really.", $this->yaml['String']);
41
- }
42
-
43
- public function testMappingsInt() {
44
- $this->assertSame (13, $this->yaml['Int']);
45
- }
46
-
47
- public function testMappingsBooleanTrue() {
48
- $this->assertSame (true, $this->yaml['True']);
49
- }
50
-
51
- public function testMappingsBooleanFalse() {
52
- $this->assertSame (false, $this->yaml['False']);
53
- }
54
-
55
- public function testMappingsZero() {
56
- $this->assertSame (0, $this->yaml['Zero']);
57
- }
58
-
59
- public function testMappingsNull() {
60
- $this->assertSame (null, $this->yaml['Null']);
61
- }
62
-
63
- public function testMappingsNotNull() {
64
- $this->assertSame ('null', $this->yaml['NotNull']);
65
- }
66
-
67
- public function testMappingsFloat() {
68
- $this->assertSame (5.34, $this->yaml['Float']);
69
- }
70
-
71
- public function testMappingsNegative() {
72
- $this->assertSame (-90, $this->yaml['Negative']);
73
- }
74
-
75
- public function testMappingsSmallFloat() {
76
- $this->assertSame (0.7, $this->yaml['SmallFloat']);
77
- }
78
-
79
- public function testNewline() {
80
- $this->assertSame ("\n", $this->yaml['NewLine']);
81
- }
82
-
83
-
84
- public function testSeq0() {
85
- $this->assertEquals ("PHP Class", $this->yaml[0]);
86
- }
87
-
88
- public function testSeq1() {
89
- $this->assertEquals ("Basic YAML Loader", $this->yaml[1]);
90
- }
91
-
92
- public function testSeq2() {
93
- $this->assertEquals ("Very Basic YAML Dumper", $this->yaml[2]);
94
- }
95
-
96
- public function testSeq3() {
97
- $this->assertEquals (array("YAML is so easy to learn.",
98
- "Your config files will never be the same."), $this->yaml[3]);
99
- }
100
-
101
- public function testSeqMap() {
102
- $this->assertEquals (array("cpu" => "1.5ghz", "ram" => "1 gig",
103
- "os" => "os x 10.4.1"), $this->yaml[4]);
104
- }
105
-
106
- public function testMappedSequence() {
107
- $this->assertEquals (array("yaml.org", "php.net"), $this->yaml['domains']);
108
- }
109
-
110
- public function testAnotherSequence() {
111
- $this->assertEquals (array("program" => "Adium", "platform" => "OS X",
112
- "type" => "Chat Client"), $this->yaml[5]);
113
- }
114
-
115
- public function testFoldedBlock() {
116
- $this->assertEquals ("There isn't any time for your tricks!\nDo you understand?", $this->yaml['no time']);
117
- }
118
-
119
- public function testLiteralAsMapped() {
120
- $this->assertEquals ("There is nothing but time\nfor your tricks.", $this->yaml['some time']);
121
- }
122
-
123
- public function testCrazy() {
124
- $this->assertEquals (array( array("name" => "spartan", "notes" =>
125
- array( "Needs to be backed up",
126
- "Needs to be normalized" ),
127
- "type" => "mysql" )), $this->yaml['databases']);
128
- }
129
-
130
- public function testColons() {
131
- $this->assertEquals ("like", $this->yaml["if: you'd"]);
132
- }
133
-
134
- public function testInline() {
135
- $this->assertEquals (array("One", "Two", "Three", "Four"), $this->yaml[6]);
136
- }
137
-
138
- public function testNestedInline() {
139
- $this->assertEquals (array("One", array("Two", "And", "Three"), "Four", "Five"), $this->yaml[7]);
140
- }
141
-
142
- public function testNestedNestedInline() {
143
- $this->assertEquals (array( "This", array("Is", "Getting", array("Ridiculous", "Guys")),
144
- "Seriously", array("Show", "Mercy")), $this->yaml[8]);
145
- }
146
-
147
- public function testInlineMappings() {
148
- $this->assertEquals (array("name" => "chris", "age" => "young", "brand" => "lucky strike"), $this->yaml[9]);
149
- }
150
-
151
- public function testNestedInlineMappings() {
152
- $this->assertEquals (array("name" => "mark", "age" => "older than chris",
153
- "brand" => array("marlboro", "lucky strike")), $this->yaml[10]);
154
- }
155
-
156
- public function testReferences() {
157
- $this->assertEquals (array('Perl', 'Python', 'PHP', 'Ruby'), $this->yaml['dynamic languages']);
158
- }
159
-
160
- public function testReferences2() {
161
- $this->assertEquals (array('C/C++', 'Java'), $this->yaml['compiled languages']);
162
- }
163
-
164
- public function testReferences3() {
165
- $this->assertEquals (array(
166
- array('Perl', 'Python', 'PHP', 'Ruby'),
167
- array('C/C++', 'Java')
168
- ), $this->yaml['all languages']);
169
- }
170
-
171
- public function testEscapedQuotes() {
172
- $this->assertEquals ("you know, this shouldn't work. but it does.", $this->yaml[11]);
173
- }
174
-
175
- public function testEscapedQuotes_2() {
176
- $this->assertEquals ( "that's my value.", $this->yaml[12]);
177
- }
178
-
179
- public function testEscapedQuotes_3() {
180
- $this->assertEquals ("again, that's my value.", $this->yaml[13]);
181
- }
182
-
183
- public function testQuotes() {
184
- $this->assertEquals ("here's to \"quotes\", boss.", $this->yaml[14]);
185
- }
186
-
187
- public function testQuoteSequence() {
188
- $this->assertEquals ( array( 'name' => "Foo, Bar's", 'age' => 20), $this->yaml[15]);
189
- }
190
-
191
- public function testShortSequence() {
192
- $this->assertEquals (array( 0 => "a", 1 => array (0 => 1, 1 => 2), 2 => "b"), $this->yaml[16]);
193
- }
194
-
195
- public function testHash_1() {
196
- $this->assertEquals ("Hash", $this->yaml['hash_1']);
197
- }
198
-
199
- public function testHash_2() {
200
- $this->assertEquals ('Hash #and a comment', $this->yaml['hash_2']);
201
- }
202
-
203
- public function testHash_3() {
204
- $this->assertEquals ('Hash (#) can appear in key too', $this->yaml['hash#3']);
205
- }
206
-
207
- public function testEndloop() {
208
- $this->assertEquals ("Does this line in the end indeed make Spyc go to an infinite loop?", $this->yaml['endloop']);
209
- }
210
-
211
- public function testReallyLargeNumber() {
212
- $this->assertEquals ('115792089237316195423570985008687907853269984665640564039457584007913129639936', $this->yaml['a_really_large_number']);
213
- }
214
-
215
- public function testFloatWithZeros() {
216
- $this->assertSame ('1.0', $this->yaml['float_test']);
217
- }
218
-
219
- public function testFloatWithQuotes() {
220
- $this->assertSame ('1.0', $this->yaml['float_test_with_quotes']);
221
- }
222
-
223
- public function testFloatInverse() {
224
- $this->assertEquals ('001', $this->yaml['float_inverse_test']);
225
- }
226
-
227
- public function testIntArray() {
228
- $this->assertEquals (array (1, 2, 3), $this->yaml['int array']);
229
- }
230
-
231
- public function testArrayOnSeveralLines() {
232
- $this->assertEquals (array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19), $this->yaml['array on several lines']);
233
- }
234
-
235
- public function testmoreLessKey() {
236
- $this->assertEquals ('<value>', $this->yaml['morelesskey']);
237
- }
238
-
239
- public function testArrayOfZero() {
240
- $this->assertSame (array(0), $this->yaml['array_of_zero']);
241
- }
242
-
243
- public function testSophisticatedArrayOfZero() {
244
- $this->assertSame (array('rx' => array ('tx' => array (0))), $this->yaml['sophisticated_array_of_zero']);
245
- }
246
-
247
- public function testSwitches() {
248
- $this->assertEquals (array (array ('row' => 0, 'col' => 0, 'func' => array ('tx' => array(0, 1)))), $this->yaml['switches']);
249
- }
250
-
251
- public function testEmptySequence() {
252
- $this->assertSame (array(), $this->yaml['empty_sequence']);
253
- }
254
-
255
- public function testEmptyHash() {
256
- $this->assertSame (array(), $this->yaml['empty_hash']);
257
- }
258
-
259
- public function testEmptykey() {
260
- $this->assertSame (array('' => array ('key' => 'value')), $this->yaml['empty_key']);
261
- }
262
-
263
- public function testMultilines() {
264
- $this->assertSame (array(array('type' => 'SomeItem', 'values' => array ('blah', 'blah', 'blah', 'blah'), 'ints' => array(2, 54, 12, 2143))), $this->yaml['multiline_items']);
265
- }
266
-
267
- public function testManyNewlines() {
268
- $this->assertSame ('A quick
269
- fox
270
-
271
-
272
- jumped
273
- over
274
-
275
-
276
-
277
-
278
-
279
- a lazy
280
-
281
-
282
-
283
- dog', $this->yaml['many_lines']);
284
- }
285
-
286
- public function testWerte() {
287
- $this->assertSame (array ('1' => 'nummer 1', '0' => 'Stunde 0'), $this->yaml['werte']);
288
- }
289
-
290
- /* public function testNoIndent() {
291
- $this->assertSame (array(
292
- array ('record1'=>'value1'),
293
- array ('record2'=>'value2')
294
- )
295
- , $this->yaml['noindent_records']);
296
- } */
297
-
298
- public function testColonsInKeys() {
299
- $this->assertSame (array (1000), $this->yaml['a:1']);
300
- }
301
-
302
- public function testColonsInKeys2() {
303
- $this->assertSame (array (2000), $this->yaml['a:2']);
304
- }
305
-
306
- public function testSpecialCharacters() {
307
- $this->assertSame ('[{]]{{]]', $this->yaml['special_characters']);
308
- }
309
-
310
- public function testAngleQuotes() {
311
- $Quotes = Spyc::YAMLLoad('quotes.yaml');
312
- $this->assertEquals (array ('html_tags' => array ('<br>', '<p>'), 'html_content' => array ('<p>hello world</p>', 'hello<br>world'), 'text_content' => array ('hello world')),
313
- $Quotes);
314
- }
315
-
316
- public function testFailingColons() {
317
- $Failing = Spyc::YAMLLoad('failing1.yaml');
318
- $this->assertSame (array ('MyObject' => array ('Prop1' => array ('key1:val1'))),
319
- $Failing);
320
- }
321
-
322
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/lib/spyc-0.5/tests/RoundTripTest.php DELETED
@@ -1,61 +0,0 @@
1
- <?php
2
-
3
- require_once ("../spyc.php");
4
-
5
- function roundTrip($a) { return Spyc::YAMLLoad(Spyc::YAMLDump(array('x' => $a))); }
6
-
7
-
8
- class RoundTripTest extends PHPUnit_Framework_TestCase {
9
-
10
- protected function setUp() {
11
- }
12
-
13
- public function testNull() {
14
- $this->assertEquals (array ('x' => null), roundTrip (null));
15
- }
16
-
17
- public function testY() {
18
- $this->assertEquals (array ('x' => 'y'), roundTrip ('y'));
19
- }
20
-
21
- public function testExclam() {
22
- $this->assertEquals (array ('x' => '!yeah'), roundTrip ('!yeah'));
23
- }
24
-
25
- public function test5() {
26
- $this->assertEquals (array ('x' => '5'), roundTrip ('5'));
27
- }
28
-
29
- public function testSpaces() {
30
- $this->assertEquals (array ('x' => 'x '), roundTrip ('x '));
31
- }
32
-
33
- public function testApostrophes() {
34
- $this->assertEquals (array ('x' => "'biz'"), roundTrip ("'biz'"));
35
- }
36
-
37
- public function testNewLines() {
38
- $this->assertEquals (array ('x' => "\n"), roundTrip ("\n"));
39
- }
40
-
41
- public function testHashes() {
42
- $this->assertEquals (array ('x' => array ("#color" => '#fff')), roundTrip (array ("#color" => '#fff')));
43
- }
44
-
45
- public function testWordWrap() {
46
- $this->assertEquals (array ('x' => "aaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"), roundTrip ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"));
47
- }
48
-
49
- public function testABCD() {
50
- $this->assertEquals (array ('a', 'b', 'c', 'd'), Spyc::YAMLLoad(Spyc::YAMLDump(array('a', 'b', 'c', 'd'))));
51
- }
52
-
53
- public function testABCD2() {
54
- $a = array('a', 'b', 'c', 'd'); // Create a simple list
55
- $b = Spyc::YAMLDump($a); // Dump the list as YAML
56
- $c = Spyc::YAMLLoad($b); // Load the dumped YAML
57
- $d = Spyc::YAMLDump($c); // Re-dump the data
58
- $this->assertSame($b, $d);
59
- }
60
-
61
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/lib/spyc-0.5/tests/failing1.yaml DELETED
@@ -1,2 +0,0 @@
1
- MyObject:
2
- Prop1: {key1:val1}
 
 
src/Libs/uaparser/lib/spyc-0.5/tests/indent_1.yaml DELETED
@@ -1,59 +0,0 @@
1
- root:
2
- child_1: 2
3
-
4
- child_2: 0
5
- child_3: 1
6
-
7
- root2:
8
- child_1: 1
9
- # A comment
10
- child_2: 2
11
-
12
- displays:
13
- - resolutions:
14
- 1024: 768
15
- - resolutions:
16
- 1920: 1200
17
-
18
- display:
19
- - resolutions:
20
- 1024: 768
21
- 1920: 1200
22
- producer: "Nec"
23
-
24
- nested_hashes_and_seqs:
25
- - { row: 0, col: 0, headsets_affected: [{ports: [0], side: left}], switch_function: {ics_ptt: true} }
26
-
27
- easier_nest: { h: [{a: b, a1: b1}, {c: d}] }
28
-
29
- one_space: |
30
- By four
31
- spaces
32
-
33
- steps:
34
- - step: &id001
35
- instrument: Lasik 2000
36
- pulseEnergy: 5.4
37
- pulseDuration: 12
38
- repetition: 1000
39
- spotSize: 1mm
40
- - step:
41
- <<: *id001
42
- spotSize: 2mm
43
-
44
- death masks are:
45
- sad: 2
46
- <<: {magnificent: 4}
47
-
48
- login: &login
49
- adapter: mysql
50
- host: localhost
51
-
52
- development:
53
- database: rails_dev
54
- <<: *login
55
-
56
- "key": "value:"
57
- colon_only: ":"
58
-
59
- list_and_comment: [one, two, three] # comment
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/lib/spyc-0.5/tests/quotes.yaml DELETED
@@ -1,8 +0,0 @@
1
- html_tags:
2
- - <br>
3
- - <p>
4
- html_content:
5
- - <p>hello world</p>
6
- - hello<br>world
7
- text_content:
8
- - hello world
 
 
 
 
 
 
 
 
src/Libs/uaparser/log/.gitignore DELETED
@@ -1,2 +0,0 @@
1
- *.txt
2
- *.log
 
 
src/Libs/uaparser/log/README.md DELETED
@@ -1 +0,0 @@
1
- If you turn on debug mode this is where your results will be logged.
 
src/Libs/uaparser/resources/regexes.json DELETED
@@ -1,1205 +0,0 @@
1
- {
2
- "user_agent_parsers": [
3
- {
4
- "regex": "(SeaMonkey|Camino)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)"
5
- },
6
- {
7
- "regex": "(Pale[Mm]oon)/(\\d+)\\.(\\d+)\\.?(\\d+)?",
8
- "family_replacement": "Pale Moon (Firefox Variant)"
9
- },
10
- {
11
- "regex": "(Fennec)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)",
12
- "family_replacement": "Firefox Mobile"
13
- },
14
- {
15
- "regex": "(Fennec)/(\\d+)\\.(\\d+)(pre)",
16
- "family_replacement": "Firefox Mobile"
17
- },
18
- {
19
- "regex": "(Fennec)/(\\d+)\\.(\\d+)",
20
- "family_replacement": "Firefox Mobile"
21
- },
22
- {
23
- "regex": "Mobile.*(Firefox)/(\\d+)\\.(\\d+)",
24
- "family_replacement": "Firefox Mobile"
25
- },
26
- {
27
- "regex": "(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?)",
28
- "family_replacement": "Firefox ($1)"
29
- },
30
- {
31
- "regex": "(Firefox)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)",
32
- "family_replacement": "Firefox Alpha"
33
- },
34
- {
35
- "regex": "(Firefox)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)",
36
- "family_replacement": "Firefox Beta"
37
- },
38
- {
39
- "regex": "(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(a\\d+[a-z]*)",
40
- "family_replacement": "Firefox Alpha"
41
- },
42
- {
43
- "regex": "(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(b\\d+[a-z]*)",
44
- "family_replacement": "Firefox Beta"
45
- },
46
- {
47
- "regex": "(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?",
48
- "family_replacement": "Firefox ($1)"
49
- },
50
- {
51
- "regex": "(Firefox).*Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)",
52
- "family_replacement": "MicroB"
53
- },
54
- {
55
- "regex": "(MozillaDeveloperPreview)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?"
56
- },
57
- {
58
- "regex": "(Flock)/(\\d+)\\.(\\d+)(b\\d+?)"
59
- },
60
- {
61
- "regex": "(RockMelt)/(\\d+)\\.(\\d+)\\.(\\d+)"
62
- },
63
- {
64
- "regex": "(Navigator)/(\\d+)\\.(\\d+)\\.(\\d+)",
65
- "family_replacement": "Netscape"
66
- },
67
- {
68
- "regex": "(Navigator)/(\\d+)\\.(\\d+)([ab]\\d+)",
69
- "family_replacement": "Netscape"
70
- },
71
- {
72
- "regex": "(Netscape6)/(\\d+)\\.(\\d+)\\.(\\d+)",
73
- "family_replacement": "Netscape"
74
- },
75
- {
76
- "regex": "(MyIBrow)/(\\d+)\\.(\\d+)",
77
- "family_replacement": "My Internet Browser"
78
- },
79
- {
80
- "regex": "(Opera Tablet).*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?"
81
- },
82
- {
83
- "regex": "(Opera)/.+Opera Mobi.+Version/(\\d+)\\.(\\d+)",
84
- "family_replacement": "Opera Mobile"
85
- },
86
- {
87
- "regex": "Opera Mobi",
88
- "family_replacement": "Opera Mobile"
89
- },
90
- {
91
- "regex": "(Opera Mini)/(\\d+)\\.(\\d+)"
92
- },
93
- {
94
- "regex": "(Opera Mini)/att/(\\d+)\\.(\\d+)"
95
- },
96
- {
97
- "regex": "(Opera)/9.80.*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?"
98
- },
99
- {
100
- "regex": "(?:Mobile Safari).*(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)",
101
- "family_replacement": "Opera Mobile"
102
- },
103
- {
104
- "regex": "(?:Chrome).*(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)",
105
- "family_replacement": "Opera"
106
- },
107
- {
108
- "regex": "(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+))?",
109
- "family_replacement": "webOS Browser"
110
- },
111
- {
112
- "regex": "(luakit)",
113
- "family_replacement": "LuaKit"
114
- },
115
- {
116
- "regex": "(Snowshoe)/(\\d+)\\.(\\d+).(\\d+)"
117
- },
118
- {
119
- "regex": "(Lightning)/(\\d+)\\.(\\d+)([ab]?\\d+[a-z]*)"
120
- },
121
- {
122
- "regex": "(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?) \\(Swiftfox\\)",
123
- "family_replacement": "Swiftfox"
124
- },
125
- {
126
- "regex": "(Firefox)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)? \\(Swiftfox\\)",
127
- "family_replacement": "Swiftfox"
128
- },
129
- {
130
- "regex": "(rekonq)/(\\d+)\\.(\\d+)\\.?(\\d+)? Safari",
131
- "family_replacement": "Rekonq"
132
- },
133
- {
134
- "regex": "rekonq",
135
- "family_replacement": "Rekonq"
136
- },
137
- {
138
- "regex": "(conkeror|Conkeror)/(\\d+)\\.(\\d+)\\.?(\\d+)?",
139
- "family_replacement": "Conkeror"
140
- },
141
- {
142
- "regex": "(konqueror)/(\\d+)\\.(\\d+)\\.(\\d+)",
143
- "family_replacement": "Konqueror"
144
- },
145
- {
146
- "regex": "(WeTab)-Browser"
147
- },
148
- {
149
- "regex": "(Comodo_Dragon)/(\\d+)\\.(\\d+)\\.(\\d+)",
150
- "family_replacement": "Comodo Dragon"
151
- },
152
- {
153
- "regex": "(YottaaMonitor|BrowserMob|HttpMonitor|YandexBot|Slurp|BingPreview|PagePeeker|ThumbShotsBot|WebThumb|URL2PNG|ZooShot|GomezA|Catchpoint bot|Willow Internet Crawler|Google SketchUp|Read%20Later)"
154
- },
155
- {
156
- "regex": "(Symphony) (\\d+).(\\d+)"
157
- },
158
- {
159
- "regex": "(Minimo)"
160
- },
161
- {
162
- "regex": "(CrMo)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)",
163
- "family_replacement": "Chrome Mobile"
164
- },
165
- {
166
- "regex": "(CriOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)",
167
- "family_replacement": "Chrome Mobile iOS"
168
- },
169
- {
170
- "regex": "(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile",
171
- "family_replacement": "Chrome Mobile"
172
- },
173
- {
174
- "regex": "(chromeframe)/(\\d+)\\.(\\d+)\\.(\\d+)",
175
- "family_replacement": "Chrome Frame"
176
- },
177
- {
178
- "regex": "(UCBrowser)[ /](\\d+)\\.(\\d+)\\.(\\d+)",
179
- "family_replacement": "UC Browser"
180
- },
181
- {
182
- "regex": "(UC Browser)[ /](\\d+)\\.(\\d+)\\.(\\d+)"
183
- },
184
- {
185
- "regex": "(UC Browser|UCBrowser|UCWEB)(\\d+)\\.(\\d+)\\.(\\d+)",
186
- "family_replacement": "UC Browser"
187
- },
188
- {
189
- "regex": "(SLP Browser)/(\\d+)\\.(\\d+)",
190
- "family_replacement": "Tizen Browser"
191
- },
192
- {
193
- "regex": "(SE 2\\.X) MetaSr (\\d+)\\.(\\d+)",
194
- "family_replacement": "Sogou Explorer"
195
- },
196
- {
197
- "regex": "(baidubrowser)[/\\s](\\d+)",
198
- "family_replacement": "Baidu Browser"
199
- },
200
- {
201
- "regex": "(FlyFlow)/(\\d+)\\.(\\d+)",
202
- "family_replacement": "Baidu Explorer"
203
- },
204
- {
205
- "regex": "(Pingdom.com_bot_version_)(\\d+)\\.(\\d+)",
206
- "family_replacement": "PingdomBot"
207
- },
208
- {
209
- "regex": "(facebookexternalhit)/(\\d+)\\.(\\d+)",
210
- "family_replacement": "FacebookBot"
211
- },
212
- {
213
- "regex": "(Twitterbot)/(\\d+)\\.(\\d+)",
214
- "family_replacement": "TwitterBot"
215
- },
216
- {
217
- "regex": "(Rackspace Monitoring)/(\\d+)\\.(\\d+)",
218
- "family_replacement": "RackspaceBot"
219
- },
220
- {
221
- "regex": "(PyAMF)/(\\d+)\\.(\\d+)\\.(\\d+)"
222
- },
223
- {
224
- "regex": "(YaBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)",
225
- "family_replacement": "Yandex Browser"
226
- },
227
- {
228
- "regex": "(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+).* MRCHROME",
229
- "family_replacement": "Mail.ru Chromium Browser"
230
- },
231
- {
232
- "regex": "(AOL) (\\d+)\\.(\\d+); AOLBuild (\\d+)"
233
- },
234
- {
235
- "regex": "(AdobeAIR|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Flock|Netscape|Lunascape|WebPilot|Vodafone|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave)/(\\d+)\\.(\\d+)\\.(\\d+)"
236
- },
237
- {
238
- "regex": "(Chromium|Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)"
239
- },
240
- {
241
- "regex": "(Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|Vodafone|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser)/(\\d+)\\.(\\d+)"
242
- },
243
- {
244
- "regex": "(Chromium|Chrome)/(\\d+)\\.(\\d+)"
245
- },
246
- {
247
- "regex": "(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\\d+)\\.(\\d+)\\.(\\d+)"
248
- },
249
- {
250
- "regex": "(iCab|Lunascape|Opera|Android|Jasmine|Polaris) (\\d+)\\.(\\d+)\\.?(\\d+)?"
251
- },
252
- {
253
- "regex": "(Kindle)/(\\d+)\\.(\\d+)"
254
- },
255
- {
256
- "regex": "(Android) Donut",
257
- "v2_replacement": "2",
258
- "v1_replacement": "1"
259
- },
260
- {
261
- "regex": "(Android) Eclair",
262
- "v2_replacement": "1",
263
- "v1_replacement": "2"
264
- },
265
- {
266
- "regex": "(Android) Froyo",
267
- "v2_replacement": "2",
268
- "v1_replacement": "2"
269
- },
270
- {
271
- "regex": "(Android) Gingerbread",
272
- "v2_replacement": "3",
273
- "v1_replacement": "2"
274
- },
275
- {
276
- "regex": "(Android) Honeycomb",
277
- "v1_replacement": "3"
278
- },
279
- {
280
- "regex": "(IEMobile)[ /](\\d+)\\.(\\d+)",
281
- "family_replacement": "IE Mobile"
282
- },
283
- {
284
- "regex": "(MSIE) (\\d+)\\.(\\d+).*XBLWP7",
285
- "family_replacement": "IE Large Screen"
286
- },
287
- {
288
- "regex": "(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+)"
289
- },
290
- {
291
- "regex": "(Firefox)/(\\d+)\\.(\\d+)(pre|[ab]\\d+[a-z]*)?"
292
- },
293
- {
294
- "regex": "(Obigo)InternetBrowser"
295
- },
296
- {
297
- "regex": "(Obigo)\\-Browser"
298
- },
299
- {
300
- "regex": "(Obigo|OBIGO)[^\\d]*(\\d+)(?:.(\\d+))?",
301
- "family_replacement": "Obigo"
302
- },
303
- {
304
- "regex": "(MAXTHON|Maxthon) (\\d+)\\.(\\d+)",
305
- "family_replacement": "Maxthon"
306
- },
307
- {
308
- "regex": "(Maxthon|MyIE2|Uzbl|Shiira)",
309
- "v1_replacement": "0"
310
- },
311
- {
312
- "regex": "PLAYSTATION 3.+WebKit",
313
- "family_replacement": "NetFront NX"
314
- },
315
- {
316
- "regex": "PLAYSTATION 3",
317
- "family_replacement": "NetFront"
318
- },
319
- {
320
- "regex": "(PlayStation Portable)",
321
- "family_replacement": "NetFront"
322
- },
323
- {
324
- "regex": "(PlayStation Vita)",
325
- "family_replacement": "NetFront NX"
326
- },
327
- {
328
- "regex": "AppleWebKit.+ (NX)/(\\d+)\\.(\\d+)\\.(\\d+)",
329
- "family_replacement": "NetFront NX"
330
- },
331
- {
332
- "regex": "(Nintendo 3DS)",
333
- "family_replacement": "NetFront NX"
334
- },
335
- {
336
- "regex": "(BrowseX) \\((\\d+)\\.(\\d+)\\.(\\d+)"
337
- },
338
- {
339
- "regex": "(NCSA_Mosaic)/(\\d+)\\.(\\d+)",
340
- "family_replacement": "NCSA Mosaic"
341
- },
342
- {
343
- "regex": "(POLARIS)/(\\d+)\\.(\\d+)",
344
- "family_replacement": "Polaris"
345
- },
346
- {
347
- "regex": "(Embider)/(\\d+)\\.(\\d+)",
348
- "family_replacement": "Polaris"
349
- },
350
- {
351
- "regex": "(BonEcho)/(\\d+)\\.(\\d+)\\.(\\d+)",
352
- "family_replacement": "Bon Echo"
353
- },
354
- {
355
- "regex": "M?QQBrowser",
356
- "family_replacement": "QQ Browser"
357
- },
358
- {
359
- "regex": "(iPod).+Version/(\\d+)\\.(\\d+)\\.(\\d+)",
360
- "family_replacement": "Mobile Safari"
361
- },
362
- {
363
- "regex": "(iPod).*Version/(\\d+)\\.(\\d+)",
364
- "family_replacement": "Mobile Safari"
365
- },
366
- {
367
- "regex": "(iPhone).*Version/(\\d+)\\.(\\d+)\\.(\\d+)",
368
- "family_replacement": "Mobile Safari"
369
- },
370
- {
371
- "regex": "(iPhone).*Version/(\\d+)\\.(\\d+)",
372
- "family_replacement": "Mobile Safari"
373
- },
374
- {
375
- "regex": "(iPad).*Version/(\\d+)\\.(\\d+)\\.(\\d+)",
376
- "family_replacement": "Mobile Safari"
377
- },
378
- {
379
- "regex": "(iPad).*Version/(\\d+)\\.(\\d+)",
380
- "family_replacement": "Mobile Safari"
381
- },
382
- {
383
- "regex": "(iPod|iPhone|iPad);.*CPU.*OS (\\d+)(?:_\\d+)?_(\\d+).*Mobile",
384
- "family_replacement": "Mobile Safari"
385
- },
386
- {
387
- "regex": "(iPod|iPhone|iPad)",
388
- "family_replacement": "Mobile Safari"
389
- },
390
- {
391
- "regex": "(AvantGo) (\\d+).(\\d+)"
392
- },
393
- {
394
- "regex": "(OneBrowser)/(\\d+).(\\d+)",
395
- "family_replacement": "ONE Browser"
396
- },
397
- {
398
- "regex": "(Avant)",
399
- "v1_replacement": "1"
400
- },
401
- {
402
- "regex": "(QtCarBrowser)",
403
- "v1_replacement": "1"
404
- },
405
- {
406
- "regex": "(iBrowser/Mini)(\\d+).(\\d+)",
407
- "family_replacement": "iBrowser Mini"
408
- },
409
- {
410
- "regex": "^(Nokia)",
411
- "family_replacement": "Nokia Services (WAP) Browser"
412
- },
413
- {
414
- "regex": "(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)\\.(\\d+)",
415
- "family_replacement": "Nokia Browser"
416
- },
417
- {
418
- "regex": "(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)",
419
- "family_replacement": "Nokia Browser"
420
- },
421
- {
422
- "regex": "(NokiaBrowser)/(\\d+)\\.(\\d+)",
423
- "family_replacement": "Nokia Browser"
424
- },
425
- {
426
- "regex": "(BrowserNG)/(\\d+)\\.(\\d+).(\\d+)",
427
- "family_replacement": "Nokia Browser"
428
- },
429
- {
430
- "regex": "(Series60)/5\\.0",
431
- "v2_replacement": "0",
432
- "v1_replacement": "7",
433
- "family_replacement": "Nokia Browser"
434
- },
435
- {
436
- "regex": "(Series60)/(\\d+)\\.(\\d+)",
437
- "family_replacement": "Nokia OSS Browser"
438
- },
439
- {
440
- "regex": "(S40OviBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)",
441
- "family_replacement": "Ovi Browser"
442
- },
443
- {
444
- "regex": "(Nokia)[EN]?(\\d+)"
445
- },
446
- {
447
- "regex": "(BB10);",
448
- "family_replacement": "BlackBerry WebKit"
449
- },
450
- {
451
- "regex": "(PlayBook).+RIM Tablet OS (\\d+)\\.(\\d+)\\.(\\d+)",
452
- "family_replacement": "BlackBerry WebKit"
453
- },
454
- {
455
- "regex": "(Black[bB]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)",
456
- "family_replacement": "BlackBerry WebKit"
457
- },
458
- {
459
- "regex": "(Black[bB]erry)\\s?(\\d+)",
460
- "family_replacement": "BlackBerry"
461
- },
462
- {
463
- "regex": "(OmniWeb)/v(\\d+)\\.(\\d+)"
464
- },
465
- {
466
- "regex": "(Blazer)/(\\d+)\\.(\\d+)",
467
- "family_replacement": "Palm Blazer"
468
- },
469
- {
470
- "regex": "(Pre)/(\\d+)\\.(\\d+)",
471
- "family_replacement": "Palm Pre"
472
- },
473
- {
474
- "regex": "(Links) \\((\\d+)\\.(\\d+)"
475
- },
476
- {
477
- "regex": "(QtWeb) Internet Browser/(\\d+)\\.(\\d+)"
478
- },
479
- {
480
- "regex": "(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+))?",
481
- "family_replacement": "Amazon Silk"
482
- },
483
- {
484
- "regex": "(PhantomJS)/(\\d+)\\.(\\d+)\\.(\\d+)"
485
- },
486
- {
487
- "regex": "(AppleWebKit)/(\\d+)\\.?(\\d+)?\\+ .* Safari",
488
- "family_replacement": "WebKit Nightly"
489
- },
490
- {
491
- "regex": "(Version)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*Safari/",
492
- "family_replacement": "Safari"
493
- },
494
- {
495
- "regex": "(Safari)/\\d+"
496
- },
497
- {
498
- "regex": "(OLPC)/Update(\\d+)\\.(\\d+)"
499
- },
500
- {
501
- "regex": "(OLPC)/Update()\\.(\\d+)",
502
- "v1_replacement": "0"
503
- },
504
- {
505
- "regex": "(SEMC\\-Browser)/(\\d+)\\.(\\d+)"
506
- },
507
- {
508
- "regex": "(Teleca)",
509
- "family_replacement": "Teleca Browser"
510
- },
511
- {
512
- "regex": "(Phantom)/V(\\d+)\\.(\\d+)",
513
- "family_replacement": "Phantom Browser"
514
- },
515
- {
516
- "regex": "Trident(.*)rv.(\\d+)\\.(\\d+)",
517
- "family_replacement": "IE"
518
- },
519
- {
520
- "regex": "([MS]?IE) (\\d+)\\.(\\d+)",
521
- "family_replacement": "IE"
522
- },
523
- {
524
- "regex": "(python-requests)/(\\d+)\\.(\\d+)",
525
- "family_replacement": "Python Requests"
526
- }
527
- ],
528
- "os_parsers": [
529
- {
530
- "regex": "(Android) (\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+))?"
531
- },
532
- {
533
- "regex": "(Android)\\-(\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+))?"
534
- },
535
- {
536
- "regex": "(Android) Donut",
537
- "os_v2_replacement": "2",
538
- "os_v1_replacement": "1"
539
- },
540
- {
541
- "regex": "(Android) Eclair",
542
- "os_v2_replacement": "1",
543
- "os_v1_replacement": "2"
544
- },
545
- {
546
- "regex": "(Android) Froyo",
547
- "os_v2_replacement": "2",
548
- "os_v1_replacement": "2"
549
- },
550
- {
551
- "regex": "(Android) Gingerbread",
552
- "os_v2_replacement": "3",
553
- "os_v1_replacement": "2"
554
- },
555
- {
556
- "regex": "(Android) Honeycomb",
557
- "os_v1_replacement": "3"
558
- },
559
- {
560
- "regex": "(Silk-Accelerated=[a-z]{4,5})",
561
- "os_replacement": "Android"
562
- },
563
- {
564
- "regex": "(Windows (?:NT 5\\.2|NT 5\\.1))",
565
- "os_replacement": "Windows XP"
566
- },
567
- {
568
- "regex": "(XBLWP7)",
569
- "os_replacement": "Windows Phone"
570
- },
571
- {
572
- "regex": "(Windows NT 6\\.4)",
573
- "os_replacement": "Windows 10"
574
- },
575
- {
576
- "regex": "(Windows NT 6\\.3)",
577
- "os_replacement": "Windows 8.1"
578
- },
579
- {
580
- "regex": "(Windows NT 6\\.2)",
581
- "os_replacement": "Windows 8"
582
- },
583
- {
584
- "regex": "(Windows NT 6\\.1)",
585
- "os_replacement": "Windows 7"
586
- },
587
- {
588
- "regex": "(Windows NT 6\\.0)",
589
- "os_replacement": "Windows Vista"
590
- },
591
- {
592
- "regex": "(Win 9x 4\\.90)",
593
- "os_replacement": "Windows Me"
594
- },
595
- {
596
- "regex": "(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\\.0|Windows Vista|Windows 2000|Windows 3.1)"
597
- },
598
- {
599
- "regex": "(Windows NT 6\\.2; ARM;)",
600
- "os_replacement": "Windows RT"
601
- },
602
- {
603
- "regex": "(Windows NT 5\\.0)",
604
- "os_replacement": "Windows 2000"
605
- },
606
- {
607
- "regex": "(Windows Phone) (\\d+)\\.(\\d+)"
608
- },
609
- {
610
- "regex": "(Windows Phone) OS (\\d+)\\.(\\d+)"
611
- },
612
- {
613
- "regex": "(Windows ?Mobile)",
614
- "os_replacement": "Windows Mobile"
615
- },
616
- {
617
- "regex": "(WinNT4.0)",
618
- "os_replacement": "Windows NT 4.0"
619
- },
620
- {
621
- "regex": "(Win98)",
622
- "os_replacement": "Windows 98"
623
- },
624
- {
625
- "regex": "(Tizen)/(\\d+)\\.(\\d+)"
626
- },
627
- {
628
- "regex": "(Mac OS X) (\\d+)[_.](\\d+)(?:[_.](\\d+))?"
629
- },
630
- {
631
- "regex": "Mac_PowerPC",
632
- "os_replacement": "Mac OS"
633
- },
634
- {
635
- "regex": "(?:PPC|Intel) (Mac OS X)"
636
- },
637
- {
638
- "regex": "(CPU OS|iPhone OS) (\\d+)_(\\d+)(?:_(\\d+))?",
639
- "os_replacement": "iOS"
640
- },
641
- {
642
- "regex": "(iPhone|iPad|iPod); Opera",
643
- "os_replacement": "iOS"
644
- },
645
- {
646
- "regex": "(iPhone|iPad|iPod).*Mac OS X.*Version/(\\d+)\\.(\\d+)",
647
- "os_replacement": "iOS"
648
- },
649
- {
650
- "regex": "(AppleTV)/(\\d+)\\.(\\d+)",
651
- "os_replacement": "ATV OS X"
652
- },
653
- {
654
- "regex": "(CrOS) [a-z0-9_]+ (\\d+)\\.(\\d+)(?:\\.(\\d+))?",
655
- "os_replacement": "Chrome OS"
656
- },
657
- {
658
- "regex": "([Dd]ebian)",
659
- "os_replacement": "Debian"
660
- },
661
- {
662
- "regex": "(Linux Mint)(?:/(\\d+))?"
663
- },
664
- {
665
- "regex": "(Mandriva)(?: Linux)?/(?:[\\d.-]+m[a-z]{2}(\\d+).(\\d))?"
666
- },
667
- {
668
- "regex": "(Symbian[Oo][Ss])/(\\d+)\\.(\\d+)",
669
- "os_replacement": "Symbian OS"
670
- },
671
- {
672
- "regex": "(Symbian/3).+NokiaBrowser/7\\.3",
673
- "os_replacement": "Symbian^3 Anna"
674
- },
675
- {
676
- "regex": "(Symbian/3).+NokiaBrowser/7\\.4",
677
- "os_replacement": "Symbian^3 Belle"
678
- },
679
- {
680
- "regex": "(Symbian/3)",
681
- "os_replacement": "Symbian^3"
682
- },
683
- {
684
- "regex": "(Series 60|SymbOS|S60)",
685
- "os_replacement": "Symbian OS"
686
- },
687
- {
688
- "regex": "(MeeGo)"
689
- },
690
- {
691
- "regex": "Symbian [Oo][Ss]",
692
- "os_replacement": "Symbian OS"
693
- },
694
- {
695
- "regex": "Series40;",
696
- "os_replacement": "Nokia Series 40"
697
- },
698
- {
699
- "regex": "(BB10);.+Version/(\\d+)\\.(\\d+)\\.(\\d+)",
700
- "os_replacement": "BlackBerry OS"
701
- },
702
- {
703
- "regex": "(Black[Bb]erry)[0-9a-z]+/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?",
704
- "os_replacement": "BlackBerry OS"
705
- },
706
- {
707
- "regex": "(Black[Bb]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?",
708
- "os_replacement": "BlackBerry OS"
709
- },
710
- {
711
- "regex": "(RIM Tablet OS) (\\d+)\\.(\\d+)\\.(\\d+)",
712
- "os_replacement": "BlackBerry Tablet OS"
713
- },
714
- {
715
- "regex": "(Play[Bb]ook)",
716
- "os_replacement": "BlackBerry Tablet OS"
717
- },
718
- {
719
- "regex": "(Black[Bb]erry)",
720
- "os_replacement": "BlackBerry OS"
721
- },
722
- {
723
- "regex": "\\(Mobile;.+Firefox/\\d+\\.\\d+",
724
- "os_replacement": "Firefox OS"
725
- },
726
- {
727
- "regex": "(BREW)[ /](\\d+)\\.(\\d+)\\.(\\d+)"
728
- },
729
- {
730
- "regex": "(BREW);"
731
- },
732
- {
733
- "regex": "(Brew MP|BMP)[ /](\\d+)\\.(\\d+)\\.(\\d+)",
734
- "os_replacement": "Brew MP"
735
- },
736
- {
737
- "regex": "BMP;",
738
- "os_replacement": "Brew MP"
739
- },
740
- {
741
- "regex": "(GoogleTV) (\\d+)\\.(\\d+)\\.(\\d+)"
742
- },
743
- {
744
- "regex": "(GoogleTV)/\\d+"
745
- },
746
- {
747
- "regex": "(WebTV)/(\\d+).(\\d+)"
748
- },
749
- {
750
- "regex": "(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+))?",
751
- "os_replacement": "webOS"
752
- },
753
- {
754
- "regex": "(VRE);"
755
- },
756
- {
757
- "regex": "(Fedora|Red Hat|PCLinuxOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)"
758
- },
759
- {
760
- "regex": "(Red Hat|Puppy|PCLinuxOS)/(\\d+)\\.(\\d+)\\.(\\d+)"
761
- },
762
- {
763
- "regex": "(Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Red Hat|Slackware)/(\\d+)\\.(\\d+)"
764
- },
765
- {
766
- "regex": "(Windows|OpenBSD|FreeBSD|NetBSD|Android|WeTab)"
767
- },
768
- {
769
- "regex": "(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Gentoo|Mageia)"
770
- },
771
- {
772
- "regex": "(Linux)/(\\d+)\\.(\\d+)"
773
- },
774
- {
775
- "regex": "(Linux|BSD)"
776
- },
777
- {
778
- "regex": "SunOS",
779
- "os_replacement": "Solaris"
780
- }
781
- ],
782
- "device_parsers": [
783
- {
784
- "regex": "HTC ([A-Z][a-z0-9]+) Build",
785
- "device_replacement": "HTC $1"
786
- },
787
- {
788
- "regex": "HTC ([A-Z][a-z0-9 ]+) \\d+\\.\\d+\\.\\d+\\.\\d+",
789
- "device_replacement": "HTC $1"
790
- },
791
- {
792
- "regex": "HTC_Touch_([A-Za-z0-9]+)",
793
- "device_replacement": "HTC Touch ($1)"
794
- },
795
- {
796
- "regex": "USCCHTC(\\d+)",
797
- "device_replacement": "HTC $1 (US Cellular)"
798
- },
799
- {
800
- "regex": "Sprint APA(9292)",
801
- "device_replacement": "HTC $1 (Sprint)"
802
- },
803
- {
804
- "regex": "HTC ([A-Za-z0-9]+ [A-Z])",
805
- "device_replacement": "HTC $1"
806
- },
807
- {
808
- "regex": "HTC[-_/\\s]([A-Za-z0-9]+)",
809
- "device_replacement": "HTC $1"
810
- },
811
- {
812
- "regex": "(ADR[A-Za-z0-9]+)",
813
- "device_replacement": "HTC $1"
814
- },
815
- {
816
- "regex": "(HTC)"
817
- },
818
- {
819
- "regex": "(QtCarBrowser)",
820
- "device_replacement": "Tesla Model S"
821
- },
822
- {
823
- "regex": "(SamsungSGHi560)",
824
- "device_replacement": "Samsung SGHi560"
825
- },
826
- {
827
- "regex": "SonyEricsson([A-Za-z0-9]+)/",
828
- "device_replacement": "Ericsson $1"
829
- },
830
- {
831
- "regex": "PLAYSTATION 3",
832
- "device_replacement": "PlayStation 3"
833
- },
834
- {
835
- "regex": "(PlayStation Portable)"
836
- },
837
- {
838
- "regex": "(PlayStation Vita)"
839
- },
840
- {
841
- "regex": "(KFOT Build)",
842
- "device_replacement": "Kindle Fire"
843
- },
844
- {
845
- "regex": "(KFTT Build)",
846
- "device_replacement": "Kindle Fire HD"
847
- },
848
- {
849
- "regex": "(KFJWI Build)",
850
- "device_replacement": "Kindle Fire HD 8.9\" WiFi"
851
- },
852
- {
853
- "regex": "(KFJWA Build)",
854
- "device_replacement": "Kindle Fire HD 8.9\" 4G"
855
- },
856
- {
857
- "regex": "(Kindle Fire)"
858
- },
859
- {
860
- "regex": "(Kindle)"
861
- },
862
- {
863
- "regex": "(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+))?",
864
- "device_replacement": "Kindle Fire"
865
- },
866
- {
867
- "regex": "Android[\\- ][\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{2}; WOWMobile (.+) Build"
868
- },
869
- {
870
- "regex": "Android[\\- ][\\d]+\\.[\\d]+\\-update1; [A-Za-z]{2}\\-[A-Za-z]{2}; (.+) Build"
871
- },
872
- {
873
- "regex": "Android[\\- ][\\d]+\\.[\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{2}; (.+) Build"
874
- },
875
- {
876
- "regex": "Android[\\- ][\\d]+\\.[\\d]+\\.[\\d]+;[A-Za-z]{2}\\-[A-Za-z]{2};(.+) Build"
877
- },
878
- {
879
- "regex": "Android[\\- ][\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{2}; (.+) Build"
880
- },
881
- {
882
- "regex": "Android[\\- ][\\d]+\\.[\\d]+\\.[\\d]+; (.+) Build"
883
- },
884
- {
885
- "regex": "Android[\\- ][\\d]+\\.[\\d]+; (.+) Build"
886
- },
887
- {
888
- "regex": "NokiaN([0-9]+)",
889
- "device_replacement": "Nokia N$1"
890
- },
891
- {
892
- "regex": "NOKIA([A-Za-z0-9\\v-]+)",
893
- "device_replacement": "Nokia $1"
894
- },
895
- {
896
- "regex": "Nokia([A-Za-z0-9\\v-]+)",
897
- "device_replacement": "Nokia $1"
898
- },
899
- {
900
- "regex": "NOKIA ([A-Za-z0-9\\-]+)",
901
- "device_replacement": "Nokia $1"
902
- },
903
- {
904
- "regex": "Nokia ([A-Za-z0-9\\-]+)",
905
- "device_replacement": "Nokia $1"
906
- },
907
- {
908
- "regex": "Lumia ([A-Za-z0-9\\-]+)",
909
- "device_replacement": "Lumia $1"
910
- },
911
- {
912
- "regex": "Symbian",
913
- "device_replacement": "Nokia"
914
- },
915
- {
916
- "regex": "BB10; ([A-Za-z0-9\\- ]+)\\)",
917
- "device_replacement": "BlackBerry $1"
918
- },
919
- {
920
- "regex": "(PlayBook).+RIM Tablet OS",
921
- "device_replacement": "BlackBerry Playbook"
922
- },
923
- {
924
- "regex": "Black[Bb]erry ([0-9]+);",
925
- "device_replacement": "BlackBerry $1"
926
- },
927
- {
928
- "regex": "Black[Bb]erry([0-9]+)",
929
- "device_replacement": "BlackBerry $1"
930
- },
931
- {
932
- "regex": "Black[Bb]erry;",
933
- "device_replacement": "BlackBerry"
934
- },
935
- {
936
- "regex": "(Pre)/(\\d+)\\.(\\d+)",
937
- "device_replacement": "Palm Pre"
938
- },
939
- {
940
- "regex": "(Pixi)/(\\d+)\\.(\\d+)",
941
- "device_replacement": "Palm Pixi"
942
- },
943
- {
944
- "regex": "(Touch[Pp]ad)/(\\d+)\\.(\\d+)",
945
- "device_replacement": "HP TouchPad"
946
- },
947
- {
948
- "regex": "HPiPAQ([A-Za-z0-9]+)/(\\d+).(\\d+)",
949
- "device_replacement": "HP iPAQ $1"
950
- },
951
- {
952
- "regex": "Palm([A-Za-z0-9]+)",
953
- "device_replacement": "Palm $1"
954
- },
955
- {
956
- "regex": "Treo([A-Za-z0-9]+)",
957
- "device_replacement": "Palm Treo $1"
958
- },
959
- {
960
- "regex": "webOS.*(P160UNA)/(\\d+).(\\d+)",
961
- "device_replacement": "HP Veer"
962
- },
963
- {
964
- "regex": "(AppleTV)",
965
- "device_replacement": "AppleTV"
966
- },
967
- {
968
- "regex": "AdsBot-Google-Mobile",
969
- "device_replacement": "Spider"
970
- },
971
- {
972
- "regex": "Googlebot-Mobile/(\\d+).(\\d+)",
973
- "device_replacement": "Spider"
974
- },
975
- {
976
- "regex": "(iPad) Simulator;"
977
- },
978
- {
979
- "regex": "(iPad);"
980
- },
981
- {
982
- "regex": "(iPod);"
983
- },
984
- {
985
- "regex": "(iPhone) Simulator;"
986
- },
987
- {
988
- "regex": "(iPhone);"
989
- },
990
- {
991
- "regex": "acer_([A-Za-z0-9]+)_",
992
- "device_replacement": "Acer $1"
993
- },
994
- {
995
- "regex": "acer_([A-Za-z0-9]+)_",
996
- "device_replacement": "Acer $1"
997
- },
998
- {
999
- "regex": "ALCATEL-([A-Za-z0-9]+)",
1000
- "device_replacement": "Alcatel $1"
1001
- },
1002
- {
1003
- "regex": "Alcatel-([A-Za-z0-9]+)",
1004
- "device_replacement": "Alcatel $1"
1005
- },
1006
- {
1007
- "regex": "Amoi\\-([A-Za-z0-9]+)",
1008
- "device_replacement": "Amoi $1"
1009
- },
1010
- {
1011
- "regex": "AMOI\\-([A-Za-z0-9]+)",
1012
- "device_replacement": "Amoi $1"
1013
- },
1014
- {
1015
- "regex": "Asus\\-([A-Za-z0-9]+)",
1016
- "device_replacement": "Asus $1"
1017
- },
1018
- {
1019
- "regex": "ASUS\\-([A-Za-z0-9]+)",
1020
- "device_replacement": "Asus $1"
1021
- },
1022
- {
1023
- "regex": "BIRD\\-([A-Za-z0-9]+)",
1024
- "device_replacement": "Bird $1"
1025
- },
1026
- {
1027
- "regex": "BIRD\\.([A-Za-z0-9]+)",
1028
- "device_replacement": "Bird $1"
1029
- },
1030
- {
1031
- "regex": "BIRD ([A-Za-z0-9]+)",
1032
- "device_replacement": "Bird $1"
1033
- },
1034
- {
1035
- "regex": "Dell ([A-Za-z0-9]+)",
1036
- "device_replacement": "Dell $1"
1037
- },
1038
- {
1039
- "regex": "DoCoMo/2\\.0 ([A-Za-z0-9]+)",
1040
- "device_replacement": "DoCoMo $1"
1041
- },
1042
- {
1043
- "regex": "([A-Za-z0-9]+)_W\\;FOMA",
1044
- "device_replacement": "DoCoMo $1"
1045
- },
1046
- {
1047
- "regex": "([A-Za-z0-9]+)\\;FOMA",
1048
- "device_replacement": "DoCoMo $1"
1049
- },
1050
- {
1051
- "regex": "Huawei([A-Za-z0-9]+)",
1052
- "device_replacement": "Huawei $1"
1053
- },
1054
- {
1055
- "regex": "HUAWEI-([A-Za-z0-9]+)",
1056
- "device_replacement": "Huawei $1"
1057
- },
1058
- {
1059
- "regex": "vodafone([A-Za-z0-9]+)",
1060
- "device_replacement": "Huawei Vodafone $1"
1061
- },
1062
- {
1063
- "regex": "i\\-mate ([A-Za-z0-9]+)",
1064
- "device_replacement": "i-mate $1"
1065
- },
1066
- {
1067
- "regex": "Kyocera\\-([A-Za-z0-9]+)",
1068
- "device_replacement": "Kyocera $1"
1069
- },
1070
- {
1071
- "regex": "KWC\\-([A-Za-z0-9]+)",
1072
- "device_replacement": "Kyocera $1"
1073
- },
1074
- {
1075
- "regex": "Lenovo\\-([A-Za-z0-9]+)",
1076
- "device_replacement": "Lenovo $1"
1077
- },
1078
- {
1079
- "regex": "Lenovo_([A-Za-z0-9]+)",
1080
- "device_replacement": "Lenovo $1"
1081
- },
1082
- {
1083
- "regex": "LG/([A-Za-z0-9]+)",
1084
- "device_replacement": "LG $1"
1085
- },
1086
- {
1087
- "regex": "LG-LG([A-Za-z0-9]+)",
1088
- "device_replacement": "LG $1"
1089
- },
1090
- {
1091
- "regex": "LGE-LG([A-Za-z0-9]+)",
1092
- "device_replacement": "LG $1"
1093
- },
1094
- {
1095
- "regex": "LGE VX([A-Za-z0-9]+)",
1096
- "device_replacement": "LG $1"
1097
- },
1098
- {
1099
- "regex": "LG ([A-Za-z0-9]+)",
1100
- "device_replacement": "LG $1"
1101
- },
1102
- {
1103
- "regex": "LGE LG\\-AX([A-Za-z0-9]+)",
1104
- "device_replacement": "LG $1"
1105
- },
1106
- {
1107
- "regex": "LG\\-([A-Za-z0-9]+)",
1108
- "device_replacement": "LG $1"
1109
- },
1110
- {
1111
- "regex": "LGE\\-([A-Za-z0-9]+)",
1112
- "device_replacement": "LG $1"
1113
- },
1114
- {
1115
- "regex": "LG([A-Za-z0-9]+)",
1116
- "device_replacement": "LG $1"
1117
- },
1118
- {
1119
- "regex": "(KIN)\\.One (\\d+)\\.(\\d+)",
1120
- "device_replacement": "Microsoft $1"
1121
- },
1122
- {
1123
- "regex": "(KIN)\\.Two (\\d+)\\.(\\d+)",
1124
- "device_replacement": "Microsoft $1"
1125
- },
1126
- {
1127
- "regex": "(Motorola)\\-([A-Za-z0-9]+)"
1128
- },
1129
- {
1130
- "regex": "MOTO\\-([A-Za-z0-9]+)",
1131
- "device_replacement": "Motorola $1"
1132
- },
1133
- {
1134
- "regex": "MOT\\-([A-Za-z0-9]+)",
1135
- "device_replacement": "Motorola $1"
1136
- },
1137
- {
1138
- "regex": "(Nintendo WiiU)",
1139
- "device_replacement": "Nintendo Wii U"
1140
- },
1141
- {
1142
- "regex": "Nintendo (DS|3DS|DSi|Wii);",
1143
- "device_replacement": "Nintendo $1"
1144
- },
1145
- {
1146
- "regex": "Pantech([A-Za-z0-9]+)",
1147
- "device_replacement": "Pantech $1"
1148
- },
1149
- {
1150
- "regex": "Philips([A-Za-z0-9]+)",
1151
- "device_replacement": "Philips $1"
1152
- },
1153
- {
1154
- "regex": "Philips ([A-Za-z0-9]+)",
1155
- "device_replacement": "Philips $1"
1156
- },
1157
- {
1158
- "regex": "SAMSUNG-([A-Za-z0-9\\-]+)",
1159
- "device_replacement": "Samsung $1"
1160
- },
1161
- {
1162
- "regex": "SAMSUNG\\; ([A-Za-z0-9\\-]+)",
1163
- "device_replacement": "Samsung $1"
1164
- },
1165
- {
1166
- "regex": "Dreamcast",
1167
- "device_replacement": "Sega Dreamcast"
1168
- },
1169
- {
1170
- "regex": "Softbank/1\\.0/([A-Za-z0-9]+)",
1171
- "device_replacement": "Softbank $1"
1172
- },
1173
- {
1174
- "regex": "Softbank/2\\.0/([A-Za-z0-9]+)",
1175
- "device_replacement": "Softbank $1"
1176
- },
1177
- {
1178
- "regex": "(WebTV)/(\\d+).(\\d+)"
1179
- },
1180
- {
1181
- "regex": "(hiptop|avantgo|plucker|xiino|blazer|elaine|up.browser|up.link|mmp|smartphone|midp|wap|vodafone|o2|pocket|mobile|pda)",
1182
- "device_replacement": "Generic Smartphone"
1183
- },
1184
- {
1185
- "regex": "^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\\-|airn|alav|asus|attw|au\\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bell|bird|bw\\-n|bw\\-u|beck|benq|bilb|blac|c55/|cdm\\-|chtm|capi|comp|cond|craw|dall|dbte|dc\\-s|dica|ds\\-d|ds12|dait|devi|dmob|doco|dopo|el49|erk0|esl8|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\\-|fly_|g\\-mo|g1 u|g560|gf\\-5|grun|gene|go.w|good|grad|hcit|hd\\-m|hd\\-p|hd\\-t|hei\\-|hp i|hpip|hs\\-c|htc |htc\\-|htca|htcg)",
1186
- "device_replacement": "Generic Feature Phone"
1187
- },
1188
- {
1189
- "regex": "^(htcp|htcs|htct|htc_|haie|hita|huaw|hutc|i\\-20|i\\-go|i\\-ma|i230|iac|iac\\-|iac/|ig01|im1k|inno|iris|jata|java|kddi|kgt|kgt/|kpt |kwc\\-|klon|lexi|lg g|lg\\-a|lg\\-b|lg\\-c|lg\\-d|lg\\-f|lg\\-g|lg\\-k|lg\\-l|lg\\-m|lg\\-o|lg\\-p|lg\\-s|lg\\-t|lg\\-u|lg\\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\\-|lge/|lynx|leno|m1\\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\\-|nem\\-|newg|neon)",
1190
- "device_replacement": "Generic Feature Phone"
1191
- },
1192
- {
1193
- "regex": "^(netf|noki|nzph|o2 x|o2\\-x|opwv|owg1|opti|oran|ot\\-s|p800|pand|pg\\-1|pg\\-2|pg\\-3|pg\\-6|pg\\-8|pg\\-c|pg13|phil|pn\\-2|pt\\-g|palm|pana|pire|pock|pose|psio|qa\\-a|qc\\-2|qc\\-3|qc\\-5|qc\\-7|qc07|qc12|qc21|qc32|qc60|qci\\-|qwap|qtek|r380|r600|raks|rim9|rove|s55/|sage|sams|sc01|sch\\-|scp\\-|sdk/|se47|sec\\-|sec0|sec1|semc|sgh\\-|shar|sie\\-|sk\\-0|sl45|slid|smb3|smt5|sp01|sph\\-|spv |spv\\-|sy01|samm|sany|sava|scoo|send|siem|smar|smit|soft|sony|t\\-mo|t218|t250|t600|t610|t618|tcl\\-|tdg\\-|telm|tim\\-|ts70|tsm\\-|tsm3|tsm5|tx\\-9|tagt)",
1194
- "device_replacement": "Generic Feature Phone"
1195
- },
1196
- {
1197
- "regex": "^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vite|voda|vulc|w3c |w3c\\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\\-|your|zte\\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\\-|webc|whit|wmlb|xda\\-|xda_)",
1198
- "device_replacement": "Generic Feature Phone"
1199
- },
1200
- {
1201
- "regex": "(bot|borg|google(^tv)|yahoo|slurp|msnbot|msrbot|openbot|archiver|netresearch|lycos|scooter|altavista|teoma|gigabot|baiduspider|blitzbot|oegp|charlotte|furlbot|http%20client|polybot|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|seekbot|semanticdiscovery|silk|snappy|speedy|spider|voila|vortex|voyager|zao|zeal|fast\\-webcrawler|converacrawler|dataparksearch|findlinks|crawler)",
1202
- "device_replacement": "Spider"
1203
- }
1204
- ]
1205
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Libs/uaparser/uaparser.php DELETED
@@ -1,308 +0,0 @@
1
- <?php
2
-
3
- /*!
4
- * ua-parser-php v2.1.1
5
- *
6
- * Copyright (c) 2011-2012 Dave Olsen, http://dmolsen.com
7
- * Licensed under the MIT license
8
- *
9
- * ua-parser-php is the PHP library for the ua-parser project. Learn more about the ua-parser project at:
10
- *
11
- * https://github.com/tobie/ua-parser
12
- *
13
- * The user agents data from the ua-parser project is licensed under the Apache license.
14
- * spyc-0.5, for loading the YAML, is licensed under the MIT license.
15
- * Services_JSON, for loading the JSON in sub-PHP 5.2 installs, is licensed under the MIT license
16
- * The initial list of generic feature phones & smartphones came from Mobile Web OSP under the MIT license
17
- * The initial list of spiders was taken from Yiibu's profile project under the MIT license.
18
- *
19
- * Many thanks to the following major contributors:
20
- *
21
- * - Bryan Shelton
22
- * - Michael Bond
23
- * - @rjd22 (https://github.com/rjd22)
24
- * - Timo Tijhof (https://github.com/Krinkle)
25
- * - Marcus Bointon (https://github.com/Synchro)
26
- * - Ryan Parman (https://github.com/skyzyx)
27
- * - Pravin Dahal (https://github.com/pravindahal)
28
- */
29
-
30
- // address 5.1 compatibility
31
- if ( ! function_exists( 'json_decode' ) || ! function_exists( 'json_encode' ) ) {
32
- $die_message = 'A minimum of PHP version 5.2.4 is required to run WordPress. More information can be read here: https://wordpress.org/about/requirements/';
33
- if ( function_exists( 'wp_die' ) ) {
34
- wp_die( $die_message );
35
- } else {
36
- die( $die_message );
37
- }
38
- }
39
-
40
- class UAParser {
41
-
42
- protected $regexes;
43
- protected $log = false;
44
-
45
- /**
46
- * Start up the parser by importing the json file to $this->regexes
47
- */
48
- public function __construct($customRegexesFile = null) {
49
-
50
- $regexesFile = ($customRegexesFile !== null) ? $customRegexesFile : dirname(__FILE__).DIRECTORY_SEPARATOR.'resources/regexes.json';
51
- if (file_exists($regexesFile)) {
52
- $this->regexes = apply_filters( 'dlm_ua_parser_regexes', json_decode( file_get_contents( $regexesFile ) ) );
53
- } else {
54
- $title = 'Error loading ua-parser';
55
- if ($customRegexesFile !== null) {
56
- $message = 'ua-parser can\'t find the custom regexes file you supplied ('.$customRegexesFile.'). Please make sure you have the correct path.';
57
- $instruction1 = '';
58
- $instruction2 = '';
59
- } else {
60
- $message = 'Please download the regexes.json file before using uaparser.php. You can type the following at the command line to download the latest version: ';
61
- $instruction1 = '%: cd /path/to/UAParser/';
62
- $instruction2 = '%: php uaparser-cli.php -g';
63
- }
64
-
65
- if (php_sapi_name() == 'cli') {
66
- print "\n".$title."\n";
67
- print $message."\n\n";
68
- print " ".$instruction2."\n\n";
69
- } else {
70
- print '<html><head><title>'.$title.'</title></head><body>';
71
- print '<h1>'.$title.'</h1>';
72
- print '<p>'.$message.'</p>';
73
- print '<blockquote>';
74
- print '<code>'.$instruction1.'</code><br>';
75
- print '<code>'.$instruction2.'</code>';
76
- print '</blockquote>';
77
- print '</body></html>';
78
- }
79
-
80
- exit;
81
- }
82
- }
83
-
84
- /**
85
- * Sets up some standard variables as well as starts the user agent parsing process
86
- * @param string a user agent string to test, defaults to an empty string
87
- * @return object the result of the user agent parsing
88
- */
89
- public function parse($ua = '') {
90
-
91
- // build the default obj that will be returned
92
- $result = (object) array(
93
- 'ua' => (object) array(),
94
- 'os' => (object) array(),
95
- 'device' => (object) array(),
96
- 'toFullString' => '',
97
- 'uaOriginal' => $ua
98
- );
99
-
100
- // figure out the ua, os, and device properties if possible
101
- $result->ua = $this->uaParse($ua);
102
- $result->os = $this->osParse($ua);
103
- $result->device = $this->deviceParse($ua);
104
-
105
- // create a full string version based on the ua and os objects
106
- $result->toFullString = $this->toFullString($result->ua, $result->os);
107
-
108
- // log the results when testing
109
- if ($this->log) {
110
- $this->log($result);
111
- }
112
-
113
- return $result;
114
-
115
- }
116
-
117
- /**
118
- * Attempts to see if the user agent matches a user_agents_parsers regex from regexes.json
119
- * @param string a user agent string to test
120
- * @return object the result of the user agent parsing
121
- */
122
- public function uaParse($uaString = '') {
123
-
124
- // build the default obj that will be returned
125
- $ua = (object) array(
126
- 'family' => 'Other',
127
- 'major' => null,
128
- 'minor' => null,
129
- 'patch' => null,
130
- 'toString' => '',
131
- 'toVersionString' => ''
132
- );
133
-
134
- // run the regexes to match things up
135
- $uaRegexes = $this->regexes->user_agent_parsers;
136
- foreach ($uaRegexes as $uaRegex) {
137
-
138
- // tests the supplied regex against the user agent
139
- if (preg_match('/'.str_replace('/','\/',str_replace('\/','/',$uaRegex->regex)).'/i',$uaString,$matches)) {
140
-
141
- // Make sure matches are at least set to null or Other
142
- if (!isset($matches[1])) { $matches[1] = 'Other'; }
143
- if (!isset($matches[2])) { $matches[2] = null; }
144
- if (!isset($matches[3])) { $matches[3] = null; }
145
- if (!isset($matches[4])) { $matches[4] = null; }
146
-
147
- // ua name
148
- $ua->family = isset($uaRegex->family_replacement) ? str_replace('$1',$matches[1],$uaRegex->family_replacement) : $matches[1];
149
-
150
- // version properties
151
- $ua->major = isset($uaRegex->v1_replacement) ? $uaRegex->v1_replacement : $matches[2];
152
- $ua->minor = isset($uaRegex->v2_replacement) ? $uaRegex->v2_replacement : $matches[3];
153
- $ua->patch = isset($uaRegex->v3_replacement) ? $uaRegex->v3_replacement : $matches[4];
154
-
155
- // extra strings
156
- $ua->toString = $this->toString($ua);
157
- $ua->toVersionString = $this->toVersionString($ua);
158
-
159
- return $ua;
160
- }
161
-
162
- }
163
-
164
- return $ua;
165
-
166
- }
167
-
168
- /**
169
- * Attempts to see if the user agent matches an os_parsers regex from regexes.json
170
- * @param string a user agent string to test
171
- * @return object the result of the os parsing
172
- */
173
- public function osParse($uaString = '') {
174
-
175
- // build the default obj that will be returned
176
- $os = (object) array(
177
- 'family' => 'Other',
178
- 'major' => null,
179
- 'minor' => null,
180
- 'patch' => null,
181
- 'patch_minor' => null,
182
- 'toString' => '',
183
- 'toVersionString' => ''
184
- );
185
-
186
- // run the regexes to match things up
187
- $osRegexes = $this->regexes->os_parsers;
188
- foreach ($osRegexes as $osRegex) {
189
-
190
- if (preg_match('/'.str_replace('/','\/',str_replace('\/','/',$osRegex->regex)).'/i',$uaString,$matches)) {
191
-
192
- // Make sure matches are at least set to null or Other
193
- if (!isset($matches[1])) { $matches[1] = 'Other'; }
194
- if (!isset($matches[2])) { $matches[2] = null; }
195
- if (!isset($matches[3])) { $matches[3] = null; }
196
- if (!isset($matches[4])) { $matches[4] = null; }
197
- if (!isset($matches[5])) { $matches[5] = null; }
198
-
199
- // os name
200
- $os->family = isset($osRegex->os_replacement) ? $osRegex->os_replacement : $matches[1];
201
-
202
- // version properties
203
- $os->major = isset($osRegex->os_v1_replacement) ? $osRegex->os_v1_replacement : $matches[2];
204
- $os->minor = isset($osRegex->os_v2_replacement) ? $osRegex->os_v2_replacement : $matches[3];
205
- $os->patch = isset($osRegex->os_v3_replacement) ? $osRegex->os_v3_replacement : $matches[4];
206
- $os->patch_minor = isset($osRegex->os_v4_replacement) ? $osRegex->os_v4_replacement : $matches[5];
207
-
208
- // extra strings
209
- $os->toString = $this->toString($os);
210
- $os->toVersionString = $this->toVersionString($os);
211
-
212
- return $os;
213
- }
214
-
215
- }
216
-
217
- return $os;
218
-
219
- }
220
-
221
- /**
222
- * Attempts to see if the user agent matches a device_parsers regex from regexes.json
223
- * @param string a user agent string to test
224
- * @return object the result of the device parsing
225
- */
226
- public function deviceParse($uaString = '') {
227
-
228
- // build the default obj that will be returned
229
- $device = (object) array(
230
- 'family' => 'Other'
231
- );
232
-
233
- // run the regexes to match things up
234
- $deviceRegexes = $this->regexes->device_parsers;
235
- foreach ($deviceRegexes as $deviceRegex) {
236
-
237
- if (preg_match('/'.str_replace('/','\/',str_replace('\/','/',$deviceRegex->regex)).'/i',$uaString,$matches)) {
238
-
239
- // Make sure matches are at least set to null or Other
240
- if (!isset($matches[1])) { $matches[1] = 'Other'; }
241
-
242
- // device name
243
- $device->family = isset($deviceRegex->device_replacement) ? str_replace('$1',str_replace("_"," ",$matches[1]),$deviceRegex->device_replacement) : str_replace("_"," ",$matches[1]);
244
-
245
- return $device;
246
-
247
- }
248
-
249
- }
250
-
251
- return $device;
252
-
253
- }
254
-
255
- /**
256
- * Returns a string consisting of the family and full version number based on the provided type
257
- * @param object the object (ua or os) to be used
258
- * @return string the result of combining family and version
259
- */
260
- public function toString($obj) {
261
-
262
- $versionString = $this->toVersionString($obj);
263
- $string = !empty($versionString) ? $obj->family.' '.$versionString : $obj->family;
264
-
265
- return $string;
266
- }
267
-
268
- /**
269
- * Returns a string consisting of just the full version number based on the provided type
270
- * @param object the obj that contains version number bits
271
- * @return string the result of combining the version number bits together
272
- */
273
- public function toVersionString($obj) {
274
-
275
- $versionString = isset($obj->major) ? $obj->major : '';
276
- $versionString = isset($obj->minor) ? $versionString.'.'.$obj->minor : $versionString;
277
- $versionString = isset($obj->patch) ? $versionString.'.'.$obj->patch : $versionString;
278
- $versionString = isset($obj->patch_minor) ? $versionString.'.'.$obj->patch_minor : $versionString;
279
-
280
- return $versionString;
281
-
282
- }
283
-
284
- /**
285
- * Returns a string consistig of the family and full version number for both the browser and os
286
- * @param object the ua object
287
- * @param object the os object
288
- * @return string the result of combining family and version
289
- */
290
- public function toFullString($ua,$os) {
291
-
292
- $fullString = $this->toString($ua).'/'.$this->toString($os);
293
-
294
- return $fullString;
295
-
296
- }
297
-
298
- /**
299
- * Logs the user agent info
300
- */
301
- protected function log($data) {
302
- $jsonData = json_encode($data);
303
- $fp = fopen(dirname(__FILE__).DIRECTORY_SEPARATOR.'log/user_agents.log', 'a');
304
- fwrite($fp, $jsonData."\r\n");
305
- fclose($fp);
306
- }
307
-
308
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/Logs/LogPage.php CHANGED
@@ -6,7 +6,8 @@ class DLM_Log_Page {
6
  * Setup log page related hooks
7
  */
8
  public function setup() {
9
- add_action( 'admin_menu', array( $this, 'add_admin_menu' ), 12 );
 
10
  add_action( 'admin_init', array( $this, 'catch_export_request' ) );
11
  add_action( 'admin_init', array( $this, 'catch_delete_request' ) );
12
  }
@@ -14,17 +15,25 @@ class DLM_Log_Page {
14
  /**
15
  * Add admin menu item
16
  */
17
- public function add_admin_menu() {
 
18
  // Logging object
19
  $logging = new DLM_Logging();
20
 
21
  // Logs page
22
  if ( $logging->is_logging_enabled() ) {
23
- add_submenu_page( 'edit.php?post_type=dlm_download', __( 'Logs', 'download-monitor' ), __( 'Logs', 'download-monitor' ), 'dlm_manage_logs', 'download-monitor-logs', array(
24
- $this,
25
- 'view'
26
- ) );
 
 
 
 
 
27
  }
 
 
28
  }
29
 
30
  /**
6
  * Setup log page related hooks
7
  */
8
  public function setup() {
9
+
10
+ add_filter( 'dlm_admin_menu_links', array( $this, 'add_logs_menu' ), 30 );
11
  add_action( 'admin_init', array( $this, 'catch_export_request' ) );
12
  add_action( 'admin_init', array( $this, 'catch_delete_request' ) );
13
  }
15
  /**
16
  * Add admin menu item
17
  */
18
+ public function add_logs_menu($links) {
19
+
20
  // Logging object
21
  $logging = new DLM_Logging();
22
 
23
  // Logs page
24
  if ( $logging->is_logging_enabled() ) {
25
+
26
+ $links[] = array(
27
+ 'page_title' => __( 'Logs', 'download-monitor' ),
28
+ 'menu_title' => __( 'Logs', 'download-monitor' ),
29
+ 'capability' => 'manage_options',
30
+ 'menu_slug' => 'download-monitor-logs',
31
+ 'function' => array( $this, 'view' ),
32
+ 'priority' => 50,
33
+ );
34
  }
35
+
36
+ return $links;
37
  }
38
 
39
  /**
src/Logs/LoggingListTable.php CHANGED
@@ -12,9 +12,6 @@ class DLM_Logging_List_Table extends WP_List_Table {
12
  private $filter_month = '';
13
  private $filter_user = 0;
14
 
15
- /** @var UAParser */
16
- private $uaparser = null;
17
-
18
  /** @var bool $display_delete_message */
19
  private $display_delete_message = false;
20
 
@@ -32,8 +29,6 @@ class DLM_Logging_List_Table extends WP_List_Table {
32
  'ajax' => false
33
  ) );
34
 
35
- $this->uaparser = new UAParser();
36
-
37
  $this->filter_status = isset( $_REQUEST['filter_status'] ) ? sanitize_text_field( $_REQUEST['filter_status'] ) : '';
38
  $this->logs_per_page = ! empty( $_REQUEST['logs_per_page'] ) ? intval( $_REQUEST['logs_per_page'] ) : 25;
39
  $this->filter_month = ! empty( $_REQUEST['filter_month'] ) ? sanitize_text_field( $_REQUEST['filter_month'] ) : '';
@@ -174,11 +169,6 @@ class DLM_Logging_List_Table extends WP_List_Table {
174
  case 'user_ip' :
175
  return '<a href="http://whois.arin.net/rest/ip/' . $log->get_user_ip() . '" target="_blank">' . $log->get_user_ip() . '</a>';
176
  break;
177
- case 'user_ua' :
178
- $ua = $this->uaparser->parse( $log->get_user_agent() );
179
-
180
- return $ua->toFullString;
181
- break;
182
  }
183
  }
184
 
@@ -196,7 +186,6 @@ class DLM_Logging_List_Table extends WP_List_Table {
196
  'file' => __( 'File', 'download-monitor' ),
197
  'user' => __( 'User', 'download-monitor' ),
198
  'user_ip' => __( 'IP Address', 'download-monitor' ),
199
- 'user_ua' => __( 'User Agent', 'download-monitor' ),
200
  'date' => __( 'Date', 'download-monitor' ),
201
  );
202
 
@@ -214,7 +203,6 @@ class DLM_Logging_List_Table extends WP_List_Table {
214
  'file' => array( 'version_id', false ),
215
  'user' => array( 'user_id', false ),
216
  'user_ip' => array( 'user_ip', false ),
217
- 'user_ua' => array( 'user_agent', false ),
218
  'date' => array( 'download_date', false )
219
  );
220
  }
@@ -393,8 +381,8 @@ class DLM_Logging_List_Table extends WP_List_Table {
393
  }
394
 
395
  // check for order
396
- $order_by = ( ! empty( $_GET['orderby'] ) ) ? $_GET['orderby'] : 'download_date';
397
- $order = ( ! empty( $_GET['order'] ) ) ? $_GET['order'] : 'DESC';
398
 
399
  /** @var DLM_WordPress_Log_Item_Repository $log_item_repository */
400
  $log_item_repository = download_monitor()->service( 'log_item_repository' );
12
  private $filter_month = '';
13
  private $filter_user = 0;
14
 
 
 
 
15
  /** @var bool $display_delete_message */
16
  private $display_delete_message = false;
17
 
29
  'ajax' => false
30
  ) );
31
 
 
 
32
  $this->filter_status = isset( $_REQUEST['filter_status'] ) ? sanitize_text_field( $_REQUEST['filter_status'] ) : '';
33
  $this->logs_per_page = ! empty( $_REQUEST['logs_per_page'] ) ? intval( $_REQUEST['logs_per_page'] ) : 25;
34
  $this->filter_month = ! empty( $_REQUEST['filter_month'] ) ? sanitize_text_field( $_REQUEST['filter_month'] ) : '';
169
  case 'user_ip' :
170
  return '<a href="http://whois.arin.net/rest/ip/' . $log->get_user_ip() . '" target="_blank">' . $log->get_user_ip() . '</a>';
171
  break;
 
 
 
 
 
172
  }
173
  }
174
 
186
  'file' => __( 'File', 'download-monitor' ),
187
  'user' => __( 'User', 'download-monitor' ),
188
  'user_ip' => __( 'IP Address', 'download-monitor' ),
 
189
  'date' => __( 'Date', 'download-monitor' ),
190
  );
191
 
203
  'file' => array( 'version_id', false ),
204
  'user' => array( 'user_id', false ),
205
  'user_ip' => array( 'user_ip', false ),
 
206
  'date' => array( 'download_date', false )
207
  );
208
  }
381
  }
382
 
383
  // check for order
384
+ $order_by = ( ! empty( $_GET['orderby'] ) ) ? sanitize_sql_orderby( $_GET['orderby'] ) : 'download_date';
385
+ $order = ( ! empty( $_GET['order'] ) ) ? esc_sql( $_GET['order'] ) : 'DESC';
386
 
387
  /** @var DLM_WordPress_Log_Item_Repository $log_item_repository */
388
  $log_item_repository = download_monitor()->service( 'log_item_repository' );
src/PostTypeManager.php CHANGED
@@ -7,6 +7,8 @@ class DLM_Post_Type_Manager {
7
  */
8
  public function setup() {
9
  add_action( 'init', array( $this, 'register' ), 10 );
 
 
10
  }
11
 
12
  /**
@@ -101,4 +103,52 @@ class DLM_Post_Type_Manager {
101
 
102
  }
103
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  }
7
  */
8
  public function setup() {
9
  add_action( 'init', array( $this, 'register' ), 10 );
10
+
11
+ add_filter( 'views_edit-dlm_download', array( $this, 'add_extensions_tab' ), 10, 1 );
12
  }
13
 
14
  /**
103
 
104
  }
105
 
106
+ public function add_extensions_tab( $views ) {
107
+ $this->display_extension_tab();
108
+ return $views;
109
+ }
110
+
111
+ public function display_extension_tab() {
112
+ ?>
113
+ <h2 class="nav-tab-wrapper">
114
+ <?php
115
+ $tabs = array(
116
+ 'downloads' => array(
117
+ 'name' => __('Downloads','download-monitor'),
118
+ 'url' => admin_url( 'edit.php?post_type=dlm_download' ),
119
+ 'priority' => '1'
120
+ ),
121
+ 'suggest_feature' => array(
122
+ 'name' => esc_html__( 'Suggest a feature', 'download-monitor' ),
123
+ 'icon' => 'dashicons-external',
124
+ 'url' => 'https://forms.gle/3igARBBzrbp6M8Fc7',
125
+ 'target' => '_blank',
126
+ 'priority' => '60'
127
+ ),
128
+ );
129
+
130
+ if ( current_user_can( 'install_plugins' ) ) {
131
+ $tabs[ 'extensions' ] = array(
132
+ 'name' => esc_html__( 'Extensions', 'download-monitor' ),
133
+ 'url' => admin_url( 'edit.php?post_type=dlm_download&page=dlm-extensions' ),
134
+ 'priority' => '5',
135
+ );
136
+ }
137
+
138
+ /**
139
+ * Hook for DLM CPT table view tabs
140
+ *
141
+ * @hooked DLM_Admin_Extensions dlm_cpt_tabs()
142
+ */
143
+ $tabs = apply_filters( 'dlm_add_edit_tabs', $tabs );
144
+
145
+ uasort( $tabs, array( 'DLM_Admin_Helper', 'sort_data_by_priority' ) );
146
+
147
+ DLM_Admin_Helper::dlm_tab_navigation($tabs,'downloads');
148
+ ?>
149
+ </h2>
150
+ <br/>
151
+ <?php
152
+ }
153
+
154
  }
src/Product/Product.php CHANGED
@@ -253,6 +253,56 @@ class DLM_Product {
253
 
254
  }
255
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  /**
257
  * Check for plugin updates
258
  *
@@ -384,31 +434,6 @@ class DLM_Product {
384
  }
385
  }
386
 
387
- /**
388
- * Handle errors from the API
389
- *
390
- * @param array $errors
391
- */
392
-
393
- public function handle_errors( $errors ) {
394
-
395
- // loop through errors
396
- foreach( $errors as $error_key => $error ) {
397
-
398
- // add error to WP
399
- DLM_Product_Manager::get()->error_handler()->add( $error );
400
-
401
- // check if error is no activation
402
- if( 'no_activation' == $error_key ) {
403
- // remove local activation if there's no license on API side
404
- $this->get_license()->set_status( 'inactive' );
405
- $this->get_license()->store();
406
- }
407
- }
408
-
409
- }
410
-
411
-
412
  /**
413
  * Display notice after extension plugin row
414
  *
@@ -427,7 +452,7 @@ class DLM_Product {
427
  echo '<tr class="plugin-update-tr active">';
428
  echo '<td colspan="3" class="plugin-update colspanchange">';
429
  echo '<div style="padding: 6px 12px; margin: 0 10px 8px 31px; background: lightYellow;">';
430
- printf( __( '<a href="%s">Register your copy</a> of the <strong>%s</strong> extension to receive access to automatic upgrades and support. Need a license key? <a href="%s" target="_blank">Purchase one now</a>.', 'download-monitor' ), admin_url( 'edit.php?post_type=dlm_download&page=dlm-extensions#installed-extensions' ), $this->get_product_name(), $this->get_tracking_url( 'plugins_page' ) );
431
  echo '</div></td></tr>';
432
 
433
  // Disable bottom border on parent row
@@ -436,26 +461,4 @@ class DLM_Product {
436
  echo '</style>';
437
  }
438
 
439
- /**
440
- * Gets a Google Analytics Campaign URL for this product
441
- *
442
- * @param string $link_identifier
443
- *
444
- * @return string The full URL
445
- */
446
- public function get_tracking_url( $link_identifier = '' ) {
447
- $tracking_vars = array(
448
- 'utm_campaign' => $this->get_product_name() . '_licensing',
449
- 'utm_medium' => 'link',
450
- 'utm_source' => $this->get_product_name(),
451
- 'utm_content' => $link_identifier
452
- );
453
-
454
- // url encode tracking vars
455
- $tracking_vars = urlencode_deep( $tracking_vars );
456
- $query_string = build_query( $tracking_vars );
457
-
458
- return 'https://www.download-monitor.com/extensions/' . str_ireplace( 'dlm-', '', $this->get_product_id() ) . '?' . $query_string;
459
- }
460
-
461
  }
253
 
254
  }
255
 
256
+ /**
257
+ * Handle errors from the API
258
+ *
259
+ * @param array $errors
260
+ */
261
+
262
+ public function handle_errors( $errors ) {
263
+
264
+ // loop through errors
265
+ foreach( $errors as $error_key => $error ) {
266
+
267
+ // add error to WP
268
+ DLM_Product_Manager::get()->error_handler()->add( $error );
269
+
270
+ // check if error is no activation
271
+ if( 'no_activation' == $error_key ) {
272
+ // remove local activation if there's no license on API side
273
+ $this->get_license()->set_status( 'inactive' );
274
+ $this->get_license()->store();
275
+ }
276
+ }
277
+
278
+ }
279
+
280
+
281
+ /**
282
+ * Gets a Google Analytics Campaign URL for this product
283
+ *
284
+ * @param string $link_identifier
285
+ *
286
+ * @return string The full URL
287
+ */
288
+ public function get_tracking_url( $link_identifier = '' ) {
289
+ $tracking_vars = array(
290
+ 'utm_campaign' => $this->get_product_name() . '_licensing',
291
+ 'utm_medium' => 'link',
292
+ 'utm_source' => $this->get_product_name(),
293
+ 'utm_content' => $link_identifier
294
+ );
295
+
296
+ // url encode tracking vars
297
+ $tracking_vars = urlencode_deep( $tracking_vars );
298
+ $query_string = build_query( $tracking_vars );
299
+
300
+ return 'https://www.download-monitor.com/extensions/' . str_ireplace( 'dlm-', '', $this->get_product_id() ) . '?' . $query_string;
301
+ }
302
+
303
+
304
+ // Remove this after migration is complete.
305
+
306
  /**
307
  * Check for plugin updates
308
  *
434
  }
435
  }
436
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
437
  /**
438
  * Display notice after extension plugin row
439
  *
452
  echo '<tr class="plugin-update-tr active">';
453
  echo '<td colspan="3" class="plugin-update colspanchange">';
454
  echo '<div style="padding: 6px 12px; margin: 0 10px 8px 31px; background: lightYellow;">';
455
+ printf( __( '<a href="%s">Register your copy</a> of the <strong>%s</strong> extension to receive access to automatic upgrades and support. Need a license key? <a href="%s" target="_blank">Purchase one now</a>.', 'download-monitor' ), admin_url( 'edit.php?post_type=dlm_download&page=dlm-installed-extensions' ), $this->get_product_name(), $this->get_tracking_url( 'plugins_page' ) );
456
  echo '</div></td></tr>';
457
 
458
  // Disable bottom border on parent row
461
  echo '</style>';
462
  }
463
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
464
  }
src/Product/ProductManager.php CHANGED
@@ -21,7 +21,7 @@ class DLM_Product_Manager {
21
  * @var DLM_Product_Error_Handler
22
  */
23
  private $error_handler;
24
-
25
  /**
26
  * Private constructor
27
  */
@@ -56,8 +56,8 @@ class DLM_Product_Manager {
56
  * Setup Product Manager
57
  */
58
  public function setup() {
 
59
  add_action( 'admin_init', array( $this, 'load_extensions' ) );
60
- add_action( 'admin_notices', array( $this, 'display_admin_notices' ) );
61
  }
62
 
63
  /**
@@ -106,10 +106,16 @@ class DLM_Product_Manager {
106
  // Setup new Product
107
  $product = new DLM_Product( $extension['file'], $extension['version'], $extension['name'] );
108
 
109
- // Setup plugin actions and filters
110
- add_action( 'pre_set_site_transient_update_plugins', array( $product, 'check_for_updates' ) );
111
- add_filter( 'plugins_api', array( $product, 'plugins_api' ), 10, 3 );
112
- add_action( 'after_plugin_row_' . $product->get_plugin_name(), array( $product, 'after_plugin_row' ), 10, 2 );
 
 
 
 
 
 
113
 
114
  // Add product to products property
115
  $this->products[ $extension['file'] ] = $product;
@@ -127,41 +133,4 @@ class DLM_Product_Manager {
127
  public function get_products() {
128
  return $this->products;
129
  }
130
-
131
- public function display_admin_notices() {
132
-
133
- // get products
134
- $products = $this->get_products();
135
-
136
- // loop products
137
- if ( count( $products ) > 0 ) {
138
- foreach ( $products as $product ) {
139
-
140
- // check if product is correctly activated
141
- if ( true !== $product->get_license()->is_active() ) {
142
-
143
- $is_dlm_page = ( isset( $_GET['post_type'] ) && 'dlm_download' == $_GET['post_type'] ) ? true : false;
144
-
145
- $notice_id = "extension-" . esc_attr( $product->get_product_id() );
146
-
147
- if ( 1 != get_option( 'dlm_hide_notice-'.$notice_id, 0 ) || $is_dlm_page ) {
148
-
149
- $message = '<b>Warning!</b> Your %s license is inactive which means you\'re missing out on updates and support! <a href="%s">Activate your license</a> or <a href="%s" target="_blank">get a license here</a>.';
150
- $message = sprintf( __( $message, 'download-monitor' ), $product->get_product_name(), admin_url( 'edit.php?post_type=dlm_download&page=dlm-extensions#installed-extensions' ), $product->get_tracking_url( 'activate-license-notice' ) );
151
-
152
- ?>
153
- <div class="notice notice-warning dlm-notice<?php echo (!$is_dlm_page?" is-dismissible":""); ?>"
154
- id="<?php echo $notice_id; ?>"
155
- data-nonce="<?php echo esc_attr( wp_create_nonce( 'dlm_hide_notice-'.$notice_id ) ); ?>">
156
- <p><?php echo $message; ?></p>
157
- </div>
158
- <?php
159
- }
160
-
161
- }
162
-
163
- }
164
- }
165
-
166
- }
167
  }
21
  * @var DLM_Product_Error_Handler
22
  */
23
  private $error_handler;
24
+
25
  /**
26
  * Private constructor
27
  */
56
  * Setup Product Manager
57
  */
58
  public function setup() {
59
+
60
  add_action( 'admin_init', array( $this, 'load_extensions' ) );
 
61
  }
62
 
63
  /**
106
  // Setup new Product
107
  $product = new DLM_Product( $extension['file'], $extension['version'], $extension['name'] );
108
 
109
+ // Remove this after migration.
110
+ if ( apply_filters( "dlm_disable_update_for_{$extension['file']}", true ) ) {
111
+ // Setup plugin actions and filters
112
+ add_action( 'pre_set_site_transient_update_plugins', array( $product, 'check_for_updates' ) );
113
+ add_filter( 'plugins_api', array( $product, 'plugins_api' ), 10, 3 );
114
+ add_action( 'after_plugin_row_' . $product->get_plugin_name(), array( $product, 'after_plugin_row' ), 10, 2 );
115
+ }
116
+
117
+ // Set action for each extension
118
+ do_action( 'dlm_extensions_action_' . $extension['file'], $extension, $product );
119
 
120
  // Add product to products property
121
  $this->products[ $extension['file'] ] = $product;
133
  public function get_products() {
134
  return $this->products;
135
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
  }
src/Shop/Admin/OrderTable.php CHANGED
@@ -361,8 +361,8 @@ class OrderTable extends \WP_List_Table {
361
  */
362
 
363
  // check for order
364
- $order_by = ( ! empty( $_GET['orderby'] ) ) ? $_GET['orderby'] : 'id';
365
- $order = ( ! empty( $_GET['order'] ) ) ? $_GET['order'] : 'DESC';
366
 
367
  /** @var \Never5\DownloadMonitor\Shop\Order\WordPressRepository $order_repository */
368
  $order_repository = Services::get()->service( 'order_repository' );
361
  */
362
 
363
  // check for order
364
+ $order_by = ( ! empty( $_GET['orderby'] ) ) ? sanitize_sql_orderby( $_GET['orderby'] ) : 'id';
365
+ $order = ( ! empty( $_GET['order'] ) ) ? esc_sql( $_GET['order'] ) : 'DESC';
366
 
367
  /** @var \Never5\DownloadMonitor\Shop\Order\WordPressRepository $order_repository */
368
  $order_repository = Services::get()->service( 'order_repository' );
src/Shop/Admin/Pages/Orders.php CHANGED
@@ -11,18 +11,25 @@ class Orders {
11
  * Setup admin order page
12
  */
13
  public function setup() {
14
- add_action( 'admin_menu', array( $this, 'add_admin_menu' ), 10 );
15
  }
16
 
17
  /**
18
  * Add settings menu item
19
  */
20
- public function add_admin_menu() {
21
- // Settings page
22
- add_submenu_page( 'edit.php?post_type=' . PostType::KEY, __( 'Orders', 'download-monitor' ), __( 'Orders', 'download-monitor' ), 'manage_options', 'download-monitor-orders', array(
23
- $this,
24
- 'view'
25
- ) );
 
 
 
 
 
 
 
26
  }
27
 
28
  /**
11
  * Setup admin order page
12
  */
13
  public function setup() {
14
+ add_filter( 'dlm_admin_menu_links', array( $this, 'orders_menu' ), 30 );
15
  }
16
 
17
  /**
18
  * Add settings menu item
19
  */
20
+ public function orders_menu($links) {
21
+
22
+ // Orders page
23
+ $links[] = array(
24
+ 'page_title' => __( 'Orders', 'download-monitor' ),
25
+ 'menu_title' => __( 'Orders', 'download-monitor' ),
26
+ 'capability' => 'manage_options',
27
+ 'menu_slug' => 'download-monitor-orders',
28
+ 'function' => array( $this, 'view' ),
29
+ 'priority' => 30,
30
+ );
31
+
32
+ return $links;
33
  }
34
 
35
  /**
src/Shop/Checkout/PaymentGateway/PayPal/ExecutePaymentListener.php CHANGED
@@ -34,8 +34,8 @@ class ExecutePaymentListener {
34
  * Get order
35
  */
36
 
37
- $order_id = ( isset( $_GET['order_id'] ) ? absint( $_GET['order_id'] ) : "" );
38
- $order_hash = ( isset( $_GET['order_hash'] ) ? $_GET['order_hash'] : "" );
39
 
40
  if ( empty( $order_id ) || empty( $order_hash ) ) {
41
  $this->execute_failed( $order_id, $order_hash );
34
  * Get order
35
  */
36
 
37
+ $order_id = isset( $_GET['order_id'] ) ? absint( $_GET['order_id'] ) : 0;
38
+ $order_hash = isset( $_GET['order_hash'] ) ? sanitize_text_field( $_GET['order_hash'] ) : '';
39
 
40
  if ( empty( $order_id ) || empty( $order_hash ) ) {
41
  $this->execute_failed( $order_id, $order_hash );
src/Shop/Product/Product.php CHANGED
@@ -148,13 +148,18 @@ class Product {
148
 
149
  $price = $user_input;
150
 
151
- // if the thousand sep is not a dot, it's a comma. In this case remove all dots, then replace
152
- if ( '.' !== download_monitor()->service( 'settings' )->get_option( 'decimal_separator' ) ) {
153
- $price = str_replace( ".", "", $price );
154
- $price = str_replace( ",", ".", $price );
155
  } else {
156
- // thousand sep is dot. Leave the dot, remove the commas
157
- $price = str_replace( ",", "", $price );
 
 
 
 
 
 
158
  }
159
 
160
  // convert to cents
@@ -169,9 +174,16 @@ class Product {
169
  * @return string
170
  */
171
  public function get_price_for_user_input() {
 
172
  $decimal_sep = download_monitor()->service( 'settings' )->get_option( 'decimal_separator' );
173
  $thousand_sep = ( ( '.' === $decimal_sep ) ? ',' : '.' );
174
- $price = ( $this->get_price() / 100 );
 
 
 
 
 
 
175
 
176
  return number_format( $price, 2, $decimal_sep, $thousand_sep );
177
  }
148
 
149
  $price = $user_input;
150
 
151
+ // Check if $price is not set
152
+ if ( ! $price || '' == $price ) {
153
+ $price = 0;
 
154
  } else {
155
+ // if the thousand sep is not a dot, it's a comma. In this case remove all dots, then replace
156
+ if ( '.' !== download_monitor()->service( 'settings' )->get_option( 'decimal_separator' ) ) {
157
+ $price = str_replace( ".", "", $price );
158
+ $price = str_replace( ",", ".", $price );
159
+ } else {
160
+ // thousand sep is dot. Leave the dot, remove the commas
161
+ $price = str_replace( ",", "", $price );
162
+ }
163
  }
164
 
165
  // convert to cents
174
  * @return string
175
  */
176
  public function get_price_for_user_input() {
177
+
178
  $decimal_sep = download_monitor()->service( 'settings' )->get_option( 'decimal_separator' );
179
  $thousand_sep = ( ( '.' === $decimal_sep ) ? ',' : '.' );
180
+ $price = $this->get_price();
181
+
182
+ if( '' != $price ) {
183
+ $price = ( $price / 100 );
184
+ }else {
185
+ $price = 0;
186
+ }
187
 
188
  return number_format( $price, 2, $decimal_sep, $thousand_sep );
189
  }
src/Shop/Shortcode/Checkout.php CHANGED
@@ -120,8 +120,8 @@ class Checkout {
120
  */
121
  private function get_order_from_url() {
122
  // get order data
123
- $order_id = absint( ( isset( $_GET['order_id'] ) ) ? $_GET['order_id'] : 0 );
124
- $order_hash = ( isset( $_GET['order_hash'] ) ? $_GET['order_hash'] : '' );
125
  $order = null;
126
 
127
  if ( $order_id > 0 ) {
120
  */
121
  private function get_order_from_url() {
122
  // get order data
123
+ $order_id = isset( $_GET['order_id'] ) ? absint( $_GET['order_id'] ) : 0;
124
+ $order_hash = isset( $_GET['order_hash'] ) ? sanitize_text_field( $_GET['order_hash'] ) : '';
125
  $order = null;
126
 
127
  if ( $order_id > 0 ) {
src/Shortcodes.php CHANGED
@@ -75,10 +75,11 @@ class DLM_Shortcodes {
75
  'id' => '',
76
  'autop' => false,
77
  'template' => dlm_get_default_download_template(),
78
- 'version_id' => '',
79
  'version' => ''
80
  ), $atts ) );
81
 
 
82
  // Make id filterable
83
  $id = apply_filters( 'dlm_shortcode_download_id', $id, $atts );
84
 
@@ -128,7 +129,11 @@ class DLM_Shortcodes {
128
  ob_start();
129
 
130
  // load template
131
- $template_handler->get_template_part( 'content-download', $template, '', array( 'dlm_download' => $download ) );
 
 
 
 
132
 
133
  // get output
134
  $output = ob_get_clean();
@@ -159,7 +164,7 @@ class DLM_Shortcodes {
159
  extract( shortcode_atts( array(
160
  'id' => '',
161
  'data' => '',
162
- 'version_id' => '',
163
  'version' => ''
164
  ), $atts ) );
165
 
@@ -211,7 +216,7 @@ class DLM_Shortcodes {
211
  case 'title' :
212
  return $download->get_title();
213
  case 'short_description' :
214
- return $download->get_excerpt();
215
  case 'download_link' :
216
  return $download->get_the_download_link();
217
  case 'download_count' :
@@ -416,12 +421,6 @@ class DLM_Shortcodes {
416
  'key' => '_featured',
417
  'value' => 'yes'
418
  );
419
- } else {
420
- $args['meta_query'][] = array(
421
- 'key' => '_featured',
422
- 'value' => 'yes',
423
- 'compare' => '!='
424
- );
425
  }
426
 
427
  if ( $members_only === 'true' || $members_only === true ) {
75
  'id' => '',
76
  'autop' => false,
77
  'template' => dlm_get_default_download_template(),
78
+ 'version_id' => null,
79
  'version' => ''
80
  ), $atts ) );
81
 
82
+
83
  // Make id filterable
84
  $id = apply_filters( 'dlm_shortcode_download_id', $id, $atts );
85
 
129
  ob_start();
130
 
131
  // load template
132
+ if( $download ) {
133
+ $template_handler->get_template_part( 'content-download', $template, '', array( 'dlm_download' => $download ) );
134
+ } else {
135
+ echo __( 'No download defined', 'download-monitor' );
136
+ }
137
 
138
  // get output
139
  $output = ob_get_clean();
164
  extract( shortcode_atts( array(
165
  'id' => '',
166
  'data' => '',
167
+ 'version_id' => null,
168
  'version' => ''
169
  ), $atts ) );
170
 
216
  case 'title' :
217
  return $download->get_title();
218
  case 'short_description' :
219
+ return wpautop( wptexturize( do_shortcode( $download->get_excerpt() ) ) );
220
  case 'download_link' :
221
  return $download->get_the_download_link();
222
  case 'download_count' :
421
  'key' => '_featured',
422
  'value' => 'yes'
423
  );
 
 
 
 
 
 
424
  }
425
 
426
  if ( $members_only === 'true' || $members_only === true ) {
templates/content-download-box.php CHANGED
@@ -7,9 +7,8 @@ if ( ! defined( 'ABSPATH' ) ) {
7
  exit;
8
  } // Exit if accessed directly
9
 
10
- /** @var DLM_Download $dlm_download */
11
-
12
  ?>
 
13
  <aside class="download-box">
14
 
15
  <?php $dlm_download->the_image(); ?>
7
  exit;
8
  } // Exit if accessed directly
9
 
 
 
10
  ?>
11
+
12
  <aside class="download-box">
13
 
14
  <?php $dlm_download->the_image(); ?>
templates/content-download-button.php CHANGED
@@ -7,8 +7,8 @@ if ( ! defined( 'ABSPATH' ) ) {
7
  exit;
8
  } // Exit if accessed directly
9
 
10
- /** @var DLM_Download $dlm_download */
11
  ?>
 
12
  <p><a class="aligncenter download-button" href="<?php $dlm_download->the_download_link(); ?>" rel="nofollow">
13
  <?php printf( __( 'Download &ldquo;%s&rdquo;', 'download-monitor' ), $dlm_download->get_title() ); ?>
14
  <small><?php echo $dlm_download->get_version()->get_filename(); ?> &ndash; <?php printf( _n( 'Downloaded 1 time', 'Downloaded %d times', $dlm_download->get_download_count(), 'download-monitor' ), $dlm_download->get_download_count() ) ?> &ndash; <?php echo $dlm_download->get_version()->get_filesize_formatted(); ?></small>
7
  exit;
8
  } // Exit if accessed directly
9
 
 
10
  ?>
11
+
12
  <p><a class="aligncenter download-button" href="<?php $dlm_download->the_download_link(); ?>" rel="nofollow">
13
  <?php printf( __( 'Download &ldquo;%s&rdquo;', 'download-monitor' ), $dlm_download->get_title() ); ?>
14
  <small><?php echo $dlm_download->get_version()->get_filename(); ?> &ndash; <?php printf( _n( 'Downloaded 1 time', 'Downloaded %d times', $dlm_download->get_download_count(), 'download-monitor' ), $dlm_download->get_download_count() ) ?> &ndash; <?php echo $dlm_download->get_version()->get_filesize_formatted(); ?></small>
templates/content-download-filename.php CHANGED
@@ -7,7 +7,6 @@ if ( ! defined( 'ABSPATH' ) ) {
7
  exit;
8
  } // Exit if accessed directly
9
 
10
- /** @var DLM_Download $dlm_download */
11
  ?>
12
  <a class="download-link filetype-icon <?php echo 'filetype-' . $dlm_download->get_version()->get_filetype(); ?>"
13
  title="<?php if ( $dlm_download->get_version()->has_version_number() ) {
7
  exit;
8
  } // Exit if accessed directly
9
 
 
10
  ?>
11
  <a class="download-link filetype-icon <?php echo 'filetype-' . $dlm_download->get_version()->get_filetype(); ?>"
12
  title="<?php if ( $dlm_download->get_version()->has_version_number() ) {
templates/content-download-no-version.php CHANGED
@@ -7,7 +7,6 @@ if ( ! defined( 'ABSPATH' ) ) {
7
  exit;
8
  } // Exit if accessed directly
9
 
10
- /** @var DLM_Download $dlm_download */
11
  ?>
12
  <a class="download-link" title="<?php _e( 'Please set a version in your WordPress admin', 'download-monitor' ); ?>" href="#" rel="nofollow">
13
  "<?php $dlm_download->the_title(); ?>" <strong><?php _e( 'has no version set!', 'download-monitor' ); ?></strong>
7
  exit;
8
  } // Exit if accessed directly
9
 
 
10
  ?>
11
  <a class="download-link" title="<?php _e( 'Please set a version in your WordPress admin', 'download-monitor' ); ?>" href="#" rel="nofollow">
12
  "<?php $dlm_download->the_title(); ?>" <strong><?php _e( 'has no version set!', 'download-monitor' ); ?></strong>
templates/content-download-title.php CHANGED
@@ -7,7 +7,6 @@ if ( ! defined( 'ABSPATH' ) ) {
7
  exit;
8
  } // Exit if accessed directly
9
 
10
- /** @var DLM_Download $dlm_download */
11
  ?>
12
  <a class="download-link" title="<?php if ( $dlm_download->get_version()->has_version_number() ) {
13
  printf( __( 'Version %s', 'download-monitor' ), $dlm_download->get_version()->get_version_number() );
7
  exit;
8
  } // Exit if accessed directly
9
 
 
10
  ?>
11
  <a class="download-link" title="<?php if ( $dlm_download->get_version()->has_version_number() ) {
12
  printf( __( 'Version %s', 'download-monitor' ), $dlm_download->get_version()->get_version_number() );
templates/content-download-version-list.php CHANGED
@@ -7,8 +7,6 @@ if ( ! defined( 'ABSPATH' ) ) {
7
  exit;
8
  } // Exit if accessed directly
9
 
10
- /** @var DLM_Download $dlm_download */
11
-
12
  $versions = $dlm_download->get_versions();
13
 
14
  if ( $versions ) : ?>
7
  exit;
8
  } // Exit if accessed directly
9
 
 
 
10
  $versions = $dlm_download->get_versions();
11
 
12
  if ( $versions ) : ?>
templates/content-download.php CHANGED
@@ -7,8 +7,8 @@ if ( ! defined( 'ABSPATH' ) ) {
7
  exit;
8
  } // Exit if accessed directly
9
 
10
- if( ! $dlm_download ) {
11
- return;
12
  }
13
 
14
  /** @var DLM_Download $dlm_download */
7
  exit;
8
  } // Exit if accessed directly
9
 
10
+ if ( ! isset( $dlm_download ) || ! $dlm_download ) {
11
+ return esc_html__('No download found', 'download-monitor');
12
  }
13
 
14
  /** @var DLM_Download $dlm_download */
templates/no-access.php CHANGED
@@ -8,10 +8,12 @@ if ( ! defined( 'ABSPATH' ) ) {
8
  } // Exit if accessed directly
9
 
10
  /** @var DLM_Download $download */
 
11
  ?>
12
 
13
  <?php do_action( 'dlm_no_access_before_message', $download ); ?>
14
  <?php if ( ! empty( $no_access_message ) ) : ?>
 
15
  <p><?php echo $no_access_message; ?></p>
16
  <?php endif; ?>
17
 
8
  } // Exit if accessed directly
9
 
10
  /** @var DLM_Download $download */
11
+
12
  ?>
13
 
14
  <?php do_action( 'dlm_no_access_before_message', $download ); ?>
15
  <?php if ( ! empty( $no_access_message ) ) : ?>
16
+
17
  <p><?php echo $no_access_message; ?></p>
18
  <?php endif; ?>
19
 
templates/shop/button/add-to-cart-box.php CHANGED
@@ -20,7 +20,7 @@ if ( ! defined( 'ABSPATH' ) ) {
20
 
21
  <h1><?php echo $product->get_title(); ?></h1>
22
 
23
- <p><?php echo $product->get_excerpt(); ?></p>
24
 
25
  <a class="download-button" title="<?php _e( 'Purchase Now', 'download-monitor' ); ?>" href="<?php echo $atc_url; ?>"
26
  rel="nofollow">
20
 
21
  <h1><?php echo $product->get_title(); ?></h1>
22
 
23
+ <p><?php echo $product->get_the_excerpt(); ?></p>
24
 
25
  <a class="download-button" title="<?php _e( 'Purchase Now', 'download-monitor' ); ?>" href="<?php echo $atc_url; ?>"
26
  rel="nofollow">
templates/shop/button/add-to-cart.php CHANGED
@@ -13,5 +13,5 @@ if ( ! defined( 'ABSPATH' ) ) {
13
  <p><a class="aligncenter download-button" href="<?php echo $atc_url; ?>" rel="nofollow">
14
  <?php printf( __( 'Purchase &ldquo;%s&rdquo;', 'download-monitor' ), $product->get_title() ); ?>
15
  <small><?php echo dlm_format_money( $product->get_price() ); ?>
16
- - <?php echo esc_html( $product->get_excerpt() ); ?></small>
17
  </a></p>
13
  <p><a class="aligncenter download-button" href="<?php echo $atc_url; ?>" rel="nofollow">
14
  <?php printf( __( 'Purchase &ldquo;%s&rdquo;', 'download-monitor' ), $product->get_title() ); ?>
15
  <small><?php echo dlm_format_money( $product->get_price() ); ?>
16
+ - <?php echo esc_html( $product->get_the_excerpt() ); ?></small>
17
  </a></p>
templates/shop/content-single-product.php CHANGED
@@ -10,10 +10,8 @@ if ( ! defined( 'ABSPATH' ) ) {
10
  */
11
  do_action( 'dlm_before_single_product', $product );
12
  ?>
13
- <div class="dlm-product">
14
- <?php if ( $product->get_content() != "" ) : ?>
15
- <p><?php echo esc_html( $product->get_content() ); ?></p>
16
- <?php echo do_shortcode( sprintf( '[dlm_buy id="%s"]', intval( $product->get_id() ) ) ); ?>
17
- <?php endif; ?>
18
- </div>
19
  <?php do_action( 'dlm_after_single_product', $product ); ?>
10
  */
11
  do_action( 'dlm_before_single_product', $product );
12
  ?>
13
+ <div class="dlm-product">
14
+ <p><?php echo esc_html( $product->get_content() ); ?></p>
15
+ <?php echo do_shortcode( sprintf( '[dlm_buy id="%s"]', intval( $product->get_id() ) ) ); ?>
16
+ </div>
 
 
17
  <?php do_action( 'dlm_after_single_product', $product ); ?>
vendor/composer/autoload_classmap.php CHANGED
@@ -95,8 +95,6 @@ return array(
95
  'DLM_WordPress_Version_Repository' => $baseDir . '/src/Version/WordPressVersionRepository.php',
96
  'DateTimeImmutable' => $baseDir . '/src/Polyfill/DateTimeImmutable/DateTimeImmutable.php',
97
  'DateTimeInterface' => $baseDir . '/src/Polyfill/DateTimeImmutable/DateTimeInterface.php',
98
- 'DumpTest' => $baseDir . '/src/Libs/uaparser/lib/spyc-0.5/tests/DumpTest.php',
99
- 'IndentTest' => $baseDir . '/src/Libs/uaparser/lib/spyc-0.5/tests/IndentTest.php',
100
  'Never5\\DownloadMonitor\\Dependencies\\PayPal\\Api\\Address' => $baseDir . '/src/Dependencies/PayPal/Api/Address.php',
101
  'Never5\\DownloadMonitor\\Dependencies\\PayPal\\Api\\Agreement' => $baseDir . '/src/Dependencies/PayPal/Api/Agreement.php',
102
  'Never5\\DownloadMonitor\\Dependencies\\PayPal\\Api\\AgreementDetails' => $baseDir . '/src/Dependencies/PayPal/Api/AgreementDetails.php',
@@ -367,9 +365,7 @@ return array(
367
  'Never5\\DownloadMonitor\\Util\\ExtensionLoader' => $baseDir . '/src/Util/ExtensionLoader.php',
368
  'Never5\\DownloadMonitor\\Util\\Onboarding' => $baseDir . '/src/Util/Onboarding.php',
369
  'Never5\\DownloadMonitor\\Util\\PageCreator' => $baseDir . '/src/Util/PageCreator.php',
370
- 'ParseTest' => $baseDir . '/src/Libs/uaparser/lib/spyc-0.5/tests/ParseTest.php',
371
- 'RoundTripTest' => $baseDir . '/src/Libs/uaparser/lib/spyc-0.5/tests/RoundTripTest.php',
372
- 'Spyc' => $baseDir . '/src/Libs/uaparser/lib/spyc-0.5/spyc.php',
373
- 'UAParser' => $baseDir . '/src/Libs/uaparser/uaparser.php',
374
  'WP_DLM' => $baseDir . '/src/DLM.php',
 
 
375
  );
95
  'DLM_WordPress_Version_Repository' => $baseDir . '/src/Version/WordPressVersionRepository.php',
96
  'DateTimeImmutable' => $baseDir . '/src/Polyfill/DateTimeImmutable/DateTimeImmutable.php',
97
  'DateTimeInterface' => $baseDir . '/src/Polyfill/DateTimeImmutable/DateTimeInterface.php',
 
 
98
  'Never5\\DownloadMonitor\\Dependencies\\PayPal\\Api\\Address' => $baseDir . '/src/Dependencies/PayPal/Api/Address.php',
99
  'Never5\\DownloadMonitor\\Dependencies\\PayPal\\Api\\Agreement' => $baseDir . '/src/Dependencies/PayPal/Api/Agreement.php',
100
  'Never5\\DownloadMonitor\\Dependencies\\PayPal\\Api\\AgreementDetails' => $baseDir . '/src/Dependencies/PayPal/Api/AgreementDetails.php',
365
  'Never5\\DownloadMonitor\\Util\\ExtensionLoader' => $baseDir . '/src/Util/ExtensionLoader.php',
366
  'Never5\\DownloadMonitor\\Util\\Onboarding' => $baseDir . '/src/Util/Onboarding.php',
367
  'Never5\\DownloadMonitor\\Util\\PageCreator' => $baseDir . '/src/Util/PageCreator.php',
 
 
 
 
368
  'WP_DLM' => $baseDir . '/src/DLM.php',
369
+ 'DLM_Admin_Helper' => $baseDir . '/src/Admin/class-dlm-admin-helper.php',
370
+ 'DLM_Uninstall' => $baseDir . '/includes/admin/uninstall/class-dlm-uninstall.php',
371
  );
vendor/composer/autoload_static.php CHANGED
@@ -110,8 +110,6 @@ class ComposerStaticInit80ce4473100edd20fd6c17775a76ce9a
110
  'DLM_WordPress_Version_Repository' => __DIR__ . '/../..' . '/src/Version/WordPressVersionRepository.php',
111
  'DateTimeImmutable' => __DIR__ . '/../..' . '/src/Polyfill/DateTimeImmutable/DateTimeImmutable.php',
112
  'DateTimeInterface' => __DIR__ . '/../..' . '/src/Polyfill/DateTimeImmutable/DateTimeInterface.php',
113
- 'DumpTest' => __DIR__ . '/../..' . '/src/Libs/uaparser/lib/spyc-0.5/tests/DumpTest.php',
114
- 'IndentTest' => __DIR__ . '/../..' . '/src/Libs/uaparser/lib/spyc-0.5/tests/IndentTest.php',
115
  'Never5\\DownloadMonitor\\Dependencies\\PayPal\\Api\\Address' => __DIR__ . '/../..' . '/src/Dependencies/PayPal/Api/Address.php',
116
  'Never5\\DownloadMonitor\\Dependencies\\PayPal\\Api\\Agreement' => __DIR__ . '/../..' . '/src/Dependencies/PayPal/Api/Agreement.php',
117
  'Never5\\DownloadMonitor\\Dependencies\\PayPal\\Api\\AgreementDetails' => __DIR__ . '/../..' . '/src/Dependencies/PayPal/Api/AgreementDetails.php',
@@ -382,11 +380,9 @@ class ComposerStaticInit80ce4473100edd20fd6c17775a76ce9a
382
  'Never5\\DownloadMonitor\\Util\\ExtensionLoader' => __DIR__ . '/../..' . '/src/Util/ExtensionLoader.php',
383
  'Never5\\DownloadMonitor\\Util\\Onboarding' => __DIR__ . '/../..' . '/src/Util/Onboarding.php',
384
  'Never5\\DownloadMonitor\\Util\\PageCreator' => __DIR__ . '/../..' . '/src/Util/PageCreator.php',
385
- 'ParseTest' => __DIR__ . '/../..' . '/src/Libs/uaparser/lib/spyc-0.5/tests/ParseTest.php',
386
- 'RoundTripTest' => __DIR__ . '/../..' . '/src/Libs/uaparser/lib/spyc-0.5/tests/RoundTripTest.php',
387
- 'Spyc' => __DIR__ . '/../..' . '/src/Libs/uaparser/lib/spyc-0.5/spyc.php',
388
- 'UAParser' => __DIR__ . '/../..' . '/src/Libs/uaparser/uaparser.php',
389
  'WP_DLM' => __DIR__ . '/../..' . '/src/DLM.php',
 
 
390
  );
391
 
392
  public static function getInitializer(ClassLoader $loader)
110
  'DLM_WordPress_Version_Repository' => __DIR__ . '/../..' . '/src/Version/WordPressVersionRepository.php',
111
  'DateTimeImmutable' => __DIR__ . '/../..' . '/src/Polyfill/DateTimeImmutable/DateTimeImmutable.php',
112
  'DateTimeInterface' => __DIR__ . '/../..' . '/src/Polyfill/DateTimeImmutable/DateTimeInterface.php',
 
 
113
  'Never5\\DownloadMonitor\\Dependencies\\PayPal\\Api\\Address' => __DIR__ . '/../..' . '/src/Dependencies/PayPal/Api/Address.php',
114
  'Never5\\DownloadMonitor\\Dependencies\\PayPal\\Api\\Agreement' => __DIR__ . '/../..' . '/src/Dependencies/PayPal/Api/Agreement.php',
115
  'Never5\\DownloadMonitor\\Dependencies\\PayPal\\Api\\AgreementDetails' => __DIR__ . '/../..' . '/src/Dependencies/PayPal/Api/AgreementDetails.php',
380
  'Never5\\DownloadMonitor\\Util\\ExtensionLoader' => __DIR__ . '/../..' . '/src/Util/ExtensionLoader.php',
381
  'Never5\\DownloadMonitor\\Util\\Onboarding' => __DIR__ . '/../..' . '/src/Util/Onboarding.php',
382
  'Never5\\DownloadMonitor\\Util\\PageCreator' => __DIR__ . '/../..' . '/src/Util/PageCreator.php',
 
 
 
 
383
  'WP_DLM' => __DIR__ . '/../..' . '/src/DLM.php',
384
+ 'DLM_Admin_Helper' => __DIR__ . '/../..' . '/src/Admin/class-dlm-admin-helper.php',
385
+ 'DLM_Uninstall' => __DIR__ . '/../..' . '/includes/admin/uninstall/class-dlm-uninstall.php',
386
  );
387
 
388
  public static function getInitializer(ClassLoader $loader)