User Menus – Nav Menu Visibility - Version 1.2.9

Version Description

Download this release

Release Info

Developer danieliser
Plugin Icon 128x128 User Menus – Nav Menu Visibility
Version 1.2.9
Comparing to
See all releases

Code changes from version 1.2.8 to 1.2.9

Files changed (69) hide show
  1. freemius/assets/css/admin/account.css +1 -1
  2. freemius/assets/css/admin/add-ons.css +2 -1
  3. freemius/assets/css/admin/affiliation.css +1 -1
  4. freemius/assets/css/admin/checkout.css +1 -1
  5. freemius/assets/css/admin/clone-resolution.css +0 -1
  6. freemius/assets/css/admin/common.css +2 -1
  7. freemius/assets/css/admin/connect.css +1 -1
  8. freemius/assets/css/admin/debug.css +1 -1
  9. freemius/assets/css/admin/dialog-boxes.css +2 -1
  10. freemius/assets/css/admin/gdpr-optin-notice.css +1 -1
  11. freemius/assets/css/admin/plugins.css +1 -1
  12. freemius/assets/css/customizer.css +1 -1
  13. freemius/assets/img/user-menus.png +0 -0
  14. freemius/config.php +5 -5
  15. freemius/includes/class-freemius.php +283 -1075
  16. freemius/includes/class-fs-admin-notices.php +21 -52
  17. freemius/includes/class-fs-api.php +3 -27
  18. freemius/includes/class-fs-plugin-updater.php +6 -8
  19. freemius/includes/entities/class-fs-user.php +1 -12
  20. freemius/includes/fs-core-functions.php +1 -1
  21. freemius/includes/fs-plugin-info-dialog.php +1 -1
  22. freemius/includes/managers/class-fs-admin-notice-manager.php +25 -69
  23. freemius/includes/managers/class-fs-clone-manager.php +0 -1480
  24. freemius/includes/managers/class-fs-plugin-manager.php +5 -18
  25. freemius/includes/sdk/Exceptions/ArgumentNotExistException.php +5 -1
  26. freemius/includes/sdk/Exceptions/EmptyArgumentException.php +5 -1
  27. freemius/includes/sdk/Exceptions/Exception.php +5 -1
  28. freemius/includes/sdk/Exceptions/InvalidArgumentException.php +5 -1
  29. freemius/includes/sdk/Exceptions/OAuthException.php +5 -1
  30. freemius/includes/sdk/FreemiusBase.php +4 -0
  31. freemius/includes/sdk/FreemiusWordPress.php +4 -1
  32. freemius/languages/freemius-cs_CZ.mo +0 -0
  33. freemius/languages/freemius-da_DK.mo +0 -0
  34. freemius/languages/freemius-en.mo +0 -0
  35. freemius/languages/freemius-es_ES.mo +0 -0
  36. freemius/languages/freemius-fr_FR.mo +0 -0
  37. freemius/languages/freemius-he_IL.mo +0 -0
  38. freemius/languages/freemius-hu_HU.mo +0 -0
  39. freemius/languages/freemius-it_IT.mo +0 -0
  40. freemius/languages/freemius-ja.mo +0 -0
  41. freemius/languages/freemius-nl_NL.mo +0 -0
  42. freemius/languages/freemius-ru_RU.mo +0 -0
  43. freemius/languages/freemius-ta.mo +0 -0
  44. freemius/languages/freemius-zh_CN.mo +0 -0
  45. freemius/languages/freemius.pot +409 -587
  46. freemius/package.json +27 -0
  47. freemius/readme.txt +182 -0
  48. freemius/require.php +5 -2
  49. freemius/start.php +1 -1
  50. freemius/templates/account.php +9 -38
  51. freemius/templates/account/partials/addon.php +6 -1
  52. freemius/templates/account/partials/site.php +3 -3
  53. freemius/templates/account/payments.php +11 -10
  54. freemius/templates/admin-notice.php +1 -4
  55. freemius/templates/ajax-loader.php +6 -1
  56. freemius/templates/clone-resolution-js.php +0 -77
  57. freemius/templates/connect.php +7 -16
  58. freemius/templates/debug.php +9 -20
  59. freemius/templates/firewall-issues-js.php +10 -6
  60. freemius/templates/forms/deactivation/form.php +543 -666
  61. freemius/templates/forms/email-address-update.php +0 -347
  62. freemius/templates/forms/license-activation.php +5 -33
  63. freemius/templates/partials/network-activation.php +6 -1
  64. freemius/templates/plugin-info/features.php +1 -1
  65. freemius/templates/powered-by.php +7 -7
  66. freemius/templates/pricing.php +10 -11
  67. freemius/templates/sticky-admin-notice-js.php +4 -2
  68. readme.txt +5 -1
  69. user-menus.php +2 -2
freemius/assets/css/admin/account.css CHANGED
@@ -1 +1 @@
1
- label.fs-tag,span.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn,span.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-info,span.fs-tag.fs-info{background:#00a0d2}label.fs-tag.fs-success,span.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error,span.fs-tag.fs-error{background:#dc3232}.fs-notice[data-id=license_not_whitelabeled].success,.fs-notice[data-id=license_whitelabeled].success{color:inherit;border-left-color:#00a0d2}.fs-notice[data-id=license_not_whitelabeled].success label.fs-plugin-title,.fs-notice[data-id=license_whitelabeled].success label.fs-plugin-title{display:none}#fs_account .postbox,#fs_account .widefat{max-width:800px}#fs_account h3{font-size:1.3em;padding:12px 15px;margin:0 0 12px 0;line-height:1.4;border-bottom:1px solid #f1f1f1}#fs_account h3 .dashicons{width:26px;height:26px;font-size:1.3em}#fs_account i.dashicons{font-size:1.2em;height:1.2em;width:1.2em}#fs_account .dashicons{vertical-align:middle}#fs_account .fs-header-actions{position:absolute;top:17px;right:15px;font-size:.9em}#fs_account .fs-header-actions ul{margin:0}#fs_account .fs-header-actions li{float:left}#fs_account .fs-header-actions li form{display:inline-block}#fs_account .fs-header-actions li a{text-decoration:none}#fs_account_details .button-group{float:right}.rtl #fs_account .fs-header-actions{left:15px;right:auto}.fs-key-value-table{width:100%}.fs-key-value-table form{display:inline-block}.fs-key-value-table tr td:first-child{text-align:right}.fs-key-value-table tr td:first-child nobr{font-weight:bold}.fs-key-value-table tr td:first-child form{display:block}.fs-key-value-table tr td.fs-right{text-align:right}.fs-key-value-table tr.fs-odd{background:#ebebeb}.fs-key-value-table td,.fs-key-value-table th{padding:10px}.fs-key-value-table code{line-height:28px}.fs-key-value-table var,.fs-key-value-table code,.fs-key-value-table input[type=text]{color:#0073aa;font-size:16px;background:none}.fs-key-value-table input[type=text]{width:100%;font-weight:bold}.fs-field-beta_program label{margin-left:7px}label.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error{background:#dc3232}#fs_sites .fs-scrollable-table .fs-table-body{max-height:200px;overflow:auto;border:1px solid #e5e5e5}#fs_sites .fs-scrollable-table .fs-table-body>table.widefat{border:none !important}#fs_sites .fs-scrollable-table .fs-main-column{width:100%}#fs_sites .fs-scrollable-table .fs-site-details td:first-of-type{text-align:right;color:gray;width:1px}#fs_sites .fs-scrollable-table .fs-site-details td:last-of-type{text-align:right}#fs_sites .fs-scrollable-table .fs-install-details table tr td{width:1px;white-space:nowrap}#fs_sites .fs-scrollable-table .fs-install-details table tr td:last-of-type{width:auto}#fs_addons h3{border:none;margin-bottom:0;padding:4px 5px}#fs_addons td{vertical-align:middle}#fs_addons thead{white-space:nowrap}#fs_addons td:first-child,#fs_addons th:first-child{text-align:left;font-weight:bold}#fs_addons td:last-child,#fs_addons th:last-child{text-align:right}#fs_addons th{font-weight:bold}#fs_billing_address{width:100%}#fs_billing_address tr td{width:50%;padding:5px}#fs_billing_address tr:first-of-type td{padding-top:0}#fs_billing_address span{font-weight:bold}#fs_billing_address input,#fs_billing_address select{display:block;width:100%;margin-top:5px}#fs_billing_address input::-moz-placeholder,#fs_billing_address select::-moz-placeholder{color:transparent;opacity:1}#fs_billing_address input:-ms-input-placeholder,#fs_billing_address select:-ms-input-placeholder{color:transparent}#fs_billing_address input::-webkit-input-placeholder,#fs_billing_address select::-webkit-input-placeholder{color:transparent}#fs_billing_address input.fs-read-mode,#fs_billing_address select.fs-read-mode{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode td span{display:none}#fs_billing_address.fs-read-mode input,#fs_billing_address.fs-read-mode select{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode input::-moz-placeholder,#fs_billing_address.fs-read-mode select::-moz-placeholder{color:#ccc;opacity:1}#fs_billing_address.fs-read-mode input:-ms-input-placeholder,#fs_billing_address.fs-read-mode select:-ms-input-placeholder{color:#ccc}#fs_billing_address.fs-read-mode input::-webkit-input-placeholder,#fs_billing_address.fs-read-mode select::-webkit-input-placeholder{color:#ccc}#fs_billing_address button{display:block;width:100%}@media screen and (max-width: 639px){#fs_account .fs-header-actions{position:static;padding:0 15px 12px 15px;margin:0 0 12px 0}#fs_account .fs-header-actions li{float:none;display:inline-block}#fs_account #fs_account_details{display:block}#fs_account #fs_account_details tbody,#fs_account #fs_account_details tr,#fs_account #fs_account_details td,#fs_account #fs_account_details th{display:block}#fs_account #fs_account_details tr td:first-child{text-align:left}#fs_account #fs_account_details tr td:nth-child(2){padding:0 12px}#fs_account #fs_account_details tr td:nth-child(2) code{margin:0;padding:0}#fs_account #fs_account_details tr td:nth-child(2) label{margin-left:0}#fs_account #fs_account_details tr td:nth-child(3){text-align:left}#fs_account #fs_account_details tr.fs-field-plan td:nth-child(2) .button-group{float:none;margin:12px 0}}/*# sourceMappingURL=account.css.map */
1
+ label.fs-tag,span.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn,span.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-info,span.fs-tag.fs-info{background:#00a0d2}label.fs-tag.fs-success,span.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error,span.fs-tag.fs-error{background:#dc3232}.fs-notice[data-id="license_not_whitelabeled"].success,.fs-notice[data-id="license_whitelabeled"].success{color:inherit;border-left-color:#00a0d2}.fs-notice[data-id="license_not_whitelabeled"].success label.fs-plugin-title,.fs-notice[data-id="license_whitelabeled"].success label.fs-plugin-title{display:none}#fs_account .postbox,#fs_account .widefat{max-width:800px}#fs_account h3{font-size:1.3em;padding:12px 15px;margin:0 0 12px 0;line-height:1.4;border-bottom:1px solid #F1F1F1}#fs_account h3 .dashicons{width:26px;height:26px;font-size:1.3em}#fs_account i.dashicons{font-size:1.2em;height:1.2em;width:1.2em}#fs_account .dashicons{vertical-align:middle}#fs_account .fs-header-actions{position:absolute;top:17px;right:15px;font-size:0.9em}#fs_account .fs-header-actions ul{margin:0}#fs_account .fs-header-actions li{float:left}#fs_account .fs-header-actions li form{display:inline-block}#fs_account .fs-header-actions li a{text-decoration:none}#fs_account_details .button-group{float:right}.rtl #fs_account .fs-header-actions{left:15px;right:auto}.fs-key-value-table{width:100%}.fs-key-value-table form{display:inline-block}.fs-key-value-table tr td:first-child{text-align:right}.fs-key-value-table tr td:first-child nobr{font-weight:bold}.fs-key-value-table tr td:first-child form{display:block}.fs-key-value-table tr td.fs-right{text-align:right}.fs-key-value-table tr.fs-odd{background:#ebebeb}.fs-key-value-table td,.fs-key-value-table th{padding:10px}.fs-key-value-table code{line-height:28px}.fs-key-value-table var,.fs-key-value-table code,.fs-key-value-table input[type="text"]{color:#0073AA;font-size:16px;background:none}.fs-key-value-table input[type="text"]{width:100%;font-weight:bold}.fs-field-beta_program label{margin-left:7px}label.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error{background:#dc3232}#fs_sites .fs-scrollable-table .fs-table-body{max-height:200px;overflow:auto;border:1px solid #e5e5e5}#fs_sites .fs-scrollable-table .fs-table-body>table.widefat{border:none !important}#fs_sites .fs-scrollable-table .fs-main-column{width:100%}#fs_sites .fs-scrollable-table .fs-site-details td:first-of-type{text-align:right;color:grey;width:1px}#fs_sites .fs-scrollable-table .fs-site-details td:last-of-type{text-align:right}#fs_sites .fs-scrollable-table .fs-install-details table tr td{width:1px;white-space:nowrap}#fs_sites .fs-scrollable-table .fs-install-details table tr td:last-of-type{width:auto}#fs_addons h3{border:none;margin-bottom:0;padding:4px 5px}#fs_addons td{vertical-align:middle}#fs_addons thead{white-space:nowrap}#fs_addons td:first-child,#fs_addons th:first-child{text-align:left;font-weight:bold}#fs_addons td:last-child,#fs_addons th:last-child{text-align:right}#fs_addons th{font-weight:bold}#fs_billing_address{width:100%}#fs_billing_address tr td{width:50%;padding:5px}#fs_billing_address tr:first-of-type td{padding-top:0}#fs_billing_address span{font-weight:bold}#fs_billing_address input,#fs_billing_address select{display:block;width:100%;margin-top:5px}#fs_billing_address input::-moz-placeholder,#fs_billing_address select::-moz-placeholder{color:transparent;opacity:1}#fs_billing_address input:-ms-input-placeholder,#fs_billing_address select:-ms-input-placeholder{color:transparent}#fs_billing_address input::-webkit-input-placeholder,#fs_billing_address select::-webkit-input-placeholder{color:transparent}#fs_billing_address input.fs-read-mode,#fs_billing_address select.fs-read-mode{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode td span{display:none}#fs_billing_address.fs-read-mode input,#fs_billing_address.fs-read-mode select{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode input::-moz-placeholder,#fs_billing_address.fs-read-mode select::-moz-placeholder{color:#ccc;opacity:1}#fs_billing_address.fs-read-mode input:-ms-input-placeholder,#fs_billing_address.fs-read-mode select:-ms-input-placeholder{color:#ccc}#fs_billing_address.fs-read-mode input::-webkit-input-placeholder,#fs_billing_address.fs-read-mode select::-webkit-input-placeholder{color:#ccc}#fs_billing_address button{display:block;width:100%}
freemius/assets/css/admin/add-ons.css CHANGED
@@ -1 +1,2 @@
1
- .fs-badge{position:absolute;top:10px;right:0;background:#71ae00;color:#fff;text-transform:uppercase;padding:5px 10px;-moz-border-radius:3px 0 0 3px;-webkit-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;font-weight:bold;border-right:0;-moz-box-shadow:0 2px 1px -1px rgba(0,0,0,.3);-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.3);box-shadow:0 2px 1px -1px rgba(0,0,0,.3)}#fs_addons .fs-cards-list{list-style:none}#fs_addons .fs-cards-list .fs-card{float:left;height:152px;width:310px;padding:0;margin:0 0 30px 30px;font-size:14px;list-style:none;border:1px solid #ddd;cursor:pointer;position:relative}#fs_addons .fs-cards-list .fs-card .fs-overlay{position:absolute;left:0;right:0;bottom:0;top:0;z-index:9}#fs_addons .fs-cards-list .fs-card .fs-inner{background-color:#fff;overflow:hidden;height:100%;position:relative}#fs_addons .fs-cards-list .fs-card .fs-inner>ul{-moz-transition:all,.15s;-o-transition:all,.15s;-ms-transition:all,.15s;-webkit-transition:all,.15s;transition:all,.15s;left:0;right:0;top:0;position:absolute}#fs_addons .fs-cards-list .fs-card .fs-inner>ul>li{list-style:none;line-height:18px;padding:0 15px;width:100%;display:block;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-card-banner{padding:0;margin:0;line-height:0;display:block;height:100px;background-repeat:repeat-x;background-size:100% 100%;-moz-transition:all,.15s;-o-transition:all,.15s;-ms-transition:all,.15s;-webkit-transition:all,.15s;transition:all,.15s}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-card-banner .fs-badge.fs-installed-addon-badge{font-size:1.02em;line-height:1.3em}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-title{margin:10px 0 0 0;height:18px;overflow:hidden;color:#000;white-space:nowrap;text-overflow:ellipsis;font-weight:bold}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-offer{font-size:.9em}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-description{background-color:#f9f9f9;padding:10px 15px 100px 15px;border-top:1px solid #eee;margin:0 0 10px 0;color:#777}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-tag{position:absolute;top:10px;right:0px;background:#adff2f;display:block;padding:2px 10px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.3);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.3);box-shadow:1px 1px 1px rgba(0,0,0,.3);text-transform:uppercase;font-size:.9em;font-weight:bold}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-cta .button,#fs_addons .fs-cards-list .fs-card .fs-inner .fs-cta .button-group{position:absolute;top:112px;right:10px}@media screen and (min-width: 960px){#fs_addons .fs-cards-list .fs-card:hover .fs-overlay{border:2px solid #29abe1;margin-left:-1px;margin-top:-1px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner ul{top:-100px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-title,#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-offer{color:#29abe1}}#TB_window,#TB_window iframe{width:821px !important}#plugin-information .fyi{width:266px !important}#plugin-information #section-holder{margin-right:299px}#plugin-information #section-description h2,#plugin-information #section-description h3,#plugin-information #section-description p,#plugin-information #section-description b,#plugin-information #section-description i,#plugin-information #section-description blockquote,#plugin-information #section-description li,#plugin-information #section-description ul,#plugin-information #section-description ol{clear:none}#plugin-information #section-description iframe{max-width:100%}#plugin-information #section-description .fs-selling-points{padding-bottom:10px;border-bottom:1px solid #ddd}#plugin-information #section-description .fs-selling-points ul{margin:0}#plugin-information #section-description .fs-selling-points ul li{padding:0;list-style:none outside none}#plugin-information #section-description .fs-selling-points ul li i.dashicons{color:#71ae00;font-size:3em;vertical-align:middle;line-height:30px;float:left;margin:0 0 0 -15px}#plugin-information #section-description .fs-selling-points ul li h3{margin:1em 30px !important}#plugin-information #section-description .fs-screenshots:after{content:"";display:table;clear:both}#plugin-information #section-description .fs-screenshots ul{list-style:none;margin:0}#plugin-information #section-description .fs-screenshots ul li{width:225px;height:225px;float:left;margin-bottom:20px;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}#plugin-information #section-description .fs-screenshots ul li a{display:block;width:100%;height:100%;border:1px solid;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.2);box-shadow:1px 1px 1px rgba(0,0,0,.2);background-size:cover}#plugin-information #section-description .fs-screenshots ul li.odd{margin-right:20px}#plugin-information .plugin-information-pricing{margin:-16px;border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan h3{margin-top:0;padding:20px;font-size:16px}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper{border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab{cursor:pointer;position:relative;padding:0 10px;font-size:.9em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab label{text-transform:uppercase;color:green;background:#adff2f;position:absolute;left:-1px;right:-1px;bottom:100%;border:1px solid #006400;padding:2px;text-align:center;font-size:.9em;line-height:1em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab.nav-tab-active{cursor:default;background:#fffeec;border-bottom-color:#fffeec}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle h3{background:#fffeec;margin:0;padding-bottom:0;color:#0073aa}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .nav-tab-wrapper,#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .fs-billing-frequency{display:none}#plugin-information .plugin-information-pricing .fs-plan .fs-pricing-body{background:#fffeec;padding:20px}#plugin-information .plugin-information-pricing .fs-plan .button{width:100%;text-align:center;font-weight:bold;text-transform:uppercase;font-size:1.1em}#plugin-information .plugin-information-pricing .fs-plan label{white-space:nowrap}#plugin-information .plugin-information-pricing .fs-plan var{font-style:normal}#plugin-information .plugin-information-pricing .fs-plan .fs-billing-frequency,#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount{text-align:center;display:block;font-weight:bold;margin-bottom:10px;text-transform:uppercase;background:#f3f3f3;padding:2px;border:1px solid #ccc}#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount{text-transform:none;color:green;background:#adff2f}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms{font-size:.9em}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms i{float:left;margin:0 0 0 -15px}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms li{margin:10px 0 0 0}#plugin-information #section-features .fs-features{margin:-20px -26px}#plugin-information #section-features table{width:100%;border-spacing:0;border-collapse:separate}#plugin-information #section-features table thead th{padding:10px 0}#plugin-information #section-features table thead .fs-price{color:#71ae00;font-weight:normal;display:block;text-align:center}#plugin-information #section-features table tbody td{border-top:1px solid #ccc;padding:10px 0;text-align:center;width:100px;color:#71ae00}#plugin-information #section-features table tbody td:first-child{text-align:left;width:auto;color:inherit;padding-left:26px}#plugin-information #section-features table tbody tr.fs-odd td{background:#fefefe}#plugin-information #section-features .dashicons-yes{width:30px;height:30px;font-size:30px}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .button,#plugin-information .fs-dropdown .button-group .button{position:relative;width:auto;top:0;right:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .button:focus,#plugin-information .fs-dropdown .button-group .button:focus{z-index:10}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .fs-dropdown-arrow,#plugin-information .fs-dropdown .button-group .fs-dropdown-arrow{border-top:6px solid #fff;border-right:4px solid transparent;border-left:4px solid transparent;top:12px;position:relative}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active:not(.up) .button:not(.fs-dropdown-arrow-button),#plugin-information .fs-dropdown.active:not(.up) .button:not(.fs-dropdown-arrow-button){border-bottom-left-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active:not(.up) .fs-dropdown-arrow-button,#plugin-information .fs-dropdown.active:not(.up) .fs-dropdown-arrow-button{border-bottom-right-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active.up .button:not(.fs-dropdown-arrow-button),#plugin-information .fs-dropdown.active.up .button:not(.fs-dropdown-arrow-button){border-top-left-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active.up .fs-dropdown-arrow-button,#plugin-information .fs-dropdown.active.up .fs-dropdown-arrow-button{border-top-right-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list,#plugin-information .fs-dropdown .fs-dropdown-list{position:absolute;right:-1px;top:100%;margin-left:auto;padding:3px 0;border:1px solid #bfbfbf;background-color:#fff;z-index:1;width:230px;text-align:left;-moz-box-shadow:0px 2px 4px -1px rgba(0,0,0,.2),0px 4px 5px 0px rgba(0,0,0,.14),0px 1px 10px 0px rgba(0,0,0,.12);-webkit-box-shadow:0px 2px 4px -1px rgba(0,0,0,.2),0px 4px 5px 0px rgba(0,0,0,.14),0px 1px 10px 0px rgba(0,0,0,.12);box-shadow:0px 2px 4px -1px rgba(0,0,0,.2),0px 4px 5px 0px rgba(0,0,0,.14),0px 1px 10px 0px rgba(0,0,0,.12)}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li,#plugin-information .fs-dropdown .fs-dropdown-list li{margin:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li a,#plugin-information .fs-dropdown .fs-dropdown-list li a{display:block;padding:5px 10px;text-decoration:none;text-shadow:none}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li:hover,#plugin-information .fs-dropdown .fs-dropdown-list li:hover{background-color:#0074a3;color:#fff}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li:hover a,#plugin-information .fs-dropdown .fs-dropdown-list li:hover a{color:#fff}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown:not(.up) .fs-dropdown-list,#plugin-information .fs-dropdown:not(.up) .fs-dropdown-list{-moz-border-radius:3px 0 3px 3px;-webkit-border-radius:3px 0 3px 3px;border-radius:3px 0 3px 3px}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.up .fs-dropdown-list,#plugin-information .fs-dropdown.up .fs-dropdown-list{-moz-border-radius:3px 3px 0 3px;-webkit-border-radius:3px 3px 0 3px;border-radius:3px 3px 0 3px}#plugin-information .fs-dropdown .button-group{width:100%}#plugin-information .fs-dropdown .button-group .button{float:none;font-size:14px;font-weight:normal;text-transform:none}#plugin-information .fs-dropdown .fs-dropdown-list{margin-top:1px}#plugin-information .fs-dropdown.up .fs-dropdown-list{top:auto;bottom:100%;margin-bottom:2px}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group{text-align:center;display:table}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group .button{display:table-cell}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group .button:not(.fs-dropdown-arrow-button){left:1px;width:100%}#plugin-information-footer>.button,#plugin-information-footer .fs-dropdown{position:relative;top:3px}#plugin-information-footer>.button.left,#plugin-information-footer .fs-dropdown.left{float:left}#plugin-information-footer>.right,#plugin-information-footer .fs-dropdown{float:right}@media screen and (max-width: 961px){#fs_addons .fs-cards-list .fs-card{height:265px}}/*# sourceMappingURL=add-ons.css.map */
 
1
+ .fs-badge{position:absolute;top:10px;right:0;background:#71ae00;color:white;text-transform:uppercase;padding:5px 10px;-moz-border-radius:3px 0 0 3px;-webkit-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;font-weight:bold;border-right:0;-moz-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);box-shadow:0 2px 1px -1px rgba(0,0,0,0.3)}#fs_addons .fs-cards-list{list-style:none}#fs_addons .fs-cards-list .fs-card{float:left;height:152px;width:310px;padding:0;margin:0 0 30px 30px;font-size:14px;list-style:none;border:1px solid #ddd;cursor:pointer;position:relative}#fs_addons .fs-cards-list .fs-card .fs-overlay{position:absolute;left:0;right:0;bottom:0;top:0;z-index:9}#fs_addons .fs-cards-list .fs-card .fs-inner{background-color:#fff;overflow:hidden;height:100%;position:relative}#fs_addons .fs-cards-list .fs-card .fs-inner>ul{-moz-transition:all,0.15s;-o-transition:all,0.15s;-ms-transition:all,0.15s;-webkit-transition:all,0.15s;transition:all,0.15s;left:0;right:0;top:0;position:absolute}#fs_addons .fs-cards-list .fs-card .fs-inner>ul>li{list-style:none;line-height:18px;padding:0 15px;width:100%;display:block;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-card-banner{padding:0;margin:0;line-height:0;display:block;height:100px;background-repeat:repeat-x;background-size:100% 100%;-moz-transition:all,0.15s;-o-transition:all,0.15s;-ms-transition:all,0.15s;-webkit-transition:all,0.15s;transition:all,0.15s}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-card-banner .fs-badge.fs-installed-addon-badge{font-size:1.02em;line-height:1.3em}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-title{margin:10px 0 0 0;height:18px;overflow:hidden;color:#000;white-space:nowrap;text-overflow:ellipsis;font-weight:bold}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-offer{font-size:0.9em}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-description{background-color:#f9f9f9;padding:10px 15px 100px 15px;border-top:1px solid #eee;margin:0 0 10px 0;color:#777}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-tag{position:absolute;top:10px;right:0px;background:greenyellow;display:block;padding:2px 10px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.3);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.3);box-shadow:1px 1px 1px rgba(0,0,0,0.3);text-transform:uppercase;font-size:0.9em;font-weight:bold}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-cta .button,#fs_addons .fs-cards-list .fs-card .fs-inner .fs-cta .button-group{position:absolute;top:112px;right:10px}@media screen and (min-width: 960px){#fs_addons .fs-cards-list .fs-card:hover .fs-overlay{border:2px solid #29abe1;margin-left:-1px;margin-top:-1px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner ul{top:-100px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-title,#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-offer{color:#29abe1}}
2
+ #TB_window,#TB_window iframe{width:821px !important}#plugin-information .fyi{width:266px !important}#plugin-information #section-holder{margin-right:299px}#plugin-information #section-description h2,#plugin-information #section-description h3,#plugin-information #section-description p,#plugin-information #section-description b,#plugin-information #section-description i,#plugin-information #section-description blockquote,#plugin-information #section-description li,#plugin-information #section-description ul,#plugin-information #section-description ol{clear:none}#plugin-information #section-description iframe{max-width:100%}#plugin-information #section-description .fs-selling-points{padding-bottom:10px;border-bottom:1px solid #ddd}#plugin-information #section-description .fs-selling-points ul{margin:0}#plugin-information #section-description .fs-selling-points ul li{padding:0;list-style:none outside none}#plugin-information #section-description .fs-selling-points ul li i.dashicons{color:#71ae00;font-size:3em;vertical-align:middle;line-height:30px;float:left;margin:0 0 0 -15px}#plugin-information #section-description .fs-selling-points ul li h3{margin:1em 30px !important}#plugin-information #section-description .fs-screenshots:after{content:"";display:table;clear:both}#plugin-information #section-description .fs-screenshots ul{list-style:none;margin:0}#plugin-information #section-description .fs-screenshots ul li{width:225px;height:225px;float:left;margin-bottom:20px;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}#plugin-information #section-description .fs-screenshots ul li a{display:block;width:100%;height:100%;border:1px solid;-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.2);box-shadow:1px 1px 1px rgba(0,0,0,0.2);background-size:cover}#plugin-information #section-description .fs-screenshots ul li.odd{margin-right:20px}#plugin-information .plugin-information-pricing{margin:-16px;border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan h3{margin-top:0;padding:20px;font-size:16px}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper{border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab{cursor:pointer;position:relative;padding:0 10px;font-size:0.9em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab label{text-transform:uppercase;color:green;background:greenyellow;position:absolute;left:-1px;right:-1px;bottom:100%;border:1px solid darkgreen;padding:2px;text-align:center;font-size:0.9em;line-height:1em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab.nav-tab-active{cursor:default;background:#fffeec;border-bottom-color:#fffeec}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle h3{background:#fffeec;margin:0;padding-bottom:0;color:#0073aa}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .nav-tab-wrapper,#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .fs-billing-frequency{display:none}#plugin-information .plugin-information-pricing .fs-plan .fs-pricing-body{background:#fffeec;padding:20px}#plugin-information .plugin-information-pricing .fs-plan .button{width:100%;text-align:center;font-weight:bold;text-transform:uppercase;font-size:1.1em}#plugin-information .plugin-information-pricing .fs-plan label{white-space:nowrap}#plugin-information .plugin-information-pricing .fs-plan var{font-style:normal}#plugin-information .plugin-information-pricing .fs-plan .fs-billing-frequency,#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount{text-align:center;display:block;font-weight:bold;margin-bottom:10px;text-transform:uppercase;background:#F3F3F3;padding:2px;border:1px solid #ccc}#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount{text-transform:none;color:green;background:greenyellow}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms{font-size:0.9em}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms i{float:left;margin:0 0 0 -15px}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms li{margin:10px 0 0 0}#plugin-information #section-features .fs-features{margin:-20px -26px}#plugin-information #section-features table{width:100%;border-spacing:0;border-collapse:separate}#plugin-information #section-features table thead th{padding:10px 0}#plugin-information #section-features table thead .fs-price{color:#71ae00;font-weight:normal;display:block;text-align:center}#plugin-information #section-features table tbody td{border-top:1px solid #ccc;padding:10px 0;text-align:center;width:100px;color:#71ae00}#plugin-information #section-features table tbody td:first-child{text-align:left;width:auto;color:inherit;padding-left:26px}#plugin-information #section-features table tbody tr.fs-odd td{background:#fefefe}#plugin-information #section-features .dashicons-yes{width:30px;height:30px;font-size:30px}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .button,#plugin-information .fs-dropdown .button-group .button{position:relative;width:auto;top:0;right:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .button:focus,#plugin-information .fs-dropdown .button-group .button:focus{z-index:10}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .fs-dropdown-arrow,#plugin-information .fs-dropdown .button-group .fs-dropdown-arrow{border-top:6px solid white;border-right:4px solid transparent;border-left:4px solid transparent;top:12px;position:relative}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active:not(.up) .button:not(.fs-dropdown-arrow-button),#plugin-information .fs-dropdown.active:not(.up) .button:not(.fs-dropdown-arrow-button){border-bottom-left-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active:not(.up) .fs-dropdown-arrow-button,#plugin-information .fs-dropdown.active:not(.up) .fs-dropdown-arrow-button{border-bottom-right-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active.up .button:not(.fs-dropdown-arrow-button),#plugin-information .fs-dropdown.active.up .button:not(.fs-dropdown-arrow-button){border-top-left-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active.up .fs-dropdown-arrow-button,#plugin-information .fs-dropdown.active.up .fs-dropdown-arrow-button{border-top-right-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list,#plugin-information .fs-dropdown .fs-dropdown-list{position:absolute;right:-1px;top:100%;margin-left:auto;padding:3px 0;border:1px solid #bfbfbf;background-color:#fff;z-index:1;width:230px;text-align:left;-moz-box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);-webkit-box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li,#plugin-information .fs-dropdown .fs-dropdown-list li{margin:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li a,#plugin-information .fs-dropdown .fs-dropdown-list li a{display:block;padding:5px 10px;text-decoration:none;text-shadow:none}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li:hover,#plugin-information .fs-dropdown .fs-dropdown-list li:hover{background-color:#0074a3;color:#fff}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li:hover a,#plugin-information .fs-dropdown .fs-dropdown-list li:hover a{color:#fff}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown:not(.up) .fs-dropdown-list,#plugin-information .fs-dropdown:not(.up) .fs-dropdown-list{-moz-border-radius:3px 0 3px 3px;-webkit-border-radius:3px 0 3px 3px;border-radius:3px 0 3px 3px}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.up .fs-dropdown-list,#plugin-information .fs-dropdown.up .fs-dropdown-list{-moz-border-radius:3px 3px 0 3px;-webkit-border-radius:3px 3px 0 3px;border-radius:3px 3px 0 3px}#plugin-information .fs-dropdown .button-group{width:100%}#plugin-information .fs-dropdown .button-group .button{float:none;font-size:14px;font-weight:normal;text-transform:none}#plugin-information .fs-dropdown .fs-dropdown-list{margin-top:1px}#plugin-information .fs-dropdown.up .fs-dropdown-list{top:auto;bottom:100%;margin-bottom:2px}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group{text-align:center;display:table}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group .button{display:table-cell}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group .button:not(.fs-dropdown-arrow-button){left:1px;width:100%}#plugin-information-footer>.button,#plugin-information-footer .fs-dropdown{position:relative;top:3px}#plugin-information-footer>.button.left,#plugin-information-footer .fs-dropdown.left{float:left}#plugin-information-footer>.right,#plugin-information-footer .fs-dropdown{float:right}@media screen and (max-width: 961px){#fs_addons .fs-cards-list .fs-card{height:265px}}
freemius/assets/css/admin/affiliation.css CHANGED
@@ -1 +1 @@
1
- #fs_affiliation_content_wrapper #messages{margin-top:25px}#fs_affiliation_content_wrapper h3{font-size:24px;padding:0;margin-left:0}#fs_affiliation_content_wrapper ul li{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;list-style-type:none}#fs_affiliation_content_wrapper ul li:before{content:"";margin-right:10px;font-weight:bold}#fs_affiliation_content_wrapper p:not(.description),#fs_affiliation_content_wrapper li,#fs_affiliation_content_wrapper label{font-size:16px !important;line-height:26px !important}#fs_affiliation_content_wrapper .button{margin-top:20px;margin-bottom:7px;line-height:35px;height:40px;font-size:16px}#fs_affiliation_content_wrapper .button#cancel_button{margin-right:5px}#fs_affiliation_content_wrapper form .input-container{margin-bottom:15px}#fs_affiliation_content_wrapper form .input-container .input-label{font-weight:bold;display:block;width:100%}#fs_affiliation_content_wrapper form .input-container.input-container-text label,#fs_affiliation_content_wrapper form .input-container.input-container-text input,#fs_affiliation_content_wrapper form .input-container.input-container-text textarea{display:block}#fs_affiliation_content_wrapper form .input-container #add_domain,#fs_affiliation_content_wrapper form .input-container .remove-domain{text-decoration:none;display:inline-block;margin-top:3px}#fs_affiliation_content_wrapper form .input-container #add_domain:focus,#fs_affiliation_content_wrapper form .input-container .remove-domain:focus{box-shadow:none}#fs_affiliation_content_wrapper form .input-container #add_domain.disabled,#fs_affiliation_content_wrapper form .input-container .remove-domain.disabled{color:#aaa;cursor:default}#fs_affiliation_content_wrapper form #extra_domains_container .description{margin-top:0;position:relative;top:-4px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container{margin-bottom:15px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container .domain{display:inline-block;margin-right:5px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container .domain:last-of-type{margin-bottom:0}/*# sourceMappingURL=affiliation.css.map */
1
+ @charset "UTF-8";#fs_affiliation_content_wrapper #messages{margin-top:25px}#fs_affiliation_content_wrapper h3{font-size:24px;padding:0;margin-left:0}#fs_affiliation_content_wrapper ul li{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;list-style-type:none}#fs_affiliation_content_wrapper ul li:before{content:'';margin-right:10px;font-weight:bold}#fs_affiliation_content_wrapper p:not(.description),#fs_affiliation_content_wrapper li,#fs_affiliation_content_wrapper label{font-size:16px !important;line-height:26px !important}#fs_affiliation_content_wrapper .button{margin-top:20px;margin-bottom:7px;line-height:35px;height:40px;font-size:16px}#fs_affiliation_content_wrapper .button#cancel_button{margin-right:5px}#fs_affiliation_content_wrapper form .input-container{margin-bottom:15px}#fs_affiliation_content_wrapper form .input-container .input-label{font-weight:bold;display:block;width:100%}#fs_affiliation_content_wrapper form .input-container.input-container-text label,#fs_affiliation_content_wrapper form .input-container.input-container-text input,#fs_affiliation_content_wrapper form .input-container.input-container-text textarea{display:block}#fs_affiliation_content_wrapper form .input-container #add_domain,#fs_affiliation_content_wrapper form .input-container .remove-domain{text-decoration:none;display:inline-block;margin-top:3px}#fs_affiliation_content_wrapper form .input-container #add_domain:focus,#fs_affiliation_content_wrapper form .input-container .remove-domain:focus{box-shadow:none}#fs_affiliation_content_wrapper form .input-container #add_domain.disabled,#fs_affiliation_content_wrapper form .input-container .remove-domain.disabled{color:#aaa;cursor:default}#fs_affiliation_content_wrapper form #extra_domains_container .description{margin-top:0;position:relative;top:-4px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container{margin-bottom:15px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container .domain{display:inline-block;margin-right:5px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container .domain:last-of-type{margin-bottom:0}
freemius/assets/css/admin/checkout.css CHANGED
@@ -1 +1 @@
1
- @media screen and (max-width: 782px){#wpbody-content{padding-bottom:0 !important}}/*# sourceMappingURL=checkout.css.map */
1
+ @media screen and (max-width: 782px){#wpbody-content{padding-bottom:0 !important}}
freemius/assets/css/admin/clone-resolution.css DELETED
@@ -1 +0,0 @@
1
- .fs-notice[data-id^=clone_resolution_options_notice]{padding:0;color:inherit !important}.fs-notice[data-id^=clone_resolution_options_notice] .fs-notice-body{padding:0;margin-bottom:0}.fs-notice[data-id^=clone_resolution_options_notice] .fs-notice-header{padding:5px 10px}.fs-notice[data-id^=clone_resolution_options_notice] ol{margin-top:0;margin-bottom:0}.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-resolution-options-container{display:flex;flex-direction:row;padding:0 10px 10px}@media(max-width: 750px){.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-resolution-options-container{flex-direction:column}}.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-resolution-option{border:1px solid #ccc;padding:10px 10px 15px 10px;flex:auto;margin:5px}.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-resolution-option:first-child{margin-left:0}.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-resolution-option:last-child{margin-right:0}.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-resolution-option strong{font-size:1.2em;padding:2px;line-height:1.5em}.fs-notice[data-id^=clone_resolution_options_notice] a{text-decoration:none}.fs-notice[data-id^=clone_resolution_options_notice] .button{margin-right:10px}.rtl .fs-notice[data-id^=clone_resolution_options_notice] .button{margin-right:0;margin-left:10px}.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-documentation-container{padding:0 10px 15px}.fs-notice[data-id=temporary_duplicate_notice] #fs_clone_resolution_error_message{border:1px solid #d3135a;background:#fee;color:#d3135a;padding:10px}.fs-notice[data-id=temporary_duplicate_notice] ol{margin-top:0}/*# sourceMappingURL=clone-resolution.css.map */
 
freemius/assets/css/admin/common.css CHANGED
@@ -1 +1,2 @@
1
- .fs-badge{position:absolute;top:10px;right:0;background:#71ae00;color:#fff;text-transform:uppercase;padding:5px 10px;-moz-border-radius:3px 0 0 3px;-webkit-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;font-weight:bold;border-right:0;-moz-box-shadow:0 2px 1px -1px rgba(0,0,0,.3);-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.3);box-shadow:0 2px 1px -1px rgba(0,0,0,.3)}.theme-browser .theme .fs-premium-theme-badge-container{position:absolute;right:0;top:0}.theme-browser .theme .fs-premium-theme-badge-container .fs-badge{position:relative;top:0;margin-top:10px;text-align:center}.theme-browser .theme .fs-premium-theme-badge-container .fs-badge.fs-premium-theme-badge{font-size:1.1em}.theme-browser .theme .fs-premium-theme-badge-container .fs-badge.fs-beta-theme-badge{background:#00a0d2}.fs-switch{position:relative;display:inline-block;color:#ccc;text-shadow:0 1px 1px rgba(255,255,255,.8);height:18px;padding:6px 6px 5px 6px;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);background:#ececec;box-shadow:0 0 4px rgba(0,0,0,.1),inset 0 1px 3px 0 rgba(0,0,0,.1);cursor:pointer}.fs-switch span{display:inline-block;width:35px;text-transform:uppercase}.fs-switch .fs-toggle{position:absolute;top:1px;width:37px;height:25px;border:1px solid #ccc;border:1px solid rgba(0,0,0,.3);border-radius:4px;background:#fff;background-color:#fff;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #ececec), color-stop(1, #fff));background-image:-webkit-linear-gradient(top, #ececec, #fff);background-image:-moz-linear-gradient(top, #ececec, #fff);background-image:-ms-linear-gradient(top, #ececec, #fff);background-image:-o-linear-gradient(top, #ececec, #fff);background-image:linear-gradient(top, bottom, #ececec, #fff);box-shadow:inset 0 1px 0 0 rgba(255,255,255,.5);z-index:999;-moz-transition:.4s cubic-bezier(0.54, 1.6, 0.5, 1);-o-transition:.4s cubic-bezier(0.54, 1.6, 0.5, 1);-ms-transition:.4s cubic-bezier(0.54, 1.6, 0.5, 1);-webkit-transition:.4s cubic-bezier(0.54, 1.6, 0.5, 1);transition:.4s cubic-bezier(0.54, 1.6, 0.5, 1)}.fs-switch.fs-off .fs-toggle{left:2%}.fs-switch.fs-on .fs-toggle{left:54%}.fs-switch.fs-round{top:8px;padding:4px 25px;-moz-border-radius:24px;-webkit-border-radius:24px;border-radius:24px}.fs-switch.fs-round .fs-toggle{top:0;width:24px;height:24px;-moz-border-radius:24px;-webkit-border-radius:24px;border-radius:24px}.fs-switch.fs-round.fs-off .fs-toggle{left:-1px}.fs-switch.fs-round.fs-on{background:#0085ba}.fs-switch.fs-round.fs-on .fs-toggle{left:25px}.fs-switch.fs-small.fs-round{padding:1px 19px}.fs-switch.fs-small.fs-round .fs-toggle{top:0;width:18px;height:18px;-moz-border-radius:18px;-webkit-border-radius:18px;border-radius:18px}.fs-switch.fs-small.fs-round.fs-on .fs-toggle{left:19px}.fs-switch-feedback{margin-left:10px}.fs-switch-feedback.success{color:#71ae00}.rtl .fs-switch-feedback{margin-left:0;margin-right:10px}#fs_frame{line-height:0;font-size:0}.fs-full-size-wrapper{margin:40px 0 -65px -20px}@media(max-width: 600px){.fs-full-size-wrapper{margin:0 0 -65px -10px}}.fs-notice{position:relative}.fs-notice.fs-has-title{margin-bottom:30px !important}.fs-notice.success{color:green}.fs-notice.promotion{border-color:#00a0d2 !important;background-color:#f2fcff !important}.fs-notice .fs-notice-body{margin:.5em 0;padding:2px}.fs-notice .fs-close{cursor:pointer;color:#aaa;float:right}.fs-notice .fs-close:hover{color:#666}.fs-notice .fs-close>*{margin-top:7px;display:inline-block}.fs-notice label.fs-plugin-title{background:rgba(0,0,0,.3);color:#fff;padding:2px 10px;position:absolute;top:100%;bottom:auto;right:auto;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;left:10px;font-size:12px;font-weight:bold;cursor:auto}div.fs-notice.updated,div.fs-notice.success,div.fs-notice.promotion{display:block !important}.rtl .fs-notice .fs-close{float:left}.fs-secure-notice{position:fixed;top:32px;left:160px;right:0;background:#ebfdeb;padding:10px 20px;color:green;z-index:9999;-moz-box-shadow:0 2px 2px rgba(6,113,6,.3);-webkit-box-shadow:0 2px 2px rgba(6,113,6,.3);box-shadow:0 2px 2px rgba(6,113,6,.3);opacity:.95;filter:alpha(opacity=95)}.fs-secure-notice:hover{opacity:1;filter:alpha(opacity=100)}.fs-secure-notice a.fs-security-proof{color:green;text-decoration:none}@media screen and (max-width: 960px){.fs-secure-notice{left:36px}}@media screen and (max-width: 600px){.fs-secure-notice{display:none}}@media screen and (max-width: 1250px){#fs_promo_tab{display:none}}@media screen and (max-width: 782px){.fs-secure-notice{left:0;top:46px;text-align:center}}span.fs-submenu-item.fs-sub:before{content:"↳";padding:0 5px}.rtl span.fs-submenu-item.fs-sub:before{content:"↲"}.fs-submenu-item.pricing.upgrade-mode{color:#adff2f}.fs-submenu-item.pricing.trial-mode{color:#83e2ff}#adminmenu .update-plugins.fs-trial{background-color:#00b9eb}.fs-ajax-spinner{border:0;width:20px;height:20px;margin-right:5px;vertical-align:sub;display:inline-block;background:url("/wp-admin/images/wpspin_light-2x.gif");background-size:contain;margin-bottom:-2px}.wrap.fs-section h2{text-align:left}.plugins p.fs-upgrade-notice{border:0;background-color:#d54e21;padding:10px;color:#f9f9f9;margin-top:10px}/*# sourceMappingURL=common.css.map */
 
1
+ .fs-badge{position:absolute;top:10px;right:0;background:#71ae00;color:white;text-transform:uppercase;padding:5px 10px;-moz-border-radius:3px 0 0 3px;-webkit-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;font-weight:bold;border-right:0;-moz-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);box-shadow:0 2px 1px -1px rgba(0,0,0,0.3)}.theme-browser .theme .fs-premium-theme-badge-container{position:absolute;right:0;top:0}.theme-browser .theme .fs-premium-theme-badge-container .fs-badge{position:relative;top:0;margin-top:10px;text-align:center}.theme-browser .theme .fs-premium-theme-badge-container .fs-badge.fs-premium-theme-badge{font-size:1.1em}.theme-browser .theme .fs-premium-theme-badge-container .fs-badge.fs-beta-theme-badge{background:#00a0d2}.fs-switch{position:relative;display:inline-block;color:#ccc;text-shadow:0 1px 1px rgba(255,255,255,0.8);height:18px;padding:6px 6px 5px 6px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);background:#ececec;box-shadow:0 0 4px rgba(0,0,0,0.1),inset 0 1px 3px 0 rgba(0,0,0,0.1);cursor:pointer}.fs-switch span{display:inline-block;width:35px;text-transform:uppercase}.fs-switch .fs-toggle{position:absolute;top:1px;width:37px;height:25px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.3);border-radius:4px;background:#fff;background-color:#fff;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #ececec), color-stop(1, #fff));background-image:-webkit-linear-gradient(top, #ececec, #fff);background-image:-moz-linear-gradient(top, #ececec, #fff);background-image:-ms-linear-gradient(top, #ececec, #fff);background-image:-o-linear-gradient(top, #ececec, #fff);background-image:linear-gradient(top, bottom, #ececec, #fff);box-shadow:inset 0 1px 0 0 rgba(255,255,255,0.5);z-index:999;-moz-transition:0.4s cubic-bezier(0.54, 1.6, 0.5, 1);-o-transition:0.4s cubic-bezier(0.54, 1.6, 0.5, 1);-ms-transition:0.4s cubic-bezier(0.54, 1.6, 0.5, 1);-webkit-transition:0.4s cubic-bezier(0.54, 1.6, 0.5, 1);transition:0.4s cubic-bezier(0.54, 1.6, 0.5, 1)}.fs-switch.fs-off .fs-toggle{left:2%}.fs-switch.fs-on .fs-toggle{left:54%}.fs-switch.fs-round{top:8px;padding:4px 25px;-moz-border-radius:24px;-webkit-border-radius:24px;border-radius:24px}.fs-switch.fs-round .fs-toggle{top:0;width:24px;height:24px;-moz-border-radius:24px;-webkit-border-radius:24px;border-radius:24px}.fs-switch.fs-round.fs-off .fs-toggle{left:-1px}.fs-switch.fs-round.fs-on{background:#0085ba}.fs-switch.fs-round.fs-on .fs-toggle{left:25px}.fs-switch.fs-small.fs-round{padding:1px 19px}.fs-switch.fs-small.fs-round .fs-toggle{top:0;width:18px;height:18px;-moz-border-radius:18px;-webkit-border-radius:18px;border-radius:18px}.fs-switch.fs-small.fs-round.fs-on .fs-toggle{left:19px}.fs-switch-feedback{margin-left:10px}.fs-switch-feedback.success{color:#71ae00}.rtl .fs-switch-feedback{margin-left:0;margin-right:10px}#fs_frame{line-height:0;font-size:0}.fs-full-size-wrapper{margin:40px 0 -65px -20px}@media (max-width: 600px){.fs-full-size-wrapper{margin:0 0 -65px -10px}}
2
+ .fs-notice{position:relative}.fs-notice.fs-has-title{margin-bottom:30px !important}.fs-notice.success{color:green}.fs-notice.promotion{border-color:#00a0d2 !important;background-color:#f2fcff !important}.fs-notice .fs-notice-body{margin:.5em 0;padding:2px}.fs-notice .fs-close{cursor:pointer;color:#aaa;float:right}.fs-notice .fs-close:hover{color:#666}.fs-notice .fs-close>*{margin-top:7px;display:inline-block}.fs-notice label.fs-plugin-title{background:rgba(0,0,0,0.3);color:#fff;padding:2px 10px;position:absolute;top:100%;bottom:auto;right:auto;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;left:10px;font-size:12px;font-weight:bold;cursor:auto}div.fs-notice.updated,div.fs-notice.success,div.fs-notice.promotion{display:block !important}.rtl .fs-notice .fs-close{float:left}.fs-secure-notice{position:fixed;top:32px;left:160px;right:0;background:#ebfdeb;padding:10px 20px;color:green;z-index:9999;-moz-box-shadow:0 2px 2px rgba(6,113,6,0.3);-webkit-box-shadow:0 2px 2px rgba(6,113,6,0.3);box-shadow:0 2px 2px rgba(6,113,6,0.3);opacity:0.95;filter:alpha(opacity=95)}.fs-secure-notice:hover{opacity:1;filter:alpha(opacity=100)}.fs-secure-notice a.fs-security-proof{color:green;text-decoration:none}@media screen and (max-width: 960px){.fs-secure-notice{left:36px}}@media screen and (max-width: 600px){.fs-secure-notice{display:none}}@media screen and (max-width: 1250px){#fs_promo_tab{display:none}}@media screen and (max-width: 782px){.fs-secure-notice{left:0;top:46px;text-align:center}}span.fs-submenu-item.fs-sub:before{content:'\21B3';padding:0 5px}.rtl span.fs-submenu-item.fs-sub:before{content:'\21B2'}.fs-submenu-item.pricing.upgrade-mode{color:greenyellow}.fs-submenu-item.pricing.trial-mode{color:#83e2ff}#adminmenu .update-plugins.fs-trial{background-color:#00b9eb}.fs-ajax-spinner{border:0;width:20px;height:20px;margin-right:5px;vertical-align:sub;display:inline-block;background:url("/wp-admin/images/wpspin_light-2x.gif");background-size:contain;margin-bottom:-2px}.wrap.fs-section h2{text-align:left}.plugins p.fs-upgrade-notice{border:0;background-color:#d54e21;padding:10px;color:#f9f9f9;margin-top:10px}
freemius/assets/css/admin/connect.css CHANGED
@@ -1 +1 @@
1
- #fs_connect{width:480px;-moz-box-shadow:0px 1px 2px rgba(0,0,0,.3);-webkit-box-shadow:0px 1px 2px rgba(0,0,0,.3);box-shadow:0px 1px 2px rgba(0,0,0,.3);margin:20px 0}@media screen and (max-width: 479px){#fs_connect{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;width:auto;margin:0 0 0 -10px}}#fs_connect .fs-content{background:#fff;padding:15px 20px}#fs_connect .fs-content .fs-error{background:snow;color:#d3135a;border:1px solid #d3135a;-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1);text-align:center;padding:5px;margin-bottom:10px}#fs_connect .fs-content p{margin:0;padding:0;font-size:1.2em}#fs_connect .fs-license-key-container{position:relative;width:280px;margin:10px auto 0 auto}#fs_connect .fs-license-key-container input{width:100%}#fs_connect .fs-license-key-container .dashicons{position:absolute;top:5px;right:5px}#fs_connect.require-license-key .fs-sites-list-container td{cursor:pointer}#fs_connect #delegate_to_site_admins{margin-right:15px;float:right;height:26px;vertical-align:middle;line-height:37px;font-weight:bold;border-bottom:1px dashed;text-decoration:none}#fs_connect #delegate_to_site_admins.rtl{margin-left:15px;margin-right:0}#fs_connect .fs-actions{padding:10px 20px;background:#c0c7ca}#fs_connect .fs-actions .button{padding:0 10px 1px;line-height:35px;height:37px;font-size:16px;margin-bottom:0}#fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}#fs_connect .fs-actions .button.button-primary{padding-right:15px;padding-left:15px}#fs_connect .fs-actions .button.button-primary:after{content:" ➜"}#fs_connect .fs-actions .button.button-primary.fs-loading:after{content:""}#fs_connect .fs-actions .button.button-secondary{float:right}#fs_connect.fs-anonymous-disabled .fs-actions .button.button-primary{width:100%}#fs_connect .fs-permissions{padding:10px 20px;background:#fefefe;-moz-transition:background .5s ease;-o-transition:background .5s ease;-ms-transition:background .5s ease;-webkit-transition:background .5s ease;transition:background .5s ease}#fs_connect .fs-permissions .fs-license-sync-disclaimer{text-align:center;margin-top:0}#fs_connect .fs-permissions>.fs-trigger{font-size:.9em;text-decoration:none;text-align:center;display:block}#fs_connect .fs-permissions ul{height:0;overflow:hidden;margin:0}#fs_connect .fs-permissions ul li{margin-bottom:12px}#fs_connect .fs-permissions ul li:last-child{margin-bottom:0}#fs_connect .fs-permissions ul li>i.dashicons{float:left;font-size:40px;width:40px;height:40px}#fs_connect .fs-permissions ul li .fs-switch{float:right}#fs_connect .fs-permissions ul li .fs-permission-description{margin-left:55px}#fs_connect .fs-permissions ul li .fs-permission-description span{font-weight:bold;text-transform:uppercase;color:#23282d}#fs_connect .fs-permissions ul li .fs-permission-description p{margin:2px 0 0 0}#fs_connect .fs-permissions.fs-open{background:#fff}#fs_connect .fs-permissions.fs-open ul{overflow:initial;height:auto;margin:20px 20px 10px 20px}@media screen and (max-width: 479px){#fs_connect .fs-permissions{background:#fff}#fs_connect .fs-permissions .fs-trigger{display:none}#fs_connect .fs-permissions ul{height:auto;margin:20px}}#fs_connect .fs-freemium-licensing{padding:8px;background:#777;color:#fff}#fs_connect .fs-freemium-licensing p{text-align:center;display:block;margin:0;padding:0}#fs_connect .fs-freemium-licensing a{color:#c2eeff;text-decoration:underline}#fs_connect .fs-visual{padding:12px;line-height:0;background:#fafafa;height:80px;position:relative}#fs_connect .fs-visual .fs-site-icon{position:absolute;left:20px;top:10px}#fs_connect .fs-visual .fs-connect-logo{position:absolute;right:20px;top:10px}#fs_connect .fs-visual .fs-plugin-icon{position:absolute;top:10px;left:50%;margin-left:-40px}#fs_connect .fs-visual .fs-plugin-icon,#fs_connect .fs-visual .fs-site-icon,#fs_connect .fs-visual img,#fs_connect .fs-visual object{width:80px;height:80px}#fs_connect .fs-visual .dashicons-wordpress{font-size:64px;background:#01749a;color:#fff;width:64px;height:64px;padding:8px}#fs_connect .fs-visual .dashicons-plus{position:absolute;top:50%;font-size:30px;margin-top:-10px;color:#bbb}#fs_connect .fs-visual .dashicons-plus.fs-first{left:28%}#fs_connect .fs-visual .dashicons-plus.fs-second{left:65%}#fs_connect .fs-visual .fs-plugin-icon,#fs_connect .fs-visual .fs-connect-logo,#fs_connect .fs-visual .fs-site-icon{border:1px solid #ccc;padding:1px;background:#fff}#fs_connect .fs-terms{text-align:center;font-size:.85em;padding:5px;background:rgba(0,0,0,.05)}#fs_connect .fs-terms,#fs_connect .fs-terms a{color:#999}#fs_connect .fs-terms a{text-decoration:none}.fs-multisite-options-container{margin-top:10px;border:1px solid #ccc;padding:5px}.fs-multisite-options-container a{text-decoration:none}.fs-multisite-options-container a:focus{box-shadow:none}.fs-multisite-options-container a.selected{font-weight:bold}.fs-multisite-options-container.fs-apply-on-all-sites{border:0 none;padding:0}.fs-multisite-options-container.fs-apply-on-all-sites .fs-all-sites-options{border-spacing:0}.fs-multisite-options-container.fs-apply-on-all-sites .fs-all-sites-options td:not(:first-child){display:none}.fs-multisite-options-container .fs-sites-list-container{display:none;overflow:auto}.fs-multisite-options-container .fs-sites-list-container table td{border-top:1px solid #ccc;padding:4px 2px}.fs-tooltip-trigger{position:relative}.fs-tooltip-trigger:not(a){cursor:help}.fs-tooltip-trigger .fs-tooltip{opacity:0;visibility:hidden;-moz-transition:opacity .3s ease-in-out;-o-transition:opacity .3s ease-in-out;-ms-transition:opacity .3s ease-in-out;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;position:absolute;background:rgba(0,0,0,.8);color:#fff !important;font-family:"arial",serif;font-size:12px;padding:10px;z-index:999999;bottom:100%;margin-bottom:5px;left:-17px;right:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.2);box-shadow:1px 1px 1px rgba(0,0,0,.2);line-height:1.3em;font-weight:bold;text-align:left;text-transform:none !important}.rtl .fs-tooltip-trigger .fs-tooltip{text-align:right;left:auto;right:-17px}.fs-tooltip-trigger .fs-tooltip::after{content:" ";display:block;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:rgba(0,0,0,.8) transparent transparent transparent;position:absolute;top:100%;left:21px}.rtl .fs-tooltip-trigger .fs-tooltip::after{right:21px;left:auto}.fs-tooltip-trigger:hover .fs-tooltip{visibility:visible;opacity:1}#fs_marketing_optin{display:none;margin-top:10px;border:1px solid #ccc;padding:10px;line-height:1.5em}#fs_marketing_optin .fs-message{display:block;margin-bottom:5px;font-size:1.05em;font-weight:600}#fs_marketing_optin.error{border:1px solid #d3135a;background:#fee}#fs_marketing_optin.error .fs-message{color:#d3135a}#fs_marketing_optin .fs-input-container{margin-top:5px}#fs_marketing_optin .fs-input-container label{margin-top:5px;display:block}#fs_marketing_optin .fs-input-container label input{float:left;margin:1px 0 0 0}#fs_marketing_optin .fs-input-container label:first-child{display:block;margin-bottom:2px}#fs_marketing_optin .fs-input-label{display:block;margin-left:20px}#fs_marketing_optin .fs-input-label .underlined{text-decoration:underline}.rtl #fs_marketing_optin .fs-input-container label input{float:right}.rtl #fs_marketing_optin .fs-input-label{margin-left:0;margin-right:20px}.rtl #fs_connect .fs-actions{padding:10px 20px;background:#c0c7ca}.rtl #fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}.rtl #fs_connect .fs-actions .button.button-primary:after{content:" »"}.rtl #fs_connect .fs-actions .button.button-primary.fs-loading:after{content:""}.rtl #fs_connect .fs-actions .button.button-secondary{float:left}.rtl #fs_connect .fs-permissions ul li .fs-permission-description{margin-right:55px;margin-left:0}.rtl #fs_connect .fs-permissions ul li .fs-switch{float:left}.rtl #fs_connect .fs-permissions ul li i.dashicons{float:right}.rtl #fs_connect .fs-visual .fs-site-icon{right:20px;left:auto}.rtl #fs_connect .fs-visual .fs-connect-logo{right:auto;left:20px}#fs_theme_connect_wrapper{position:fixed;top:0;height:100%;width:100%;z-index:99990;background:rgba(0,0,0,.75);text-align:center;overflow-y:auto}#fs_theme_connect_wrapper:before{content:"";display:inline-block;vertical-align:middle;height:100%}#fs_theme_connect_wrapper>button.close{color:#fff;cursor:pointer;height:40px;width:40px;position:absolute;right:0;border:0;background-color:transparent;top:32px}#fs_theme_connect_wrapper #fs_connect{top:0;text-align:left;display:inline-block;vertical-align:middle;margin-top:52px;margin-bottom:20px}#fs_theme_connect_wrapper #fs_connect .fs-terms{background:rgba(140,140,140,.64)}#fs_theme_connect_wrapper #fs_connect .fs-terms,#fs_theme_connect_wrapper #fs_connect .fs-terms a{color:#c5c5c5}.wp-pointer-content #fs_connect{margin:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.fs-opt-in-pointer .wp-pointer-content{padding:0}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow{border-bottom-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow-inner{border-bottom-color:#fafafa}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow{border-top-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow-inner{border-top-color:#fafafa}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow{border-right-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow-inner{border-right-color:#fafafa}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow{border-left-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow-inner{border-left-color:#fafafa}#license_issues_link{display:block;text-align:center;font-size:.9em;margin-top:10px}/*# sourceMappingURL=connect.css.map */
1
+ #fs_connect{width:480px;-moz-box-shadow:0px 1px 2px rgba(0,0,0,0.3);-webkit-box-shadow:0px 1px 2px rgba(0,0,0,0.3);box-shadow:0px 1px 2px rgba(0,0,0,0.3);margin:20px 0}@media screen and (max-width: 479px){#fs_connect{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;width:auto;margin:0 0 0 -10px}}#fs_connect .fs-content{background:#fff;padding:15px 20px}#fs_connect .fs-content .fs-error{background:snow;color:#d3135a;border:1px solid #d3135a;-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);text-align:center;padding:5px;margin-bottom:10px}#fs_connect .fs-content p{margin:0;padding:0;font-size:1.2em}#fs_connect .fs-license-key-container{position:relative;width:280px;margin:10px auto 0 auto}#fs_connect .fs-license-key-container input{width:100%}#fs_connect .fs-license-key-container .dashicons{position:absolute;top:5px;right:5px}#fs_connect.require-license-key .fs-sites-list-container td{cursor:pointer}#fs_connect #delegate_to_site_admins{margin-right:15px;float:right;height:26px;vertical-align:middle;line-height:37px;font-weight:bold;border-bottom:1px dashed;text-decoration:none}#fs_connect #delegate_to_site_admins.rtl{margin-left:15px;margin-right:0}#fs_connect .fs-actions{padding:10px 20px;background:#C0C7CA}#fs_connect .fs-actions .button{padding:0 10px 1px;line-height:35px;height:37px;font-size:16px;margin-bottom:0}#fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}#fs_connect .fs-actions .button.button-primary{padding-right:15px;padding-left:15px}#fs_connect .fs-actions .button.button-primary:after{content:' \279C'}#fs_connect .fs-actions .button.button-primary.fs-loading:after{content:''}#fs_connect .fs-actions .button.button-secondary{float:right}#fs_connect.fs-anonymous-disabled .fs-actions .button.button-primary{width:100%}#fs_connect .fs-permissions{padding:10px 20px;background:#FEFEFE;-moz-transition:background 0.5s ease;-o-transition:background 0.5s ease;-ms-transition:background 0.5s ease;-webkit-transition:background 0.5s ease;transition:background 0.5s ease}#fs_connect .fs-permissions .fs-license-sync-disclaimer{text-align:center;margin-top:0}#fs_connect .fs-permissions>.fs-trigger{font-size:0.9em;text-decoration:none;text-align:center;display:block}#fs_connect .fs-permissions ul{height:0;overflow:hidden;margin:0}#fs_connect .fs-permissions ul li{margin-bottom:12px}#fs_connect .fs-permissions ul li:last-child{margin-bottom:0}#fs_connect .fs-permissions ul li>i.dashicons{float:left;font-size:40px;width:40px;height:40px}#fs_connect .fs-permissions ul li .fs-switch{float:right}#fs_connect .fs-permissions ul li .fs-permission-description{margin-left:55px}#fs_connect .fs-permissions ul li .fs-permission-description span{font-weight:bold;text-transform:uppercase;color:#23282d}#fs_connect .fs-permissions ul li .fs-permission-description p{margin:2px 0 0 0}#fs_connect .fs-permissions.fs-open{background:#fff}#fs_connect .fs-permissions.fs-open ul{overflow:initial;height:auto;margin:20px 20px 10px 20px}@media screen and (max-width: 479px){#fs_connect .fs-permissions{background:#fff}#fs_connect .fs-permissions .fs-trigger{display:none}#fs_connect .fs-permissions ul{height:auto;margin:20px}}#fs_connect .fs-freemium-licensing{padding:8px;background:#777;color:#fff}#fs_connect .fs-freemium-licensing p{text-align:center;display:block;margin:0;padding:0}#fs_connect .fs-freemium-licensing a{color:#C2EEFF;text-decoration:underline}#fs_connect .fs-visual{padding:12px;line-height:0;background:#fafafa;height:80px;position:relative}#fs_connect .fs-visual .fs-site-icon{position:absolute;left:20px;top:10px}#fs_connect .fs-visual .fs-connect-logo{position:absolute;right:20px;top:10px}#fs_connect .fs-visual .fs-plugin-icon{position:absolute;top:10px;left:50%;margin-left:-40px}#fs_connect .fs-visual .fs-plugin-icon,#fs_connect .fs-visual .fs-site-icon,#fs_connect .fs-visual img,#fs_connect .fs-visual object{width:80px;height:80px}#fs_connect .fs-visual .dashicons-wordpress{font-size:64px;background:#01749a;color:#fff;width:64px;height:64px;padding:8px}#fs_connect .fs-visual .dashicons-plus{position:absolute;top:50%;font-size:30px;margin-top:-10px;color:#bbb}#fs_connect .fs-visual .dashicons-plus.fs-first{left:28%}#fs_connect .fs-visual .dashicons-plus.fs-second{left:65%}#fs_connect .fs-visual .fs-plugin-icon,#fs_connect .fs-visual .fs-connect-logo,#fs_connect .fs-visual .fs-site-icon{border:1px solid #ccc;padding:1px;background:#fff}#fs_connect .fs-terms{text-align:center;font-size:0.85em;padding:5px;background:rgba(0,0,0,0.05)}#fs_connect .fs-terms,#fs_connect .fs-terms a{color:#999}#fs_connect .fs-terms a{text-decoration:none}.fs-multisite-options-container{margin-top:10px;border:1px solid #ccc;padding:5px}.fs-multisite-options-container a{text-decoration:none}.fs-multisite-options-container a:focus{box-shadow:none}.fs-multisite-options-container a.selected{font-weight:bold}.fs-multisite-options-container.fs-apply-on-all-sites{border:0 none;padding:0}.fs-multisite-options-container.fs-apply-on-all-sites .fs-all-sites-options{border-spacing:0}.fs-multisite-options-container.fs-apply-on-all-sites .fs-all-sites-options td:not(:first-child){display:none}.fs-multisite-options-container .fs-sites-list-container{display:none;overflow:auto}.fs-multisite-options-container .fs-sites-list-container table td{border-top:1px solid #ccc;padding:4px 2px}.fs-tooltip-trigger{position:relative}.fs-tooltip-trigger:not(a){cursor:help}.fs-tooltip-trigger .fs-tooltip{opacity:0;visibility:hidden;-moz-transition:opacity 0.3s ease-in-out;-o-transition:opacity 0.3s ease-in-out;-ms-transition:opacity 0.3s ease-in-out;-webkit-transition:opacity 0.3s ease-in-out;transition:opacity 0.3s ease-in-out;position:absolute;background:rgba(0,0,0,0.8);color:#fff !important;font-family:'arial', serif;font-size:12px;padding:10px;z-index:999999;bottom:100%;margin-bottom:5px;left:-17px;right:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.2);box-shadow:1px 1px 1px rgba(0,0,0,0.2);line-height:1.3em;font-weight:bold;text-align:left;text-transform:none !important}.rtl .fs-tooltip-trigger .fs-tooltip{text-align:right;left:auto;right:-17px}.fs-tooltip-trigger .fs-tooltip::after{content:' ';display:block;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:rgba(0,0,0,0.8) transparent transparent transparent;position:absolute;top:100%;left:21px}.rtl .fs-tooltip-trigger .fs-tooltip::after{right:21px;left:auto}.fs-tooltip-trigger:hover .fs-tooltip{visibility:visible;opacity:1}#fs_marketing_optin{display:none;margin-top:10px;border:1px solid #ccc;padding:10px;line-height:1.5em}#fs_marketing_optin .fs-message{display:block;margin-bottom:5px;font-size:1.05em;font-weight:600}#fs_marketing_optin.error{border:1px solid #d3135a;background:#fee}#fs_marketing_optin.error .fs-message{color:#d3135a}#fs_marketing_optin .fs-input-container{margin-top:5px}#fs_marketing_optin .fs-input-container label{margin-top:5px;display:block}#fs_marketing_optin .fs-input-container label input{float:left;margin:1px 0 0 0}#fs_marketing_optin .fs-input-container label:first-child{display:block;margin-bottom:2px}#fs_marketing_optin .fs-input-label{display:block;margin-left:20px}#fs_marketing_optin .fs-input-label .underlined{text-decoration:underline}.rtl #fs_marketing_optin .fs-input-container label input{float:right}.rtl #fs_marketing_optin .fs-input-label{margin-left:0;margin-right:20px}.rtl #fs_connect .fs-actions{padding:10px 20px;background:#C0C7CA}.rtl #fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}.rtl #fs_connect .fs-actions .button.button-primary:after{content:' \000bb'}.rtl #fs_connect .fs-actions .button.button-primary.fs-loading:after{content:''}.rtl #fs_connect .fs-actions .button.button-secondary{float:left}.rtl #fs_connect .fs-permissions ul li .fs-permission-description{margin-right:55px;margin-left:0}.rtl #fs_connect .fs-permissions ul li .fs-switch{float:left}.rtl #fs_connect .fs-permissions ul li i.dashicons{float:right}.rtl #fs_connect .fs-visual .fs-site-icon{right:20px;left:auto}.rtl #fs_connect .fs-visual .fs-connect-logo{right:auto;left:20px}#fs_theme_connect_wrapper{position:fixed;top:0;height:100%;width:100%;z-index:99990;background:rgba(0,0,0,0.75);text-align:center;overflow-y:auto}#fs_theme_connect_wrapper:before{content:"";display:inline-block;vertical-align:middle;height:100%}#fs_theme_connect_wrapper>button.close{color:white;cursor:pointer;height:40px;width:40px;position:absolute;right:0;border:0;background-color:transparent;top:32px}#fs_theme_connect_wrapper #fs_connect{top:0;text-align:left;display:inline-block;vertical-align:middle;margin-top:52px;margin-bottom:20px}#fs_theme_connect_wrapper #fs_connect .fs-terms{background:rgba(140,140,140,0.64)}#fs_theme_connect_wrapper #fs_connect .fs-terms,#fs_theme_connect_wrapper #fs_connect .fs-terms a{color:#c5c5c5}.wp-pointer-content #fs_connect{margin:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.fs-opt-in-pointer .wp-pointer-content{padding:0}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow{border-bottom-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow-inner{border-bottom-color:#fafafa}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow{border-top-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow-inner{border-top-color:#fafafa}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow{border-right-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow-inner{border-right-color:#fafafa}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow{border-left-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow-inner{border-left-color:#fafafa}#license_issues_link{display:block;text-align:center;font-size:0.9em;margin-top:10px}
freemius/assets/css/admin/debug.css CHANGED
@@ -1 +1 @@
1
- .fs-switch-label{font-size:20px;line-height:31px;margin:0 5px}#fs_log_book table{font-family:Consolas,Monaco,monospace;font-size:12px}#fs_log_book table th{color:#ccc}#fs_log_book table tr{background:#232525}#fs_log_book table tr.alternate{background:#2b2b2b}#fs_log_book table tr td.fs-col--logger{color:#5a7435}#fs_log_book table tr td.fs-col--type{color:#ffc861}#fs_log_book table tr td.fs-col--function{color:#a7b7b1;font-weight:bold}#fs_log_book table tr td.fs-col--message,#fs_log_book table tr td.fs-col--message a{color:#9a73ac !important}#fs_log_book table tr td.fs-col--file{color:#d07922}#fs_log_book table tr td.fs-col--timestamp{color:#6596be}/*# sourceMappingURL=debug.css.map */
1
+ .fs-switch-label{font-size:20px;line-height:31px;margin:0 5px}#fs_log_book table{font-family:Consolas,Monaco,monospace;font-size:12px}#fs_log_book table th{color:#ccc}#fs_log_book table tr{background:#232525}#fs_log_book table tr.alternate{background:#2b2b2b}#fs_log_book table tr td.fs-col--logger{color:#5a7435}#fs_log_book table tr td.fs-col--type{color:#ffc861}#fs_log_book table tr td.fs-col--function{color:#a7b7b1;font-weight:bold}#fs_log_book table tr td.fs-col--message,#fs_log_book table tr td.fs-col--message a{color:#9a73ac !important}#fs_log_book table tr td.fs-col--file{color:#d07922}#fs_log_book table tr td.fs-col--timestamp{color:#6596be}
freemius/assets/css/admin/dialog-boxes.css CHANGED
@@ -1 +1,2 @@
1
- .fs-modal{position:fixed;overflow:auto;height:100%;width:100%;top:0;z-index:100000;display:none;background:rgba(0,0,0,.6)}.fs-modal .dashicons{vertical-align:middle}.fs-modal .fs-modal-dialog{background:transparent;position:absolute;left:50%;margin-left:-298px;padding-bottom:30px;top:-100%;z-index:100001;width:596px}@media(max-width: 650px){.fs-modal .fs-modal-dialog{margin-left:-50%;box-sizing:border-box;padding-left:10px;padding-right:10px;width:100%}.fs-modal .fs-modal-dialog .fs-modal-panel>h3>strong{font-size:1.3em}}.fs-modal.active{display:block}.fs-modal.active:before{display:block}.fs-modal.active .fs-modal-dialog{top:10%}.fs-modal.fs-success .fs-modal-header{border-bottom-color:#46b450}.fs-modal.fs-success .fs-modal-body{background-color:#f7fff7}.fs-modal.fs-warn .fs-modal-header{border-bottom-color:#ffb900}.fs-modal.fs-warn .fs-modal-body{background-color:#fff8e5}.fs-modal.fs-error .fs-modal-header{border-bottom-color:#dc3232}.fs-modal.fs-error .fs-modal-body{background-color:#ffeaea}.fs-modal .fs-modal-body,.fs-modal .fs-modal-footer{border:0;background:#fefefe;padding:20px}.fs-modal .fs-modal-header{border-bottom:#eee solid 1px;background:#fbfbfb;padding:15px 20px;position:relative;margin-bottom:-10px}.fs-modal .fs-modal-header h4{margin:0;padding:0;text-transform:uppercase;font-size:1.2em;font-weight:bold;color:#cacaca;text-shadow:1px 1px 1px #fff;letter-spacing:.6px;-webkit-font-smoothing:antialiased}.fs-modal .fs-modal-header .fs-close{position:absolute;right:10px;top:12px;cursor:pointer;color:#bbb;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;padding:3px;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.fs-modal .fs-modal-header .fs-close:hover{color:#fff;background:#aaa}.fs-modal .fs-modal-header .fs-close .dashicons,.fs-modal .fs-modal-header .fs-close:hover .dashicons{text-decoration:none}.fs-modal .fs-modal-body{border-bottom:0}.fs-modal .fs-modal-body p{font-size:14px}.fs-modal .fs-modal-body h2{font-size:20px;line-height:1.5em}.fs-modal .fs-modal-body>div{margin-top:10px}.fs-modal .fs-modal-body>div h2{font-weight:bold;font-size:20px;margin-top:0}.fs-modal .fs-modal-footer{border-top:#eee solid 1px;text-align:right}.fs-modal .fs-modal-footer>.button{margin:0 7px}.fs-modal .fs-modal-footer>.button:last-of-type{margin:0}.fs-modal .fs-modal-panel>.notice.inline{margin:0;display:none}.fs-modal .fs-modal-panel:not(.active){display:none}.rtl .fs-modal .fs-modal-header .fs-close{right:auto;left:20px}.rtl .fs-modal .fs-modal-footer{text-align:left}body.has-fs-modal{overflow:hidden}.fs-modal.fs-modal-deactivation-feedback .reason-input,.fs-modal.fs-modal-deactivation-feedback .internal-message{margin:3px 0 3px 22px}.fs-modal.fs-modal-deactivation-feedback .reason-input input,.fs-modal.fs-modal-deactivation-feedback .reason-input textarea,.fs-modal.fs-modal-deactivation-feedback .internal-message input,.fs-modal.fs-modal-deactivation-feedback .internal-message textarea{width:100%}.fs-modal.fs-modal-deactivation-feedback li.reason.has-internal-message .internal-message{border:1px solid #ccc;padding:7px;display:none}@media(max-width: 650px){.fs-modal.fs-modal-deactivation-feedback li.reason li.reason{margin-bottom:10px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .reason-input,.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .internal-message{margin-left:29px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label{display:table}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label>span{display:table-cell;font-size:1.3em}}.fs-modal.fs-modal-deactivation-feedback .anonymous-feedback-label,.fs-modal.fs-modal-deactivation-feedback .feedback-from-snooze-label{float:left;line-height:30px}.rtl .fs-modal.fs-modal-deactivation-feedback .anonymous-feedback-label,.rtl .fs-modal.fs-modal-deactivation-feedback .feedback-from-snooze-label{float:right}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel{margin-top:0 !important}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel h3{margin-top:0;line-height:1.5em}#the-list .deactivate>.fs-slug{display:none}.fs-modal.fs-modal-subscription-cancellation .fs-price-increase-warning{color:red;font-weight:bold;padding:0 25px;margin-bottom:0}.fs-modal.fs-modal-subscription-cancellation ul.subscription-actions label input{float:left;top:5px;position:relative}.rtl .fs-modal.fs-modal-subscription-cancellation ul.subscription-actions label input{float:right}.fs-modal.fs-modal-subscription-cancellation ul.subscription-actions label span{display:block;margin-left:24px}.rtl .fs-modal.fs-modal-subscription-cancellation ul.subscription-actions label span{margin-left:0;margin-right:24px}.fs-modal.fs-modal-license-activation .fs-modal-body input.fs-license-key{width:100%}.fs-license-options-container table,.fs-license-options-container table select,.fs-license-options-container table .fs-available-license-key{width:100%}.fs-license-options-container table td:first-child{width:1%}.fs-license-options-container table .fs-other-license-key-container label{position:relative;top:6px;float:left;margin-right:5px}.fs-license-options-container table .fs-other-license-key-container div{overflow:hidden;width:auto;height:30px;display:block;top:2px;position:relative}.fs-license-options-container table .fs-other-license-key-container div input{margin:0}.fs-sites-list-container td{cursor:pointer}.fs-modal.fs-modal-user-change .fs-modal-body input#fs_other_email_address{width:100%}.fs-user-change-options-container table{width:100%;border-collapse:collapse}.fs-user-change-options-container table tr{display:block;margin-bottom:2px}.fs-user-change-options-container table .fs-email-address-container td{display:inline-block}.fs-user-change-options-container table .fs-email-address-container input[type=radio]{margin-bottom:0;margin-top:0}.fs-user-change-options-container table .fs-other-email-address-container{width:100%}.fs-user-change-options-container table .fs-other-email-address-container>div{display:table;width:100%}.fs-user-change-options-container table .fs-other-email-address-container>div label,.fs-user-change-options-container table .fs-other-email-address-container>div>div{display:table-cell}.fs-user-change-options-container table .fs-other-email-address-container>div label{width:1%;padding-left:3px;padding-right:3px}.fs-user-change-options-container table .fs-other-email-address-container>div>div{width:auto}.fs-user-change-options-container table .fs-other-email-address-container>div>div input{width:100%}.fs-modal.fs-modal-developer-license-debug-mode .fs-modal-body input.fs-license-or-user-key{width:100%}.fs-multisite-options-container{margin-top:10px;border:1px solid #ccc;padding:5px}.fs-multisite-options-container a{text-decoration:none}.fs-multisite-options-container a:focus{box-shadow:none}.fs-multisite-options-container a.selected{font-weight:bold}.fs-multisite-options-container.fs-apply-on-all-sites{border:0 none;padding:0}.fs-multisite-options-container.fs-apply-on-all-sites .fs-all-sites-options{border-spacing:0}.fs-multisite-options-container.fs-apply-on-all-sites .fs-all-sites-options td:not(:first-child){display:none}.fs-multisite-options-container .fs-sites-list-container{display:none;overflow:auto}.fs-multisite-options-container .fs-sites-list-container table td{border-top:1px solid #ccc;padding:4px 2px}.fs-modal.fs-modal-license-key-resend .email-address-container{overflow:hidden;padding-right:2px}.fs-modal.fs-modal-license-key-resend.fs-freemium input.email-address{width:300px}.fs-modal.fs-modal-license-key-resend.fs-freemium label{display:block;margin-bottom:10px}.fs-modal.fs-modal-license-key-resend.fs-premium input.email-address{width:100%}.fs-modal.fs-modal-license-key-resend.fs-premium .button-container{float:right;margin-left:7px}@media(max-width: 650px){.fs-modal.fs-modal-license-key-resend.fs-premium .button-container{margin-top:2px}}.rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .input-container>.email-address-container{padding-left:2px;padding-right:0}.rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .button-container{float:left;margin-right:7px;margin-left:0}a.show-license-resend-modal{margin-top:4px;display:inline-block}.fs-modal.fs-modal-email-address-update .fs-modal-body input[type=text]{width:100%}.fs-modal.fs-modal-email-address-update p{margin-bottom:0}.fs-modal.fs-modal-email-address-update ul{margin:1em .5em}.fs-modal.fs-modal-email-address-update ul li label span{float:left;margin-top:0}.fs-modal.fs-modal-email-address-update ul li label span:last-child{display:block;float:none;margin-left:20px}.fs-ajax-loader{position:relative;width:170px;height:20px;margin:auto}.fs-ajax-loader .fs-ajax-loader-bar{position:absolute;top:0;background-color:#0074a3;width:20px;height:20px;-webkit-animation-name:bounce_ajaxLoader;-moz-animation-name:bounce_ajaxLoader;-ms-animation-name:bounce_ajaxLoader;-o-animation-name:bounce_ajaxLoader;animation-name:bounce_ajaxLoader;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s;animation-duration:1.5s;animation-iteration-count:infinite;-o-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-webkit-animation-direction:normal;-moz-animation-direction:normal;-ms-animation-direction:normal;-o-animation-direction:normal;animation-direction:normal;-moz-transform:.3;-o-transform:.3;-ms-transform:.3;-webkit-transform:.3;transform:.3}.fs-ajax-loader .fs-ajax-loader-bar-1{left:0px;animation-delay:0.6s;-o-animation-delay:0.6s;-ms-animation-delay:0.6s;-webkit-animation-delay:0.6s;-moz-animation-delay:0.6s}.fs-ajax-loader .fs-ajax-loader-bar-2{left:19px;animation-delay:0.75s;-o-animation-delay:0.75s;-ms-animation-delay:0.75s;-webkit-animation-delay:0.75s;-moz-animation-delay:0.75s}.fs-ajax-loader .fs-ajax-loader-bar-3{left:38px;animation-delay:0.9s;-o-animation-delay:0.9s;-ms-animation-delay:0.9s;-webkit-animation-delay:0.9s;-moz-animation-delay:0.9s}.fs-ajax-loader .fs-ajax-loader-bar-4{left:57px;animation-delay:1.05s;-o-animation-delay:1.05s;-ms-animation-delay:1.05s;-webkit-animation-delay:1.05s;-moz-animation-delay:1.05s}.fs-ajax-loader .fs-ajax-loader-bar-5{left:76px;animation-delay:1.2s;-o-animation-delay:1.2s;-ms-animation-delay:1.2s;-webkit-animation-delay:1.2s;-moz-animation-delay:1.2s}.fs-ajax-loader .fs-ajax-loader-bar-6{left:95px;animation-delay:1.35s;-o-animation-delay:1.35s;-ms-animation-delay:1.35s;-webkit-animation-delay:1.35s;-moz-animation-delay:1.35s}.fs-ajax-loader .fs-ajax-loader-bar-7{left:114px;animation-delay:1.5s;-o-animation-delay:1.5s;-ms-animation-delay:1.5s;-webkit-animation-delay:1.5s;-moz-animation-delay:1.5s}.fs-ajax-loader .fs-ajax-loader-bar-8{left:133px;animation-delay:1.65s;-o-animation-delay:1.65s;-ms-animation-delay:1.65s;-webkit-animation-delay:1.65s;-moz-animation-delay:1.65s}@-moz-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@-ms-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@-o-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@-webkit-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}.fs-modal-auto-install #request-filesystem-credentials-form h2,.fs-modal-auto-install #request-filesystem-credentials-form .request-filesystem-credentials-action-buttons{display:none}.fs-modal-auto-install #request-filesystem-credentials-form input[type=password],.fs-modal-auto-install #request-filesystem-credentials-form input[type=email],.fs-modal-auto-install #request-filesystem-credentials-form input[type=text]{-webkit-appearance:none;padding:10px 10px 5px 10px;width:300px;max-width:100%}.fs-modal-auto-install #request-filesystem-credentials-form>div,.fs-modal-auto-install #request-filesystem-credentials-form label,.fs-modal-auto-install #request-filesystem-credentials-form fieldset{width:300px;max-width:100%;margin:0 auto;display:block}.button-primary.warn{box-shadow:0 1px 0 #d2593c;text-shadow:0 -1px 1px #d2593c,1px 0 1px #d2593c,0 1px 1px #d2593c,-1px 0 1px #d2593c;background:#f56a48;border-color:#ec6544 #d2593c #d2593c}.button-primary.warn:hover{background:#fd6d4a;border-color:#d2593c}.button-primary.warn:focus{box-shadow:0 1px 0 #dd6041,0 0 2px 1px #e4a796}.button-primary.warn:active{background:#dd6041;border-color:#d2593c;box-shadow:inset 0 2px 0 #d2593c}.button-primary.warn.disabled{color:#f5b3a1 !important;background:#e76444 !important;border-color:#d85e40 !important;text-shadow:0 -1px 0 rgba(0,0,0,.1) !important}/*# sourceMappingURL=dialog-boxes.css.map */
 
1
+ .fs-modal{position:fixed;overflow:auto;height:100%;width:100%;top:0;z-index:100000;display:none;background:rgba(0,0,0,0.6)}.fs-modal .dashicons{vertical-align:middle}.fs-modal .fs-modal-dialog{background:transparent;position:absolute;left:50%;margin-left:-298px;padding-bottom:30px;top:-100%;z-index:100001;width:596px}@media (max-width: 650px){.fs-modal .fs-modal-dialog{margin-left:-50%;box-sizing:border-box;padding-left:10px;padding-right:10px;width:100%}.fs-modal .fs-modal-dialog .fs-modal-panel>h3>strong{font-size:1.3em}}.fs-modal.active{display:block}.fs-modal.active:before{display:block}.fs-modal.active .fs-modal-dialog{top:10%}.fs-modal.fs-success .fs-modal-header{border-bottom-color:#46b450}.fs-modal.fs-success .fs-modal-body{background-color:#f7fff7}.fs-modal.fs-warn .fs-modal-header{border-bottom-color:#ffb900}.fs-modal.fs-warn .fs-modal-body{background-color:#fff8e5}.fs-modal.fs-error .fs-modal-header{border-bottom-color:#dc3232}.fs-modal.fs-error .fs-modal-body{background-color:#ffeaea}.fs-modal .fs-modal-body,.fs-modal .fs-modal-footer{border:0;background:#fefefe;padding:20px}.fs-modal .fs-modal-header{border-bottom:#eeeeee solid 1px;background:#fbfbfb;padding:15px 20px;position:relative;margin-bottom:-10px}.fs-modal .fs-modal-header h4{margin:0;padding:0;text-transform:uppercase;font-size:1.2em;font-weight:bold;color:#cacaca;text-shadow:1px 1px 1px #fff;letter-spacing:0.6px;-webkit-font-smoothing:antialiased}.fs-modal .fs-modal-header .fs-close{position:absolute;right:10px;top:12px;cursor:pointer;color:#bbb;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;padding:3px;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;-ms-transition:all 0.2s ease-in-out;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.fs-modal .fs-modal-header .fs-close:hover{color:#fff;background:#aaa}.fs-modal .fs-modal-header .fs-close .dashicons,.fs-modal .fs-modal-header .fs-close:hover .dashicons{text-decoration:none}.fs-modal .fs-modal-body{border-bottom:0}.fs-modal .fs-modal-body p{font-size:14px}.fs-modal .fs-modal-body h2{font-size:20px;line-height:1.5em}.fs-modal .fs-modal-body>div{margin-top:10px}.fs-modal .fs-modal-body>div h2{font-weight:bold;font-size:20px;margin-top:0}.fs-modal .fs-modal-footer{border-top:#eeeeee solid 1px;text-align:right}.fs-modal .fs-modal-footer>.button{margin:0 7px}.fs-modal .fs-modal-footer>.button:first-child{margin:0}.fs-modal .fs-modal-panel>.notice.inline{margin:0;display:none}.fs-modal .fs-modal-panel:not(.active){display:none}.rtl .fs-modal .fs-modal-header .fs-close{right:auto;left:20px}body.has-fs-modal{overflow:hidden}.fs-modal.fs-modal-deactivation-feedback .reason-input,.fs-modal.fs-modal-deactivation-feedback .internal-message{margin:3px 0 3px 22px}.fs-modal.fs-modal-deactivation-feedback .reason-input input,.fs-modal.fs-modal-deactivation-feedback .reason-input textarea,.fs-modal.fs-modal-deactivation-feedback .internal-message input,.fs-modal.fs-modal-deactivation-feedback .internal-message textarea{width:100%}.fs-modal.fs-modal-deactivation-feedback li.reason.has-internal-message .internal-message{border:1px solid #ccc;padding:7px;display:none}@media (max-width: 650px){.fs-modal.fs-modal-deactivation-feedback li.reason li.reason{margin-bottom:10px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .reason-input,.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .internal-message{margin-left:29px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label{display:table}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label>span{display:table-cell;font-size:1.3em}}.fs-modal.fs-modal-deactivation-feedback .anonymous-feedback-label{float:left}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel{margin-top:0 !important}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel h3{margin-top:0;line-height:1.5em}#the-list .deactivate>.fs-slug{display:none}.fs-modal.fs-modal-subscription-cancellation .fs-price-increase-warning{color:red;font-weight:bold;padding:0 25px;margin-bottom:0}.fs-modal.fs-modal-subscription-cancellation ul.subscription-actions label input{float:left;top:5px;position:relative}.rtl .fs-modal.fs-modal-subscription-cancellation ul.subscription-actions label input{float:right}.fs-modal.fs-modal-subscription-cancellation ul.subscription-actions label span{display:block;margin-left:24px}.rtl .fs-modal.fs-modal-subscription-cancellation ul.subscription-actions label span{margin-left:0;margin-right:24px}.fs-modal.fs-modal-license-activation .fs-modal-body input.fs-license-key{width:100%}.fs-license-options-container table,.fs-license-options-container table select,.fs-license-options-container table .fs-available-license-key{width:100%}.fs-license-options-container table td:first-child{width:1%}.fs-license-options-container table .fs-other-license-key-container label{position:relative;top:6px;float:left;margin-right:5px}.fs-license-options-container table .fs-other-license-key-container div{overflow:hidden;width:auto;height:30px;display:block;top:2px;position:relative}.fs-license-options-container table .fs-other-license-key-container div input{margin:0}.fs-sites-list-container td{cursor:pointer}.fs-modal.fs-modal-user-change .fs-modal-body input#fs_other_email_address{width:100%}.fs-user-change-options-container table{width:100%;border-collapse:collapse}.fs-user-change-options-container table tr{display:block;margin-bottom:2px}.fs-user-change-options-container table .fs-email-address-container td{display:inline-block}.fs-user-change-options-container table .fs-email-address-container input[type="radio"]{margin-bottom:0;margin-top:0}.fs-user-change-options-container table .fs-other-email-address-container{width:100%}.fs-user-change-options-container table .fs-other-email-address-container>div{display:table;width:100%}.fs-user-change-options-container table .fs-other-email-address-container>div label,.fs-user-change-options-container table .fs-other-email-address-container>div>div{display:table-cell}.fs-user-change-options-container table .fs-other-email-address-container>div label{width:1%;padding-left:3px;padding-right:3px}.fs-user-change-options-container table .fs-other-email-address-container>div>div{width:auto}.fs-user-change-options-container table .fs-other-email-address-container>div>div input{width:100%}.fs-modal.fs-modal-developer-license-debug-mode .fs-modal-body input.fs-license-or-user-key{width:100%}.fs-multisite-options-container{margin-top:10px;border:1px solid #ccc;padding:5px}.fs-multisite-options-container a{text-decoration:none}.fs-multisite-options-container a:focus{box-shadow:none}.fs-multisite-options-container a.selected{font-weight:bold}.fs-multisite-options-container.fs-apply-on-all-sites{border:0 none;padding:0}.fs-multisite-options-container.fs-apply-on-all-sites .fs-all-sites-options{border-spacing:0}.fs-multisite-options-container.fs-apply-on-all-sites .fs-all-sites-options td:not(:first-child){display:none}.fs-multisite-options-container .fs-sites-list-container{display:none;overflow:auto}.fs-multisite-options-container .fs-sites-list-container table td{border-top:1px solid #ccc;padding:4px 2px}.fs-modal.fs-modal-license-key-resend .email-address-container{overflow:hidden;padding-right:2px}.fs-modal.fs-modal-license-key-resend.fs-freemium input.email-address{width:300px}.fs-modal.fs-modal-license-key-resend.fs-freemium label{display:block;margin-bottom:10px}.fs-modal.fs-modal-license-key-resend.fs-premium input.email-address{width:100%}.fs-modal.fs-modal-license-key-resend.fs-premium .button-container{float:right;margin-left:7px}@media (max-width: 650px){.fs-modal.fs-modal-license-key-resend.fs-premium .button-container{margin-top:2px}}
2
+ .rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .input-container>.email-address-container{padding-left:2px;padding-right:0}.rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .button-container{float:left;margin-right:7px;margin-left:0}a.show-license-resend-modal{margin-top:4px;display:inline-block}.fs-ajax-loader{position:relative;width:170px;height:20px;margin:auto}.fs-ajax-loader .fs-ajax-loader-bar{position:absolute;top:0;background-color:#0074a3;width:20px;height:20px;-webkit-animation-name:bounce_ajaxLoader;-moz-animation-name:bounce_ajaxLoader;-ms-animation-name:bounce_ajaxLoader;-o-animation-name:bounce_ajaxLoader;animation-name:bounce_ajaxLoader;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s;animation-duration:1.5s;animation-iteration-count:infinite;-o-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-webkit-animation-direction:normal;-moz-animation-direction:normal;-ms-animation-direction:normal;-o-animation-direction:normal;animation-direction:normal;-moz-transform:0.3;-o-transform:0.3;-ms-transform:0.3;-webkit-transform:0.3;transform:0.3}.fs-ajax-loader .fs-ajax-loader-bar-1{left:0px;animation-delay:0.6s;-o-animation-delay:0.6s;-ms-animation-delay:0.6s;-webkit-animation-delay:0.6s;-moz-animation-delay:0.6s}.fs-ajax-loader .fs-ajax-loader-bar-2{left:19px;animation-delay:0.75s;-o-animation-delay:0.75s;-ms-animation-delay:0.75s;-webkit-animation-delay:0.75s;-moz-animation-delay:0.75s}.fs-ajax-loader .fs-ajax-loader-bar-3{left:38px;animation-delay:0.9s;-o-animation-delay:0.9s;-ms-animation-delay:0.9s;-webkit-animation-delay:0.9s;-moz-animation-delay:0.9s}.fs-ajax-loader .fs-ajax-loader-bar-4{left:57px;animation-delay:1.05s;-o-animation-delay:1.05s;-ms-animation-delay:1.05s;-webkit-animation-delay:1.05s;-moz-animation-delay:1.05s}.fs-ajax-loader .fs-ajax-loader-bar-5{left:76px;animation-delay:1.2s;-o-animation-delay:1.2s;-ms-animation-delay:1.2s;-webkit-animation-delay:1.2s;-moz-animation-delay:1.2s}.fs-ajax-loader .fs-ajax-loader-bar-6{left:95px;animation-delay:1.35s;-o-animation-delay:1.35s;-ms-animation-delay:1.35s;-webkit-animation-delay:1.35s;-moz-animation-delay:1.35s}.fs-ajax-loader .fs-ajax-loader-bar-7{left:114px;animation-delay:1.5s;-o-animation-delay:1.5s;-ms-animation-delay:1.5s;-webkit-animation-delay:1.5s;-moz-animation-delay:1.5s}.fs-ajax-loader .fs-ajax-loader-bar-8{left:133px;animation-delay:1.65s;-o-animation-delay:1.65s;-ms-animation-delay:1.65s;-webkit-animation-delay:1.65s;-moz-animation-delay:1.65s}@-moz-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@-ms-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@-o-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@-webkit-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}.fs-modal-auto-install #request-filesystem-credentials-form h2,.fs-modal-auto-install #request-filesystem-credentials-form .request-filesystem-credentials-action-buttons{display:none}.fs-modal-auto-install #request-filesystem-credentials-form input[type=password],.fs-modal-auto-install #request-filesystem-credentials-form input[type=email],.fs-modal-auto-install #request-filesystem-credentials-form input[type=text]{-webkit-appearance:none;padding:10px 10px 5px 10px;width:300px;max-width:100%}.fs-modal-auto-install #request-filesystem-credentials-form>div,.fs-modal-auto-install #request-filesystem-credentials-form label,.fs-modal-auto-install #request-filesystem-credentials-form fieldset{width:300px;max-width:100%;margin:0 auto;display:block}.button-primary.warn{box-shadow:0 1px 0 #d2593c;text-shadow:0 -1px 1px #d2593c,1px 0 1px #d2593c,0 1px 1px #d2593c,-1px 0 1px #d2593c;background:#f56a48;border-color:#ec6544 #d2593c #d2593c}.button-primary.warn:hover{background:#fd6d4a;border-color:#d2593c}.button-primary.warn:focus{box-shadow:0 1px 0 #dd6041,0 0 2px 1px #e4a796}.button-primary.warn:active{background:#dd6041;border-color:#d2593c;box-shadow:inset 0 2px 0 #d2593c}.button-primary.warn.disabled{color:#f5b3a1 !important;background:#e76444 !important;border-color:#d85e40 !important;text-shadow:0 -1px 0 rgba(0,0,0,0.1) !important}
freemius/assets/css/admin/gdpr-optin-notice.css CHANGED
@@ -1 +1 @@
1
- .fs-notice[data-id^=gdpr_optin_actions] .underlined{text-decoration:underline}.fs-notice[data-id^=gdpr_optin_actions] ul .button,.fs-notice[data-id^=gdpr_optin_actions] ul .action-description{vertical-align:middle}.fs-notice[data-id^=gdpr_optin_actions] ul .action-description{display:inline-block;margin-left:3px}/*# sourceMappingURL=gdpr-optin-notice.css.map */
1
+ .fs-notice[data-id^="gdpr_optin_actions"] .underlined{text-decoration:underline}.fs-notice[data-id^="gdpr_optin_actions"] ul .button,.fs-notice[data-id^="gdpr_optin_actions"] ul .action-description{vertical-align:middle}.fs-notice[data-id^="gdpr_optin_actions"] ul .action-description{display:inline-block;margin-left:3px}
freemius/assets/css/admin/plugins.css CHANGED
@@ -1 +1 @@
1
- label.fs-tag,span.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn,span.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-info,span.fs-tag.fs-info{background:#00a0d2}label.fs-tag.fs-success,span.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error,span.fs-tag.fs-error{background:#dc3232}.wp-list-table.plugins .plugin-title span.fs-tag{display:inline-block;margin-left:5px;line-height:10px}/*# sourceMappingURL=plugins.css.map */
1
+ label.fs-tag,span.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn,span.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-info,span.fs-tag.fs-info{background:#00a0d2}label.fs-tag.fs-success,span.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error,span.fs-tag.fs-error{background:#dc3232}.wp-list-table.plugins .plugin-title span.fs-tag{display:inline-block;margin-left:5px;line-height:10px}
freemius/assets/css/customizer.css CHANGED
@@ -1 +1 @@
1
- #fs_customizer_upsell .fs-customizer-plan{padding:10px 20px 20px 20px;border-radius:3px;background:#fff}#fs_customizer_upsell .fs-customizer-plan h2{position:relative;margin:0;line-height:2em;text-transform:uppercase}#fs_customizer_upsell .fs-customizer-plan h2 .button-link{top:-2px}#fs_customizer_upsell .fs-feature{position:relative}#fs_customizer_upsell .dashicons-yes{color:#0085ba;font-size:2em;vertical-align:bottom;margin-left:-7px;margin-right:10px}.rtl #fs_customizer_upsell .dashicons-yes{margin-left:10px;margin-right:-7px}#fs_customizer_upsell .dashicons-editor-help{color:#bbb;cursor:help}#fs_customizer_upsell .dashicons-editor-help .fs-feature-desc{opacity:0;visibility:hidden;-moz-transition:opacity .3s ease-in-out;-o-transition:opacity .3s ease-in-out;-ms-transition:opacity .3s ease-in-out;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;position:absolute;background:#000;color:#fff;font-family:"arial",serif;font-size:12px;padding:10px;z-index:999999;bottom:100%;margin-bottom:5px;left:0;right:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.2);box-shadow:1px 1px 1px rgba(0,0,0,.2);line-height:1.3em;font-weight:bold;text-align:left}.rtl #fs_customizer_upsell .dashicons-editor-help .fs-feature-desc{text-align:right}#fs_customizer_upsell .dashicons-editor-help .fs-feature-desc::after{content:" ";display:block;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:#000 transparent transparent transparent;position:absolute;top:100%;left:21px}.rtl #fs_customizer_upsell .dashicons-editor-help .fs-feature-desc::after{right:21px;left:auto}#fs_customizer_upsell .dashicons-editor-help:hover .fs-feature-desc{visibility:visible;opacity:1}#fs_customizer_upsell .button-primary{display:block;text-align:center;margin-top:10px}#fs_customizer_support{display:block !important}#fs_customizer_support .button{float:right}#fs_customizer_support .button-group{width:100%;display:block;margin-top:10px}#fs_customizer_support .button-group .button{float:none;width:50%;text-align:center}#customize-theme-controls #accordion-section-freemius_upsell{border-top:1px solid #0085ba !important;border-bottom:1px solid #0085ba !important}#customize-theme-controls #accordion-section-freemius_upsell h3.accordion-section-title{color:#fff;background-color:#0085ba;border-left:4px solid #0085ba;transition:.15s background-color ease-in-out,.15s border-color ease-in-out;outline:none;border-bottom:none !important}#customize-theme-controls #accordion-section-freemius_upsell h3.accordion-section-title:hover{background-color:#008ec2;border-left-color:#0073aa}#customize-theme-controls #accordion-section-freemius_upsell h3.accordion-section-title:after{color:#fff}#customize-theme-controls #accordion-section-freemius_upsell .rtl h3.accordion-section-title{border-left:none;border-right:4px solid #0085ba}#customize-theme-controls #accordion-section-freemius_upsell .rtl h3.accordion-section-title:hover{border-right-color:#0073aa}/*# sourceMappingURL=customizer.css.map */
1
+ #fs_customizer_upsell .fs-customizer-plan{padding:10px 20px 20px 20px;border-radius:3px;background:#fff}#fs_customizer_upsell .fs-customizer-plan h2{position:relative;margin:0;line-height:2em;text-transform:uppercase}#fs_customizer_upsell .fs-customizer-plan h2 .button-link{top:-2px}#fs_customizer_upsell .fs-feature{position:relative}#fs_customizer_upsell .dashicons-yes{color:#0085ba;font-size:2em;vertical-align:bottom;margin-left:-7px;margin-right:10px}.rtl #fs_customizer_upsell .dashicons-yes{margin-left:10px;margin-right:-7px}#fs_customizer_upsell .dashicons-editor-help{color:#bbb;cursor:help}#fs_customizer_upsell .dashicons-editor-help .fs-feature-desc{opacity:0;visibility:hidden;-moz-transition:opacity 0.3s ease-in-out;-o-transition:opacity 0.3s ease-in-out;-ms-transition:opacity 0.3s ease-in-out;-webkit-transition:opacity 0.3s ease-in-out;transition:opacity 0.3s ease-in-out;position:absolute;background:#000;color:#fff;font-family:'arial', serif;font-size:12px;padding:10px;z-index:999999;bottom:100%;margin-bottom:5px;left:0;right:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.2);box-shadow:1px 1px 1px rgba(0,0,0,0.2);line-height:1.3em;font-weight:bold;text-align:left}.rtl #fs_customizer_upsell .dashicons-editor-help .fs-feature-desc{text-align:right}#fs_customizer_upsell .dashicons-editor-help .fs-feature-desc::after{content:' ';display:block;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:#000 transparent transparent transparent;position:absolute;top:100%;left:21px}.rtl #fs_customizer_upsell .dashicons-editor-help .fs-feature-desc::after{right:21px;left:auto}#fs_customizer_upsell .dashicons-editor-help:hover .fs-feature-desc{visibility:visible;opacity:1}#fs_customizer_upsell .button-primary{display:block;text-align:center;margin-top:10px}#fs_customizer_support{display:block !important}#fs_customizer_support .button{float:right}#fs_customizer_support .button-group{width:100%;display:block;margin-top:10px}#fs_customizer_support .button-group .button{float:none;width:50%;text-align:center}#customize-theme-controls #accordion-section-freemius_upsell{border-top:1px solid #0085ba !important;border-bottom:1px solid #0085ba !important}#customize-theme-controls #accordion-section-freemius_upsell h3.accordion-section-title{color:#fff;background-color:#0085ba;border-left:4px solid #0085ba;transition:.15s background-color ease-in-out, .15s border-color ease-in-out;outline:none;border-bottom:none !important}#customize-theme-controls #accordion-section-freemius_upsell h3.accordion-section-title:hover{background-color:#008ec2;border-left-color:#0073aa}#customize-theme-controls #accordion-section-freemius_upsell h3.accordion-section-title:after{color:#fff}#customize-theme-controls #accordion-section-freemius_upsell .rtl h3.accordion-section-title{border-left:none;border-right:4px solid #0085ba}#customize-theme-controls #accordion-section-freemius_upsell .rtl h3.accordion-section-title:hover{border-right-color:#0073aa}
freemius/assets/img/user-menus.png DELETED
Binary file
freemius/config.php CHANGED
@@ -354,7 +354,7 @@
354
  is_multisite() &&
355
  ( is_network_admin() ||
356
  ( ( defined( 'DOING_AJAX' ) && DOING_AJAX &&
357
- ( isset( $_REQUEST['_fs_network_admin'] ) && 'true' === $_REQUEST['_fs_network_admin'] /*||
358
  ( ! empty( $_REQUEST['action'] ) && 'delete-plugin' === $_REQUEST['action'] )*/ )
359
  ) ||
360
  // Plugin uninstall.
@@ -385,7 +385,7 @@
385
 
386
  if ( ! defined( 'WP_FS__DEMO_MODE' ) ) {
387
  define( 'WP_FS__DEMO_MODE', false );
388
- }
389
- if ( ! defined( 'FS_SDK__SSLVERIFY' ) ) {
390
- define( 'FS_SDK__SSLVERIFY', false );
391
- }
354
  is_multisite() &&
355
  ( is_network_admin() ||
356
  ( ( defined( 'DOING_AJAX' ) && DOING_AJAX &&
357
+ ( isset( $_REQUEST['_fs_network_admin'] ) /*||
358
  ( ! empty( $_REQUEST['action'] ) && 'delete-plugin' === $_REQUEST['action'] )*/ )
359
  ) ||
360
  // Plugin uninstall.
385
 
386
  if ( ! defined( 'WP_FS__DEMO_MODE' ) ) {
387
  define( 'WP_FS__DEMO_MODE', false );
388
+ }
389
+ if ( ! defined( 'FS_SDK__SSLVERIFY' ) ) {
390
+ define( 'FS_SDK__SSLVERIFY', false );
391
+ }
freemius/includes/class-freemius.php CHANGED
@@ -408,10 +408,8 @@
408
  * @param bool $is_init Since 1.2.1 Is initiation sequence.
409
  */
410
  private function __construct( $module_id, $slug = false, $is_init = false ) {
411
- $main_file = false;
412
-
413
  if ( $is_init && is_numeric( $module_id ) && is_string( $slug ) ) {
414
- $main_file = $this->store_id_slug_type_path_map( $module_id, $slug );
415
  }
416
 
417
  $this->_module_id = $module_id;
@@ -426,7 +424,7 @@
426
 
427
  $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $this->get_unique_affix(), WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK );
428
 
429
- $this->_plugin_main_file_path = $this->_find_caller_plugin_file( $is_init, $main_file );
430
  $this->_plugin_dir_path = plugin_dir_path( $this->_plugin_main_file_path );
431
  $this->_plugin_basename = $this->get_plugin_basename();
432
  $this->_free_plugin_basename = str_replace( '-premium/', '/', $this->_plugin_basename );
@@ -521,10 +519,7 @@
521
  * @author Leo Fajardo (@leorw)
522
  * @since 1.2.2
523
  */
524
- ( is_object( $this->_plugin ) && isset( $this->_plugin->title ) ?
525
- $this->_plugin->title :
526
- $this->get_plugin_name()
527
- ),
528
  $this->get_unique_affix()
529
  );
530
 
@@ -1646,10 +1641,8 @@
1646
  }
1647
 
1648
  if ( $this->is_plugin() ) {
1649
- if ( version_compare( $GLOBALS['wp_version'], '5.1', '<' ) ) {
1650
  add_action( 'wpmu_new_blog', array( $this, '_after_new_blog_callback' ), 10, 6 );
1651
- } else {
1652
- add_action( 'wp_initialize_site', array( $this, '_after_wp_initialize_site_callback' ), 11, 2 );
1653
  }
1654
 
1655
  register_deactivation_hook( $this->_plugin_main_file_path, array( &$this, '_deactivate_plugin_hook' ) );
@@ -1659,12 +1652,7 @@
1659
  add_action( 'deactivate_blog', array( &$this, '_after_site_deactivated_callback' ) );
1660
  add_action( 'archive_blog', array( &$this, '_after_site_deactivated_callback' ) );
1661
  add_action( 'make_spam_blog', array( &$this, '_after_site_deactivated_callback' ) );
1662
-
1663
- if ( version_compare( $GLOBALS['wp_version'], '5.1', '<' ) ) {
1664
- add_action( 'deleted_blog', array( $this, '_after_site_deleted_callback' ), 10, 2 );
1665
- } else {
1666
- add_action( 'wp_delete_site', array( $this, '_after_wpsite_deleted_callback' ) );
1667
- }
1668
 
1669
  add_action( 'activate_blog', array( &$this, '_after_site_reactivated_callback' ) );
1670
  add_action( 'unarchive_blog', array( &$this, '_after_site_reactivated_callback' ) );
@@ -1689,7 +1677,6 @@
1689
  add_action( 'admin_init', array( &$this, '_add_premium_version_upgrade_selection' ) );
1690
  add_action( 'admin_init', array( &$this, '_add_beta_mode_update_handler' ) );
1691
  add_action( 'admin_init', array( &$this, '_add_user_change_option' ) );
1692
- add_action( 'admin_init', array( &$this, '_add_email_address_update_option' ) );
1693
 
1694
  $this->add_ajax_action( 'update_billing', array( &$this, '_update_billing_ajax_action' ) );
1695
  $this->add_ajax_action( 'start_trial', array( &$this, '_start_trial_ajax_action' ) );
@@ -2107,27 +2094,20 @@
2107
  /**
2108
  * Leverage backtrace to find caller plugin file path.
2109
  *
2110
- * @param bool $is_init Is initiation sequence.
2111
- * @param string $main_file Since 2.5.0 expects the module's main file path to potentially purge the cached path.
2112
- *
2113
- * @return string
2114
  * @since 1.0.6
2115
  *
2116
- * @author Vova Feldman (@svovaf)
 
 
2117
  */
2118
- private function _find_caller_plugin_file( $is_init = false, $main_file = '' ) {
2119
  // Try to load the cached value of the file path.
2120
  if ( isset( $this->_storage->plugin_main_file ) ) {
2121
  $plugin_main_file = $this->_storage->plugin_main_file;
2122
  if ( ! empty( $plugin_main_file->path ) ) {
2123
  $absolute_path = $this->get_absolute_path( $plugin_main_file->path );
2124
  if ( file_exists( $absolute_path ) ) {
2125
- if ( $is_init && $absolute_path !== $this->get_absolute_path( $main_file ) ) {
2126
- // Update cached path if not matching the actual path.
2127
- $plugin_main_file->path = $main_file;
2128
- $this->_storage->plugin_main_file = $plugin_main_file;
2129
- }
2130
-
2131
  return $absolute_path;
2132
  }
2133
  }
@@ -2168,11 +2148,12 @@
2168
  * Only the original instantiator that calls dynamic_init can modify the module's path.
2169
  */
2170
  // Find caller module.
 
2171
  $this->_storage->plugin_main_file = (object) array(
2172
- 'path' => $main_file,
2173
  );
2174
 
2175
- return $this->get_absolute_path( $main_file );
2176
  }
2177
 
2178
  /**
@@ -2234,8 +2215,6 @@
2234
  * @param number $module_id
2235
  * @param string $slug
2236
  *
2237
- * @return string Since 2.5.0 return the module's main file path.
2238
- *
2239
  * @since 1.2.2
2240
  */
2241
  private function store_id_slug_type_path_map( $module_id, $slug ) {
@@ -2257,52 +2236,20 @@
2257
  $store_option = true;
2258
  }
2259
 
2260
- $find_caller = empty( $id_slug_type_path_map[ $module_id ]['path'] );
2261
-
2262
- if ( ! $find_caller ) {
2263
- /**
2264
- * This verification is for cases when suddenly the same module
2265
- * is installed but with a different folder name.
2266
- *
2267
- * @author Vova Feldman (@svovaf)
2268
- * @since 1.2.3
2269
- */
2270
- $find_caller = ! file_exists( $this->get_absolute_path(
2271
- $id_slug_type_path_map[ $module_id ]['path'],
2272
- $id_slug_type_path_map[ $module_id ]['type']
2273
- ) );
2274
- }
2275
-
2276
- foreach ( $id_slug_type_path_map as $id => $data ) {
2277
- if ( empty( $id ) ) {
2278
- // Remove maps with empty module ID.
2279
- unset( $id_slug_type_path_map[ $id ] );
2280
- $store_option = true;
2281
- continue;
2282
- }
2283
-
2284
- /**
2285
- * If the module's main file path is identical to the main file path of another module then it means that the cached path of the current module or the other one with the same path is wrong, and therefore, we need to recalculate those paths.
2286
- *
2287
- * @author Vova Feldman (@svovaf)
2288
- * @since 2.5.0
2289
- */
2290
- if ( ! $find_caller ) {
2291
- if ( $id == $module_id ) {
2292
- continue;
2293
- }
2294
-
2295
- if (
2296
- isset( $data['path'] ) &&
2297
- $data['path'] === $id_slug_type_path_map[ $module_id ]['path']
2298
- ) {
2299
- $find_caller = true;
2300
- }
2301
- }
2302
- }
2303
-
2304
- if ( $find_caller ) {
2305
- $caller_main_file_and_type = $this->get_caller_main_file_and_type( $module_id );
2306
 
2307
  $id_slug_type_path_map[ $module_id ]['type'] = $caller_main_file_and_type->module_type;
2308
  $id_slug_type_path_map[ $module_id ]['path'] = $caller_main_file_and_type->path;
@@ -2313,8 +2260,6 @@
2313
  if ( $store_option ) {
2314
  self::$_accounts->set_option( 'id_slug_type_path_map', $id_slug_type_path_map, true );
2315
  }
2316
-
2317
- return $id_slug_type_path_map[ $module_id ]['path'];
2318
  }
2319
 
2320
  /**
@@ -2328,10 +2273,8 @@
2328
  * add-ons are relying on loading the SDK from the parent module, and also allows themes including the
2329
  * SDK an internal file instead of directly from functions.php.
2330
  * @since 1.2.1.7 Knows how to handle cases when an add-on includes the parent module logic.
2331
- *
2332
- * @param number $module_id @since 2.5.0
2333
  */
2334
- private function get_caller_main_file_and_type( $module_id ) {
2335
  self::require_plugin_essentials();
2336
 
2337
  $all_plugins = fs_get_plugins( true );
@@ -2470,12 +2413,10 @@
2470
  }
2471
  }
2472
 
2473
- $caller_main_file_and_type = (object) array(
2474
  'module_type' => $module_type,
2475
  'path' => $caller_file_candidate
2476
  );
2477
-
2478
- return apply_filters( "fs_{$module_id}_caller_main_file_and_type", $caller_main_file_and_type );
2479
  }
2480
 
2481
  #----------------------------------------------------------------------------------
@@ -2492,13 +2433,6 @@
2492
  * @since 1.1.2
2493
  */
2494
  function _add_deactivation_feedback_dialog_box() {
2495
- if (
2496
- $this->is_clone() ||
2497
- ( is_object( $this->_site ) && ! $this->is_registered() )
2498
- ) {
2499
- return;
2500
- }
2501
-
2502
  $subscription_cancellation_dialog_box_template_params = $this->apply_filters( 'show_deactivation_subscription_cancellation', true ) ?
2503
  $this->_get_subscription_cancellation_dialog_box_template_params() :
2504
  array();
@@ -2506,7 +2440,7 @@
2506
  /**
2507
  * @since 2.3.0 Developers can optionally hide the deactivation feedback form using the 'show_deactivation_feedback_form' filter.
2508
  */
2509
- $show_deactivation_feedback_form = ! self::is_deactivation_snoozed();
2510
  if ( $this->has_filter( 'show_deactivation_feedback_form' ) ) {
2511
  $show_deactivation_feedback_form = $this->apply_filters( 'show_deactivation_feedback_form', true );
2512
  } else if ( $this->is_addon() ) {
@@ -2611,7 +2545,7 @@
2611
  $reason_temporary_deactivation = array(
2612
  'id' => self::REASON_TEMPORARY_DEACTIVATION,
2613
  'text' => sprintf(
2614
- $this->get_text_inline( "It's a temporary %s - I'm troubleshooting an issue", 'reason-temporary-x' ),
2615
  strtolower( $this->is_plugin() ?
2616
  $this->get_text_inline( 'Deactivation', 'deactivation' ) :
2617
  $this->get_text_inline( 'Theme Switch', 'theme-switch' )
@@ -2776,14 +2710,6 @@
2776
 
2777
  $this->_storage->store( 'uninstall_reason', $reason );
2778
 
2779
- if ( self::REASON_TEMPORARY_DEACTIVATION == $reason->id ) {
2780
- $snooze_period = fs_request_get( 'snooze_period' );
2781
-
2782
- if ( is_numeric( $snooze_period ) && 0 < $snooze_period ) {
2783
- self::snooze_deactivation_form( (int) $snooze_period );
2784
- }
2785
- }
2786
-
2787
  /**
2788
  * If the module type is "theme", trigger the uninstall event here (on theme deactivation) since themes do
2789
  * not support uninstall hook.
@@ -2805,73 +2731,6 @@
2805
  exit;
2806
  }
2807
 
2808
- #--------------------------------------------------------------------------------
2809
- #region Deactivation Feedback Snoozing
2810
- #--------------------------------------------------------------------------------
2811
-
2812
- /**
2813
- * @author Vova Feldman (@svovaf)
2814
- * @since 2.4.3
2815
- *
2816
- * @param int $period
2817
- *
2818
- * @return bool True if the value was set, false otherwise.
2819
- */
2820
- private static function snooze_deactivation_form( $period ) {
2821
- return ( 0 < $period && self::reset_deactivation_snoozing( $period ) );
2822
- }
2823
-
2824
- /**
2825
- * Check if deactivation feedback form is snoozed.
2826
- *
2827
- * @author Vova Feldman (@svovaf)
2828
- * @since 2.4.3
2829
- *
2830
- * @return bool
2831
- */
2832
- static function is_deactivation_snoozed() {
2833
- $is_snoozed = ( ! is_multisite() || fs_is_network_admin() ) ?
2834
- get_transient( 'fs_snooze_period' ) :
2835
- get_site_transient( 'fs_snooze_period' );
2836
-
2837
-
2838
- return ( 'true' === $is_snoozed );
2839
- }
2840
-
2841
- /**
2842
- * Reset deactivation snoozing. When `$period` is `0` will stop deactivation snoozing by deleting the transients. Otherwise, will set the transients for the selected period.
2843
- *
2844
- * @param int $period Period in seconds.
2845
- *
2846
- * @author Vova Feldman (@svovaf)
2847
- * @since 2.4.3
2848
- */
2849
- private static function reset_deactivation_snoozing( $period = 0 ) {
2850
- $value = ( 0 === $period ) ? null : 'true';
2851
-
2852
- if ( ! is_multisite() || fs_is_network_admin() ) {
2853
- return set_transient( 'fs_snooze_period', $value, $period );
2854
- } else {
2855
- return set_site_transient( 'fs_snooze_period', $value, $period );
2856
- }
2857
- }
2858
-
2859
- /**
2860
- * The deactivation snooze expiration UNIX timestamp (in sec).
2861
- *
2862
- * @author Vova Feldman (@svovaf)
2863
- * @since 2.4.3
2864
- *
2865
- * @return int
2866
- */
2867
- static function deactivation_snooze_expires_at() {
2868
- return ( ! is_multisite() || fs_is_network_admin() ) ?
2869
- (int) get_option( '_transient_timeout_fs_snooze_period' ) :
2870
- (int) get_site_option( '_site_transient_timeout_fs_snooze_period' );
2871
- }
2872
-
2873
- #endregion
2874
-
2875
  /**
2876
  * @author Leo Fajardo (@leorw)
2877
  * @since 2.1.4
@@ -3068,13 +2927,6 @@
3068
  return self::instance( $addon_id );
3069
  }
3070
 
3071
- /**
3072
- * @return Freemius[]
3073
- */
3074
- static function _get_all_instances() {
3075
- return self::$_instances;
3076
- }
3077
-
3078
  #endregion ------------------------------------------------------------------
3079
 
3080
  /**
@@ -3585,9 +3437,6 @@
3585
  add_action( 'plugins_loaded', array( 'Freemius', '_load_textdomain' ), 1 );
3586
  }
3587
 
3588
- $clone_manager = FS_Clone_Manager::instance();
3589
- add_action( 'init', array( $clone_manager, '_init' ) );
3590
-
3591
  add_action( 'admin_footer', array( 'Freemius', '_enrich_ajax_url' ) );
3592
  add_action( 'admin_footer', array( 'Freemius', '_open_support_forum_in_new_page' ) );
3593
 
@@ -3607,86 +3456,6 @@
3607
  self::$_statics_loaded = true;
3608
  }
3609
 
3610
- #--------------------------------------------------------------------------------
3611
- #region Clone
3612
- #--------------------------------------------------------------------------------
3613
-
3614
- /**
3615
- * @author Leo Fajardo (@leorw)
3616
- * @since 2.5.0
3617
- *
3618
- * @return bool
3619
- */
3620
- private function is_unresolved_clone() {
3621
- if ( ! $this->is_clone() ) {
3622
- return false;
3623
- }
3624
-
3625
- return FS_Clone_Manager::instance()->has_temporary_duplicate_mode_expired();
3626
- }
3627
-
3628
- /**
3629
- * @author Leo Fajardo (@leorw)
3630
- * @since 2.5.0
3631
- */
3632
- function is_clone() {
3633
- if ( ! is_object( $this->_site ) ) {
3634
- return false;
3635
- }
3636
-
3637
- return (
3638
- fs_strip_url_protocol( trailingslashit( $this->_site->url ) ) !== fs_strip_url_protocol( trailingslashit( get_site_url() ) )
3639
- );
3640
- }
3641
-
3642
- /**
3643
- * @author Leo Fajardo (@leorw)
3644
- * @since 2.5.0
3645
- *
3646
- * @param number $site_id
3647
- */
3648
- function fetch_install_by_id( $site_id ) {
3649
- return $this->get_current_or_network_user_api_scope()->get( "/installs/{$site_id}.json" );
3650
- }
3651
-
3652
- /**
3653
- * @author Leo Fajardo (@leorw)
3654
- * @since 2.5.0
3655
- *
3656
- * @return string|object|bool
3657
- */
3658
- function _handle_long_term_duplicate() {
3659
- $this->_logger->entrance();
3660
-
3661
- $this->delete_current_install( false );
3662
-
3663
- $license_key = false;
3664
-
3665
- if (
3666
- is_object( $this->_license ) &&
3667
- ! $this->_license->is_utilized(
3668
- ( WP_FS__IS_LOCALHOST_FOR_SERVER || FS_Site::is_localhost_by_address( get_site_url() ) )
3669
- )
3670
- ) {
3671
- $license_key = $this->_license->secret_key;
3672
- }
3673
-
3674
- return $this->opt_in(
3675
- false,
3676
- false,
3677
- false,
3678
- $license_key,
3679
- false,
3680
- false,
3681
- false,
3682
- null,
3683
- array(),
3684
- false
3685
- );
3686
- }
3687
-
3688
- #endregion
3689
-
3690
  /**
3691
  * @author Leo Fajardo (@leorw)
3692
  *
@@ -3781,6 +3550,8 @@
3781
  * @since 1.1.7.3
3782
  */
3783
  static function _toggle_debug_mode() {
 
 
3784
  if ( ! is_super_admin() ) {
3785
  return;
3786
  }
@@ -3802,10 +3573,19 @@
3802
  * @since 1.2.1.6
3803
  */
3804
  static function _get_debug_log() {
 
 
 
 
 
 
 
 
 
3805
  $logs = FS_Logger::load_db_logs(
3806
  fs_request_get( 'filters', false, 'post' ),
3807
- ! empty( $_POST['limit'] ) && is_numeric( $_POST['limit'] ) ? intval( $_POST['limit'] ) : 200,
3808
- ! empty( $_POST['offset'] ) && is_numeric( $_POST['offset'] ) ? intval( $_POST['offset'] ) : 0
3809
  );
3810
 
3811
  self::shoot_ajax_success( $logs );
@@ -3912,10 +3692,6 @@
3912
 
3913
  switch_to_blog( $current_blog_id );
3914
  }
3915
- } else if ( fs_request_is_action( 'reset_deactivation_snoozing' ) ) {
3916
- check_admin_referer( 'reset_deactivation_snoozing' );
3917
-
3918
- self::reset_deactivation_snoozing();
3919
  } else if ( fs_request_is_action( 'simulate_trial' ) ) {
3920
  check_admin_referer( 'simulate_trial' );
3921
 
@@ -3964,65 +3740,55 @@
3964
  }
3965
 
3966
  /**
3967
- * @author Leo Fajardo (@leorw)
3968
- * @since 2.5.0
3969
- *
3970
- * @return array
3971
  */
3972
- static function get_all_modules_sites() {
3973
  self::$_static_logger->entrance();
3974
 
3975
- $sites_by_type = array(
3976
- WP_FS__MODULE_TYPE_PLUGIN => array(),
3977
- WP_FS__MODULE_TYPE_THEME => array(),
3978
- );
3979
-
3980
- $module_types = array_keys( $sites_by_type );
3981
-
3982
  if ( ! is_multisite() ) {
3983
- foreach ( $module_types as $type ) {
3984
- $sites_by_type[ $type ] = self::get_all_sites( $type );
3985
- }
3986
  } else {
3987
  $sites = self::get_sites();
3988
 
 
 
 
3989
  foreach ( $sites as $site ) {
3990
  $blog_id = self::get_site_blog_id( $site );
3991
 
3992
- foreach ( $module_types as $type ) {
3993
- $installs = self::get_all_sites( $type, $blog_id );
3994
 
3995
- foreach ( $installs as $slug => $install ) {
3996
- if ( ! isset( $sites_by_type[ $type ][ $slug ] ) ) {
3997
- $sites_by_type[ $type ][ $slug ] = array();
3998
- }
3999
 
4000
- $install->blog_id = $blog_id;
4001
 
4002
- $sites_by_type[ $type ][ $slug ][] = $install;
 
 
 
 
 
 
 
4003
  }
4004
 
 
 
 
4005
  }
4006
  }
4007
  }
4008
 
4009
- return $sites_by_type;
4010
- }
4011
-
4012
- /**
4013
- * @author Vova Feldman (@svovaf)
4014
- * @since 1.0.8
4015
- */
4016
- static function _debug_page_render() {
4017
- self::$_static_logger->entrance();
4018
-
4019
- $all_modules_sites = self::get_all_modules_sites();
4020
-
4021
  $licenses_by_module_type = self::get_all_licenses_by_module_type();
4022
 
4023
  $vars = array(
4024
- 'plugin_sites' => $all_modules_sites[ WP_FS__MODULE_TYPE_PLUGIN ],
4025
- 'theme_sites' => $all_modules_sites[ WP_FS__MODULE_TYPE_THEME ],
4026
  'users' => self::get_all_users(),
4027
  'addons' => self::get_all_addons(),
4028
  'account_addons' => self::get_all_account_addons(),
@@ -4054,10 +3820,6 @@
4054
  function is_on() {
4055
  self::$_static_logger->entrance();
4056
 
4057
- if ( is_object( $this->_site ) && ! $this->is_registered() ) {
4058
- return false;
4059
- }
4060
-
4061
  if ( isset( $this->_is_on ) ) {
4062
  return $this->_is_on;
4063
  }
@@ -4146,24 +3908,18 @@
4146
 
4147
  $is_update = $this->apply_filters( 'is_plugin_update', $this->is_plugin_update() );
4148
 
4149
- $params = array(
4150
- 'is_update' => json_encode( $is_update ),
4151
- 'version' => $version,
4152
- 'sdk' => $this->version,
4153
- 'is_admin' => json_encode( is_admin() ),
4154
- 'is_ajax' => json_encode( self::is_ajax() ),
4155
- 'is_cron' => json_encode( self::is_cron() ),
4156
- 'is_gdpr_test' => $is_gdpr_test,
4157
- 'is_http' => json_encode( WP_FS__IS_HTTP_REQUEST ),
4158
- );
4159
-
4160
- if ( is_multisite() && function_exists( 'get_network' ) ) {
4161
- $params['network_uid'] = $this->get_anonymous_network_id();
4162
- }
4163
-
4164
  return $this->get_api_plugin_scope()->ping(
4165
  $this->get_anonymous_id( $blog_id ),
4166
- $params
 
 
 
 
 
 
 
 
 
4167
  );
4168
  }
4169
 
@@ -4329,17 +4085,6 @@
4329
  return $unique_id;
4330
  }
4331
 
4332
- /**
4333
- * Returns anonymous network ID.
4334
- *
4335
- * @since 2.4.3
4336
- *
4337
- * @return string
4338
- */
4339
- function get_anonymous_network_id() {
4340
- return $this->get_anonymous_id( get_network()->site_id );
4341
- }
4342
-
4343
  /**
4344
  * @author Vova Feldman (@svovaf)
4345
  * @since 1.1.7.4
@@ -4713,6 +4458,12 @@
4713
  * @since 1.0.9
4714
  */
4715
  function _email_about_firewall_issue() {
 
 
 
 
 
 
4716
  $this->_admin_notices->remove_sticky( 'failed_connect_api' );
4717
 
4718
  $pong = $this->ping();
@@ -4787,6 +4538,12 @@
4787
  * @since 1.1.7.4
4788
  */
4789
  function _retry_connectivity_test() {
 
 
 
 
 
 
4790
  $this->_admin_notices->remove_sticky( 'failed_connect_api_first' );
4791
 
4792
  $pong = $this->ping();
@@ -5150,8 +4907,10 @@
5150
  * @since 1.1.7.3
5151
  *
5152
  */
5153
- if ( $this->is_registered() && $this->is_tracking_allowed() ) {
5154
- $this->maybe_schedule_sync_cron();
 
 
5155
  }
5156
 
5157
  /**
@@ -5164,8 +4923,6 @@
5164
  }
5165
 
5166
  if ( $this->is_registered() ) {
5167
- FS_Clone_Manager::instance()->maybe_resolve_new_subsite_install_automatically( $this );
5168
-
5169
  $this->hook_callback_to_install_sync();
5170
  }
5171
 
@@ -5180,28 +4937,6 @@
5180
  }
5181
 
5182
  if ( $this->is_user_in_admin() ) {
5183
- if ( $this->is_registered() && fs_request_has( 'purchase_completed' ) ) {
5184
- $this->_admin_notices->add_sticky(
5185
- sprintf(
5186
- /* translators: %s: License type (e.g. you have a professional license) */
5187
- $this->get_text_inline( 'You have purchased a %s license.', 'you-have-x-license' ),
5188
- fs_request_get( 'purchased_plan' )
5189
- ) .
5190
- sprintf(
5191
- $this->get_text_inline(" The %s's %sdownload link%s, license key, and installation instructions have been sent to %s. If you can't find the email after 5 min, please check your spam box.", 'post-purchase-email-sent-message' ),
5192
- $this->get_module_label( true ),
5193
- ( FS_Plugin::is_valid_id( $this->get_bundle_id() ) ? "products' " : '' ),
5194
- ( FS_Plugin::is_valid_id( $this->get_bundle_id() ) ? 's' : '' ),
5195
- sprintf(
5196
- '<strong>%s</strong>',
5197
- fs_request_get( 'purchase_email' )
5198
- )
5199
- ),
5200
- 'plan_purchased',
5201
- $this->get_text_x_inline( 'Yee-haw', 'interjection expressing joy or exuberance', 'yee-haw' ) . '!'
5202
- );
5203
- }
5204
-
5205
  if ( $this->is_addon() ) {
5206
  if ( ! $this->is_parent_plugin_installed() ) {
5207
  $parent_name = $this->get_option( $plugin_info, 'parent_name', null );
@@ -5325,8 +5060,7 @@
5325
  */
5326
  ( file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $this->premium_plugin_basename() ) ) )
5327
  ) &&
5328
- $this->has_release_on_freemius() &&
5329
- ( ! $this->is_unresolved_clone() )
5330
  ) {
5331
  FS_Plugin_Updater::instance( $this );
5332
  }
@@ -5474,7 +5208,7 @@
5474
  }
5475
 
5476
  // Send update to FS.
5477
- $result = $this->api_site_call( '/?fields=is_disconnected', 'put', array(
5478
  'is_disconnected' => true
5479
  ) );
5480
 
@@ -5623,7 +5357,7 @@
5623
  return true;
5624
  }
5625
 
5626
- $result = $this->api_site_call( '/?is_disconnected', 'put', array(
5627
  'is_disconnected' => false
5628
  ) );
5629
 
@@ -7203,24 +6937,6 @@
7203
  return $this->is_cron_on( 'sync' );
7204
  }
7205
 
7206
- /**
7207
- * @author Leo Fajardo (@leorw)
7208
- * @since 2.5.0
7209
- */
7210
- private function maybe_schedule_sync_cron() {
7211
- $next_schedule = $this->next_sync_cron();
7212
-
7213
- // The event is properly scheduled, so no need to reschedule it.
7214
- if (
7215
- is_numeric( $next_schedule ) &&
7216
- $next_schedule > time()
7217
- ) {
7218
- return;
7219
- }
7220
-
7221
- $this->schedule_sync_cron();
7222
- }
7223
-
7224
  /**
7225
  * @author Vova Feldman (@svovaf)
7226
  * @since 1.1.7.3
@@ -7399,10 +7115,6 @@
7399
  * @param int|null $current_blog_id
7400
  */
7401
  function _sync_install_cron_method( array $blog_ids, $current_blog_id = null ) {
7402
- if ( $this->is_clone() ) {
7403
- return;
7404
- }
7405
-
7406
  if ( $this->is_registered() ) {
7407
  if ( 1 < count( $blog_ids ) ) {
7408
  $this->sync_installs( array(), true );
@@ -7419,20 +7131,13 @@
7419
  /**
7420
  * Show a notice that activation is currently pending.
7421
  *
7422
- * @todo Add some sort of mechanism to allow users to update the email address they would like to opt-in with when $is_suspicious_email is true.
7423
- *
7424
  * @author Vova Feldman (@svovaf)
7425
  * @since 1.0.7
7426
  *
7427
  * @param bool|string $email
7428
  * @param bool $is_pending_trial Since 1.2.1.5
7429
- * @param bool $is_suspicious_email Since 2.5.0 Set to true when there's an indication that email address the user opted in with is fake/dummy/placeholder.
7430
  */
7431
- function _add_pending_activation_notice(
7432
- $email = false,
7433
- $is_pending_trial = false,
7434
- $is_suspicious_email = false
7435
- ) {
7436
  if ( ! is_string( $email ) ) {
7437
  $current_user = self::_get_current_wp_user();
7438
  $email = $current_user->user_email;
@@ -7488,20 +7193,6 @@
7488
  /**
7489
  * Don't redirect if activating multiple plugins at once (bulk activation).
7490
  */
7491
- } else if (
7492
- self::is_deactivation_snoozed() &&
7493
- (
7494
- // Either running the free code base.
7495
- ! $this->is_premium() ||
7496
- // Or if has a free version.
7497
- ! $this->is_only_premium() ||
7498
- // If premium only, don't redirect if license is activated.
7499
- ( $this->is_registered() && ! $this->can_use_premium_code() )
7500
- )
7501
- ) {
7502
- /**
7503
- * Don't redirect if activating during the deactivation snooze period (aka troubleshooting), unless activating a paid product version that the admin didn't enter its license key yet.
7504
- */
7505
  } else if ( ! $is_migration ) {
7506
  $this->_redirect_on_activation_hook();
7507
  return;
@@ -7688,6 +7379,8 @@
7688
 
7689
  fs_enqueue_local_script( 'postmessage', 'nojquery.ba-postmessage.min.js' );
7690
  fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' );
 
 
7691
  }
7692
 
7693
  /**
@@ -7723,14 +7416,14 @@
7723
  <?php
7724
  echo $this->apply_filters( 'optin_pointer_execute', "
7725
 
7726
- optin.pointer('open');
7727
 
7728
- // Tag the opt-in pointer with custom class.
7729
- $('.wp-pointer #fs_connect')
7730
- .parents('.wp-pointer.wp-pointer-top')
7731
- .addClass('fs-opt-in-pointer');
7732
 
7733
- ", 'element', 'optin' ) ?>
7734
  }
7735
  }
7736
  });
@@ -7778,7 +7471,7 @@
7778
  }
7779
 
7780
  /* Events
7781
- ------------------------------------------------------------------------------------------------------------------*/
7782
  /**
7783
  * Delete site install from Database.
7784
  *
@@ -8110,9 +7803,7 @@
8110
  $plugin_version = $this->_storage->is_anonymous_ms['version'];
8111
  $network = true;
8112
  } else {
8113
- $plugin_version = isset( $this->_storage->is_anonymous ) ?
8114
- $this->_storage->is_anonymous['version'] :
8115
- null;
8116
  $network = false;
8117
  }
8118
 
@@ -8260,7 +7951,7 @@
8260
  );
8261
  } else {
8262
  // Activate the license.
8263
- $install = $this->api_site_call(
8264
  '/',
8265
  'put',
8266
  array( 'license_key' => $this->apply_filters( 'license_key', $license->secret_key ) )
@@ -8935,17 +8626,9 @@
8935
  * @uses Freemius::is_network_anonymous() to check if the super-admin network skipped.
8936
  * @uses Freemius::is_network_delegated_connection() to check if the super-admin network delegated the connection to the site admins.
8937
  */
8938
- public function _after_new_blog_callback( $blog_id, $user_id, $domain, $path, $network_id, $meta ) {
8939
  $this->_logger->entrance();
8940
 
8941
- if ( ! $this->_is_network_active ) {
8942
- FS_Clone_Manager::instance()->store_new_blog_install_info( $blog_id );
8943
- return;
8944
- }
8945
-
8946
- $site = null;
8947
- $new_blog_id = $blog_id;
8948
-
8949
  if ( $this->is_premium() &&
8950
  $this->is_network_connected() &&
8951
  is_object( $this->_license ) &&
@@ -8979,13 +8662,9 @@
8979
  }
8980
  }
8981
 
8982
- $site = $this->_site;
8983
-
8984
  $this->switch_to_blog( $current_blog_id );
8985
 
8986
- if ( is_object( $site ) ) {
8987
- FS_Clone_Manager::instance()->store_new_blog_install_info( $blog_id, $site );
8988
-
8989
  // Already connected (with or without a license), so no need to continue.
8990
  return;
8991
  }
@@ -9018,8 +8697,6 @@
9018
  false
9019
  );
9020
 
9021
- $site = $this->_site;
9022
-
9023
  $this->switch_to_blog( $current_blog_id );
9024
  } else {
9025
  /**
@@ -9030,8 +8707,8 @@
9030
  $has_delegated_site = false;
9031
 
9032
  $sites = self::get_sites();
9033
- foreach ( $sites as $wp_site ) {
9034
- $blog_id = self::get_site_blog_id( $wp_site );
9035
 
9036
  if ( $this->is_site_delegated_connection( $blog_id ) ) {
9037
  $has_delegated_site = true;
@@ -9045,36 +8722,6 @@
9045
  $this->skip_site_connection( $blog_id );
9046
  }
9047
  }
9048
-
9049
- /**
9050
- * Store the new blog's information even if there's no install so that when a clone install is stored in the new blog's storage, we can try to resolve it automatically.
9051
- *
9052
- * @author Leo Fajardo (@leorw)
9053
- * @since 2.5.0
9054
- */
9055
- FS_Clone_Manager::instance()->store_new_blog_install_info( $new_blog_id, $site );
9056
- }
9057
-
9058
- /**
9059
- * @author Vova Feldman (@svovaf)
9060
- * @since 2.5.0
9061
- *
9062
- * @param \WP_Site $new_site
9063
- * @param array $args
9064
- */
9065
- public function _after_wp_initialize_site_callback( WP_Site $new_site, $args ) {
9066
- $this->_logger->entrance();
9067
-
9068
- $this->_after_new_blog_callback(
9069
- $new_site->id,
9070
- // Dummy user ID (not in use).
9071
- 0,
9072
- $new_site->domain,
9073
- $new_site->path,
9074
- $new_site->network_id,
9075
- // Dummy meta, not in use.
9076
- array()
9077
- );
9078
  }
9079
 
9080
  /**
@@ -9650,7 +9297,6 @@
9650
  *
9651
  * @param string[] string $override
9652
  * @param bool $only_diff
9653
- * @param bool $is_keepalive
9654
  * @param bool $include_plugins Since 1.1.8 by default include plugin changes.
9655
  * @param bool $include_themes Since 1.1.8 by default include plugin changes.
9656
  *
@@ -9659,7 +9305,6 @@
9659
  private function get_installs_data_for_api(
9660
  array $override,
9661
  $only_diff = false,
9662
- $is_keepalive = false,
9663
  $include_plugins = true,
9664
  $include_themes = true
9665
  ) {
@@ -9697,9 +9342,6 @@
9697
 
9698
  $sites = self::get_sites();
9699
 
9700
- $subsite_data_by_install_id = array();
9701
- $install_url_by_install_id = array();
9702
-
9703
  foreach ( $sites as $site ) {
9704
  $blog_id = self::get_site_blog_id( $site );
9705
 
@@ -9718,34 +9360,10 @@
9718
 
9719
  $install_data = $this->get_site_info( $site );
9720
 
9721
- if ( FS_Clone_Manager::instance()->is_temporary_duplicate_by_blog_id( $install_data['blog_id'] ) ) {
9722
- continue;
9723
- }
9724
-
9725
  $uid = $install_data['uid'];
9726
- $url = $install_data['url'];
9727
-
9728
- if ( isset( $subsite_data_by_install_id[ $install->id ] ) ) {
9729
- $clone_subsite_data = $subsite_data_by_install_id[ $install->id ];
9730
- $clone_install_url = $install_url_by_install_id[ $install->id ];
9731
-
9732
- if (
9733
- /**
9734
- * If we already have an install with the same URL as the subsite it's stored in, skip the current subsite. Otherwise, replace the existing install's data with the current subsite's install's data if the URLs match.
9735
- *
9736
- * @author Leo Fajardo (@leorw)
9737
- * @since 2.5.0
9738
- */
9739
- fs_strip_url_protocol( untrailingslashit( $clone_install_url ) ) === fs_strip_url_protocol( untrailingslashit( $clone_subsite_data['url'] ) ) ||
9740
- fs_strip_url_protocol( untrailingslashit( $install->url ) ) !== fs_strip_url_protocol( untrailingslashit( $url ) )
9741
- ) {
9742
- continue;
9743
- }
9744
- }
9745
 
9746
  unset( $install_data['blog_id'] );
9747
  unset( $install_data['uid'] );
9748
- unset( $install_data['url'] );
9749
 
9750
  $install_data['is_disconnected'] = $install->is_disconnected;
9751
  $install_data['is_active'] = $this->is_active_for_site( $blog_id );
@@ -9770,25 +9388,18 @@
9770
  $is_common_diff_for_any_site = $is_common_diff_for_any_site || $is_common_diff;
9771
  }
9772
 
9773
- if ( ! empty( $install_data ) || $is_common_diff || $is_keepalive ) {
9774
  // Add install ID and site unique ID.
9775
  $install_data['id'] = $install->id;
9776
  $install_data['uid'] = $uid;
9777
- $install_data['url'] = $url;
9778
 
9779
- $subsite_data_by_install_id[ $install->id ] = $install_data;
9780
- $install_url_by_install_id[ $install->id ] = $install->url;
9781
  }
9782
  }
9783
  }
9784
 
9785
  restore_current_blog();
9786
 
9787
- $installs_data = array_merge(
9788
- $installs_data,
9789
- array_values( $subsite_data_by_install_id )
9790
- );
9791
-
9792
  if ( 0 < count( $installs_data ) && ( $is_common_diff_for_any_site || ! $only_diff ) ) {
9793
  if ( ! $only_diff ) {
9794
  $installs_data[] = $common;
@@ -9860,11 +9471,10 @@
9860
  *
9861
  * @param string[] string $override
9862
  * @param bool $flush
9863
- * @param bool $is_two_way_sync @since 2.5.0 If true and there's a successful API request, the install sync cron will be cleared.
9864
  *
9865
  * @return false|object|string
9866
  */
9867
- private function send_install_update( $override = array(), $flush = false, $is_two_way_sync = false ) {
9868
  $this->_logger->entrance();
9869
 
9870
  $check_properties = $this->get_install_data_for_api( $override );
@@ -9890,9 +9500,10 @@
9890
  }
9891
  }
9892
 
9893
- if ( $is_two_way_sync ) {
9894
  /**
9895
- * Update last install sync timestamp during a two-way sync call as we expect that updates are sent during this call.
 
9896
  *
9897
  * @author Leo Fajardo (@leorw)
9898
  * @since 2.2.3
@@ -9908,11 +9519,11 @@
9908
  $this->set_keepalive_timestamp();
9909
 
9910
  // Send updated values to FS.
9911
- $site = $this->api_site_call( '/', 'put', $params, true );
9912
 
9913
- if ( $is_two_way_sync && $this->is_api_result_entity( $site ) ) {
9914
  /**
9915
- * Clear scheduled install sync after a two-way sync call.
9916
  *
9917
  * @author Leo Fajardo (@leorw)
9918
  * @since 2.2.3
@@ -9934,29 +9545,37 @@
9934
  *
9935
  * @param string[] string $override
9936
  * @param bool $flush
9937
- * @param bool $is_two_way_sync @since 2.5.0 If true and there's a successful API request, the install sync cron will be cleared.
9938
  *
9939
  * @return false|object|string
9940
  */
9941
- private function send_installs_update( $override = array(), $flush = false, $is_two_way_sync = false ) {
9942
  $this->_logger->entrance();
9943
 
9944
- /**
9945
- * Pass `true` to use the network level storage since the update is for many installs.
9946
- *
9947
- * @author Leo Fajardo (@leorw)
9948
- * @since 2.2.3
9949
- */
9950
- $should_send_keepalive = $this->should_send_keepalive_update( true );
9951
-
9952
- $installs_data = $this->get_installs_data_for_api( $override, ! $flush, $should_send_keepalive );
9953
 
 
9954
  if ( empty( $installs_data ) ) {
9955
- return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9956
  }
9957
 
9958
- if ( $is_two_way_sync ) {
9959
- // Update last install sync timestamp during a two-way sync call as we expect that updates are sent during this call.
9960
  $this->set_cron_execution_timestamp( 'install_sync' );
9961
  }
9962
 
@@ -9971,8 +9590,8 @@
9971
  // Send updated values to FS.
9972
  $result = $this->get_api_user_scope()->call( "/plugins/{$this->_plugin->id}/installs.json", 'put', $installs_data );
9973
 
9974
- if ( $is_two_way_sync && $this->is_api_result_object( $result, 'installs' ) ) {
9975
- // I successfully sent a two-way installs update, clear the scheduled install sync if it exists.
9976
  $this->clear_install_sync_cron();
9977
  }
9978
 
@@ -10022,10 +9641,10 @@
10022
  * @param string[] string $override
10023
  * @param bool $flush
10024
  */
10025
- function sync_install( $override = array(), $flush = false ) {
10026
  $this->_logger->entrance();
10027
 
10028
- $site = $this->send_install_update( $override, $flush, true );
10029
 
10030
  if ( false === $site ) {
10031
  // No sync required.
@@ -10054,7 +9673,7 @@
10054
  private function sync_installs( $override = array(), $flush = false ) {
10055
  $this->_logger->entrance();
10056
 
10057
- $result = $this->send_installs_update( $override, $flush, true );
10058
 
10059
  if ( false === $result ) {
10060
  // No sync required.
@@ -10307,17 +9926,7 @@
10307
  return;
10308
  }
10309
 
10310
- if (
10311
- ! $fs->is_clone() &&
10312
- /**
10313
- * If there's a context install, run this method only when there's also a context user (e.g., when cloning a subsite of a multisite network into a single-site installation, it's possible for an install to be associated with a non-existing user entity; we want Freemius to be off in this case, while we are trying to recover the user).
10314
- *
10315
- * @author Leo Fajardo
10316
- */
10317
- ( ! is_object( $fs->_site ) || $fs->is_registered() )
10318
- ) {
10319
- $fs->_uninstall_plugin_event();
10320
- }
10321
 
10322
  $fs->do_action( 'after_uninstall' );
10323
  }
@@ -10713,7 +10322,7 @@
10713
  #endregion ------------------------------------------------------------------
10714
 
10715
  /* Account
10716
- ------------------------------------------------------------------------------------------------------------------*/
10717
 
10718
  /**
10719
  * Find plugin's slug by plugin's basename.
@@ -10777,14 +10386,9 @@
10777
  */
10778
  private static function get_all_sites(
10779
  $module_type = WP_FS__MODULE_TYPE_PLUGIN,
10780
- $blog_id = null,
10781
- $is_backup = false
10782
  ) {
10783
- $sites = self::get_account_option(
10784
- ( $is_backup ? 'prev_' : '' ) . 'sites',
10785
- $module_type,
10786
- $blog_id
10787
- );
10788
 
10789
  if ( ! is_array( $sites ) ) {
10790
  $sites = array();
@@ -11204,52 +10808,6 @@
11204
  return $this->_site;
11205
  }
11206
 
11207
- /**
11208
- * @author Leo Fajardo (@leorw)
11209
- * @since 2.5.0
11210
- */
11211
- function store_site( $site ) {
11212
- $this->_site = $site;
11213
- $this->_store_site( true );
11214
- }
11215
-
11216
- /**
11217
- * Deletes the current install with an option to back it up in case restoration will be needed (e.g., if the automatic clone resolution attempt fails).
11218
- *
11219
- * @author Leo Fajardo (@leorw)
11220
- * @since 2.5.0
11221
- */
11222
- function delete_current_install( $back_up ) {
11223
- // Back up and delete the unique ID.
11224
- if ( $back_up ) {
11225
- self::$_accounts->set_option( 'prev_unique_id', $this->get_anonymous_id() );
11226
- }
11227
-
11228
- self::$_accounts->set_option( 'unique_id', null );
11229
-
11230
- if ( $back_up ) {
11231
- // Back up the install before deleting it so that it can be restored later on if necessary (e.g., if the automatic clone resolution attempt fails).
11232
- $this->back_up_site();
11233
- }
11234
-
11235
- $this->_delete_site();
11236
- $this->_site = null;
11237
- }
11238
-
11239
- /**
11240
- * @author Leo Fajardo (@leorw)
11241
- * @since 2.5.0
11242
- */
11243
- function restore_backup_site() {
11244
- self::$_accounts->set_option(
11245
- 'unique_id',
11246
- self::$_accounts->get_option( 'prev_unique_id' )
11247
- );
11248
-
11249
- $sites = self::get_all_sites( $this->_module_type, null, true );
11250
- $this->store_site( clone $sites[ $this->_slug ] );
11251
- }
11252
-
11253
  /**
11254
  * Get plugin add-ons.
11255
  *
@@ -13330,76 +12888,7 @@
13330
  );
13331
 
13332
  fs_require_template( 'forms/license-activation.php', $vars );
13333
- fs_require_template( 'forms/resend-key.php', $vars );
13334
- }
13335
-
13336
- /**
13337
- * Displays an email address update dialog box when the user clicks on the email address "Edit" button on the "Account" page.
13338
- *
13339
- * @author Leo Fajardo (@leorw)
13340
- * @since 2.5.0
13341
- */
13342
- function _add_email_address_update_dialog_box() {
13343
- $vars = array( 'id' => $this->_module_id );
13344
-
13345
- fs_require_template( 'forms/email-address-update.php', $vars );
13346
- }
13347
-
13348
- /**
13349
- * @author Leo Fajardo (@leorw)
13350
- * @since 2.5.0
13351
- */
13352
- function _add_email_address_update_option() {
13353
- if ( ! $this->should_handle_user_change() ) {
13354
- return;
13355
- }
13356
-
13357
- // Add email address update AJAX handler.
13358
- $this->add_ajax_action( 'update_email_address', array( &$this, '_email_address_update_ajax_handler' ) );
13359
- }
13360
-
13361
- /**
13362
- * @author Leo Fajardo (@leorw)
13363
- * @since 2.5.0
13364
- */
13365
- function _email_address_update_ajax_handler() {
13366
- $this->check_ajax_referer( 'update_email_address' );
13367
-
13368
- $new_email_address = fs_request_get( 'email_address' );
13369
- $transfer_type = fs_request_get( 'transfer_type' );
13370
-
13371
- $result = $this->update_email( $new_email_address );
13372
-
13373
- if ( ! FS_Api::is_api_error( $result ) ) {
13374
- self::shoot_ajax_success();
13375
- }
13376
-
13377
- $error = '';
13378
-
13379
- if ( FS_Api::is_api_error_object( $result ) ) {
13380
- switch ( $result->error->code ) {
13381
- case 'user_exist':
13382
- case 'account_verification_required':
13383
- $error = array(
13384
- 'code' => 'change_ownership',
13385
- 'url' => $this->get_account_url( 'change_owner', array(
13386
- 'state' => 'init',
13387
- 'candidate_email' => $new_email_address,
13388
- 'transfer_type' => $transfer_type,
13389
- ) ),
13390
- );
13391
-
13392
- break;
13393
- }
13394
- }
13395
-
13396
- if ( empty( $error ) ) {
13397
- $error = is_object( $result ) ?
13398
- var_export( $result->error, true ) :
13399
- $result;
13400
- }
13401
-
13402
- self::shoot_ajax_failure( $error );
13403
  }
13404
 
13405
  /**
@@ -13609,15 +13098,10 @@
13609
  ( $is_network_admin && $this->is_network_active() && ! $this->is_network_delegated_connection() ) ||
13610
  ( ! $is_network_admin && ( ! $this->is_network_active() || $this->is_delegated_connection() ) )
13611
  ) {
13612
- if (
13613
- $this->is_premium() ||
13614
- ( $this->has_paid_plan() && ! $this->has_premium_version() )
13615
- ) {
13616
- /**
13617
- * @since 1.2.0 Add license action link only on plugins page.
13618
- */
13619
- $this->_add_license_action_link();
13620
- }
13621
  }
13622
  }
13623
 
@@ -13789,7 +13273,7 @@
13789
  self::shoot_ajax_failure();
13790
  }
13791
 
13792
- $site = $this->api_site_call(
13793
  '',
13794
  'put',
13795
  array(
@@ -14402,7 +13886,7 @@
14402
 
14403
  $addon_info = $fs->_get_addon_info( $addon_id, $is_installed );
14404
 
14405
- if ( ! isset( $addon_info['is_connected'] ) || ! $addon_info['is_connected'] ) {
14406
  // Add-on is not associated with an install entity.
14407
  continue;
14408
  }
@@ -15379,16 +14863,6 @@
15379
  return ( defined( 'DOING_CRON' ) && DOING_CRON );
15380
  }
15381
 
15382
- /**
15383
- * @author Leo Fajardo (@leorw)
15384
- * @since 2.5.0
15385
- *
15386
- * @return bool
15387
- */
15388
- static function is_admin_post() {
15389
- return ( 'admin-post.php' === self::get_current_page() );
15390
- }
15391
-
15392
  /**
15393
  * Check if a real user is visiting the admin dashboard.
15394
  *
@@ -15402,7 +14876,7 @@
15402
  is_admin() &&
15403
  ! self::is_ajax() &&
15404
  ! self::is_cron() &&
15405
- ! self::is_admin_post()
15406
  );
15407
  }
15408
 
@@ -15683,17 +15157,12 @@
15683
  }
15684
 
15685
  /**
15686
- * @todo Implement pagination when accessing the subsites collection.
15687
- *
15688
  * @author Leo Fajardo (@leorw)
15689
  * @since 2.0.0
15690
  *
15691
- * @param int $limit Default to 1,000
15692
- * @param int $offset Default to 0
15693
- *
15694
  * @return array Active & public sites collection.
15695
  */
15696
- static function get_sites( $limit = 1000, $offset = 0 ) {
15697
  if ( ! is_multisite() ) {
15698
  return array();
15699
  }
@@ -15715,8 +15184,6 @@
15715
  'mature' => 0,
15716
  'spam' => 0,
15717
  'deleted' => 0,
15718
- 'number' => $limit,
15719
- 'offset' => $offset,
15720
  );
15721
 
15722
  if ( function_exists( 'get_sites' ) ) {
@@ -15906,16 +15373,11 @@
15906
  *
15907
  * @param int $blog_id
15908
  * @param FS_Site $install
15909
- * @param bool $flush
15910
  *
15911
  * @return bool Since 2.3.1 returns if a switch was made.
15912
  */
15913
- function switch_to_blog( $blog_id, FS_Site $install = null, $flush = false ) {
15914
- if ( ! is_numeric( $blog_id ) ) {
15915
- return false;
15916
- }
15917
-
15918
- if ( ! $flush && $blog_id == $this->_context_is_network_or_blog_id ) {
15919
  return false;
15920
  }
15921
 
@@ -15979,7 +15441,7 @@
15979
  unset( $this->_site_api );
15980
  unset( $this->_user_api );
15981
 
15982
- return true;
15983
  }
15984
 
15985
  /**
@@ -16276,10 +15738,6 @@
16276
  }
16277
  }
16278
 
16279
- if ( ! $this->is_registered() ) {
16280
- return;
16281
- }
16282
-
16283
  if ( $this->is_sync_cron_scheduled() &&
16284
  $context_blog_id == $this->get_sync_cron_blog_id()
16285
  ) {
@@ -16313,10 +15771,6 @@
16313
 
16314
  $this->update_multisite_data_after_site_deactivation( $context_blog_id );
16315
 
16316
- if ( ! $this->is_registered() ) {
16317
- return;
16318
- }
16319
-
16320
  $current_blog_id = get_current_blog_id();
16321
 
16322
  $this->switch_to_blog( $context_blog_id );
@@ -16350,10 +15804,6 @@
16350
 
16351
  $this->update_multisite_data_after_site_deactivation( $context_blog_id );
16352
 
16353
- if ( ! $this->is_registered() ) {
16354
- return;
16355
- }
16356
-
16357
  $current_blog_id = get_current_blog_id();
16358
 
16359
  $this->switch_to_blog( $context_blog_id );
@@ -16371,20 +15821,6 @@
16371
  $this->switch_to_blog( $current_blog_id );
16372
  }
16373
 
16374
- /**
16375
- * Executed after site deletion, called from wp_delete_site
16376
- *
16377
- * @author Dario Curvino (@dudo)
16378
- * @since 2.5.0
16379
- *
16380
- * @param WP_Site $old_site
16381
- */
16382
- public function _after_wpsite_deleted_callback( WP_Site $old_site ) {
16383
- $this->_logger->entrance();
16384
-
16385
- $this->_after_site_deleted_callback( $old_site->blog_id, true );
16386
- }
16387
-
16388
  /**
16389
  * Executed after site re-activation.
16390
  *
@@ -16631,7 +16067,7 @@
16631
  }
16632
 
16633
  /* Logger
16634
- ------------------------------------------------------------------------------------------------------------------*/
16635
  /**
16636
  * @param string $id
16637
  * @param bool $prefix_slug
@@ -16656,7 +16092,7 @@
16656
  }
16657
 
16658
  /* Security
16659
- ------------------------------------------------------------------------------------------------------------------*/
16660
  private static function _encrypt( $str ) {
16661
  if ( is_null( $str ) ) {
16662
  return null;
@@ -16876,6 +16312,20 @@
16876
  ) {
16877
  // Load site.
16878
  $this->_site = $site;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16879
  }
16880
 
16881
  $user = null;
@@ -16904,30 +16354,7 @@
16904
  /**
16905
  * This is a special fault tolerance mechanism to handle a scenario that the user data is missing.
16906
  */
16907
- if (
16908
- ! isset( $this->_storage->user_recovery_from_install_last_attempt_timestamp ) ||
16909
- time() > ( $this->_storage->user_recovery_from_install_last_attempt_timestamp + FS_Clone_Manager::CLONE_RESOLUTION_MAX_EXECUTION_TIME )
16910
- ) {
16911
- $user = $this->sync_user_by_current_install();
16912
- } else {
16913
- return;
16914
- }
16915
-
16916
- if ( is_object( $user ) ) {
16917
- $this->_storage->user_was_recovered_from_install = true;
16918
- } else {
16919
- $this->_storage->user_recovery_from_install_attempts = isset( $this->_storage->user_recovery_from_install_attempts ) ?
16920
- ( $this->_storage->user_recovery_from_install_attempts + 1 ) :
16921
- 1;
16922
-
16923
- if ( $this->_storage->user_recovery_from_install_attempts >= 3 ) {
16924
- $this->delete_current_install( false );
16925
- } else {
16926
- $this->_storage->user_recovery_from_install_last_attempt_timestamp = time();
16927
-
16928
- return;
16929
- }
16930
- }
16931
  }
16932
 
16933
  $this->_user = ( $user instanceof FS_User ) ?
@@ -16941,23 +16368,6 @@
16941
  }
16942
 
16943
  if ( is_object( $this->_site ) ) {
16944
- // Load plans.
16945
- $this->_plans = isset( $plans[ $this->_slug ] ) ?
16946
- $plans[ $this->_slug ] :
16947
- array();
16948
-
16949
- if ( ! is_array( $this->_plans ) || empty( $this->_plans ) ) {
16950
- $this->_sync_plans();
16951
- } else {
16952
- for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) {
16953
- if ( $this->_plans[ $i ] instanceof FS_Plugin_Plan ) {
16954
- $this->_plans[ $i ] = self::decrypt_entity( $this->_plans[ $i ] );
16955
- } else {
16956
- unset( $this->_plans[ $i ] );
16957
- }
16958
- }
16959
- }
16960
-
16961
  $this->_license = $this->_get_license_by_id( $this->_site->license_id );
16962
 
16963
  if ( $this->_site->version != $this->get_plugin_version() ) {
@@ -16976,13 +16386,6 @@
16976
  if ( $this->is_theme() ) {
16977
  $this->_register_account_hooks();
16978
  }
16979
-
16980
- if (
16981
- $this->is_clone() &&
16982
- empty( FS_Clone_Manager::instance()->get_clone_identification_timestamp() )
16983
- ) {
16984
- FS_Clone_Manager::instance()->store_clone_identification_timestamp();
16985
- }
16986
  }
16987
 
16988
  /**
@@ -17194,10 +16597,6 @@
17194
  );
17195
  }
17196
 
17197
- if ( is_multisite() && function_exists( 'get_network' ) ) {
17198
- $params['network_uid'] = $this->get_anonymous_network_id();
17199
- }
17200
-
17201
  return array_merge( $params, $override_with );
17202
  }
17203
 
@@ -17219,7 +16618,6 @@
17219
  * @param bool $is_disconnected Whether or not to opt in without tracking.
17220
  * @param null|bool $is_marketing_allowed
17221
  * @param array $sites If network-level opt-in, an array of containing details of sites.
17222
- * @param bool $redirect
17223
  *
17224
  * @return string|object
17225
  * @use WP_Error
@@ -17233,8 +16631,7 @@
17233
  $trial_plan_id = false,
17234
  $is_disconnected = false,
17235
  $is_marketing_allowed = null,
17236
- $sites = array(),
17237
- $redirect = true
17238
  ) {
17239
  $this->_logger->entrance();
17240
 
@@ -17258,7 +16655,7 @@
17258
  $fs_user,
17259
  false,
17260
  $trial_plan_id,
17261
- $redirect,
17262
  true,
17263
  $sites
17264
  );
@@ -17418,8 +16815,7 @@
17418
  true ),
17419
  false,
17420
  $filtered_license_key,
17421
- ! empty( $params['trial_plan_id'] ),
17422
- isset( $decoded->is_suspicious_email ) && $decoded->is_suspicious_email
17423
  );
17424
  } else if ( isset( $decoded->install_secret_key ) ) {
17425
  return $this->install_with_new_user(
@@ -17694,13 +17090,7 @@
17694
  );
17695
  }
17696
  } else if ( fs_request_has( 'pending_activation' ) ) {
17697
- $this->set_pending_confirmation(
17698
- fs_request_get( 'user_email' ),
17699
- true,
17700
- false,
17701
- false,
17702
- fs_request_get_bool( 'is_suspicious_email' )
17703
- );
17704
  }
17705
  }
17706
  }
@@ -17795,7 +17185,7 @@
17795
  $site->secret_key = $install_secret_key;
17796
 
17797
  $this->_site = $site;
17798
- $site_result = $this->get_api_site_scope( true )->get();
17799
  $site = new FS_Site( $site_result );
17800
  $this->_site = $site;
17801
 
@@ -17942,8 +17332,7 @@
17942
  $email = false,
17943
  $redirect = true,
17944
  $license_key = false,
17945
- $is_pending_trial = false,
17946
- $is_suspicious_email = false
17947
  ) {
17948
  if ( $this->_ignore_pending_mode ) {
17949
  /**
@@ -17958,7 +17347,7 @@
17958
  // Install must be activated via email since
17959
  // user with the same email already exist.
17960
  $this->_storage->is_pending_activation = true;
17961
- $this->_add_pending_activation_notice( $email, $is_pending_trial, $is_suspicious_email );
17962
  }
17963
 
17964
  if ( ! empty( $license_key ) ) {
@@ -18021,7 +17410,7 @@
18021
  *
18022
  * @return object|string If redirect is `false`, returns the next page the user should be redirected to, or the API error object if failed to install.
18023
  */
18024
- function install_with_current_user(
18025
  $license_key = false,
18026
  $trial_plan_id = false,
18027
  $sites = array(),
@@ -18404,6 +17793,9 @@
18404
  $this->send_installs_update();
18405
  }
18406
 
 
 
 
18407
  $current_blog = get_current_blog_id();
18408
 
18409
  foreach ( $blog_2_install_map as $blog_id => $install ) {
@@ -18412,12 +17804,7 @@
18412
  $this->do_action( 'after_account_connection', $this->_user, $install );
18413
  }
18414
 
18415
- // Switch install context back to the first install.
18416
- $this->switch_to_blog(
18417
- $current_blog,
18418
- $first_install,
18419
- ( $this->_site->id != $first_install->id )
18420
- );
18421
 
18422
  $this->do_action( 'after_network_account_connection', $this->_user, $blog_2_install_map );
18423
  }
@@ -18521,10 +17908,6 @@
18521
  // return;
18522
  // }
18523
 
18524
- if ( is_object( $this->_site ) && ! $this->is_registered() ) {
18525
- return;
18526
- }
18527
-
18528
  /**
18529
  * When running from a site admin with a network activated module and the connection
18530
  * was NOT delegated and the user still haven't skipped or opted-in, then hide the
@@ -19479,7 +18862,7 @@
19479
  *
19480
  * @return string
19481
  */
19482
- static function get_ajax_action_static( $tag, $module_id = null ) {
19483
  $action = "fs_{$tag}";
19484
 
19485
  if ( ! empty( $module_id ) ) {
@@ -19722,7 +19105,7 @@
19722
  }
19723
 
19724
  /* Account Page
19725
- ------------------------------------------------------------------------------------------------------------------*/
19726
  /**
19727
  * Update site information.
19728
  *
@@ -19733,7 +19116,7 @@
19733
  * @param null|int $network_level_or_blog_id Since 2.0.0
19734
  * @param \FS_Site $site Since 2.0.0
19735
  */
19736
- private function _store_site( $store = true, $network_level_or_blog_id = null, FS_Site $site = null, $is_backup = false ) {
19737
  $this->_logger->entrance();
19738
 
19739
  if ( is_null( $site ) ) {
@@ -19748,12 +19131,9 @@
19748
 
19749
  $site_clone = clone $site;
19750
 
19751
- $sites = self::get_all_sites( $this->_module_type, $network_level_or_blog_id, $is_backup );
19752
 
19753
- if (
19754
- ! $is_backup &&
19755
- is_object( $this->_user ) && $this->_user->id != $site->user_id
19756
- ) {
19757
  $this->sync_user_by_current_install( $site->user_id );
19758
 
19759
  $prev_stored_user_id = $this->_storage->get( 'prev_user_id', false, $network_level_or_blog_id );
@@ -19778,26 +19158,7 @@
19778
 
19779
  $sites[ $this->_slug ] = $site_clone;
19780
 
19781
- $this->set_account_option(
19782
- ( $is_backup ? 'prev_' : '' ) . 'sites',
19783
- $sites,
19784
- $store,
19785
- $network_level_or_blog_id
19786
- );
19787
- }
19788
-
19789
- /**
19790
- * Stores the context site in the sites backup storage. This logic is used before deleting the site info so that it can be restored later on if necessary (e.g., if the automatic clone resolution attempt fails).
19791
- *
19792
- * @author Leo Fajardo (@leorw)
19793
- * @since 2.5.0
19794
- */
19795
- private function back_up_site() {
19796
- $this->_logger->entrance();
19797
-
19798
- $site_clone = clone $this->_site;
19799
-
19800
- $this->_store_site( true, null, $site_clone, true );
19801
  }
19802
 
19803
  /**
@@ -21038,10 +20399,10 @@
21038
  $this->switch_to_blog( $current_blog_id );
21039
  }
21040
 
21041
- $result = $this->send_install_update( array(), true, true );
21042
  $is_valid = $this->is_api_result_entity( $result );
21043
  } else {
21044
- $result = $this->send_installs_update( array(), true, true );
21045
  $is_valid = $this->is_api_result_object( $result, 'installs' );
21046
  }
21047
 
@@ -21051,7 +20412,7 @@
21051
  $this->switch_to_blog( $this->_storage->network_install_blog_id );
21052
  }
21053
 
21054
- // Show API message only if not background sync or if paying customer.
21055
  if ( ! $background || $this->is_paying() ) {
21056
  // Try to ping API to see if not blocked.
21057
  if ( ! FS_Api::test() ) {
@@ -21061,49 +20422,25 @@
21061
  * @author Vova Feldman (@svovaf)
21062
  * @since 1.1.6 Only show message related to one of the Freemius powered plugins. Once it will be resolved it will fix the issue for all plugins anyways. There's no point to scare users with multiple error messages.
21063
  */
 
21064
 
21065
  if ( ! self::$_global_admin_notices->has_sticky( 'api_blocked' ) ) {
21066
- // Add notice immediately if not a background sync.
21067
- $add_notice = ( ! $background );
21068
-
21069
- if ( ! $add_notice ) {
21070
- $counter = (int) get_transient( '_fs_api_connection_retry_counter' );
21071
-
21072
- // We only want to add the notice after 3 consecutive failures.
21073
- $add_notice = ( 3 <= $counter );
21074
-
21075
- if ( ! $add_notice ) {
21076
- /**
21077
- * Update counter transient only if notice shouldn't be added. If it is added the transient will be reset anyway, because the retries mechanism should only start counting if the admin isn't aware of the connectivity issue.
21078
- *
21079
- * Also, since the background sync happens once a day, setting the transient expiration for a week should be enough to count 3 failures, if there's an actual connectivity issue.
21080
- */
21081
- set_transient( '_fs_api_connection_retry_counter', $counter + 1, WP_FS__TIME_WEEK_IN_SEC );
21082
- }
21083
- }
21084
-
21085
- // Add notice instantly for not-background sync and only after 3 failed attempts for background sync.
21086
- if ( $add_notice ) {
21087
- self::$_global_admin_notices->add(
21088
- sprintf(
21089
- $this->get_text_inline( 'Your server is blocking the access to Freemius\' API, which is crucial for %1$s synchronization. Please contact your host to whitelist %2$s', 'server-blocking-access' ),
21090
- $this->get_plugin_name(),
21091
- '<b>' . implode( ', ', $this->apply_filters( 'api_domains', array(
21092
- 'api.freemius.com',
21093
- 'wp.freemius.com'
21094
- ) ) ) . '</b>'
21095
- ) . '<br> ' . $this->get_text_inline( 'Error received from the server:', 'server-error-message' ) . var_export( $result->error, true ),
21096
- $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...',
21097
- 'error',
21098
- $background,
21099
- 'api_blocked'
21100
- );
21101
-
21102
- // Notice was just shown, reset connectivity counter.
21103
- delete_transient( '_fs_api_connection_retry_counter' );
21104
- }
21105
  }
21106
- } else if ( is_object( $result ) ) {
21107
  // Authentication params are broken.
21108
  $this->_admin_notices->add(
21109
  $this->get_text_inline( 'It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.', 'wrong-authentication-param-message' ) . '<br> ' . $this->get_text_inline( 'Error received from the server:', 'server-error-message' ) . var_export( $result->error, true ),
@@ -21117,9 +20454,6 @@
21117
  return;
21118
  }
21119
 
21120
- // API is working now. Delete the transient and start afresh.
21121
- delete_transient('_fs_api_connection_retry_counter');
21122
-
21123
  if ( $is_site_level_sync ) {
21124
  $site = new FS_Site( $result );
21125
  } else {
@@ -21311,7 +20645,7 @@
21311
  }
21312
 
21313
  if ( ! $this->is_addon() &&
21314
- $this->_site->is_beta() !== $site->is_beta()
21315
  ) {
21316
  // Beta flag updated.
21317
  $this->_site = $site;
@@ -22045,10 +21379,6 @@
22045
  ) {
22046
  $this->_logger->entrance();
22047
 
22048
- if ( $this->is_unresolved_clone() ) {
22049
- return false;
22050
- }
22051
-
22052
  $switch_to_blog_id = null;
22053
 
22054
  /**
@@ -22161,11 +21491,9 @@
22161
  private function get_latest_download_api_url( $plugin_id = false ) {
22162
  $this->_logger->entrance();
22163
 
22164
- $download_api_url = $this->get_api_site_scope()->get_signed_url(
22165
  $this->_get_latest_version_endpoint( $plugin_id, 'zip' )
22166
  );
22167
-
22168
- return str_replace( 'http:', 'https:', $download_api_url );
22169
  }
22170
 
22171
  /**
@@ -22360,6 +21688,7 @@
22360
  private function update_email( $new_email ) {
22361
  $this->_logger->entrance();
22362
 
 
22363
  $api = $this->get_api_user_scope();
22364
  $user = $api->call( "?plugin_id={$this->_plugin->id}&fields=id,email,is_verified", 'put', array(
22365
  'email' => $new_email,
@@ -22375,6 +21704,7 @@
22375
  $this->_store_user();
22376
  } else {
22377
  // handle different error cases.
 
22378
  }
22379
 
22380
  return $user;
@@ -22450,32 +21780,15 @@
22450
  * @uses FS_Api
22451
  *
22452
  * @param string $candidate_email
22453
- * @param string $transfer_type
22454
  *
22455
  * @return bool Is ownership change successfully initiated.
22456
  */
22457
- private function init_change_owner( $candidate_email, $transfer_type ) {
22458
  $this->_logger->entrance();
22459
 
22460
- $installs_info_by_slug_map = $this->get_parent_and_addons_installs_info();
22461
- $install_ids = array();
22462
-
22463
- foreach ( $installs_info_by_slug_map as $slug => $install_info ) {
22464
- $install = $install_info['install'];
22465
-
22466
- if ( $this->_user->id != $install->user_id ) {
22467
- // Skip add-on installs that are not owned by the parent product's install's owner.
22468
- continue;
22469
- }
22470
-
22471
- $install_ids[ $slug ] = $install->id;
22472
- }
22473
-
22474
  $api = $this->get_api_site_scope();
22475
  $result = $api->call( "/users/{$this->_user->id}.json", 'put', array(
22476
  'email' => $candidate_email,
22477
- 'transfer_type' => $transfer_type,
22478
- 'install_ids' => implode( ',', array_values( $install_ids ) ),
22479
  'after_confirm_url' => $this->_get_admin_page_url(
22480
  'account',
22481
  array( 'fs_action' => 'change_owner' )
@@ -22497,113 +21810,28 @@
22497
  private function complete_change_owner() {
22498
  $this->_logger->entrance();
22499
 
22500
- $install_ids = fs_request_get( 'install_ids' );
22501
-
22502
- if ( ! empty( $install_ids ) ) {
22503
- $install_ids = explode( ',', $install_ids );
22504
-
22505
- foreach ( $install_ids as $key => $install_id ) {
22506
- if ( ! FS_Site::is_valid_id( $install_id ) ) {
22507
- unset( $install_ids[ $key ] );
22508
- }
22509
- }
22510
- }
22511
-
22512
- if ( ! is_array( $install_ids ) ) {
22513
- $install_ids = array();
22514
- }
22515
-
22516
- $user = new FS_User();
22517
- $user->id = fs_request_get( 'user_id' );
22518
- $user->public_key = fs_request_get( 'user_public_key' );
22519
- $user->secret_key = fs_request_get( 'user_secret_key' );
22520
-
22521
- $prev_user = $this->_user;
22522
- $this->_user = $user;
22523
-
22524
- $result = $this->get_api_user_scope( true )->get(
22525
- "/installs.json?install_ids=" . implode( ',', $install_ids )
22526
- );
22527
-
22528
- $current_blog_sites = self::get_all_sites( $this->get_module_type() );
22529
-
22530
- if ( $this->is_api_result_object( $result, 'installs' ) ) {
22531
- $site_id_slug_map = array();
22532
-
22533
- foreach ( $current_blog_sites as $slug => $site ) {
22534
- $site_id_slug_map[ $site->id ] = $slug;
22535
- }
22536
-
22537
- foreach ( $result->installs as $install ) {
22538
- $site = new FS_Site( $install );
22539
-
22540
- if ( ! isset( $site_id_slug_map[ $install->id ] ) ) {
22541
- continue;
22542
- }
22543
-
22544
- $current_blog_sites[ $site_id_slug_map[ $install->id ] ] = clone $site;
22545
 
22546
- if ( $this->_site->id == $site->id ) {
22547
- $this->_site = $site;
22548
- }
22549
- }
22550
- }
22551
 
22552
  // Validate install's user and given user.
22553
  if ( $user->id != $this->_site->user_id ) {
22554
- $this->_user = $prev_user;
22555
-
22556
  return false;
22557
  }
22558
 
22559
- $this->set_account_option( 'sites', $current_blog_sites, true );
 
22560
 
22561
  // Fetch new user information.
 
22562
  $user_result = $this->get_api_user_scope( true )->get();
22563
  $user = new FS_User( $user_result );
22564
  $this->_user = $user;
22565
 
22566
- $this->_set_account( $user, $this->_site );
22567
-
22568
- $remove_user = true;
22569
- $all_modules_sites = self::get_all_modules_sites();
22570
-
22571
- foreach ( $all_modules_sites as $sites_by_module_type ) {
22572
- foreach ( $sites_by_module_type as $sites_by_slug ) {
22573
- foreach ( $sites_by_slug as $site ) {
22574
- if ( $prev_user->id == $site->user_id ) {
22575
- $remove_user = false;
22576
- break;
22577
- }
22578
- }
22579
-
22580
- if ( ! $remove_user ) {
22581
- break;
22582
- }
22583
- }
22584
-
22585
- if ( ! $remove_user ) {
22586
- break;
22587
- }
22588
- }
22589
-
22590
- if ( $remove_user ) {
22591
- $users = self::get_all_users();
22592
-
22593
- if ( isset( $users[ $prev_user->id ] ) ) {
22594
- unset( $users[ $prev_user->id ] );
22595
- } else {
22596
- // If the prev user wasn't found by the key, iterate over the users collection.
22597
- foreach ( $users as $key => $user ) {
22598
- if ( $user->id == $prev_user->id ) {
22599
- unset( $users[ $key ] );
22600
- break;
22601
- }
22602
- }
22603
- }
22604
-
22605
- $this->set_account_option( 'users', $users, true );
22606
- }
22607
 
22608
  return true;
22609
  }
@@ -23015,15 +22243,10 @@
23015
  $state = fs_request_get( 'state', 'init' );
23016
  switch ( $state ) {
23017
  case 'init':
23018
- $candidate_email = fs_request_get( 'candidate_email' );
23019
- $transfer_type = fs_request_get( 'transfer_type' );
23020
 
23021
- if ( $this->init_change_owner( $candidate_email, $transfer_type ) ) {
23022
- if ( 'transfer' === $transfer_type ) {
23023
- $this->_admin_notices->add( sprintf( $this->get_text_inline( 'A confirmation email was just sent to %s. The email owner must confirm the update within the next 4 hours.', 'change-owner-request-sent-x-transfer' ), '<b>' . $this->_user->email . '</b>' ) );
23024
- } else {
23025
- $this->_admin_notices->add( sprintf( $this->get_text_inline( 'A confirmation email was just sent to %s. You must confirm the update within the next 4 hours. If you cannot find the email, please check your spam folder.', 'change-owner-request-sent-x' ), '<b>' . $this->_user->email . '</b>' ) );
23026
- }
23027
  }
23028
  break;
23029
  case 'owner_confirmed':
@@ -23046,6 +22269,37 @@
23046
 
23047
  return;
23048
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23049
  case 'update_user_name':
23050
  check_admin_referer( 'update_user_name' );
23051
 
@@ -23308,7 +22562,7 @@
23308
  }
23309
 
23310
  /* Pricing & Upgrade
23311
- ------------------------------------------------------------------------------------------------------------------*/
23312
  /**
23313
  * Render pricing page.
23314
  *
@@ -23467,17 +22721,17 @@
23467
  }
23468
 
23469
  /* CSS & JavaScript
23470
- ------------------------------------------------------------------------------------------------------------------*/
23471
  /* function _enqueue_script($handle, $src) {
23472
- $url = plugins_url( substr( WP_FS__DIR_JS, strlen( $this->_plugin_dir_path ) ) . '/assets/js/' . $src );
23473
 
23474
- $this->_logger->entrance( 'script = ' . $url );
23475
 
23476
- wp_enqueue_script( $handle, $url );
23477
- }*/
23478
 
23479
  /* SDK
23480
- ------------------------------------------------------------------------------------------------------------------*/
23481
  private $_user_api;
23482
 
23483
  /**
@@ -23489,7 +22743,7 @@
23489
  *
23490
  * @return FS_Api
23491
  */
23492
- function get_api_user_scope( $flush = false ) {
23493
  if ( ! isset( $this->_user_api ) || $flush ) {
23494
  $this->_user_api = $this->get_api_user_scope_by_user( $this->_user );
23495
  }
@@ -23568,56 +22822,13 @@
23568
  $this->_site->public_key,
23569
  ! $this->is_live(),
23570
  $this->_site->secret_key,
23571
- $this->get_sdk_version(),
23572
- get_site_url()
23573
  );
23574
  }
23575
 
23576
  return $this->_site_api;
23577
  }
23578
 
23579
- /**
23580
- * @author Leo Fajardo (@leorw)
23581
- * @since 2.5.0
23582
- *
23583
- * @param string $path
23584
- * @param string $method
23585
- * @param array $params
23586
- * @param bool $flush_instance
23587
- *
23588
- * @return array|mixed|string|void
23589
- * @throws Freemius_Exception
23590
- */
23591
- private function api_site_call( $path, $method = 'GET', $params = array(), $flush_instance = false ) {
23592
- $result = $this->get_api_site_scope( $flush_instance )->call( $path, $method, $params );
23593
-
23594
- /**
23595
- * Checks if the local install's URL is different from the remote install's URL, update the local install if necessary, and then run the clone handler if the install's URL is different from the URL of the site.
23596
- *
23597
- * @author Leo Fajardo (@leorw)
23598
- * @since 2.5.0
23599
- */
23600
- if (
23601
- $this->is_registered() &&
23602
- FS_Api::is_api_result_entity( $result ) &&
23603
- isset( $result->url )
23604
- ) {
23605
- $stored_local_url = trailingslashit( $this->_site->url );
23606
- $stored_remote_url = trailingslashit( $result->url );
23607
-
23608
- if ( $stored_local_url !== $stored_remote_url ) {
23609
- $this->_site->url = $result->url;
23610
- $this->_store_site();
23611
- }
23612
-
23613
- if ( fs_strip_url_protocol( $stored_remote_url ) !== fs_strip_url_protocol( trailingslashit( get_site_url() ) ) ) {
23614
- FS_Clone_Manager::instance()->maybe_run_clone_resolution();
23615
- }
23616
- }
23617
-
23618
- return $result;
23619
- }
23620
-
23621
  private $_plugin_api;
23622
 
23623
  /**
@@ -24053,7 +23264,7 @@
24053
  }
24054
 
24055
  /* Action Links
24056
- ------------------------------------------------------------------------------------------------------------------*/
24057
  private $_action_links_hooked = false;
24058
  private $_action_links = array();
24059
 
@@ -24240,13 +23451,10 @@
24240
 
24241
  if (
24242
  $this->is_addon() &&
24243
- ! $this->is_only_premium()
 
24244
  ) {
24245
- $parent = $this->get_parent_instance();
24246
-
24247
- if ( is_object( $parent ) && $parent->is_anonymous() ) {
24248
- return;
24249
- }
24250
  }
24251
 
24252
  if ( fs_is_network_admin() ) {
408
  * @param bool $is_init Since 1.2.1 Is initiation sequence.
409
  */
410
  private function __construct( $module_id, $slug = false, $is_init = false ) {
 
 
411
  if ( $is_init && is_numeric( $module_id ) && is_string( $slug ) ) {
412
+ $this->store_id_slug_type_path_map( $module_id, $slug );
413
  }
414
 
415
  $this->_module_id = $module_id;
424
 
425
  $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $this->get_unique_affix(), WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK );
426
 
427
+ $this->_plugin_main_file_path = $this->_find_caller_plugin_file( $is_init );
428
  $this->_plugin_dir_path = plugin_dir_path( $this->_plugin_main_file_path );
429
  $this->_plugin_basename = $this->get_plugin_basename();
430
  $this->_free_plugin_basename = str_replace( '-premium/', '/', $this->_plugin_basename );
519
  * @author Leo Fajardo (@leorw)
520
  * @since 1.2.2
521
  */
522
+ ( is_object( $this->_plugin ) ? $this->_plugin->title : $this->get_plugin_name() ),
 
 
 
523
  $this->get_unique_affix()
524
  );
525
 
1641
  }
1642
 
1643
  if ( $this->is_plugin() ) {
1644
+ if ( $this->_is_network_active ) {
1645
  add_action( 'wpmu_new_blog', array( $this, '_after_new_blog_callback' ), 10, 6 );
 
 
1646
  }
1647
 
1648
  register_deactivation_hook( $this->_plugin_main_file_path, array( &$this, '_deactivate_plugin_hook' ) );
1652
  add_action( 'deactivate_blog', array( &$this, '_after_site_deactivated_callback' ) );
1653
  add_action( 'archive_blog', array( &$this, '_after_site_deactivated_callback' ) );
1654
  add_action( 'make_spam_blog', array( &$this, '_after_site_deactivated_callback' ) );
1655
+ add_action( 'deleted_blog', array( &$this, '_after_site_deleted_callback' ), 10, 2 );
 
 
 
 
 
1656
 
1657
  add_action( 'activate_blog', array( &$this, '_after_site_reactivated_callback' ) );
1658
  add_action( 'unarchive_blog', array( &$this, '_after_site_reactivated_callback' ) );
1677
  add_action( 'admin_init', array( &$this, '_add_premium_version_upgrade_selection' ) );
1678
  add_action( 'admin_init', array( &$this, '_add_beta_mode_update_handler' ) );
1679
  add_action( 'admin_init', array( &$this, '_add_user_change_option' ) );
 
1680
 
1681
  $this->add_ajax_action( 'update_billing', array( &$this, '_update_billing_ajax_action' ) );
1682
  $this->add_ajax_action( 'start_trial', array( &$this, '_start_trial_ajax_action' ) );
2094
  /**
2095
  * Leverage backtrace to find caller plugin file path.
2096
  *
2097
+ * @author Vova Feldman (@svovaf)
 
 
 
2098
  * @since 1.0.6
2099
  *
2100
+ * @param bool $is_init Is initiation sequence.
2101
+ *
2102
+ * @return string
2103
  */
2104
+ private function _find_caller_plugin_file( $is_init = false ) {
2105
  // Try to load the cached value of the file path.
2106
  if ( isset( $this->_storage->plugin_main_file ) ) {
2107
  $plugin_main_file = $this->_storage->plugin_main_file;
2108
  if ( ! empty( $plugin_main_file->path ) ) {
2109
  $absolute_path = $this->get_absolute_path( $plugin_main_file->path );
2110
  if ( file_exists( $absolute_path ) ) {
 
 
 
 
 
 
2111
  return $absolute_path;
2112
  }
2113
  }
2148
  * Only the original instantiator that calls dynamic_init can modify the module's path.
2149
  */
2150
  // Find caller module.
2151
+ $id_slug_type_path_map = self::$_accounts->get_option( 'id_slug_type_path_map', array() );
2152
  $this->_storage->plugin_main_file = (object) array(
2153
+ 'path' => $id_slug_type_path_map[ $this->_module_id ]['path'],
2154
  );
2155
 
2156
+ return $this->get_absolute_path( $id_slug_type_path_map[ $this->_module_id ]['path'] );
2157
  }
2158
 
2159
  /**
2215
  * @param number $module_id
2216
  * @param string $slug
2217
  *
 
 
2218
  * @since 1.2.2
2219
  */
2220
  private function store_id_slug_type_path_map( $module_id, $slug ) {
2236
  $store_option = true;
2237
  }
2238
 
2239
+ if ( empty( $id_slug_type_path_map[ $module_id ]['path'] ) ||
2240
+ /**
2241
+ * This verification is for cases when suddenly the same module
2242
+ * is installed but with a different folder name.
2243
+ *
2244
+ * @author Vova Feldman (@svovaf)
2245
+ * @since 1.2.3
2246
+ */
2247
+ ! file_exists( $this->get_absolute_path(
2248
+ $id_slug_type_path_map[ $module_id ]['path'],
2249
+ $id_slug_type_path_map[ $module_id ]['type']
2250
+ ) )
2251
+ ) {
2252
+ $caller_main_file_and_type = $this->get_caller_main_file_and_type();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2253
 
2254
  $id_slug_type_path_map[ $module_id ]['type'] = $caller_main_file_and_type->module_type;
2255
  $id_slug_type_path_map[ $module_id ]['path'] = $caller_main_file_and_type->path;
2260
  if ( $store_option ) {
2261
  self::$_accounts->set_option( 'id_slug_type_path_map', $id_slug_type_path_map, true );
2262
  }
 
 
2263
  }
2264
 
2265
  /**
2273
  * add-ons are relying on loading the SDK from the parent module, and also allows themes including the
2274
  * SDK an internal file instead of directly from functions.php.
2275
  * @since 1.2.1.7 Knows how to handle cases when an add-on includes the parent module logic.
 
 
2276
  */
2277
+ private function get_caller_main_file_and_type() {
2278
  self::require_plugin_essentials();
2279
 
2280
  $all_plugins = fs_get_plugins( true );
2413
  }
2414
  }
2415
 
2416
+ return (object) array(
2417
  'module_type' => $module_type,
2418
  'path' => $caller_file_candidate
2419
  );
 
 
2420
  }
2421
 
2422
  #----------------------------------------------------------------------------------
2433
  * @since 1.1.2
2434
  */
2435
  function _add_deactivation_feedback_dialog_box() {
 
 
 
 
 
 
 
2436
  $subscription_cancellation_dialog_box_template_params = $this->apply_filters( 'show_deactivation_subscription_cancellation', true ) ?
2437
  $this->_get_subscription_cancellation_dialog_box_template_params() :
2438
  array();
2440
  /**
2441
  * @since 2.3.0 Developers can optionally hide the deactivation feedback form using the 'show_deactivation_feedback_form' filter.
2442
  */
2443
+ $show_deactivation_feedback_form = true;
2444
  if ( $this->has_filter( 'show_deactivation_feedback_form' ) ) {
2445
  $show_deactivation_feedback_form = $this->apply_filters( 'show_deactivation_feedback_form', true );
2446
  } else if ( $this->is_addon() ) {
2545
  $reason_temporary_deactivation = array(
2546
  'id' => self::REASON_TEMPORARY_DEACTIVATION,
2547
  'text' => sprintf(
2548
+ $this->get_text_inline( "It's a temporary %s. I'm just debugging an issue.", 'reason-temporary-x' ),
2549
  strtolower( $this->is_plugin() ?
2550
  $this->get_text_inline( 'Deactivation', 'deactivation' ) :
2551
  $this->get_text_inline( 'Theme Switch', 'theme-switch' )
2710
 
2711
  $this->_storage->store( 'uninstall_reason', $reason );
2712
 
 
 
 
 
 
 
 
 
2713
  /**
2714
  * If the module type is "theme", trigger the uninstall event here (on theme deactivation) since themes do
2715
  * not support uninstall hook.
2731
  exit;
2732
  }
2733
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2734
  /**
2735
  * @author Leo Fajardo (@leorw)
2736
  * @since 2.1.4
2927
  return self::instance( $addon_id );
2928
  }
2929
 
 
 
 
 
 
 
 
2930
  #endregion ------------------------------------------------------------------
2931
 
2932
  /**
3437
  add_action( 'plugins_loaded', array( 'Freemius', '_load_textdomain' ), 1 );
3438
  }
3439
 
 
 
 
3440
  add_action( 'admin_footer', array( 'Freemius', '_enrich_ajax_url' ) );
3441
  add_action( 'admin_footer', array( 'Freemius', '_open_support_forum_in_new_page' ) );
3442
 
3456
  self::$_statics_loaded = true;
3457
  }
3458
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3459
  /**
3460
  * @author Leo Fajardo (@leorw)
3461
  *
3550
  * @since 1.1.7.3
3551
  */
3552
  static function _toggle_debug_mode() {
3553
+ check_admin_referer( 'fs_toggle_debug_mode' );
3554
+
3555
  if ( ! is_super_admin() ) {
3556
  return;
3557
  }
3573
  * @since 1.2.1.6
3574
  */
3575
  static function _get_debug_log() {
3576
+ check_admin_referer( 'fs_get_debug_log' );
3577
+
3578
+ if ( ! is_super_admin() ) {
3579
+ return;
3580
+ }
3581
+
3582
+ $limit = min( ! empty( $_POST['limit'] ) ? absint( $_POST['limit'] ) : 200, 200 );
3583
+ $offset = min( ! empty( $_POST['offset'] ) ? absint( $_POST['offset'] ) : 200, 200 );
3584
+
3585
  $logs = FS_Logger::load_db_logs(
3586
  fs_request_get( 'filters', false, 'post' ),
3587
+ $limit,
3588
+ $offset
3589
  );
3590
 
3591
  self::shoot_ajax_success( $logs );
3692
 
3693
  switch_to_blog( $current_blog_id );
3694
  }
 
 
 
 
3695
  } else if ( fs_request_is_action( 'simulate_trial' ) ) {
3696
  check_admin_referer( 'simulate_trial' );
3697
 
3740
  }
3741
 
3742
  /**
3743
+ * @author Vova Feldman (@svovaf)
3744
+ * @since 1.0.8
 
 
3745
  */
3746
+ static function _debug_page_render() {
3747
  self::$_static_logger->entrance();
3748
 
 
 
 
 
 
 
 
3749
  if ( ! is_multisite() ) {
3750
+ $all_plugins_installs = self::get_all_sites( WP_FS__MODULE_TYPE_PLUGIN );
3751
+ $all_themes_installs = self::get_all_sites( WP_FS__MODULE_TYPE_THEME );
 
3752
  } else {
3753
  $sites = self::get_sites();
3754
 
3755
+ $all_plugins_installs = array();
3756
+ $all_themes_installs = array();
3757
+
3758
  foreach ( $sites as $site ) {
3759
  $blog_id = self::get_site_blog_id( $site );
3760
 
3761
+ $plugins_installs = self::get_all_sites( WP_FS__MODULE_TYPE_PLUGIN, $blog_id );
 
3762
 
3763
+ foreach ( $plugins_installs as $slug => $install ) {
3764
+ if ( ! isset( $all_plugins_installs[ $slug ] ) ) {
3765
+ $all_plugins_installs[ $slug ] = array();
3766
+ }
3767
 
3768
+ $install->blog_id = $blog_id;
3769
 
3770
+ $all_plugins_installs[ $slug ][] = $install;
3771
+ }
3772
+
3773
+ $themes_installs = self::get_all_sites( WP_FS__MODULE_TYPE_THEME, $blog_id );
3774
+
3775
+ foreach ( $themes_installs as $slug => $install ) {
3776
+ if ( ! isset( $all_themes_installs[ $slug ] ) ) {
3777
+ $all_themes_installs[ $slug ] = array();
3778
  }
3779
 
3780
+ $install->blog_id = $blog_id;
3781
+
3782
+ $all_themes_installs[ $slug ][] = $install;
3783
  }
3784
  }
3785
  }
3786
 
 
 
 
 
 
 
 
 
 
 
 
 
3787
  $licenses_by_module_type = self::get_all_licenses_by_module_type();
3788
 
3789
  $vars = array(
3790
+ 'plugin_sites' => $all_plugins_installs,
3791
+ 'theme_sites' => $all_themes_installs,
3792
  'users' => self::get_all_users(),
3793
  'addons' => self::get_all_addons(),
3794
  'account_addons' => self::get_all_account_addons(),
3820
  function is_on() {
3821
  self::$_static_logger->entrance();
3822
 
 
 
 
 
3823
  if ( isset( $this->_is_on ) ) {
3824
  return $this->_is_on;
3825
  }
3908
 
3909
  $is_update = $this->apply_filters( 'is_plugin_update', $this->is_plugin_update() );
3910
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3911
  return $this->get_api_plugin_scope()->ping(
3912
  $this->get_anonymous_id( $blog_id ),
3913
+ array(
3914
+ 'is_update' => json_encode( $is_update ),
3915
+ 'version' => $version,
3916
+ 'sdk' => $this->version,
3917
+ 'is_admin' => json_encode( is_admin() ),
3918
+ 'is_ajax' => json_encode( self::is_ajax() ),
3919
+ 'is_cron' => json_encode( self::is_cron() ),
3920
+ 'is_gdpr_test' => $is_gdpr_test,
3921
+ 'is_http' => json_encode( WP_FS__IS_HTTP_REQUEST ),
3922
+ )
3923
  );
3924
  }
3925
 
4085
  return $unique_id;
4086
  }
4087
 
 
 
 
 
 
 
 
 
 
 
 
4088
  /**
4089
  * @author Vova Feldman (@svovaf)
4090
  * @since 1.1.7.4
4458
  * @since 1.0.9
4459
  */
4460
  function _email_about_firewall_issue() {
4461
+ check_admin_referer( 'fs_resolve_firewall_issues' );
4462
+
4463
+ if ( ! current_user_can( is_multisite() ? 'manage_options' : 'activate_plugins' ) ) {
4464
+ return;
4465
+ }
4466
+
4467
  $this->_admin_notices->remove_sticky( 'failed_connect_api' );
4468
 
4469
  $pong = $this->ping();
4538
  * @since 1.1.7.4
4539
  */
4540
  function _retry_connectivity_test() {
4541
+ check_admin_referer( 'fs_retry_connectivity_test' );
4542
+
4543
+ if ( ! current_user_can( is_multisite() ? 'manage_options' : 'activate_plugins' ) ) {
4544
+ return;
4545
+ }
4546
+
4547
  $this->_admin_notices->remove_sticky( 'failed_connect_api_first' );
4548
 
4549
  $pong = $this->ping();
4907
  * @since 1.1.7.3
4908
  *
4909
  */
4910
+ if ( $this->is_registered() ) {
4911
+ if ( ! $this->is_sync_cron_on() && $this->is_tracking_allowed() ) {
4912
+ $this->schedule_sync_cron();
4913
+ }
4914
  }
4915
 
4916
  /**
4923
  }
4924
 
4925
  if ( $this->is_registered() ) {
 
 
4926
  $this->hook_callback_to_install_sync();
4927
  }
4928
 
4937
  }
4938
 
4939
  if ( $this->is_user_in_admin() ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4940
  if ( $this->is_addon() ) {
4941
  if ( ! $this->is_parent_plugin_installed() ) {
4942
  $parent_name = $this->get_option( $plugin_info, 'parent_name', null );
5060
  */
5061
  ( file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $this->premium_plugin_basename() ) ) )
5062
  ) &&
5063
+ $this->has_release_on_freemius()
 
5064
  ) {
5065
  FS_Plugin_Updater::instance( $this );
5066
  }
5208
  }
5209
 
5210
  // Send update to FS.
5211
+ $result = $this->get_api_site_scope()->call( '/?fields=is_disconnected', 'put', array(
5212
  'is_disconnected' => true
5213
  ) );
5214
 
5357
  return true;
5358
  }
5359
 
5360
+ $result = $this->get_api_site_scope()->call( '/?is_disconnected', 'put', array(
5361
  'is_disconnected' => false
5362
  ) );
5363
 
6937
  return $this->is_cron_on( 'sync' );
6938
  }
6939
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6940
  /**
6941
  * @author Vova Feldman (@svovaf)
6942
  * @since 1.1.7.3
7115
  * @param int|null $current_blog_id
7116
  */
7117
  function _sync_install_cron_method( array $blog_ids, $current_blog_id = null ) {
 
 
 
 
7118
  if ( $this->is_registered() ) {
7119
  if ( 1 < count( $blog_ids ) ) {
7120
  $this->sync_installs( array(), true );
7131
  /**
7132
  * Show a notice that activation is currently pending.
7133
  *
 
 
7134
  * @author Vova Feldman (@svovaf)
7135
  * @since 1.0.7
7136
  *
7137
  * @param bool|string $email
7138
  * @param bool $is_pending_trial Since 1.2.1.5
 
7139
  */
7140
+ function _add_pending_activation_notice( $email = false, $is_pending_trial = false ) {
 
 
 
 
7141
  if ( ! is_string( $email ) ) {
7142
  $current_user = self::_get_current_wp_user();
7143
  $email = $current_user->user_email;
7193
  /**
7194
  * Don't redirect if activating multiple plugins at once (bulk activation).
7195
  */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7196
  } else if ( ! $is_migration ) {
7197
  $this->_redirect_on_activation_hook();
7198
  return;
7379
 
7380
  fs_enqueue_local_script( 'postmessage', 'nojquery.ba-postmessage.min.js' );
7381
  fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' );
7382
+
7383
+ fs_enqueue_local_style( 'fs_connect', '/admin/connect.css' );
7384
  }
7385
 
7386
  /**
7416
  <?php
7417
  echo $this->apply_filters( 'optin_pointer_execute', "
7418
 
7419
+ optin.pointer('open');
7420
 
7421
+ // Tag the opt-in pointer with custom class.
7422
+ $('.wp-pointer #fs_connect')
7423
+ .parents('.wp-pointer.wp-pointer-top')
7424
+ .addClass('fs-opt-in-pointer');
7425
 
7426
+ ", 'element', 'optin' ) ?>
7427
  }
7428
  }
7429
  });
7471
  }
7472
 
7473
  /* Events
7474
+ ------------------------------------------------------------------------------------------------------------------*/
7475
  /**
7476
  * Delete site install from Database.
7477
  *
7803
  $plugin_version = $this->_storage->is_anonymous_ms['version'];
7804
  $network = true;
7805
  } else {
7806
+ $plugin_version = $this->_storage->is_anonymous['version'];
 
 
7807
  $network = false;
7808
  }
7809
 
7951
  );
7952
  } else {
7953
  // Activate the license.
7954
+ $install = $this->get_api_site_scope()->call(
7955
  '/',
7956
  'put',
7957
  array( 'license_key' => $this->apply_filters( 'license_key', $license->secret_key ) )
8626
  * @uses Freemius::is_network_anonymous() to check if the super-admin network skipped.
8627
  * @uses Freemius::is_network_delegated_connection() to check if the super-admin network delegated the connection to the site admins.
8628
  */
8629
+ function _after_new_blog_callback( $blog_id, $user_id, $domain, $path, $network_id, $meta ) {
8630
  $this->_logger->entrance();
8631
 
 
 
 
 
 
 
 
 
8632
  if ( $this->is_premium() &&
8633
  $this->is_network_connected() &&
8634
  is_object( $this->_license ) &&
8662
  }
8663
  }
8664
 
 
 
8665
  $this->switch_to_blog( $current_blog_id );
8666
 
8667
+ if ( is_object( $this->_site ) ) {
 
 
8668
  // Already connected (with or without a license), so no need to continue.
8669
  return;
8670
  }
8697
  false
8698
  );
8699
 
 
 
8700
  $this->switch_to_blog( $current_blog_id );
8701
  } else {
8702
  /**
8707
  $has_delegated_site = false;
8708
 
8709
  $sites = self::get_sites();
8710
+ foreach ( $sites as $site ) {
8711
+ $blog_id = self::get_site_blog_id( $site );
8712
 
8713
  if ( $this->is_site_delegated_connection( $blog_id ) ) {
8714
  $has_delegated_site = true;
8722
  $this->skip_site_connection( $blog_id );
8723
  }
8724
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8725
  }
8726
 
8727
  /**
9297
  *
9298
  * @param string[] string $override
9299
  * @param bool $only_diff
 
9300
  * @param bool $include_plugins Since 1.1.8 by default include plugin changes.
9301
  * @param bool $include_themes Since 1.1.8 by default include plugin changes.
9302
  *
9305
  private function get_installs_data_for_api(
9306
  array $override,
9307
  $only_diff = false,
 
9308
  $include_plugins = true,
9309
  $include_themes = true
9310
  ) {
9342
 
9343
  $sites = self::get_sites();
9344
 
 
 
 
9345
  foreach ( $sites as $site ) {
9346
  $blog_id = self::get_site_blog_id( $site );
9347
 
9360
 
9361
  $install_data = $this->get_site_info( $site );
9362
 
 
 
 
 
9363
  $uid = $install_data['uid'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9364
 
9365
  unset( $install_data['blog_id'] );
9366
  unset( $install_data['uid'] );
 
9367
 
9368
  $install_data['is_disconnected'] = $install->is_disconnected;
9369
  $install_data['is_active'] = $this->is_active_for_site( $blog_id );
9388
  $is_common_diff_for_any_site = $is_common_diff_for_any_site || $is_common_diff;
9389
  }
9390
 
9391
+ if ( ! empty( $install_data ) || $is_common_diff ) {
9392
  // Add install ID and site unique ID.
9393
  $install_data['id'] = $install->id;
9394
  $install_data['uid'] = $uid;
 
9395
 
9396
+ $installs_data[] = $install_data;
 
9397
  }
9398
  }
9399
  }
9400
 
9401
  restore_current_blog();
9402
 
 
 
 
 
 
9403
  if ( 0 < count( $installs_data ) && ( $is_common_diff_for_any_site || ! $only_diff ) ) {
9404
  if ( ! $only_diff ) {
9405
  $installs_data[] = $common;
9471
  *
9472
  * @param string[] string $override
9473
  * @param bool $flush
 
9474
  *
9475
  * @return false|object|string
9476
  */
9477
+ private function send_install_update( $override = array(), $flush = false ) {
9478
  $this->_logger->entrance();
9479
 
9480
  $check_properties = $this->get_install_data_for_api( $override );
9500
  }
9501
  }
9502
 
9503
+ if ( ! $keepalive_only_update ) {
9504
  /**
9505
+ * Do not update the last install sync timestamp after a keepalive-only call since there were no actual
9506
+ * updates sent.
9507
  *
9508
  * @author Leo Fajardo (@leorw)
9509
  * @since 2.2.3
9519
  $this->set_keepalive_timestamp();
9520
 
9521
  // Send updated values to FS.
9522
+ $site = $this->get_api_site_scope()->call( '/', 'put', $params );
9523
 
9524
+ if ( ! $keepalive_only_update && $this->is_api_result_entity( $site ) ) {
9525
  /**
9526
+ * Do not clear scheduled sync after a keepalive-only call since there were no actual updates sent.
9527
  *
9528
  * @author Leo Fajardo (@leorw)
9529
  * @since 2.2.3
9545
  *
9546
  * @param string[] string $override
9547
  * @param bool $flush
 
9548
  *
9549
  * @return false|object|string
9550
  */
9551
+ private function send_installs_update( $override = array(), $flush = false ) {
9552
  $this->_logger->entrance();
9553
 
9554
+ $installs_data = $this->get_installs_data_for_api( $override, ! $flush );
 
 
 
 
 
 
 
 
9555
 
9556
+ $keepalive_only_update = false;
9557
  if ( empty( $installs_data ) ) {
9558
+ /**
9559
+ * Pass `true` to use the network level storage since the update is for many installs.
9560
+ *
9561
+ * @author Leo Fajardo (@leorw)
9562
+ * @since 2.2.3
9563
+ */
9564
+ $keepalive_only_update = $this->should_send_keepalive_update( true );
9565
+
9566
+ if ( ! $keepalive_only_update ) {
9567
+ /**
9568
+ * There are no updates to send including keepalive.
9569
+ *
9570
+ * @author Leo Fajardo (@leorw)
9571
+ * @since 2.2.3
9572
+ */
9573
+ return false;
9574
+ }
9575
  }
9576
 
9577
+ if ( ! $keepalive_only_update ) {
9578
+ // Update last install sync timestamp if there were actual updates sent (i.e., not a keepalive-only call).
9579
  $this->set_cron_execution_timestamp( 'install_sync' );
9580
  }
9581
 
9590
  // Send updated values to FS.
9591
  $result = $this->get_api_user_scope()->call( "/plugins/{$this->_plugin->id}/installs.json", 'put', $installs_data );
9592
 
9593
+ if ( ! $keepalive_only_update && $this->is_api_result_object( $result, 'installs' ) ) {
9594
+ // I successfully sent installs update (there was an actual update sent and it's not just a keepalive-only call), clear scheduled sync if exist.
9595
  $this->clear_install_sync_cron();
9596
  }
9597
 
9641
  * @param string[] string $override
9642
  * @param bool $flush
9643
  */
9644
+ private function sync_install( $override = array(), $flush = false ) {
9645
  $this->_logger->entrance();
9646
 
9647
+ $site = $this->send_install_update( $override, $flush );
9648
 
9649
  if ( false === $site ) {
9650
  // No sync required.
9673
  private function sync_installs( $override = array(), $flush = false ) {
9674
  $this->_logger->entrance();
9675
 
9676
+ $result = $this->send_installs_update( $override, $flush );
9677
 
9678
  if ( false === $result ) {
9679
  // No sync required.
9926
  return;
9927
  }
9928
 
9929
+ $fs->_uninstall_plugin_event();
 
 
 
 
 
 
 
 
 
 
9930
 
9931
  $fs->do_action( 'after_uninstall' );
9932
  }
10322
  #endregion ------------------------------------------------------------------
10323
 
10324
  /* Account
10325
+ ------------------------------------------------------------------------------------------------------------------*/
10326
 
10327
  /**
10328
  * Find plugin's slug by plugin's basename.
10386
  */
10387
  private static function get_all_sites(
10388
  $module_type = WP_FS__MODULE_TYPE_PLUGIN,
10389
+ $blog_id = null
 
10390
  ) {
10391
+ $sites = self::get_account_option( 'sites', $module_type, $blog_id );
 
 
 
 
10392
 
10393
  if ( ! is_array( $sites ) ) {
10394
  $sites = array();
10808
  return $this->_site;
10809
  }
10810
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10811
  /**
10812
  * Get plugin add-ons.
10813
  *
12888
  );
12889
 
12890
  fs_require_template( 'forms/license-activation.php', $vars );
12891
+ fs_require_template( 'forms/resend-key.php', $vars );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12892
  }
12893
 
12894
  /**
13098
  ( $is_network_admin && $this->is_network_active() && ! $this->is_network_delegated_connection() ) ||
13099
  ( ! $is_network_admin && ( ! $this->is_network_active() || $this->is_delegated_connection() ) )
13100
  ) {
13101
+ /**
13102
+ * @since 1.2.0 Add license action link only on plugins page.
13103
+ */
13104
+ $this->_add_license_action_link();
 
 
 
 
 
13105
  }
13106
  }
13107
 
13273
  self::shoot_ajax_failure();
13274
  }
13275
 
13276
+ $site = $this->get_api_site_scope()->call(
13277
  '',
13278
  'put',
13279
  array(
13886
 
13887
  $addon_info = $fs->_get_addon_info( $addon_id, $is_installed );
13888
 
13889
+ if ( ! $addon_info['is_connected'] ) {
13890
  // Add-on is not associated with an install entity.
13891
  continue;
13892
  }
14863
  return ( defined( 'DOING_CRON' ) && DOING_CRON );
14864
  }
14865
 
 
 
 
 
 
 
 
 
 
 
14866
  /**
14867
  * Check if a real user is visiting the admin dashboard.
14868
  *
14876
  is_admin() &&
14877
  ! self::is_ajax() &&
14878
  ! self::is_cron() &&
14879
+ ( 'admin-post.php' !== self::get_current_page() )
14880
  );
14881
  }
14882
 
15157
  }
15158
 
15159
  /**
 
 
15160
  * @author Leo Fajardo (@leorw)
15161
  * @since 2.0.0
15162
  *
 
 
 
15163
  * @return array Active & public sites collection.
15164
  */
15165
+ static function get_sites() {
15166
  if ( ! is_multisite() ) {
15167
  return array();
15168
  }
15184
  'mature' => 0,
15185
  'spam' => 0,
15186
  'deleted' => 0,
 
 
15187
  );
15188
 
15189
  if ( function_exists( 'get_sites' ) ) {
15373
  *
15374
  * @param int $blog_id
15375
  * @param FS_Site $install
 
15376
  *
15377
  * @return bool Since 2.3.1 returns if a switch was made.
15378
  */
15379
+ function switch_to_blog( $blog_id, FS_Site $install = null ) {
15380
+ if ( ! is_numeric( $blog_id ) || $blog_id == $this->_context_is_network_or_blog_id ) {
 
 
 
 
15381
  return false;
15382
  }
15383
 
15441
  unset( $this->_site_api );
15442
  unset( $this->_user_api );
15443
 
15444
+ return false;
15445
  }
15446
 
15447
  /**
15738
  }
15739
  }
15740
 
 
 
 
 
15741
  if ( $this->is_sync_cron_scheduled() &&
15742
  $context_blog_id == $this->get_sync_cron_blog_id()
15743
  ) {
15771
 
15772
  $this->update_multisite_data_after_site_deactivation( $context_blog_id );
15773
 
 
 
 
 
15774
  $current_blog_id = get_current_blog_id();
15775
 
15776
  $this->switch_to_blog( $context_blog_id );
15804
 
15805
  $this->update_multisite_data_after_site_deactivation( $context_blog_id );
15806
 
 
 
 
 
15807
  $current_blog_id = get_current_blog_id();
15808
 
15809
  $this->switch_to_blog( $context_blog_id );
15821
  $this->switch_to_blog( $current_blog_id );
15822
  }
15823
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15824
  /**
15825
  * Executed after site re-activation.
15826
  *
16067
  }
16068
 
16069
  /* Logger
16070
+ ------------------------------------------------------------------------------------------------------------------*/
16071
  /**
16072
  * @param string $id
16073
  * @param bool $prefix_slug
16092
  }
16093
 
16094
  /* Security
16095
+ ------------------------------------------------------------------------------------------------------------------*/
16096
  private static function _encrypt( $str ) {
16097
  if ( is_null( $str ) ) {
16098
  return null;
16312
  ) {
16313
  // Load site.
16314
  $this->_site = $site;
16315
+
16316
+ // Load plans.
16317
+ $this->_plans = $plans[ $this->_slug ];
16318
+ if ( ! is_array( $this->_plans ) || empty( $this->_plans ) ) {
16319
+ $this->_sync_plans();
16320
+ } else {
16321
+ for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) {
16322
+ if ( $this->_plans[ $i ] instanceof FS_Plugin_Plan ) {
16323
+ $this->_plans[ $i ] = self::decrypt_entity( $this->_plans[ $i ] );
16324
+ } else {
16325
+ unset( $this->_plans[ $i ] );
16326
+ }
16327
+ }
16328
+ }
16329
  }
16330
 
16331
  $user = null;
16354
  /**
16355
  * This is a special fault tolerance mechanism to handle a scenario that the user data is missing.
16356
  */
16357
+ $user = $this->sync_user_by_current_install();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16358
  }
16359
 
16360
  $this->_user = ( $user instanceof FS_User ) ?
16368
  }
16369
 
16370
  if ( is_object( $this->_site ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16371
  $this->_license = $this->_get_license_by_id( $this->_site->license_id );
16372
 
16373
  if ( $this->_site->version != $this->get_plugin_version() ) {
16386
  if ( $this->is_theme() ) {
16387
  $this->_register_account_hooks();
16388
  }
 
 
 
 
 
 
 
16389
  }
16390
 
16391
  /**
16597
  );
16598
  }
16599
 
 
 
 
 
16600
  return array_merge( $params, $override_with );
16601
  }
16602
 
16618
  * @param bool $is_disconnected Whether or not to opt in without tracking.
16619
  * @param null|bool $is_marketing_allowed
16620
  * @param array $sites If network-level opt-in, an array of containing details of sites.
 
16621
  *
16622
  * @return string|object
16623
  * @use WP_Error
16631
  $trial_plan_id = false,
16632
  $is_disconnected = false,
16633
  $is_marketing_allowed = null,
16634
+ $sites = array()
 
16635
  ) {
16636
  $this->_logger->entrance();
16637
 
16655
  $fs_user,
16656
  false,
16657
  $trial_plan_id,
16658
+ true,
16659
  true,
16660
  $sites
16661
  );
16815
  true ),
16816
  false,
16817
  $filtered_license_key,
16818
+ ! empty( $params['trial_plan_id'] )
 
16819
  );
16820
  } else if ( isset( $decoded->install_secret_key ) ) {
16821
  return $this->install_with_new_user(
17090
  );
17091
  }
17092
  } else if ( fs_request_has( 'pending_activation' ) ) {
17093
+ $this->set_pending_confirmation( fs_request_get( 'user_email' ), true );
 
 
 
 
 
 
17094
  }
17095
  }
17096
  }
17185
  $site->secret_key = $install_secret_key;
17186
 
17187
  $this->_site = $site;
17188
+ $site_result = $this->get_api_site_scope()->get();
17189
  $site = new FS_Site( $site_result );
17190
  $this->_site = $site;
17191
 
17332
  $email = false,
17333
  $redirect = true,
17334
  $license_key = false,
17335
+ $is_pending_trial = false
 
17336
  ) {
17337
  if ( $this->_ignore_pending_mode ) {
17338
  /**
17347
  // Install must be activated via email since
17348
  // user with the same email already exist.
17349
  $this->_storage->is_pending_activation = true;
17350
+ $this->_add_pending_activation_notice( $email, $is_pending_trial );
17351
  }
17352
 
17353
  if ( ! empty( $license_key ) ) {
17410
  *
17411
  * @return object|string If redirect is `false`, returns the next page the user should be redirected to, or the API error object if failed to install.
17412
  */
17413
+ private function install_with_current_user(
17414
  $license_key = false,
17415
  $trial_plan_id = false,
17416
  $sites = array(),
17793
  $this->send_installs_update();
17794
  }
17795
 
17796
+ // Switch install context back to the first install.
17797
+ $this->_site = $first_install;
17798
+
17799
  $current_blog = get_current_blog_id();
17800
 
17801
  foreach ( $blog_2_install_map as $blog_id => $install ) {
17804
  $this->do_action( 'after_account_connection', $this->_user, $install );
17805
  }
17806
 
17807
+ $this->switch_to_blog( $current_blog );
 
 
 
 
 
17808
 
17809
  $this->do_action( 'after_network_account_connection', $this->_user, $blog_2_install_map );
17810
  }
17908
  // return;
17909
  // }
17910
 
 
 
 
 
17911
  /**
17912
  * When running from a site admin with a network activated module and the connection
17913
  * was NOT delegated and the user still haven't skipped or opted-in, then hide the
18862
  *
18863
  * @return string
18864
  */
18865
+ private static function get_ajax_action_static( $tag, $module_id = null ) {
18866
  $action = "fs_{$tag}";
18867
 
18868
  if ( ! empty( $module_id ) ) {
19105
  }
19106
 
19107
  /* Account Page
19108
+ ------------------------------------------------------------------------------------------------------------------*/
19109
  /**
19110
  * Update site information.
19111
  *
19116
  * @param null|int $network_level_or_blog_id Since 2.0.0
19117
  * @param \FS_Site $site Since 2.0.0
19118
  */
19119
+ private function _store_site( $store = true, $network_level_or_blog_id = null, FS_Site $site = null ) {
19120
  $this->_logger->entrance();
19121
 
19122
  if ( is_null( $site ) ) {
19131
 
19132
  $site_clone = clone $site;
19133
 
19134
+ $sites = self::get_all_sites( $this->_module_type, $network_level_or_blog_id );
19135
 
19136
+ if ( is_object( $this->_user ) && $this->_user->id != $site->user_id ) {
 
 
 
19137
  $this->sync_user_by_current_install( $site->user_id );
19138
 
19139
  $prev_stored_user_id = $this->_storage->get( 'prev_user_id', false, $network_level_or_blog_id );
19158
 
19159
  $sites[ $this->_slug ] = $site_clone;
19160
 
19161
+ $this->set_account_option( 'sites', $sites, $store, $network_level_or_blog_id );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19162
  }
19163
 
19164
  /**
20399
  $this->switch_to_blog( $current_blog_id );
20400
  }
20401
 
20402
+ $result = $this->send_install_update( array(), true );
20403
  $is_valid = $this->is_api_result_entity( $result );
20404
  } else {
20405
+ $result = $this->send_installs_update( array(), true );
20406
  $is_valid = $this->is_api_result_object( $result, 'installs' );
20407
  }
20408
 
20412
  $this->switch_to_blog( $this->_storage->network_install_blog_id );
20413
  }
20414
 
20415
+ // Show API messages only if not background sync or if paying customer.
20416
  if ( ! $background || $this->is_paying() ) {
20417
  // Try to ping API to see if not blocked.
20418
  if ( ! FS_Api::test() ) {
20422
  * @author Vova Feldman (@svovaf)
20423
  * @since 1.1.6 Only show message related to one of the Freemius powered plugins. Once it will be resolved it will fix the issue for all plugins anyways. There's no point to scare users with multiple error messages.
20424
  */
20425
+ $api = $this->get_api_site_scope();
20426
 
20427
  if ( ! self::$_global_admin_notices->has_sticky( 'api_blocked' ) ) {
20428
+ self::$_global_admin_notices->add(
20429
+ sprintf(
20430
+ $this->get_text_inline( 'Your server is blocking the access to Freemius\' API, which is crucial for %1$s synchronization. Please contact your host to whitelist %2$s', 'server-blocking-access' ),
20431
+ $this->get_plugin_name(),
20432
+ '<b>' . implode( ', ', $this->apply_filters( 'api_domains', array(
20433
+ 'api.freemius.com',
20434
+ 'wp.freemius.com'
20435
+ ) ) ) . '</b>'
20436
+ ) . '<br> ' . $this->get_text_inline( 'Error received from the server:', 'server-error-message' ) . var_export( $result->error, true ),
20437
+ $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...',
20438
+ 'error',
20439
+ $background,
20440
+ 'api_blocked'
20441
+ );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20442
  }
20443
+ } else {
20444
  // Authentication params are broken.
20445
  $this->_admin_notices->add(
20446
  $this->get_text_inline( 'It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.', 'wrong-authentication-param-message' ) . '<br> ' . $this->get_text_inline( 'Error received from the server:', 'server-error-message' ) . var_export( $result->error, true ),
20454
  return;
20455
  }
20456
 
 
 
 
20457
  if ( $is_site_level_sync ) {
20458
  $site = new FS_Site( $result );
20459
  } else {
20645
  }
20646
 
20647
  if ( ! $this->is_addon() &&
20648
+ $this->_site->is_beta() !== $site->is_beta
20649
  ) {
20650
  // Beta flag updated.
20651
  $this->_site = $site;
21379
  ) {
21380
  $this->_logger->entrance();
21381
 
 
 
 
 
21382
  $switch_to_blog_id = null;
21383
 
21384
  /**
21491
  private function get_latest_download_api_url( $plugin_id = false ) {
21492
  $this->_logger->entrance();
21493
 
21494
+ return $this->get_api_site_scope()->get_signed_url(
21495
  $this->_get_latest_version_endpoint( $plugin_id, 'zip' )
21496
  );
 
 
21497
  }
21498
 
21499
  /**
21688
  private function update_email( $new_email ) {
21689
  $this->_logger->entrance();
21690
 
21691
+
21692
  $api = $this->get_api_user_scope();
21693
  $user = $api->call( "?plugin_id={$this->_plugin->id}&fields=id,email,is_verified", 'put', array(
21694
  'email' => $new_email,
21704
  $this->_store_user();
21705
  } else {
21706
  // handle different error cases.
21707
+
21708
  }
21709
 
21710
  return $user;
21780
  * @uses FS_Api
21781
  *
21782
  * @param string $candidate_email
 
21783
  *
21784
  * @return bool Is ownership change successfully initiated.
21785
  */
21786
+ private function init_change_owner( $candidate_email ) {
21787
  $this->_logger->entrance();
21788
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21789
  $api = $this->get_api_site_scope();
21790
  $result = $api->call( "/users/{$this->_user->id}.json", 'put', array(
21791
  'email' => $candidate_email,
 
 
21792
  'after_confirm_url' => $this->_get_admin_page_url(
21793
  'account',
21794
  array( 'fs_action' => 'change_owner' )
21810
  private function complete_change_owner() {
21811
  $this->_logger->entrance();
21812
 
21813
+ $site_result = $this->get_api_site_scope( true )->get();
21814
+ $site = new FS_Site( $site_result );
21815
+ $this->_site = $site;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21816
 
21817
+ $user = new FS_User();
21818
+ $user->id = fs_request_get( 'user_id' );
 
 
 
21819
 
21820
  // Validate install's user and given user.
21821
  if ( $user->id != $this->_site->user_id ) {
 
 
21822
  return false;
21823
  }
21824
 
21825
+ $user->public_key = fs_request_get( 'user_public_key' );
21826
+ $user->secret_key = fs_request_get( 'user_secret_key' );
21827
 
21828
  // Fetch new user information.
21829
+ $this->_user = $user;
21830
  $user_result = $this->get_api_user_scope( true )->get();
21831
  $user = new FS_User( $user_result );
21832
  $this->_user = $user;
21833
 
21834
+ $this->_set_account( $user, $site );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21835
 
21836
  return true;
21837
  }
22243
  $state = fs_request_get( 'state', 'init' );
22244
  switch ( $state ) {
22245
  case 'init':
22246
+ $candidate_email = fs_request_get( 'candidate_email', '' );
 
22247
 
22248
+ if ( $this->init_change_owner( $candidate_email ) ) {
22249
+ $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder.', 'change-owner-request-sent-x' ), '<b>' . $this->_user->email . '</b>' ) );
 
 
 
 
22250
  }
22251
  break;
22252
  case 'owner_confirmed':
22269
 
22270
  return;
22271
 
22272
+ case 'update_email':
22273
+ check_admin_referer( 'update_email' );
22274
+
22275
+ $new_email = fs_request_get( 'fs_email_' . $this->get_unique_affix(), '' );
22276
+ $result = $this->update_email( $new_email );
22277
+
22278
+ if ( isset( $result->error ) ) {
22279
+ switch ( $result->error->code ) {
22280
+ case 'user_exist':
22281
+ $this->_admin_notices->add(
22282
+ $this->get_text_inline( 'Sorry, we could not complete the email update. Another user with the same email is already registered.', 'user-exist-message' ) . ' ' .
22283
+ sprintf( $this->get_text_inline( 'If you would like to give up the ownership of the %s\'s account to %s click the Change Ownership button.', 'user-exist-message_ownership' ), $this->_module_type, '<b>' . $new_email . '</b>' ) .
22284
+ sprintf(
22285
+ '<a style="margin-left: 10px;" href="%s"><button class="button button-primary">%s &nbsp;&#10140;</button></a>',
22286
+ $this->get_account_url( 'change_owner', array(
22287
+ 'state' => 'init',
22288
+ 'candidate_email' => $new_email
22289
+ ) ),
22290
+ $this->get_text_inline( 'Change Ownership', 'change-ownership' )
22291
+ ),
22292
+ $oops_text,
22293
+ 'error'
22294
+ );
22295
+ break;
22296
+ }
22297
+ } else {
22298
+ $this->_admin_notices->add( $this->get_text_inline( 'Your email was successfully updated. You should receive an email with confirmation instructions in few moments.', 'email-updated-message' ) );
22299
+ }
22300
+
22301
+ return;
22302
+
22303
  case 'update_user_name':
22304
  check_admin_referer( 'update_user_name' );
22305
 
22562
  }
22563
 
22564
  /* Pricing & Upgrade
22565
+ ------------------------------------------------------------------------------------------------------------------*/
22566
  /**
22567
  * Render pricing page.
22568
  *
22721
  }
22722
 
22723
  /* CSS & JavaScript
22724
+ ------------------------------------------------------------------------------------------------------------------*/
22725
  /* function _enqueue_script($handle, $src) {
22726
+ $url = plugins_url( substr( WP_FS__DIR_JS, strlen( $this->_plugin_dir_path ) ) . '/assets/js/' . $src );
22727
 
22728
+ $this->_logger->entrance( 'script = ' . $url );
22729
 
22730
+ wp_enqueue_script( $handle, $url );
22731
+ }*/
22732
 
22733
  /* SDK
22734
+ ------------------------------------------------------------------------------------------------------------------*/
22735
  private $_user_api;
22736
 
22737
  /**
22743
  *
22744
  * @return FS_Api
22745
  */
22746
+ private function get_api_user_scope( $flush = false ) {
22747
  if ( ! isset( $this->_user_api ) || $flush ) {
22748
  $this->_user_api = $this->get_api_user_scope_by_user( $this->_user );
22749
  }
22822
  $this->_site->public_key,
22823
  ! $this->is_live(),
22824
  $this->_site->secret_key,
22825
+ $this->get_sdk_version()
 
22826
  );
22827
  }
22828
 
22829
  return $this->_site_api;
22830
  }
22831
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22832
  private $_plugin_api;
22833
 
22834
  /**
23264
  }
23265
 
23266
  /* Action Links
23267
+ ------------------------------------------------------------------------------------------------------------------*/
23268
  private $_action_links_hooked = false;
23269
  private $_action_links = array();
23270
 
23451
 
23452
  if (
23453
  $this->is_addon() &&
23454
+ ! $this->is_only_premium() &&
23455
+ $this->_parent->is_anonymous()
23456
  ) {
23457
+ return;
 
 
 
 
23458
  }
23459
 
23460
  if ( fs_is_network_admin() ) {
freemius/includes/class-fs-admin-notices.php CHANGED
@@ -125,10 +125,13 @@
125
  $is_sticky = false,
126
  $id = '',
127
  $store_if_sticky = true,
128
- $network_level_or_blog_id = null,
129
- $is_dimissible = null
130
  ) {
131
- $notices = $this->get_site_or_network_notices( $id, $network_level_or_blog_id );
 
 
 
 
132
 
133
  $notices->add(
134
  $message,
@@ -136,11 +139,7 @@
136
  $type,
137
  $is_sticky,
138
  $id,
139
- $store_if_sticky,
140
- null,
141
- null,
142
- false,
143
- $is_dimissible
144
  );
145
  }
146
 
@@ -150,9 +149,8 @@
150
  *
151
  * @param string|string[] $ids
152
  * @param int|null $network_level_or_blog_id
153
- * @param bool $store
154
  */
155
- function remove_sticky( $ids, $network_level_or_blog_id = null, $store = true ) {
156
  if ( ! is_array( $ids ) ) {
157
  $ids = array( $ids );
158
  }
@@ -163,7 +161,7 @@
163
  $notices = $this->get_site_notices( $network_level_or_blog_id );
164
  }
165
 
166
- return $notices->remove_sticky( $ids, $store );
167
  }
168
 
169
  /**
@@ -178,7 +176,11 @@
178
  * @return bool
179
  */
180
  function has_sticky( $id, $network_level_or_blog_id = null ) {
181
- $notices = $this->get_site_or_network_notices( $id, $network_level_or_blog_id );
 
 
 
 
182
 
183
  return $notices->has_sticky( $id );
184
  }
@@ -198,7 +200,6 @@
198
  * @param string|null $plugin_title
199
  * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network and
200
  * blog admin pages.
201
- * @param bool $is_dismissible
202
  */
203
  function add_sticky(
204
  $message,
@@ -208,30 +209,15 @@
208
  $network_level_or_blog_id = null,
209
  $wp_user_id = null,
210
  $plugin_title = null,
211
- $is_network_and_blog_admins = false,
212
- $is_dismissible = true,
213
- $data = array()
214
  ) {
215
- $notices = $this->get_site_or_network_notices( $id, $network_level_or_blog_id );
216
-
217
- $notices->add_sticky( $message, $id, $title, $type, $wp_user_id, $plugin_title, $is_network_and_blog_admins, $is_dismissible, $data );
218
- }
219
-
220
- /**
221
- * Retrieves the data of a sticky notice.
222
- *
223
- * @author Leo Fajardo (@leorw)
224
- * @since 2.4.3
225
- *
226
- * @param string $id
227
- * @param int|null $network_level_or_blog_id
228
- *
229
- * @return array|null
230
- */
231
- function get_sticky( $id, $network_level_or_blog_id ) {
232
- $notices = $this->get_site_or_network_notices( $id, $network_level_or_blog_id );
233
 
234
- return $notices->get_sticky( $id );
235
  }
236
 
237
  /**
@@ -331,22 +317,5 @@
331
  return fs_is_network_admin();
332
  }
333
 
334
- /**
335
- * Retrieves an instance of FS_Admin_Notice_Manager.
336
- *
337
- * @author Leo Fajardo (@leorw)
338
- * @since 2.5.0
339
- *
340
- * @param string $id
341
- * @param int|null $network_level_or_blog_id
342
- *
343
- * @return FS_Admin_Notice_Manager
344
- */
345
- private function get_site_or_network_notices( $id, $network_level_or_blog_id ) {
346
- return $this->should_use_network_notices( $id, $network_level_or_blog_id ) ?
347
- $this->_network_notices :
348
- $this->get_site_notices( $network_level_or_blog_id );
349
- }
350
-
351
  #endregion
352
  }
125
  $is_sticky = false,
126
  $id = '',
127
  $store_if_sticky = true,
128
+ $network_level_or_blog_id = null
 
129
  ) {
130
+ if ( $this->should_use_network_notices( $id, $network_level_or_blog_id ) ) {
131
+ $notices = $this->_network_notices;
132
+ } else {
133
+ $notices = $this->get_site_notices( $network_level_or_blog_id );
134
+ }
135
 
136
  $notices->add(
137
  $message,
139
  $type,
140
  $is_sticky,
141
  $id,
142
+ $store_if_sticky
 
 
 
 
143
  );
144
  }
145
 
149
  *
150
  * @param string|string[] $ids
151
  * @param int|null $network_level_or_blog_id
 
152
  */
153
+ function remove_sticky( $ids, $network_level_or_blog_id = null ) {
154
  if ( ! is_array( $ids ) ) {
155
  $ids = array( $ids );
156
  }
161
  $notices = $this->get_site_notices( $network_level_or_blog_id );
162
  }
163
 
164
+ return $notices->remove_sticky( $ids );
165
  }
166
 
167
  /**
176
  * @return bool
177
  */
178
  function has_sticky( $id, $network_level_or_blog_id = null ) {
179
+ if ( $this->should_use_network_notices( $id, $network_level_or_blog_id ) ) {
180
+ $notices = $this->_network_notices;
181
+ } else {
182
+ $notices = $this->get_site_notices( $network_level_or_blog_id );
183
+ }
184
 
185
  return $notices->has_sticky( $id );
186
  }
200
  * @param string|null $plugin_title
201
  * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network and
202
  * blog admin pages.
 
203
  */
204
  function add_sticky(
205
  $message,
209
  $network_level_or_blog_id = null,
210
  $wp_user_id = null,
211
  $plugin_title = null,
212
+ $is_network_and_blog_admins = false
 
 
213
  ) {
214
+ if ( $this->should_use_network_notices( $id, $network_level_or_blog_id ) ) {
215
+ $notices = $this->_network_notices;
216
+ } else {
217
+ $notices = $this->get_site_notices( $network_level_or_blog_id );
218
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
219
 
220
+ $notices->add_sticky( $message, $id, $title, $type, $wp_user_id, $plugin_title, $is_network_and_blog_admins );
221
  }
222
 
223
  /**
317
  return fs_is_network_admin();
318
  }
319
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
320
  #endregion
321
  }
freemius/includes/class-fs-api.php CHANGED
@@ -64,14 +64,6 @@
64
  */
65
  private $_sdk_version;
66
 
67
- /**
68
- * @author Leo Fajardo (@leorw)
69
- * @since 2.5.0
70
- *
71
- * @var string
72
- */
73
- private $_url;
74
-
75
  /**
76
  * @param string $slug
77
  * @param string $scope 'app', 'developer', 'user' or 'install'.
@@ -80,7 +72,6 @@
80
  * @param bool $is_sandbox
81
  * @param bool|string $secret_key Element's secret key.
82
  * @param null|string $sdk_version
83
- * @param null|string $url
84
  *
85
  * @return FS_Api
86
  */
@@ -91,15 +82,14 @@
91
  $public_key,
92
  $is_sandbox,
93
  $secret_key = false,
94
- $sdk_version = null,
95
- $url = null
96
  ) {
97
  $identifier = md5( $slug . $scope . $id . $public_key . ( is_string( $secret_key ) ? $secret_key : '' ) . json_encode( $is_sandbox ) );
98
 
99
  if ( ! isset( self::$_instances[ $identifier ] ) ) {
100
  self::_init();
101
 
102
- self::$_instances[ $identifier ] = new FS_Api( $slug, $scope, $id, $public_key, $secret_key, $is_sandbox, $sdk_version, $url );
103
  }
104
 
105
  return self::$_instances[ $identifier ];
@@ -133,7 +123,6 @@
133
  * @param bool|string $secret_key Element's secret key.
134
  * @param bool $is_sandbox
135
  * @param null|string $sdk_version
136
- * @param null|string $url
137
  */
138
  private function __construct(
139
  $slug,
@@ -142,14 +131,12 @@
142
  $public_key,
143
  $secret_key,
144
  $is_sandbox,
145
- $sdk_version,
146
- $url
147
  ) {
148
  $this->_api = new Freemius_Api_WordPress( $scope, $id, $public_key, $secret_key, $is_sandbox );
149
 
150
  $this->_slug = $slug;
151
  $this->_sdk_version = $sdk_version;
152
- $this->_url = $url;
153
  $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $slug . '_api', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK );
154
  }
155
 
@@ -211,17 +198,6 @@
211
  }
212
  }
213
 
214
- /**
215
- * @since 2.5.0 Include the site's URL, if available, in all API requests that are going through the API manager.
216
- */
217
- if ( ! empty( $this->_url ) ) {
218
- if ( false === strpos( $path, 'url=' ) &&
219
- ! isset( $params['url'] )
220
- ) {
221
- $path = add_query_arg( 'url', $this->_url, $path );
222
- }
223
- }
224
-
225
  $result = $this->_api->Api( $path, $method, $params );
226
 
227
  if ( null !== $result &&
64
  */
65
  private $_sdk_version;
66
 
 
 
 
 
 
 
 
 
67
  /**
68
  * @param string $slug
69
  * @param string $scope 'app', 'developer', 'user' or 'install'.
72
  * @param bool $is_sandbox
73
  * @param bool|string $secret_key Element's secret key.
74
  * @param null|string $sdk_version
 
75
  *
76
  * @return FS_Api
77
  */
82
  $public_key,
83
  $is_sandbox,
84
  $secret_key = false,
85
+ $sdk_version = null
 
86
  ) {
87
  $identifier = md5( $slug . $scope . $id . $public_key . ( is_string( $secret_key ) ? $secret_key : '' ) . json_encode( $is_sandbox ) );
88
 
89
  if ( ! isset( self::$_instances[ $identifier ] ) ) {
90
  self::_init();
91
 
92
+ self::$_instances[ $identifier ] = new FS_Api( $slug, $scope, $id, $public_key, $secret_key, $is_sandbox, $sdk_version );
93
  }
94
 
95
  return self::$_instances[ $identifier ];
123
  * @param bool|string $secret_key Element's secret key.
124
  * @param bool $is_sandbox
125
  * @param null|string $sdk_version
 
126
  */
127
  private function __construct(
128
  $slug,
131
  $public_key,
132
  $secret_key,
133
  $is_sandbox,
134
+ $sdk_version
 
135
  ) {
136
  $this->_api = new Freemius_Api_WordPress( $scope, $id, $public_key, $secret_key, $is_sandbox );
137
 
138
  $this->_slug = $slug;
139
  $this->_sdk_version = $sdk_version;
 
140
  $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $slug . '_api', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK );
141
  }
142
 
198
  }
199
  }
200
 
 
 
 
 
 
 
 
 
 
 
 
201
  $result = $this->_api->Api( $path, $method, $params );
202
 
203
  if ( null !== $result &&
freemius/includes/class-fs-plugin-updater.php CHANGED
@@ -240,11 +240,7 @@
240
  * @since 2.0.0
241
  */
242
  private function add_transient_filters() {
243
- if (
244
- $this->_fs->is_premium() &&
245
- $this->_fs->is_registered() &&
246
- ! $this->_fs->is_tracking_allowed()
247
- ) {
248
  $this->_logger->log( 'Opted out sites cannot receive automatic software updates.' );
249
 
250
  return;
@@ -614,9 +610,11 @@
614
  if ( ! isset( $this->_translation_updates ) ) {
615
  $this->_translation_updates = array();
616
 
617
- $translation_updates = $this->fetch_wp_org_module_translation_updates( $module_type, $slug );
618
- if ( ! empty( $translation_updates ) ) {
619
- $this->_translation_updates = $translation_updates;
 
 
620
  }
621
  }
622
 
240
  * @since 2.0.0
241
  */
242
  private function add_transient_filters() {
243
+ if ( $this->_fs->is_premium() && ! $this->_fs->is_tracking_allowed() ) {
 
 
 
 
244
  $this->_logger->log( 'Opted out sites cannot receive automatic software updates.' );
245
 
246
  return;
610
  if ( ! isset( $this->_translation_updates ) ) {
611
  $this->_translation_updates = array();
612
 
613
+ if ( current_user_can( 'update_languages' ) ) {
614
+ $translation_updates = $this->fetch_wp_org_module_translation_updates( $module_type, $slug );
615
+ if ( ! empty( $translation_updates ) ) {
616
+ $this->_translation_updates = $translation_updates;
617
+ }
618
  }
619
  }
620
 
freemius/includes/entities/class-fs-user.php CHANGED
@@ -56,18 +56,7 @@
56
  return ( isset( $this->is_verified ) && true === $this->is_verified );
57
  }
58
 
59
- /**
60
- * @author Leo Fajardo (@leorw)
61
- * @since 2.4.2
62
- *
63
- * @return bool
64
- */
65
- function is_beta() {
66
- // Return `false` since this is just for backward compatibility.
67
- return false;
68
- }
69
-
70
- static function get_type() {
71
  return 'user';
72
  }
73
  }
56
  return ( isset( $this->is_verified ) && true === $this->is_verified );
57
  }
58
 
59
+ static function get_type() {
 
 
 
 
 
 
 
 
 
 
 
60
  return 'user';
61
  }
62
  }
freemius/includes/fs-core-functions.php CHANGED
@@ -1349,7 +1349,7 @@
1349
  function fs_is_plugin_uninstall() {
1350
  return (
1351
  defined( 'WP_UNINSTALL_PLUGIN' ) ||
1352
- ( 0 < did_action( 'pre_uninstall_plugin' ) )
1353
  );
1354
  }
1355
  }
1349
  function fs_is_plugin_uninstall() {
1350
  return (
1351
  defined( 'WP_UNINSTALL_PLUGIN' ) ||
1352
+ ( 0 < did_action( 'update_option_uninstall_plugins' ) )
1353
  );
1354
  }
1355
  }
freemius/includes/fs-plugin-info-dialog.php CHANGED
@@ -1306,8 +1306,8 @@
1306
  <?php endif ?>
1307
  </div>
1308
  </div>
 
1309
  <?php endforeach ?>
1310
- </div>
1311
  <?php endif ?>
1312
  <?php endif ?>
1313
  <div>
1306
  <?php endif ?>
1307
  </div>
1308
  </div>
1309
+ </div>
1310
  <?php endforeach ?>
 
1311
  <?php endif ?>
1312
  <?php endif ?>
1313
  <div>
freemius/includes/managers/class-fs-admin-notice-manager.php CHANGED
@@ -160,10 +160,7 @@
160
  false,
161
  isset( $msg['wp_user_id'] ) ? $msg['wp_user_id'] : null,
162
  ! empty( $msg['plugin'] ) ? $msg['plugin'] : null,
163
- $is_network_and_blog_admins,
164
- isset( $msg['dismissible'] ) ?
165
- $msg['dismissible'] :
166
- null
167
  );
168
  }
169
  }
@@ -178,7 +175,12 @@
178
  *
179
  */
180
  function dismiss_notice_ajax_callback() {
181
- $this->_sticky_storage->remove( $_POST['message_id'] );
 
 
 
 
 
182
  wp_die();
183
  }
184
 
@@ -222,6 +224,9 @@
222
  return;
223
  }
224
 
 
 
 
225
  foreach ( $this->_notices as $id => $msg ) {
226
  if ( isset( $msg['wp_user_id'] ) && is_numeric( $msg['wp_user_id'] ) ) {
227
  if ( get_current_user_id() != $msg['wp_user_id'] ) {
@@ -264,7 +269,7 @@
264
  $show_notice = call_user_func_array( 'fs_apply_filter', array(
265
  $this->_module_unique_affix,
266
  'show_admin_notice',
267
- $this->show_admin_notices(),
268
  $msg
269
  ) );
270
 
@@ -318,30 +323,6 @@
318
  return false;
319
  }
320
 
321
- /**
322
- * Check if admin notices should be shown on page. E.g., we don't want to show notices in the Visual Editor.
323
- *
324
- * @author Xiaheng Chen (@xhchen)
325
- * @since 2.4.2
326
- *
327
- * @return bool
328
- */
329
- function show_admin_notices() {
330
- global $pagenow;
331
-
332
- if ( 'about.php' === $pagenow ) {
333
- // Don't show admin notices on the About page.
334
- return false;
335
- }
336
-
337
- if ( $this->is_gutenberg_page() ) {
338
- // Don't show admin notices in Gutenberg (visual editor).
339
- return false;
340
- }
341
-
342
- return true;
343
- }
344
-
345
  /**
346
  * Add admin message to admin messages queue, and hook to admin_notices / all_admin_notices if not yet hooked.
347
  *
@@ -358,8 +339,6 @@
358
  * @param string|null $plugin_title
359
  * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network
360
  * and blog admin pages.
361
- * @param bool|null $is_dismissible
362
- * @param array $data
363
  *
364
  * @uses add_action()
365
  */
@@ -372,9 +351,7 @@
372
  $store_if_sticky = true,
373
  $wp_user_id = null,
374
  $plugin_title = null,
375
- $is_network_and_blog_admins = false,
376
- $is_dismissible = null,
377
- $data = array()
378
  ) {
379
  $notices_type = $this->get_notices_type();
380
 
@@ -394,16 +371,14 @@
394
  }
395
 
396
  $message_object = array(
397
- 'message' => $message,
398
- 'title' => $title,
399
- 'type' => $type,
400
- 'sticky' => $is_sticky,
401
- 'id' => $id,
402
- 'manager_id' => $this->_id,
403
- 'plugin' => ( ! is_null( $plugin_title ) ? $plugin_title : $this->_title ),
404
- 'wp_user_id' => $wp_user_id,
405
- 'dismissible' => $is_dismissible,
406
- 'data' => $data
407
  );
408
 
409
  if ( $is_sticky && $store_if_sticky ) {
@@ -418,16 +393,15 @@
418
  * @since 1.0.7
419
  *
420
  * @param string|string[] $ids
421
- * @param bool $store
422
  */
423
- function remove_sticky( $ids, $store = true ) {
424
  if ( ! is_array( $ids ) ) {
425
  $ids = array( $ids );
426
  }
427
 
428
  foreach ( $ids as $id ) {
429
  // Remove from sticky storage.
430
- $this->_sticky_storage->remove( $id, $store );
431
 
432
  if ( isset( $this->_notices[ $id ] ) ) {
433
  unset( $this->_notices[ $id ] );
@@ -463,32 +437,14 @@
463
  * @param string|null $plugin_title
464
  * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network
465
  * and blog admin pages.
466
- * @param bool $is_dimissible
467
- * @param array $data
468
  */
469
- function add_sticky( $message, $id, $title = '', $type = 'success', $wp_user_id = null, $plugin_title = null, $is_network_and_blog_admins = false, $is_dimissible = true, $data = array() ) {
470
  if ( ! empty( $this->_module_unique_affix ) ) {
471
  $message = fs_apply_filter( $this->_module_unique_affix, "sticky_message_{$id}", $message );
472
  $title = fs_apply_filter( $this->_module_unique_affix, "sticky_title_{$id}", $title );
473
  }
474
 
475
- $this->add( $message, $title, $type, true, $id, true, $wp_user_id, $plugin_title, $is_network_and_blog_admins, $is_dimissible, $data );
476
- }
477
-
478
- /**
479
- * Retrieves the data of an sticky notice.
480
- *
481
- * @author Leo Fajardo (@leorw)
482
- * @since 2.4.3
483
- *
484
- * @param string $id Message ID.
485
- *
486
- * @return array|null
487
- */
488
- function get_sticky( $id ) {
489
- return isset( $this->_sticky_storage->{$id} ) ?
490
- $this->_sticky_storage->{$id} :
491
- null;
492
  }
493
 
494
  /**
@@ -518,4 +474,4 @@
518
  }
519
 
520
  #endregion
521
- }
160
  false,
161
  isset( $msg['wp_user_id'] ) ? $msg['wp_user_id'] : null,
162
  ! empty( $msg['plugin'] ) ? $msg['plugin'] : null,
163
+ $is_network_and_blog_admins
 
 
 
164
  );
165
  }
166
  }
175
  *
176
  */
177
  function dismiss_notice_ajax_callback() {
178
+ check_admin_referer( 'fs_dismiss_notice_action' );
179
+
180
+ if ( ! is_numeric( $_POST['message_id'] ) ) {
181
+ $this->_sticky_storage->remove( $_POST['message_id'] );
182
+ }
183
+
184
  wp_die();
185
  }
186
 
224
  return;
225
  }
226
 
227
+
228
+ $show_admin_notices = ( ! $this->is_gutenberg_page() );
229
+
230
  foreach ( $this->_notices as $id => $msg ) {
231
  if ( isset( $msg['wp_user_id'] ) && is_numeric( $msg['wp_user_id'] ) ) {
232
  if ( get_current_user_id() != $msg['wp_user_id'] ) {
269
  $show_notice = call_user_func_array( 'fs_apply_filter', array(
270
  $this->_module_unique_affix,
271
  'show_admin_notice',
272
+ $show_admin_notices,
273
  $msg
274
  ) );
275
 
323
  return false;
324
  }
325
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
326
  /**
327
  * Add admin message to admin messages queue, and hook to admin_notices / all_admin_notices if not yet hooked.
328
  *
339
  * @param string|null $plugin_title
340
  * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network
341
  * and blog admin pages.
 
 
342
  *
343
  * @uses add_action()
344
  */
351
  $store_if_sticky = true,
352
  $wp_user_id = null,
353
  $plugin_title = null,
354
+ $is_network_and_blog_admins = false
 
 
355
  ) {
356
  $notices_type = $this->get_notices_type();
357
 
371
  }
372
 
373
  $message_object = array(
374
+ 'message' => $message,
375
+ 'title' => $title,
376
+ 'type' => $type,
377
+ 'sticky' => $is_sticky,
378
+ 'id' => $id,
379
+ 'manager_id' => $this->_id,
380
+ 'plugin' => ( ! is_null( $plugin_title ) ? $plugin_title : $this->_title ),
381
+ 'wp_user_id' => $wp_user_id,
 
 
382
  );
383
 
384
  if ( $is_sticky && $store_if_sticky ) {
393
  * @since 1.0.7
394
  *
395
  * @param string|string[] $ids
 
396
  */
397
+ function remove_sticky( $ids ) {
398
  if ( ! is_array( $ids ) ) {
399
  $ids = array( $ids );
400
  }
401
 
402
  foreach ( $ids as $id ) {
403
  // Remove from sticky storage.
404
+ $this->_sticky_storage->remove( $id );
405
 
406
  if ( isset( $this->_notices[ $id ] ) ) {
407
  unset( $this->_notices[ $id ] );
437
  * @param string|null $plugin_title
438
  * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network
439
  * and blog admin pages.
 
 
440
  */
441
+ function add_sticky( $message, $id, $title = '', $type = 'success', $wp_user_id = null, $plugin_title = null, $is_network_and_blog_admins = false ) {
442
  if ( ! empty( $this->_module_unique_affix ) ) {
443
  $message = fs_apply_filter( $this->_module_unique_affix, "sticky_message_{$id}", $message );
444
  $title = fs_apply_filter( $this->_module_unique_affix, "sticky_title_{$id}", $title );
445
  }
446
 
447
+ $this->add( $message, $title, $type, true, $id, true, $wp_user_id, $plugin_title, $is_network_and_blog_admins );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
448
  }
449
 
450
  /**
474
  }
475
 
476
  #endregion
477
+ }
freemius/includes/managers/class-fs-clone-manager.php DELETED
@@ -1,1480 +0,0 @@
1
- <?php
2
- /**
3
- * @package Freemius
4
- * @copyright Copyright (c) 2015, Freemius, Inc.
5
- * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6
- * @author Leo Fajardo (@leorw)
7
- * @since 2.5.0
8
- */
9
-
10
- if ( ! defined( 'ABSPATH' ) ) {
11
- exit;
12
- }
13
-
14
- /**
15
- * Manages the detection of clones and provides the logged-in WordPress user with options for manually resolving them.
16
- *
17
- * @since 2.5.0
18
- *
19
- * @property int $clone_identification_timestamp
20
- * @property int $temporary_duplicate_mode_selection_timestamp
21
- * @property int $temporary_duplicate_notice_shown_timestamp
22
- * @property string $request_handler_id
23
- * @property int $request_handler_timestamp
24
- * @property int $request_handler_retries_count
25
- */
26
- class FS_Clone_Manager {
27
- /**
28
- * @var FS_Option_Manager
29
- */
30
- private $_storage;
31
- /**
32
- * @var FS_Option_Manager
33
- */
34
- private $_network_storage;
35
- /**
36
- * @var array {
37
- * @type int $clone_identification_timestamp
38
- * @type int $temporary_duplicate_mode_selection_timestamp
39
- * @type int $temporary_duplicate_notice_shown_timestamp
40
- * @type string $request_handler_id
41
- * @type int $request_handler_timestamp
42
- * @type int $request_handler_retries_count
43
- * }
44
- */
45
- private $_data;
46
- /**
47
- * @var array {
48
- * @type array $new_blog_install_map
49
- * }
50
- */
51
- private $_network_data;
52
- /**
53
- * @var FS_Admin_Notices
54
- */
55
- private $_notices;
56
- /**
57
- * @var FS_Logger
58
- */
59
- protected $_logger;
60
-
61
- /**
62
- * @var int 3 minutes
63
- */
64
- const CLONE_RESOLUTION_MAX_EXECUTION_TIME = 180;
65
- /**
66
- * @var int
67
- */
68
- const CLONE_RESOLUTION_MAX_RETRIES = 3;
69
- /**
70
- * @var int
71
- */
72
- const TEMPORARY_DUPLICATE_PERIOD = WP_FS__TIME_WEEK_IN_SEC * 2;
73
- /**
74
- * @var string
75
- */
76
- const OPTION_NAME = 'clone_resolution';
77
- /**
78
- * @var string
79
- */
80
- const OPTION_MANAGER_NAME = 'clone_management';
81
- /**
82
- * @var string
83
- */
84
- const OPTION_TEMPORARY_DUPLICATE = 'temporary_duplicate';
85
- /**
86
- * @var string
87
- */
88
- const OPTION_NEW_HOME = 'new_home';
89
-
90
- #--------------------------------------------------------------------------------
91
- #region Singleton
92
- #--------------------------------------------------------------------------------
93
-
94
- /**
95
- * @var FS_Clone_Manager
96
- */
97
- private static $_instance;
98
-
99
- /**
100
- * @return FS_Clone_Manager
101
- */
102
- static function instance() {
103
- if ( ! isset( self::$_instance ) ) {
104
- self::$_instance = new self();
105
- }
106
-
107
- return self::$_instance;
108
- }
109
-
110
- #endregion
111
-
112
- private function __construct() {
113
- $this->_storage = FS_Option_Manager::get_manager( WP_FS___OPTION_PREFIX . self::OPTION_MANAGER_NAME, true );
114
- $this->_network_storage = FS_Option_Manager::get_manager( WP_FS___OPTION_PREFIX . self::OPTION_MANAGER_NAME, true, true );
115
- $this->_data = $this->_storage->get_option( self::OPTION_NAME, array() );
116
- $this->_network_data = $this->_network_storage->get_option( self::OPTION_NAME, array() );
117
-
118
- $this->_notices = FS_Admin_Notices::instance( 'global_clone_resolution_notices', '', '', true );
119
- $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . '_clone_manager', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK );
120
-
121
- $defaults = array(
122
- 'clone_identification_timestamp' => null,
123
- 'temporary_duplicate_mode_selection_timestamp' => null,
124
- 'temporary_duplicate_notice_shown_timestamp' => null,
125
- 'request_handler_id' => null,
126
- 'request_handler_timestamp' => null,
127
- 'request_handler_retries_count' => null,
128
- );
129
-
130
- if ( ! is_array( $this->_data ) ) {
131
- $this->_data = $defaults;
132
- } else {
133
- foreach ( $defaults as $name => $value ) {
134
- $this->_data[ $name ] = isset( $this->_data[ $name ] ) ?
135
- $this->_data[ $name ] :
136
- $value;
137
- }
138
- }
139
-
140
- if (
141
- ! is_array( $this->_network_data ) ||
142
- ! isset( $this->_network_data['new_blog_install_map'] )
143
- ) {
144
- $this->_network_data = array( 'new_blog_install_map' => null );
145
- }
146
- }
147
-
148
- /**
149
- * @author Leo Fajardo (@leorw)
150
- * @since 2.5.0
151
- */
152
- function _init() {
153
- if ( is_admin() ) {
154
- if ( Freemius::is_admin_post() ) {
155
- add_action( 'admin_post_fs_clone_resolution', array( $this, '_handle_clone_resolution' ) );
156
- }
157
-
158
- if (
159
- empty( $this->get_clone_identification_timestamp() ) &&
160
- (
161
- ! fs_is_network_admin() ||
162
- ! ( $this->is_clone_resolution_options_notice_shown() || $this->is_temporary_duplicate_notice_shown() )
163
- )
164
- ) {
165
- $this->hide_clone_admin_notices();
166
- } else {
167
- if ( Freemius::is_ajax() ) {
168
- Freemius::add_ajax_action_static( 'handle_clone_resolution', array( $this, '_clone_resolution_action_ajax_handler' ) );
169
- } else if ( ! Freemius::is_cron() && ! Freemius::is_admin_post() ) {
170
- $this->maybe_show_clone_admin_notice();
171
-
172
- add_action( 'admin_footer', array( $this, '_add_clone_resolution_javascript' ) );
173
- }
174
- }
175
- }
176
- }
177
-
178
- /**
179
- * Retrieves the timestamp that was stored when a clone was identified.
180
- *
181
- * @return int|null
182
- */
183
- function get_clone_identification_timestamp() {
184
- return $this->clone_identification_timestamp;
185
- }
186
-
187
- /**
188
- * Stores the time when a clone was identified.
189
- */
190
- function store_clone_identification_timestamp() {
191
- $this->clone_identification_timestamp = time();
192
- }
193
-
194
- /**
195
- * Retrieves the timestamp for the temporary duplicate mode's expiration.
196
- *
197
- * @return int
198
- */
199
- function get_temporary_duplicate_expiration_timestamp() {
200
- $temporary_duplicate_mode_start_timestamp = $this->was_temporary_duplicate_mode_selected() ?
201
- $this->temporary_duplicate_mode_selection_timestamp :
202
- $this->get_clone_identification_timestamp();
203
-
204
- return ( $temporary_duplicate_mode_start_timestamp + self::TEMPORARY_DUPLICATE_PERIOD );
205
- }
206
-
207
- /**
208
- * Determines if the SDK should handle clones. The SDK handles clones only up to 3 times with 3 min interval.
209
- *
210
- * @return bool
211
- */
212
- private function should_handle_clones() {
213
- if ( ! isset( $this->request_handler_timestamp ) ) {
214
- return true;
215
- }
216
-
217
- if ( $this->request_handler_retries_count >= self::CLONE_RESOLUTION_MAX_RETRIES ) {
218
- return false;
219
- }
220
-
221
- // Give the logic that handles clones enough time to finish (it is given 3 minutes for now).
222
- return ( time() > ( $this->request_handler_timestamp + self::CLONE_RESOLUTION_MAX_EXECUTION_TIME ) );
223
- }
224
-
225
- /**
226
- * Executes the clones handler logic if it should be executed, i.e., based on the return value of the should_handle_clones() method.
227
- *
228
- * @author Leo Fajardo (@leorw)
229
- * @since 2.5.0
230
- */
231
- function maybe_run_clone_resolution() {
232
- if ( ! $this->should_handle_clones() ) {
233
- return;
234
- }
235
-
236
- $this->request_handler_retries_count = isset( $this->request_handler_retries_count ) ?
237
- ( $this->request_handler_retries_count + 1 ) :
238
- 1;
239
-
240
- $this->request_handler_timestamp = time();
241
-
242
- $handler_id = ( rand() . microtime() );
243
- $this->request_handler_id = $handler_id;
244
-
245
- // Add cookies to trigger request with the same user access permissions.
246
- $cookies = array();
247
- foreach ( $_COOKIE as $name => $value ) {
248
- $cookies[] = new WP_Http_Cookie( array(
249
- 'name' => $name,
250
- 'value' => $value,
251
- ) );
252
- }
253
-
254
- wp_remote_post(
255
- admin_url( 'admin-post.php' ),
256
- array(
257
- 'method' => 'POST',
258
- 'body' => array(
259
- 'action' => 'fs_clone_resolution',
260
- 'handler_id' => $handler_id,
261
- ),
262
- 'timeout' => 0.01,
263
- 'blocking' => false,
264
- 'sslverify' => false,
265
- 'cookies' => $cookies,
266
- )
267
- );
268
- }
269
-
270
- /**
271
- * Executes the clones handler logic.
272
- *
273
- * @author Leo Fajardo (@leorw)
274
- * @since 2.5.0
275
- */
276
- function _handle_clone_resolution() {
277
- $handler_id = fs_request_get( 'handler_id' );
278
-
279
- if ( empty( $handler_id ) ) {
280
- return;
281
- }
282
-
283
- if (
284
- ! isset( $this->request_handler_id ) ||
285
- $this->request_handler_id !== $handler_id
286
- ) {
287
- return;
288
- }
289
-
290
- if ( ! $this->try_automatic_resolution() ) {
291
- $this->store_clone_identification_timestamp();
292
- $this->clear_temporary_duplicate_notice_shown_timestamp();
293
- }
294
- }
295
-
296
- #--------------------------------------------------------------------------------
297
- #region Automatic Clone Resolution
298
- #--------------------------------------------------------------------------------
299
-
300
- /**
301
- * @var array All installs cache.
302
- */
303
- private $all_installs;
304
-
305
- /**
306
- * Checks if a given instance's install is a clone of another subsite in the network.
307
- *
308
- * @author Vova Feldman (@svovaf)
309
- *
310
- * @return FS_Site
311
- */
312
- private function find_network_subsite_clone_install( Freemius $instance ) {
313
- if ( ! is_multisite() ) {
314
- // Not a multi-site network.
315
- return null;
316
- }
317
-
318
- if ( ! isset( $this->all_installs ) ) {
319
- $this->all_installs = Freemius::get_all_modules_sites();
320
- }
321
-
322
- // Check if there's another blog that has the same site.
323
- $module_type = $instance->get_module_type();
324
- $sites_by_module_type = ! empty( $this->all_installs[ $module_type ] ) ?
325
- $this->all_installs[ $module_type ] :
326
- array();
327
-
328
- $slug = $instance->get_slug();
329
- $sites_by_slug = ! empty( $sites_by_module_type[ $slug ] ) ?
330
- $sites_by_module_type[ $slug ] :
331
- array();
332
-
333
- $current_blog_id = get_current_blog_id();
334
-
335
- $current_install = $instance->get_site();
336
-
337
- foreach ( $sites_by_slug as $site ) {
338
- if (
339
- $current_install->id == $site->id &&
340
- $current_blog_id != $site->blog_id
341
- ) {
342
- // Clone is identical to an install on another subsite in the network.
343
- return $site;
344
- }
345
- }
346
-
347
- return null;
348
- }
349
-
350
- /**
351
- * Tries to find a different install of the context product that is associated with the current URL and loads it.
352
- *
353
- * @author Leo Fajardo (@leorw)
354
- * @since 2.5.0
355
- *
356
- * @param Freemius $instance
357
- * @param string $url
358
- *
359
- * @return object
360
- */
361
- private function find_other_install_by_url( Freemius $instance, $url ) {
362
- $result = $instance->get_api_user_scope()->get( "/plugins/{$instance->get_id()}/installs.json?search=" . urlencode( $url ) . "&all=true", true );
363
-
364
- $current_install = $instance->get_site();
365
-
366
- if ( $instance->is_api_result_object( $result, 'installs' ) ) {
367
- foreach ( $result->installs as $install ) {
368
- if ( $install->id == $current_install->id ) {
369
- continue;
370
- }
371
-
372
- if (
373
- $instance->is_only_premium() &&
374
- ! FS_Plugin_License::is_valid_id( $install->license_id )
375
- ) {
376
- continue;
377
- }
378
-
379
- // When searching for installs by a URL, the API will first strip any paths and search for any matching installs by the subdomain. Therefore, we need to test if there's a match between the current URL and the install's URL before continuing.
380
- if ( $url !== fs_strip_url_protocol( untrailingslashit( $install->url ) ) ) {
381
- continue;
382
- }
383
-
384
- // Found a different install that is associated with the current URL, load it and replace the current install with it if no updated install is found.
385
- return $install;
386
- }
387
- }
388
-
389
- return null;
390
- }
391
-
392
- /**
393
- * Delete the current install associated with a given instance and opt-in/activate-license to create a fresh install.
394
- *
395
- * @author Vova Feldman (@svovaf)
396
- * @since 2.5.0
397
- *
398
- * @param Freemius $instance
399
- * @param string|false $license_key
400
- *
401
- * @return bool TRUE if successfully connected. FALSE if failed and had to restore install from backup.
402
- */
403
- private function delete_install_and_connect( Freemius $instance, $license_key = false ) {
404
- $user = Freemius::_get_user_by_id( $instance->get_site()->user_id );
405
-
406
- $instance->delete_current_install( true );
407
-
408
- if ( ! is_object( $user ) ) {
409
- // Get logged-in WordPress user.
410
- $current_user = Freemius::_get_current_wp_user();
411
-
412
- // Find the relevant FS user by email address.
413
- $user = Freemius::_get_user_by_email( $current_user->user_email );
414
- }
415
-
416
- if ( is_object( $user ) ) {
417
- // When a clone is found, we prefer to use the same user of the original install for the opt-in.
418
- $instance->install_with_user( $user, $license_key, false, false );
419
- } else {
420
- // If no user is found, activate with the license.
421
- $instance->opt_in(
422
- false,
423
- false,
424
- false,
425
- $license_key
426
- );
427
- }
428
-
429
- if ( is_object( $instance->get_site() ) ) {
430
- // Install successfully created.
431
- return true;
432
- }
433
-
434
- // Restore from backup.
435
- $instance->restore_backup_site();
436
-
437
- return false;
438
- }
439
-
440
- /**
441
- * Try to resolve the clone situation automatically.
442
- *
443
- * @param Freemius $instance
444
- * @param string $current_url
445
- * @param bool $is_localhost
446
- * @param bool|null $is_clone_of_network_subsite
447
- *
448
- * @return bool If managed to automatically resolve the clone.
449
- */
450
- private function try_resolve_clone_automatically( Freemius $instance, $current_url, $is_localhost, $is_clone_of_network_subsite = null ) {
451
- // Try to find a different install of the context product that is associated with the current URL.
452
- $associated_install = $this->find_other_install_by_url( $instance, $current_url );
453
-
454
- if ( is_object( $associated_install ) ) {
455
- // Replace the current install with a different install that is associated with the current URL.
456
- $instance->store_site( new FS_Site( clone $associated_install ) );
457
- $instance->sync_install( array( 'is_new_site' => true ), true );
458
-
459
- return true;
460
- }
461
-
462
- if ( ! $instance->is_premium() ) {
463
- // For free products, opt-in with the context user to create new install.
464
- return $this->delete_install_and_connect( $instance );
465
- }
466
-
467
- $license = $instance->_get_license();
468
- $can_activate_license = ( is_object( $license ) && ! $license->is_utilized( $is_localhost ) );
469
-
470
- if ( ! $can_activate_license ) {
471
- // License can't be activated, therefore, can't be automatically resolved.
472
- return false;
473
- }
474
-
475
- $is_clone_of_network_subsite = ( ! is_null( $is_clone_of_network_subsite ) ) ?
476
- $is_clone_of_network_subsite :
477
- is_object( $this->find_network_subsite_clone_install( $instance ) );
478
-
479
- if (
480
- $is_clone_of_network_subsite ||
481
- WP_FS__IS_LOCALHOST_FOR_SERVER ||
482
- $is_localhost
483
- ) {
484
- // If the site is a clone of another subsite in the network, or a localhost one, try to auto activate the license.
485
- return $this->delete_install_and_connect( $instance, $license->secret_key );
486
- }
487
-
488
- return false;
489
- }
490
-
491
- /**
492
- * Tries to recover the install of a newly created subsite or resolve it if it's a clone.
493
- *
494
- * @author Leo Fajardo (@leorw)
495
- * @since 2.5.0
496
- *
497
- * @param Freemius $instance
498
- */
499
- function maybe_resolve_new_subsite_install_automatically( Freemius $instance ) {
500
- if ( ! $instance->is_user_in_admin() ) {
501
- // Try to recover an install or resolve a clone only when there's a user in admin to prevent doing it prematurely (e.g., the install can get replaced with clone data again).
502
- return;
503
- }
504
-
505
- if ( ! is_multisite() ) {
506
- return;
507
- }
508
-
509
- $new_blog_install_map = $this->new_blog_install_map;
510
-
511
- if ( empty( $new_blog_install_map ) || ! is_array( $new_blog_install_map ) ) {
512
- return;
513
- }
514
-
515
- $is_network_admin = fs_is_network_admin();
516
-
517
- if ( ! $is_network_admin ) {
518
- // If not in network admin, handle the current site.
519
- $blog_id = get_current_blog_id();
520
- } else {
521
- // If in network admin, handle only the first site.
522
- $blog_ids = array_keys( $new_blog_install_map );
523
- $blog_id = $blog_ids[0];
524
- }
525
-
526
- if ( ! isset( $new_blog_install_map[ $blog_id ] ) ) {
527
- // There's no site to handle.
528
- return;
529
- }
530
-
531
- $expected_install_id = $new_blog_install_map[ $blog_id ]['install_id'];
532
-
533
- $current_install = $instance->get_install_by_blog_id( $blog_id );
534
- $current_install_id = is_object( $current_install ) ?
535
- $current_install->id :
536
- null;
537
-
538
- if ( $expected_install_id == $current_install_id ) {
539
- // Remove the current site's information from the map to prevent handling it again.
540
- $this->remove_new_blog_install_info_from_storage( $blog_id );
541
-
542
- return;
543
- }
544
-
545
- $instance->switch_to_blog( $blog_id );
546
-
547
- $current_url = fs_strip_url_protocol( untrailingslashit( get_site_url() ) );
548
- $current_install_url = is_object( $current_install ) ?
549
- fs_strip_url_protocol( untrailingslashit( $current_install->url ) ) :
550
- null;
551
-
552
- // This can be `false` even if the install is a clone as the URL can be updated as part of the cloning process.
553
- $is_clone = ( ! is_null( $current_install_url ) && $current_url !== $current_install_url );
554
-
555
- if ( ! FS_Site::is_valid_id( $expected_install_id ) ) {
556
- $expected_install = null;
557
- } else {
558
- $expected_install = $instance->fetch_install_by_id( $expected_install_id );
559
- }
560
-
561
- if ( FS_Api::is_api_result_entity( $expected_install ) ) {
562
- // Replace the current install with the expected install.
563
- $instance->store_site( new FS_Site( clone $expected_install ) );
564
- $instance->sync_install( array( 'is_new_site' => true ), true );
565
- } else {
566
- $network_subsite_clone_install = null;
567
-
568
- if ( ! $is_clone ) {
569
- // It is possible that `$is_clone` is `false` but the install is actually a clone as the following call checks the install ID and not the URL.
570
- $network_subsite_clone_install = $this->find_network_subsite_clone_install( $instance );
571
- }
572
-
573
- if ( $is_clone || is_object( $network_subsite_clone_install ) ) {
574
- // If there's no expected install (or it couldn't be fetched) and the current install is a clone, try to resolve the clone automatically.
575
- $is_localhost = FS_Site::is_localhost_by_address( $current_url );
576
-
577
- $resolved = $this->try_resolve_clone_automatically( $instance, $current_url, $is_localhost, is_object( $network_subsite_clone_install ) );
578
-
579
- if ( ! $resolved && is_object( $network_subsite_clone_install ) ) {
580
- if ( empty( $this->get_clone_identification_timestamp() ) ) {
581
- $this->store_clone_identification_timestamp();
582
- }
583
-
584
- // Since the clone couldn't be identified based on the URL, replace the stored install with the cloned install so that the manual clone resolution notice will appear.
585
- $instance->store_site( clone $network_subsite_clone_install );
586
- }
587
- }
588
- }
589
-
590
- $instance->restore_current_blog();
591
-
592
- // Remove the current site's information from the map to prevent handling it again.
593
- $this->remove_new_blog_install_info_from_storage( $blog_id );
594
- }
595
-
596
- /**
597
- * If a new install was created after creating a new subsite, its ID is stored in the blog-install map so that it can be recovered in case it's replaced with a clone install (e.g., when the newly created subsite is a clone).
598
- *
599
- * @author Leo Fajardo (@leorw)
600
- * @since 2.5.0
601
- *
602
- * @param int $blog_id
603
- * @param FS_Site $site
604
- */
605
- function store_new_blog_install_info( $blog_id, $site = null ) {
606
- $new_blog_install_map = $this->new_blog_install_map;
607
-
608
- if (
609
- empty( $new_blog_install_map ) ||
610
- ! is_array( $new_blog_install_map )
611
- ) {
612
- $new_blog_install_map = array();
613
- }
614
-
615
- $install_id = null;
616
-
617
- if ( is_object( $site ) ) {
618
- $install_id = $site->id;
619
- }
620
-
621
- $new_blog_install_map[ $blog_id ] = array( 'install_id' => $install_id );
622
-
623
- $this->new_blog_install_map = $new_blog_install_map;
624
- }
625
-
626
- /**
627
- * @author Leo Fajardo (@leorw)
628
- * @since 2.5.0
629
- *
630
- * @param int $blog_id
631
- */
632
- private function remove_new_blog_install_info_from_storage( $blog_id ) {
633
- $new_blog_install_map = $this->new_blog_install_map;
634
-
635
- unset( $new_blog_install_map[ $blog_id ] );
636
- $this->new_blog_install_map = $new_blog_install_map;
637
- }
638
-
639
- /**
640
- * Tries to resolve all clones automatically.
641
- *
642
- * @author Leo Fajardo (@leorw)
643
- * @since 2.5.0
644
- *
645
- * @return bool If managed to automatically resolve all clones.
646
- */
647
- private function try_automatic_resolution() {
648
- $this->_logger->entrance();
649
-
650
- $current_url = fs_strip_url_protocol( untrailingslashit( get_site_url() ) );
651
- $is_localhost = FS_Site::is_localhost_by_address( $current_url );
652
-
653
- $require_manual_resolution = false;
654
-
655
- $instances = Freemius::_get_all_instances();
656
-
657
- foreach ( $instances as $instance ) {
658
- if ( ! $instance->is_registered() ) {
659
- continue;
660
- }
661
-
662
- if ( ! $instance->is_clone() ) {
663
- continue;
664
- }
665
-
666
- if ( ! $this->try_resolve_clone_automatically( $instance, $current_url, $is_localhost ) ) {
667
- $require_manual_resolution = true;
668
- }
669
- }
670
-
671
- return ( ! $require_manual_resolution );
672
- }
673
-
674
- #endregion
675
-
676
- #--------------------------------------------------------------------------------
677
- #region Manual Clone Resolution
678
- #--------------------------------------------------------------------------------
679
-
680
- /**
681
- * @author Leo Fajardo (@leorw)
682
- * @since 2.5.0
683
- */
684
- function _add_clone_resolution_javascript() {
685
- $vars = array( 'ajax_action' => Freemius::get_ajax_action_static( 'handle_clone_resolution' ) );
686
-
687
- fs_require_once_template( 'clone-resolution-js.php', $vars );
688
- }
689
-
690
- /**
691
- * @author Leo Fajardo (@leorw)
692
- * @since 2.5.0
693
- */
694
- function _clone_resolution_action_ajax_handler() {
695
- $this->_logger->entrance();
696
-
697
- check_ajax_referer( Freemius::get_ajax_action_static( 'handle_clone_resolution' ), 'security' );
698
-
699
- $clone_action = fs_request_get( 'clone_action' );
700
-
701
- if ( empty( $clone_action ) ) {
702
- Freemius::shoot_ajax_failure( array(
703
- 'message' => fs_text_inline( 'Invalid clone resolution action.', 'invalid-clone-resolution-action-error' ),
704
- 'redirect_url' => '',
705
- ) );
706
- }
707
-
708
- $result = array();
709
-
710
- if ( self::OPTION_TEMPORARY_DUPLICATE === $clone_action ) {
711
- $this->store_temporary_duplicate_timestamp();
712
- } else {
713
- $result = $this->resolve_cloned_sites( $clone_action );
714
- }
715
-
716
- if ( 'temporary_duplicate_license_activation' !== $clone_action ) {
717
- $this->remove_clone_resolution_options_notice();
718
- } else {
719
- $this->remove_temporary_duplicate_notice();
720
- }
721
-
722
- Freemius::shoot_ajax_success( $result );
723
- }
724
-
725
- /**
726
- * @author Leo Fajardo (@leorw)
727
- * @since 2.5.0
728
- *
729
- * @param string $clone_action
730
- */
731
- private function resolve_cloned_sites( $clone_action ) {
732
- $this->_logger->entrance();
733
-
734
- $instances_with_clone_count = 0;
735
- $instance_with_error = null;
736
- $has_error = false;
737
-
738
- $instances = Freemius::_get_all_instances();
739
-
740
- foreach ( $instances as $instance ) {
741
- if ( ! $instance->is_registered() ) {
742
- continue;
743
- }
744
-
745
- if ( ! $instance->is_clone() ) {
746
- continue;
747
- }
748
-
749
- $instances_with_clone_count ++;
750
-
751
- if ( FS_Clone_Manager::OPTION_NEW_HOME === $clone_action ) {
752
- $instance->sync_install( array( 'is_new_site' => true ), true );
753
- } else {
754
- $instance->_handle_long_term_duplicate();
755
-
756
- if ( ! is_object( $instance->get_site() ) ) {
757
- $has_error = true;
758
-
759
- if ( ! is_object( $instance_with_error ) ) {
760
- $instance_with_error = $instance;
761
- }
762
- }
763
- }
764
- }
765
-
766
- $redirect_url = '';
767
-
768
- if (
769
- 1 === $instances_with_clone_count &&
770
- $has_error
771
- ) {
772
- $redirect_url = $instance_with_error->get_activation_url();
773
- }
774
-
775
- return ( array( 'redirect_url' => $redirect_url ) );
776
- }
777
-
778
- /**
779
- * @author Leo Fajardo (@leorw)
780
- * @since 2.5.0
781
- */
782
- private function hide_clone_admin_notices() {
783
- $this->remove_clone_resolution_options_notice( false );
784
- $this->remove_temporary_duplicate_notice( false );
785
- }
786
-
787
- /**
788
- * @author Leo Fajardo (@leorw)
789
- * @since 2.5.0
790
- */
791
- private function maybe_show_clone_admin_notice() {
792
- $this->_logger->entrance();
793
-
794
- if ( fs_is_network_admin() ) {
795
- $existing_notice_ids = $this->maybe_remove_notices();
796
-
797
- if ( ! empty( $existing_notice_ids ) ) {
798
- fs_enqueue_local_style( 'fs_clone_resolution_notice', '/admin/clone-resolution.css' );
799
- }
800
-
801
- return;
802
- }
803
-
804
- $first_instance_with_clone = null;
805
-
806
- $site_urls = array();
807
- $sites_with_license_urls = array();
808
- $sites_with_premium_version_count = 0;
809
- $product_ids = array();
810
- $product_titles = array();
811
-
812
- $instances = Freemius::_get_all_instances();
813
-
814
- foreach ( $instances as $instance ) {
815
- if ( ! $instance->is_registered() ) {
816
- continue;
817
- }
818
-
819
- if ( ! $instance->is_clone() ) {
820
- continue;
821
- }
822
-
823
- $install = $instance->get_site();
824
-
825
- $site_urls[] = $install->url;
826
- $product_ids[] = $instance->get_id();
827
- $product_titles[] = $instance->get_plugin_title();
828
-
829
- if ( is_null( $first_instance_with_clone ) ) {
830
- $first_instance_with_clone = $instance;
831
- }
832
-
833
- if ( is_object( $instance->_get_license() ) ) {
834
- $sites_with_license_urls[] = $install->url;
835
- }
836
-
837
- if ( $instance->is_premium() ) {
838
- $sites_with_premium_version_count ++;
839
- }
840
- }
841
-
842
- if ( empty( $site_urls ) && empty( $sites_with_license_urls ) ) {
843
- $this->hide_clone_admin_notices();
844
-
845
- return;
846
- }
847
-
848
- $site_urls = array_unique( $site_urls );
849
- $sites_with_license_urls = array_unique( $sites_with_license_urls );
850
-
851
- $module_label = fs_text_inline( 'products', 'products' );
852
- $admin_notice_module_title = null;
853
-
854
- $has_temporary_duplicate_mode_expired = $this->has_temporary_duplicate_mode_expired();
855
-
856
- if (
857
- ! $this->was_temporary_duplicate_mode_selected() ||
858
- $has_temporary_duplicate_mode_expired
859
- ) {
860
- if ( ! empty( $site_urls ) ) {
861
- fs_enqueue_local_style( 'fs_clone_resolution_notice', '/admin/clone-resolution.css' );
862
-
863
- $doc_url = 'https://freemius.com/help/documentation/wordpress-sdk/safe-mode-clone-resolution-duplicate-website/';
864
-
865
- if ( 1 === count( $instances ) ) {
866
- $doc_url = fs_apply_filter(
867
- $first_instance_with_clone->get_unique_affix(),
868
- 'clone_resolution_documentation_url',
869
- $doc_url
870
- );
871
- }
872
-
873
- $this->add_manual_clone_resolution_admin_notice(
874
- $product_ids,
875
- $product_titles,
876
- $site_urls,
877
- get_site_url(),
878
- ( count( $site_urls ) === count( $sites_with_license_urls ) ),
879
- ( count( $site_urls ) === $sites_with_premium_version_count ),
880
- $doc_url
881
- );
882
- }
883
-
884
- return;
885
- }
886
-
887
- if ( empty( $sites_with_license_urls ) ) {
888
- return;
889
- }
890
-
891
- if ( ! $this->is_temporary_duplicate_notice_shown() ) {
892
- $last_time_temporary_duplicate_notice_shown = $this->last_time_temporary_duplicate_notice_was_shown();
893
- $was_temporary_duplicate_notice_shown_before = is_numeric( $last_time_temporary_duplicate_notice_shown );
894
-
895
- if ( $was_temporary_duplicate_notice_shown_before ) {
896
- $temporary_duplicate_mode_expiration_timestamp = $this->get_temporary_duplicate_expiration_timestamp();
897
- $current_time = time();
898
-
899
- if (
900
- $current_time > $temporary_duplicate_mode_expiration_timestamp ||
901
- $current_time < ( $temporary_duplicate_mode_expiration_timestamp - ( 2 * WP_FS__TIME_24_HOURS_IN_SEC ) )
902
- ) {
903
- // Do not show the notice if the temporary duplicate mode has already expired or it will expire more than 2 days from now.
904
- return;
905
- }
906
- }
907
- }
908
-
909
- if ( 1 === count( $sites_with_license_urls ) ) {
910
- $module_label = $first_instance_with_clone->get_module_label( true );
911
- $admin_notice_module_title = $first_instance_with_clone->get_plugin_title();
912
- }
913
-
914
- fs_enqueue_local_style( 'fs_clone_resolution_notice', '/admin/clone-resolution.css' );
915
-
916
- $this->add_temporary_duplicate_sticky_notice(
917
- $product_ids,
918
- $this->get_temporary_duplicate_admin_notice_string( $sites_with_license_urls, $product_titles, $module_label ),
919
- $admin_notice_module_title
920
- );
921
- }
922
-
923
- /**
924
- * Removes the notices from the storage if the context product is either no longer active on the context subsite or it's active but there's no longer any clone. This prevents the notices from being shown on the network-level admin page when they are no longer relevant.
925
- *
926
- * @author Leo Fajardo (@leorw)
927
- * @since 2.5.1
928
- *
929
- * @return string[]
930
- */
931
- private function maybe_remove_notices() {
932
- $notices = array(
933
- 'clone_resolution_options_notice' => $this->_notices->get_sticky( 'clone_resolution_options_notice', true ),
934
- 'temporary_duplicate_notice' => $this->_notices->get_sticky( 'temporary_duplicate_notice', true ),
935
- );
936
-
937
- $instances = Freemius::_get_all_instances();
938
-
939
- foreach ( $notices as $id => $notice ) {
940
- if ( ! is_array( $notice ) ) {
941
- unset( $notices[ $id ] );
942
- continue;
943
- }
944
-
945
- if ( empty( $notice['data'] ) || ! is_array( $notice['data'] ) ) {
946
- continue;
947
- }
948
-
949
- if ( empty( $notice['data']['product_ids'] ) || empty( $notice['data']['blog_id'] ) ) {
950
- continue;
951
- }
952
-
953
- $product_ids = $notice['data']['product_ids'];
954
- $blog_id = $notice['data']['blog_id'];
955
- $has_clone = false;
956
-
957
- if ( ! is_null( get_site( $blog_id ) ) ) {
958
- foreach ( $product_ids as $product_id ) {
959
- if ( ! isset( $instances[ 'm_' . $product_id ] ) ) {
960
- continue;
961
- }
962
-
963
- $instance = $instances[ 'm_' . $product_id ];
964
-
965
- $plugin_basename = $instance->get_plugin_basename();
966
-
967
- $is_plugin_active = is_plugin_active_for_network( $plugin_basename );
968
-
969
- if ( ! $is_plugin_active ) {
970
- switch_to_blog( $blog_id );
971
-
972
- $is_plugin_active = is_plugin_active( $plugin_basename );
973
-
974
- restore_current_blog();
975
- }
976
-
977
- if ( ! $is_plugin_active ) {
978
- continue;
979
- }
980
-
981
- $install = $instance->get_install_by_blog_id( $blog_id );
982
-
983
- if ( ! is_object( $install ) ) {
984
- continue;
985
- }
986
-
987
- $subsite_url = trailingslashit( get_site_url( $blog_id ) );
988
- $install_url = trailingslashit( $install->url );
989
-
990
- $has_clone = ( fs_strip_url_protocol( $install_url ) !== fs_strip_url_protocol( $subsite_url ) );
991
- }
992
- }
993
-
994
- if ( ! $has_clone ) {
995
- $this->_notices->remove_sticky( $id, true, false );
996
- unset( $notices[ $id ] );
997
- }
998
- }
999
-
1000
- return array_keys( $notices );
1001
- }
1002
-
1003
- /**
1004
- * Adds a notice that provides the logged-in WordPress user with manual clone resolution options.
1005
- *
1006
- * @param number[] $product_ids
1007
- * @param string[] $site_urls
1008
- * @param string $current_url
1009
- * @param bool $has_license
1010
- * @param bool $is_premium
1011
- * @param string $doc_url
1012
- */
1013
- private function add_manual_clone_resolution_admin_notice(
1014
- $product_ids,
1015
- $product_titles,
1016
- $site_urls,
1017
- $current_url,
1018
- $has_license,
1019
- $is_premium,
1020
- $doc_url
1021
- ) {
1022
- $this->_logger->entrance();
1023
-
1024
- $total_sites = count( $site_urls );
1025
- $sites_list = '';
1026
-
1027
- $total_products = count( $product_titles );
1028
- $products_list = '';
1029
-
1030
- if ( 1 === $total_products ) {
1031
- $notice_header = sprintf(
1032
- '<div class="fs-notice-header"><p>%s</p></div>',
1033
- fs_esc_html_inline( '%1$s has been placed into safe mode because we noticed that %2$s is an exact copy of %3$s.', 'single-cloned-site-safe-mode-message' )
1034
- );
1035
- } else {
1036
- $notice_header = sprintf(
1037
- '<div class="fs-notice-header"><p>%s</p></div>',
1038
- ( 1 === $total_sites ) ?
1039
- fs_esc_html_inline( 'The products below have been placed into safe mode because we noticed that %2$s is an exact copy of %3$s:%1$s', 'multiple-products-cloned-site-safe-mode-message' ) :
1040
- fs_esc_html_inline( 'The products below have been placed into safe mode because we noticed that %2$s is an exact copy of these sites:%3$s%1$s', 'multiple-products-multiple-cloned-sites-safe-mode-message' )
1041
- );
1042
-
1043
- foreach ( $product_titles as $product_title ) {
1044
- $products_list .= sprintf( '<li>%s</li>', $product_title );
1045
- }
1046
-
1047
- $products_list = '<ol>' . $products_list . '</ol>';
1048
-
1049
- foreach ( $site_urls as $site_url ) {
1050
- $sites_list .= sprintf(
1051
- '<li><a href="%s" target="_blank">%s</a></li>',
1052
- $site_url,
1053
- fs_strip_url_protocol( $site_url )
1054
- );
1055
- }
1056
-
1057
- $sites_list = '<ol>' . $sites_list . '</ol>';
1058
- }
1059
-
1060
- $remote_site_link = '<b>' . (1 === $total_sites ?
1061
- sprintf(
1062
- '<a href="%s" target="_blank">%s</a>',
1063
- $site_urls[0],
1064
- fs_strip_url_protocol( $site_urls[0] )
1065
- ) :
1066
- fs_text_inline( 'the above-mentioned sites', 'above-mentioned-sites' )) . '</b>';
1067
-
1068
- $current_site_link = sprintf(
1069
- '<b><a href="%s" target="_blank">%s</a></b>',
1070
- $current_url,
1071
- fs_strip_url_protocol( $current_url )
1072
- );
1073
-
1074
- $button_template = '<button class="button" data-clone-action="%s">%s</button>';
1075
- $option_template = '<div class="fs-clone-resolution-option"><strong>%s</strong><p>%s</p><div>%s</div></div>';
1076
-
1077
- $duplicate_option = sprintf(
1078
- $option_template,
1079
- fs_esc_html_inline( 'Is %2$s a duplicate of %4$s?', 'duplicate-site-confirmation-message' ),
1080
- fs_esc_html_inline( 'Yes, %2$s is a duplicate of %4$s for the purpose of testing, staging, or development.', 'duplicate-site-message' ),
1081
- ($this->has_temporary_duplicate_mode_expired() ?
1082
- sprintf(
1083
- $button_template,
1084
- 'long_term_duplicate',
1085
- fs_text_inline( 'Long-Term Duplicate', 'long-term-duplicate' )
1086
- ) :
1087
- sprintf(
1088
- $button_template,
1089
- 'temporary_duplicate',
1090
- fs_text_inline( 'Duplicate Website', 'duplicate-site' )
1091
- ))
1092
- );
1093
-
1094
- $migration_option = sprintf(
1095
- $option_template,
1096
- fs_esc_html_inline( 'Is %2$s the new home of %4$s?', 'migrate-site-confirmation-message' ),
1097
- sprintf(
1098
- fs_esc_html_inline( 'Yes, %%2$s is replacing %%4$s. I would like to migrate my %s from %%4$s to %%2$s.', 'migrate-site-message' ),
1099
- ( $has_license ? fs_text_inline( 'license', 'license' ) : fs_text_inline( 'data', 'data' ) )
1100
- ),
1101
- sprintf(
1102
- $button_template,
1103
- 'new_home',
1104
- $has_license ?
1105
- fs_text_inline( 'Migrate License', 'migrate-product-license' ) :
1106
- fs_text_inline( 'Migrate', 'migrate-product-data' )
1107
- )
1108
- );
1109
-
1110
- $new_website = sprintf(
1111
- $option_template,
1112
- fs_esc_html_inline( 'Is %2$s a new website?', 'new-site-confirmation-message' ),
1113
- fs_esc_html_inline( 'Yes, %2$s is a new and different website that is separate from %4$s.', 'new-site-message' ) .
1114
- ($is_premium ?
1115
- ' ' . fs_text_inline( 'It requires license activation.', 'new-site-requires-license-activation-message' ) :
1116
- ''
1117
- ),
1118
- sprintf(
1119
- $button_template,
1120
- 'new_website',
1121
- ( ! $is_premium || ! $has_license ) ?
1122
- fs_text_inline( 'New Website', 'new-website' ) :
1123
- fs_text_inline( 'Activate License', 'activate-license' )
1124
- )
1125
- );
1126
-
1127
- /**
1128
- * %1$s - single product's title or product titles list.
1129
- * %2$s - site's URL.
1130
- * %3$s - single install's URL or install URLs list.
1131
- * %4$s - Clone site's link or "the above-mentioned sites" if there are multiple clone sites.
1132
- */
1133
- $message = sprintf(
1134
- $notice_header .
1135
- '<div class="fs-clone-resolution-options-container" data-ajax-url="' . esc_attr( admin_url( 'admin-ajax.php?_fs_network_admin=false', 'relative' ) ) . '">' .
1136
- $duplicate_option .
1137
- $migration_option .
1138
- $new_website . '</div>' .
1139
- sprintf( '<div class="fs-clone-documentation-container">Unsure what to do? <a href="%s" target="_blank">Read more here</a>.</div>', $doc_url ),
1140
- // %1$s
1141
- ( 1 === $total_products ?
1142
- sprintf( '<b>%s</b>', $product_titles[0] ) :
1143
- ( 1 === $total_sites ?
1144
- sprintf( '<div>%s</div>', $products_list ) :
1145
- sprintf( '<div><p><strong>%s</strong>:</p>%s</div>', fs_esc_html_x_inline( 'Products', 'Clone resolution admin notice products list label', 'products' ), $products_list ) )
1146
- ),
1147
- // %2$s
1148
- $current_site_link,
1149
- // %3$s
1150
- ( 1 === $total_sites ?
1151
- $remote_site_link :
1152
- $sites_list ),
1153
- // %4$s
1154
- $remote_site_link
1155
- );
1156
-
1157
- $this->_notices->add_sticky(
1158
- $message,
1159
- 'clone_resolution_options_notice',
1160
- '',
1161
- 'warn',
1162
- true,
1163
- null,
1164
- null,
1165
- true,
1166
- // Intentionally not dismissible.
1167
- false,
1168
- array(
1169
- 'product_ids' => $product_ids,
1170
- 'blog_id' => get_current_blog_id()
1171
- )
1172
- );
1173
- }
1174
-
1175
- #endregion
1176
-
1177
- #--------------------------------------------------------------------------------
1178
- #region Temporary Duplicate (Short Term)
1179
- #--------------------------------------------------------------------------------
1180
-
1181
- /**
1182
- * @author Leo Fajardo (@leorw)
1183
- * @since 2.5.0
1184
- *
1185
- * @return string
1186
- */
1187
- private function get_temporary_duplicate_admin_notice_string( $site_urls, $product_titles, $module_label ) {
1188
- $this->_logger->entrance();
1189
-
1190
- $temporary_duplicate_end_date = $this->get_temporary_duplicate_expiration_timestamp();
1191
- $temporary_duplicate_end_date = date( 'M j, Y', $temporary_duplicate_end_date );
1192
-
1193
- $current_url = get_site_url();
1194
- $current_site_link = sprintf(
1195
- '<b><a href="%s" target="_blank">%s</a></b>',
1196
- $current_url,
1197
- fs_strip_url_protocol( $current_url )
1198
- );
1199
-
1200
- $total_sites = count( $site_urls );
1201
- $sites_list = '';
1202
-
1203
- $total_products = count( $product_titles );
1204
- $products_list = '';
1205
-
1206
- if ( $total_sites > 1 ) {
1207
- foreach ( $site_urls as $site_url ) {
1208
- $sites_list .= sprintf(
1209
- '<li><a href="%s" target="_blank">%s</a></li>',
1210
- $site_url,
1211
- fs_strip_url_protocol( $site_url )
1212
- );
1213
- }
1214
-
1215
- $sites_list = '<ol class="fs-sites-list">' . $sites_list . '</ol>';
1216
- }
1217
-
1218
- if ( $total_products > 1 ) {
1219
- foreach ( $product_titles as $product_title ) {
1220
- $products_list .= sprintf( '<li>%s</li>', $product_title );
1221
- }
1222
-
1223
- $products_list = '<ol>' . $products_list . '</ol>';
1224
- }
1225
-
1226
- return sprintf(
1227
- sprintf(
1228
- '<div>%s</div>',
1229
- ( 1 === $total_sites ?
1230
- sprintf( '<p>%s</p>', fs_esc_html_inline( 'You marked this website, %s, as a temporary duplicate of %s.', 'temporary-duplicate-message' ) ) :
1231
- sprintf( '<p>%s:</p>', fs_esc_html_inline( 'You marked this website, %s, as a temporary duplicate of these sites', 'temporary-duplicate-of-sites-message' ) ) . '%s' )
1232
- ) . '%s',
1233
- $current_site_link,
1234
- ( 1 === $total_sites ?
1235
- sprintf(
1236
- '<b><a href="%s" target="_blank">%s</a></b>',
1237
- $site_urls[0],
1238
- fs_strip_url_protocol( $site_urls[0] )
1239
- ) :
1240
- $sites_list ),
1241
- sprintf(
1242
- '<div class="fs-clone-resolution-options-container fs-duplicate-site-options" data-ajax-url="%s" data-blog-id="' . get_current_blog_id() . '"><p>%s</p>%s<p>%s</p></div>',
1243
- esc_attr( admin_url( 'admin-ajax.php?_fs_network_admin=false', 'relative' ) ),
1244
- sprintf(
1245
- fs_esc_html_inline( "%s automatic security & feature updates and paid functionality will keep working without interruptions until %s (or when your license expires, whatever comes first).", 'duplicate-site-confirmation-message' ),
1246
- ( 1 === $total_products ?
1247
- sprintf(
1248
- fs_esc_html_x_inline( "The %s's", '"The <product_label>", e.g.: "The plugin"', 'the-product-x'),
1249
- "<strong>{$module_label}</strong>"
1250
- ) :
1251
- fs_esc_html_inline( "The following products'", 'the-following-products' ) ),
1252
- sprintf( '<strong>%s</strong>', $temporary_duplicate_end_date )
1253
- ),
1254
- ( 1 === $total_products ?
1255
- '' :
1256
- sprintf( '<div>%s</div>', $products_list )
1257
- ),
1258
- sprintf(
1259
- fs_esc_html_inline( 'If this is a long term duplicate, to keep automatic updates and paid functionality after %s, please %s.', 'duplicate-site-message' ),
1260
- sprintf( '<strong>%s</strong>', $temporary_duplicate_end_date),
1261
- sprintf( '<a href="#" id="fs_temporary_duplicate_license_activation_link" data-clone-action="temporary_duplicate_license_activation">%s</a>', fs_esc_html_inline( 'activate a license here', 'activate-license-here' ) )
1262
- )
1263
- )
1264
- );
1265
- }
1266
-
1267
- /**
1268
- * Determines if the temporary duplicate mode has already expired.
1269
- *
1270
- * @return bool
1271
- */
1272
- function has_temporary_duplicate_mode_expired() {
1273
- $temporary_duplicate_mode_start_timestamp = $this->was_temporary_duplicate_mode_selected() ?
1274
- $this->temporary_duplicate_mode_selection_timestamp :
1275
- $this->get_clone_identification_timestamp();
1276
-
1277
- if ( ! is_numeric( $temporary_duplicate_mode_start_timestamp ) ) {
1278
- return false;
1279
- }
1280
-
1281
- return ( time() > ( $temporary_duplicate_mode_start_timestamp + self::TEMPORARY_DUPLICATE_PERIOD ) );
1282
- }
1283
-
1284
- /**
1285
- * Determines if the logged-in WordPress user manually selected the temporary duplicate mode for the site.
1286
- *
1287
- * @return bool
1288
- */
1289
- function was_temporary_duplicate_mode_selected() {
1290
- return (
1291
- isset( $this->temporary_duplicate_mode_selection_timestamp ) &&
1292
- is_numeric( $this->temporary_duplicate_mode_selection_timestamp )
1293
- );
1294
- }
1295
-
1296
- /**
1297
- * Stores the time when the logged-in WordPress user selected the temporary duplicate mode for the site.
1298
- */
1299
- private function store_temporary_duplicate_timestamp() {
1300
- $this->temporary_duplicate_mode_selection_timestamp = time();
1301
- }
1302
-
1303
- /**
1304
- * Removes the notice that is shown when the logged-in WordPress user has selected the temporary duplicate mode for the site.
1305
- *
1306
- * @param bool $store
1307
- */
1308
- function remove_clone_resolution_options_notice( $store = true ) {
1309
- $this->_notices->remove_sticky( 'clone_resolution_options_notice', true, $store );
1310
- }
1311
-
1312
- /**
1313
- * Removes the notice that is shown when the logged-in WordPress user has selected the temporary duplicate mode for the site.
1314
- *
1315
- * @param bool $store
1316
- */
1317
- function remove_temporary_duplicate_notice( $store = true ) {
1318
- $this->_notices->remove_sticky( 'temporary_duplicate_notice', true, $store );
1319
- }
1320
-
1321
- /**
1322
- * Determines if the manual clone resolution options notice is currently being shown.
1323
- *
1324
- * @return bool
1325
- */
1326
- function is_clone_resolution_options_notice_shown() {
1327
- return $this->_notices->has_sticky( 'clone_resolution_options_notice', true );
1328
- }
1329
-
1330
- /**
1331
- * Determines if the temporary duplicate notice is currently being shown.
1332
- *
1333
- * @return bool
1334
- */
1335
- function is_temporary_duplicate_notice_shown() {
1336
- return $this->_notices->has_sticky( 'temporary_duplicate_notice', true );
1337
- }
1338
-
1339
- /**
1340
- * Determines if a site was marked as a temporary duplicate and if it's still a temporary duplicate.
1341
- *
1342
- * @return bool
1343
- */
1344
- function is_temporary_duplicate_by_blog_id( $blog_id ) {
1345
- $storage = FS_Option_Manager::get_manager( WP_FS___OPTION_PREFIX . self::OPTION_MANAGER_NAME, true, $blog_id );
1346
- $data = $storage->get_option( self::OPTION_NAME, array() );
1347
-
1348
- if ( ! is_array( $data ) ) {
1349
- return false;
1350
- }
1351
-
1352
- $was_temporary_duplicate_mode_selected = (
1353
- isset( $data['temporary_duplicate_mode_selection_timestamp'] ) &&
1354
- is_numeric( $data['temporary_duplicate_mode_selection_timestamp'] )
1355
- );
1356
-
1357
- if ( ! $was_temporary_duplicate_mode_selected ) {
1358
- return false;
1359
- }
1360
-
1361
- return ( time() < ( $data['temporary_duplicate_mode_selection_timestamp'] + self::TEMPORARY_DUPLICATE_PERIOD ) );
1362
- }
1363
-
1364
- /**
1365
- * Determines the last time the temporary duplicate notice was shown.
1366
- *
1367
- * @return int|null
1368
- */
1369
- function last_time_temporary_duplicate_notice_was_shown() {
1370
- return ( ! isset( $this->temporary_duplicate_notice_shown_timestamp ) ) ?
1371
- null :
1372
- $this->temporary_duplicate_notice_shown_timestamp;
1373
- }
1374
-
1375
- /**
1376
- * Clears the time that has been stored when the temporary duplicate notice was shown.
1377
- */
1378
- function clear_temporary_duplicate_notice_shown_timestamp() {
1379
- $this->temporary_duplicate_notice_shown_timestamp = null;
1380
- }
1381
-
1382
- /**
1383
- * Adds a temporary duplicate notice that provides the logged-in WordPress user with an option to activate a license for the site.
1384
- *
1385
- * @param number[] $product_ids
1386
- * @param string $message
1387
- * @param string $message
1388
- * @param string|null $plugin_title
1389
- */
1390
- function add_temporary_duplicate_sticky_notice( $product_ids, $message, $plugin_title = null ) {
1391
- $this->_logger->entrance();
1392
-
1393
- $this->_notices->add_sticky(
1394
- $message,
1395
- 'temporary_duplicate_notice',
1396
- '',
1397
- 'promotion',
1398
- true,
1399
- null,
1400
- $plugin_title,
1401
- true,
1402
- true,
1403
- array(
1404
- 'product_ids' => $product_ids,
1405
- 'blog_id' => get_current_blog_id()
1406
- )
1407
- );
1408
-
1409
- $this->temporary_duplicate_notice_shown_timestamp = time();
1410
- }
1411
-
1412
- #endregion
1413
-
1414
- /**
1415
- * @author Leo Fajardo
1416
- * @since 2.5.0
1417
- *
1418
- * @param string $key
1419
- *
1420
- * @return bool
1421
- */
1422
- private function should_use_network_storage( $key ) {
1423
- return ( 'new_blog_install_map' === $key );
1424
- }
1425
-
1426
- #--------------------------------------------------------------------------------
1427
- #region Magic methods
1428
- #--------------------------------------------------------------------------------
1429
-
1430
- /**
1431
- * @param string $name
1432
- * @param int|string $value
1433
- */
1434
- function __set( $name, $value ) {
1435
- if ( ! $this->should_use_network_storage( $name ) ) {
1436
- $storage = $this->_storage;
1437
- $data = $this->_data;
1438
- } else {
1439
- $storage = $this->_network_storage;
1440
- $data = $this->_network_data;
1441
- }
1442
-
1443
- if ( ! array_key_exists( $name, $data ) ) {
1444
- return;
1445
- }
1446
-
1447
- $data[ $name ] = $value;
1448
-
1449
- $storage->set_option( self::OPTION_NAME, $data, true );
1450
- }
1451
-
1452
- /**
1453
- * @param string $name
1454
- *
1455
- * @return bool
1456
- */
1457
- function __isset( $name ) {
1458
- return (
1459
- isset( $this->_data[ $name ] ) ||
1460
- isset( $this->_network_data[ $name ] )
1461
- );
1462
- }
1463
-
1464
- /**
1465
- * @param string $name
1466
- *
1467
- * @return null|int|string
1468
- */
1469
- function __get( $name ) {
1470
- $data = ( ! $this->should_use_network_storage( $name ) ) ?
1471
- $this->_data :
1472
- $this->_network_data;
1473
-
1474
- return array_key_exists( $name, $data ) ?
1475
- $data[ $name ] :
1476
- null;
1477
- }
1478
-
1479
- #endregion
1480
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
freemius/includes/managers/class-fs-plugin-manager.php CHANGED
@@ -211,23 +211,10 @@
211
  * @return bool|\FS_Plugin
212
  */
213
  function get() {
214
- if ( isset( $this->_module ) ) {
215
- return $this->_module;
216
- }
217
-
218
- if ( empty( $this->_module_id ) ) {
219
- return false;
220
- }
221
-
222
- /**
223
- * Return an FS_Plugin entity that has its `id` and `is_live` properties set (`is_live` is initialized in the FS_Plugin constructor) to avoid triggering an error that is relevant to these properties when the FS_Plugin entity is used before the `parse_settings()` method is called. This can happen when creating a regular WordPress site by cloning a subsite of a multisite network and the data that is stored in the network-level storage is not cloned.
224
- *
225
- * @author Leo Fajardo (@leorw)
226
- * @since 2.5.0
227
- */
228
- $plugin = new FS_Plugin();
229
- $plugin->id = $this->_module_id;
230
-
231
- return $plugin;
232
  }
 
 
233
  }
211
  * @return bool|\FS_Plugin
212
  */
213
  function get() {
214
+ return isset( $this->_module ) ?
215
+ $this->_module :
216
+ false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
  }
218
+
219
+
220
  }
freemius/includes/sdk/Exceptions/ArgumentNotExistException.php CHANGED
@@ -1,4 +1,8 @@
1
  <?php
 
 
 
 
2
  if ( ! class_exists( 'Freemius_InvalidArgumentException' ) ) {
3
  exit;
4
  }
@@ -6,4 +10,4 @@
6
  if ( ! class_exists( 'Freemius_ArgumentNotExistException' ) ) {
7
  class Freemius_ArgumentNotExistException extends Freemius_InvalidArgumentException {
8
  }
9
- }
1
  <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ exit;
4
+ }
5
+
6
  if ( ! class_exists( 'Freemius_InvalidArgumentException' ) ) {
7
  exit;
8
  }
10
  if ( ! class_exists( 'Freemius_ArgumentNotExistException' ) ) {
11
  class Freemius_ArgumentNotExistException extends Freemius_InvalidArgumentException {
12
  }
13
+ }
freemius/includes/sdk/Exceptions/EmptyArgumentException.php CHANGED
@@ -1,4 +1,8 @@
1
  <?php
 
 
 
 
2
  if ( ! class_exists( 'Freemius_InvalidArgumentException' ) ) {
3
  exit;
4
  }
@@ -6,4 +10,4 @@
6
  if ( ! class_exists( 'Freemius_EmptyArgumentException' ) ) {
7
  class Freemius_EmptyArgumentException extends Freemius_InvalidArgumentException {
8
  }
9
- }
1
  <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ exit;
4
+ }
5
+
6
  if ( ! class_exists( 'Freemius_InvalidArgumentException' ) ) {
7
  exit;
8
  }
10
  if ( ! class_exists( 'Freemius_EmptyArgumentException' ) ) {
11
  class Freemius_EmptyArgumentException extends Freemius_InvalidArgumentException {
12
  }
13
+ }
freemius/includes/sdk/Exceptions/Exception.php CHANGED
@@ -1,4 +1,8 @@
1
  <?php
 
 
 
 
2
  if ( ! class_exists( 'Freemius_Exception' ) ) {
3
  /**
4
  * Thrown when an API call returns an exception.
@@ -71,4 +75,4 @@
71
  return $str . $this->getMessage();
72
  }
73
  }
74
- }
1
  <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ exit;
4
+ }
5
+
6
  if ( ! class_exists( 'Freemius_Exception' ) ) {
7
  /**
8
  * Thrown when an API call returns an exception.
75
  return $str . $this->getMessage();
76
  }
77
  }
78
+ }
freemius/includes/sdk/Exceptions/InvalidArgumentException.php CHANGED
@@ -1,8 +1,12 @@
1
  <?php
 
 
 
 
2
  if ( ! class_exists( 'Freemius_Exception' ) ) {
3
  exit;
4
  }
5
 
6
  if ( ! class_exists( 'Freemius_InvalidArgumentException' ) ) {
7
  class Freemius_InvalidArgumentException extends Freemius_Exception { }
8
- }
1
  <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ exit;
4
+ }
5
+
6
  if ( ! class_exists( 'Freemius_Exception' ) ) {
7
  exit;
8
  }
9
 
10
  if ( ! class_exists( 'Freemius_InvalidArgumentException' ) ) {
11
  class Freemius_InvalidArgumentException extends Freemius_Exception { }
12
+ }
freemius/includes/sdk/Exceptions/OAuthException.php CHANGED
@@ -1,4 +1,8 @@
1
  <?php
 
 
 
 
2
  if ( ! class_exists( 'Freemius_Exception' ) ) {
3
  exit;
4
  }
@@ -9,4 +13,4 @@
9
  parent::__construct( $pResult );
10
  }
11
  }
12
- }
1
  <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ exit;
4
+ }
5
+
6
  if ( ! class_exists( 'Freemius_Exception' ) ) {
7
  exit;
8
  }
13
  parent::__construct( $pResult );
14
  }
15
  }
16
+ }
freemius/includes/sdk/FreemiusBase.php CHANGED
@@ -15,6 +15,10 @@
15
  * under the License.
16
  */
17
 
 
 
 
 
18
  if ( ! defined( 'FS_API__VERSION' ) ) {
19
  define( 'FS_API__VERSION', '1' );
20
  }
15
  * under the License.
16
  */
17
 
18
+ if ( ! defined( 'ABSPATH' ) ) {
19
+ exit;
20
+ }
21
+
22
  if ( ! defined( 'FS_API__VERSION' ) ) {
23
  define( 'FS_API__VERSION', '1' );
24
  }
freemius/includes/sdk/FreemiusWordPress.php CHANGED
@@ -14,6 +14,9 @@
14
  * License for the specific language governing permissions and limitations
15
  * under the License.
16
  */
 
 
 
17
 
18
  require_once dirname( __FILE__ ) . '/FreemiusBase.php';
19
 
@@ -709,4 +712,4 @@
709
  }
710
 
711
  #endregion
712
- }
14
  * License for the specific language governing permissions and limitations
15
  * under the License.
16
  */
17
+ if ( ! defined( 'ABSPATH' ) ) {
18
+ exit;
19
+ }
20
 
21
  require_once dirname( __FILE__ ) . '/FreemiusBase.php';
22
 
712
  }
713
 
714
  #endregion
715
+ }
freemius/languages/freemius-cs_CZ.mo CHANGED
Binary file
freemius/languages/freemius-da_DK.mo CHANGED
Binary file
freemius/languages/freemius-en.mo CHANGED
Binary file
freemius/languages/freemius-es_ES.mo CHANGED
Binary file
freemius/languages/freemius-fr_FR.mo CHANGED
Binary file
freemius/languages/freemius-he_IL.mo CHANGED
Binary file
freemius/languages/freemius-hu_HU.mo CHANGED
Binary file
freemius/languages/freemius-it_IT.mo CHANGED
Binary file
freemius/languages/freemius-ja.mo CHANGED
Binary file
freemius/languages/freemius-nl_NL.mo CHANGED
Binary file
freemius/languages/freemius-ru_RU.mo CHANGED
Binary file
freemius/languages/freemius-ta.mo CHANGED
Binary file
freemius/languages/freemius-zh_CN.mo CHANGED
Binary file
freemius/languages/freemius.pot CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2022 freemius
2
  # This file is distributed under the same license as the freemius package.
3
  msgid ""
4
  msgstr ""
@@ -16,803 +16,795 @@ msgstr ""
16
  "X-Poedit-SourceCharset: UTF-8\n"
17
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
18
 
19
- #: includes/class-freemius.php:1932, templates/account.php:941
20
  msgid "An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned."
21
  msgstr ""
22
 
23
- #: includes/class-freemius.php:1939
24
  msgid "Would you like to proceed with the update?"
25
  msgstr ""
26
 
27
- #: includes/class-freemius.php:2158
28
  msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error."
29
  msgstr ""
30
 
31
- #: includes/class-freemius.php:2160
32
  msgid "Error"
33
  msgstr ""
34
 
35
- #: includes/class-freemius.php:2606
36
  msgid "I found a better %s"
37
  msgstr ""
38
 
39
- #: includes/class-freemius.php:2608
40
  msgid "What's the %s's name?"
41
  msgstr ""
42
 
43
- #: includes/class-freemius.php:2614
44
- msgid "It's a temporary %s - I'm troubleshooting an issue"
45
  msgstr ""
46
 
47
- #: includes/class-freemius.php:2616
48
  msgid "Deactivation"
49
  msgstr ""
50
 
51
- #: includes/class-freemius.php:2617
52
  msgid "Theme Switch"
53
  msgstr ""
54
 
55
- #: includes/class-freemius.php:2626, templates/forms/resend-key.php:24, templates/forms/user-change.php:29
56
  msgid "Other"
57
  msgstr ""
58
 
59
- #: includes/class-freemius.php:2634
60
  msgid "I no longer need the %s"
61
  msgstr ""
62
 
63
- #: includes/class-freemius.php:2641
64
  msgid "I only needed the %s for a short period"
65
  msgstr ""
66
 
67
- #: includes/class-freemius.php:2647
68
  msgid "The %s broke my site"
69
  msgstr ""
70
 
71
- #: includes/class-freemius.php:2654
72
  msgid "The %s suddenly stopped working"
73
  msgstr ""
74
 
75
- #: includes/class-freemius.php:2664
76
  msgid "I can't pay for it anymore"
77
  msgstr ""
78
 
79
- #: includes/class-freemius.php:2666
80
  msgid "What price would you feel comfortable paying?"
81
  msgstr ""
82
 
83
- #: includes/class-freemius.php:2672
84
  msgid "I don't like to share my information with you"
85
  msgstr ""
86
 
87
- #: includes/class-freemius.php:2693
88
  msgid "The %s didn't work"
89
  msgstr ""
90
 
91
- #: includes/class-freemius.php:2703
92
  msgid "I couldn't understand how to make it work"
93
  msgstr ""
94
 
95
- #: includes/class-freemius.php:2711
96
  msgid "The %s is great, but I need specific feature that you don't support"
97
  msgstr ""
98
 
99
- #: includes/class-freemius.php:2713
100
  msgid "What feature?"
101
  msgstr ""
102
 
103
- #: includes/class-freemius.php:2717
104
  msgid "The %s is not working"
105
  msgstr ""
106
 
107
- #: includes/class-freemius.php:2719
108
  msgid "Kindly share what didn't work so we can fix it for future users..."
109
  msgstr ""
110
 
111
- #: includes/class-freemius.php:2723
112
  msgid "It's not what I was looking for"
113
  msgstr ""
114
 
115
- #: includes/class-freemius.php:2725
116
  msgid "What you've been looking for?"
117
  msgstr ""
118
 
119
- #: includes/class-freemius.php:2729
120
  msgid "The %s didn't work as expected"
121
  msgstr ""
122
 
123
- #: includes/class-freemius.php:2731
124
  msgid "What did you expect?"
125
  msgstr ""
126
 
127
- #: includes/class-freemius.php:3751, templates/debug.php:20
128
  msgid "Freemius Debug"
129
  msgstr ""
130
 
131
- #: includes/class-freemius.php:4538
132
  msgid "I don't know what is cURL or how to install it, help me!"
133
  msgstr ""
134
 
135
- #: includes/class-freemius.php:4540
136
  msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update."
137
  msgstr ""
138
 
139
- #: includes/class-freemius.php:4547
140
  msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again."
141
  msgstr ""
142
 
143
- #: includes/class-freemius.php:4652
144
  msgid "Yes - do your thing"
145
  msgstr ""
146
 
147
- #: includes/class-freemius.php:4657
148
  msgid "No - just deactivate"
149
  msgstr ""
150
 
151
- #: includes/class-freemius.php:4702, includes/class-freemius.php:5218, includes/class-freemius.php:6480, includes/class-freemius.php:13907, includes/class-freemius.php:14649, includes/class-freemius.php:18176, includes/class-freemius.php:18281, includes/class-freemius.php:18458, includes/class-freemius.php:20718, includes/class-freemius.php:21096, includes/class-freemius.php:21110, includes/class-freemius.php:21798, includes/class-freemius.php:22810, includes/class-freemius.php:22943, includes/class-freemius.php:23073, templates/add-ons.php:57
152
  msgctxt "exclamation"
153
  msgid "Oops"
154
  msgstr ""
155
 
156
- #: includes/class-freemius.php:4771
157
  msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience."
158
  msgstr ""
159
 
160
- #: includes/class-freemius.php:5187
161
- msgid "You have purchased a %s license."
162
- msgstr ""
163
-
164
- #: includes/class-freemius.php:5191
165
- msgid " The %s's %sdownload link%s, license key, and installation instructions have been sent to %s. If you can't find the email after 5 min, please check your spam box."
166
- msgstr ""
167
-
168
- #: includes/class-freemius.php:5201, includes/class-freemius.php:6177, includes/class-freemius.php:17574, includes/class-freemius.php:17585, includes/class-freemius.php:20987, includes/class-freemius.php:21378, includes/class-freemius.php:21447, includes/class-freemius.php:21619
169
- msgctxt "interjection expressing joy or exuberance"
170
- msgid "Yee-haw"
171
- msgstr ""
172
-
173
- #: includes/class-freemius.php:5215
174
  msgctxt "addonX cannot run without pluginY"
175
  msgid "%s cannot run without %s."
176
  msgstr ""
177
 
178
- #: includes/class-freemius.php:5216
179
  msgctxt "addonX cannot run..."
180
  msgid "%s cannot run without the plugin."
181
  msgstr ""
182
 
183
- #: includes/class-freemius.php:5416, includes/class-freemius.php:5441, includes/class-freemius.php:21869
184
  msgid "Unexpected API error. Please contact the %s's author with the following error."
185
  msgstr ""
186
 
187
- #: includes/class-freemius.php:6146
188
  msgid "Premium %s version was successfully activated."
189
  msgstr ""
190
 
191
- #: includes/class-freemius.php:6158, includes/class-freemius.php:8104
192
  msgctxt "Used to express elation, enthusiasm, or triumph (especially in electronic communication)."
193
  msgid "W00t"
194
  msgstr ""
195
 
196
- #: includes/class-freemius.php:6173
197
  msgid "You have a %s license."
198
  msgstr ""
199
 
200
- #: includes/class-freemius.php:6463
 
 
 
 
 
201
  msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license."
202
  msgstr ""
203
 
204
- #: includes/class-freemius.php:6467
205
  msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin."
206
  msgstr ""
207
 
208
- #: includes/class-freemius.php:6476, templates/add-ons.php:186, templates/account/partials/addon.php:381
209
  msgid "More information about %s"
210
  msgstr ""
211
 
212
- #: includes/class-freemius.php:6477
213
  msgid "Purchase License"
214
  msgstr ""
215
 
216
- #: includes/class-freemius.php:7443, templates/connect.php:180
217
  msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s."
218
  msgstr ""
219
 
220
- #: includes/class-freemius.php:7447
221
  msgid "start the trial"
222
  msgstr ""
223
 
224
- #: includes/class-freemius.php:7448, templates/connect.php:184
225
  msgid "complete the install"
226
  msgstr ""
227
 
228
- #: includes/class-freemius.php:7581
229
  msgid "You are just one step away - %s"
230
  msgstr ""
231
 
232
- #: includes/class-freemius.php:7584
233
  msgctxt "%s - plugin name. As complete \"PluginX\" activation now"
234
  msgid "Complete \"%s\" Activation Now"
235
  msgstr ""
236
 
237
- #: includes/class-freemius.php:7666
238
  msgid "We made a few tweaks to the %s, %s"
239
  msgstr ""
240
 
241
- #: includes/class-freemius.php:7670
242
  msgid "Opt in to make \"%s\" better!"
243
  msgstr ""
244
 
245
- #: includes/class-freemius.php:8103
246
  msgid "The upgrade of %s was successfully completed."
247
  msgstr ""
248
 
249
- #: includes/class-freemius.php:10669, includes/class-fs-plugin-updater.php:1089, includes/class-fs-plugin-updater.php:1284, includes/class-fs-plugin-updater.php:1291, templates/auto-installation.php:32
250
  msgid "Add-On"
251
  msgstr ""
252
 
253
- #: includes/class-freemius.php:10671, templates/account.php:403, templates/account.php:411, templates/debug.php:368, templates/debug.php:566
254
  msgid "Plugin"
255
  msgstr ""
256
 
257
- #: includes/class-freemius.php:10672, templates/account.php:404, templates/account.php:412, templates/debug.php:368, templates/debug.php:566, templates/forms/deactivation/form.php:107
258
  msgid "Theme"
259
  msgstr ""
260
 
261
- #: includes/class-freemius.php:13727
262
  msgid "An unknown error has occurred while trying to toggle the license's white-label mode."
263
  msgstr ""
264
 
265
- #: includes/class-freemius.php:13741
266
  msgid "Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s."
267
  msgstr ""
268
 
269
- #: includes/class-freemius.php:13746
270
  msgid "User Dashboard"
271
  msgstr ""
272
 
273
- #: includes/class-freemius.php:13747
274
  msgid "revert it now"
275
  msgstr ""
276
 
277
- #: includes/class-freemius.php:13805
278
  msgid "An unknown error has occurred while trying to set the user's beta mode."
279
  msgstr ""
280
 
281
- #: includes/class-freemius.php:13878
282
  msgid "Invalid new user ID or email address."
283
  msgstr ""
284
 
285
- #: includes/class-freemius.php:13908
286
  msgid "Sorry, we could not complete the email update. Another user with the same email is already registered."
287
  msgstr ""
288
 
289
- #: includes/class-freemius.php:13909
290
  msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button."
291
  msgstr ""
292
 
293
- #: includes/class-freemius.php:13916
294
  msgid "Change Ownership"
295
  msgstr ""
296
 
297
- #: includes/class-freemius.php:14516
298
  msgid "Invalid site details collection."
299
  msgstr ""
300
 
301
- #: includes/class-freemius.php:14636
302
  msgid "We couldn't find your email address in the system, are you sure it's the right address?"
303
  msgstr ""
304
 
305
- #: includes/class-freemius.php:14638
306
  msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?"
307
  msgstr ""
308
 
309
- #: includes/class-freemius.php:14912
310
  msgid "Account is pending activation."
311
  msgstr ""
312
 
313
- #: includes/class-freemius.php:15024, templates/forms/premium-versions-upgrade-handler.php:47
314
  msgid "Buy a license now"
315
  msgstr ""
316
 
317
- #: includes/class-freemius.php:15036, templates/forms/premium-versions-upgrade-handler.php:46
318
  msgid "Renew your license now"
319
  msgstr ""
320
 
321
- #: includes/class-freemius.php:15040
322
  msgid "%s to access version %s security & feature updates, and support."
323
  msgstr ""
324
 
325
- #: includes/class-freemius.php:17556
326
  msgid "%s activation was successfully completed."
327
  msgstr ""
328
 
329
- #: includes/class-freemius.php:17570
330
  msgid "Your account was successfully activated with the %s plan."
331
  msgstr ""
332
 
333
- #: includes/class-freemius.php:17581, includes/class-freemius.php:21443
334
  msgid "Your trial has been successfully started."
335
  msgstr ""
336
 
337
- #: includes/class-freemius.php:18174, includes/class-freemius.php:18279, includes/class-freemius.php:18456
338
  msgid "Couldn't activate %s."
339
  msgstr ""
340
 
341
- #: includes/class-freemius.php:18175, includes/class-freemius.php:18280, includes/class-freemius.php:18457
342
  msgid "Please contact us with the following message:"
343
  msgstr ""
344
 
345
- #: includes/class-freemius.php:18276, templates/forms/data-debug-mode.php:162
346
  msgid "An unknown error has occurred."
347
  msgstr ""
348
 
349
- #: includes/class-freemius.php:18818, includes/class-freemius.php:24152
350
  msgid "Upgrade"
351
  msgstr ""
352
 
353
- #: includes/class-freemius.php:18824
354
  msgid "Start Trial"
355
  msgstr ""
356
 
357
- #: includes/class-freemius.php:18826
358
  msgid "Pricing"
359
  msgstr ""
360
 
361
- #: includes/class-freemius.php:18906, includes/class-freemius.php:18908
362
  msgid "Affiliation"
363
  msgstr ""
364
 
365
- #: includes/class-freemius.php:18936, includes/class-freemius.php:18938, templates/account.php:251, templates/debug.php:334
366
  msgid "Account"
367
  msgstr ""
368
 
369
- #: includes/class-freemius.php:18952, includes/class-freemius.php:18954, includes/customizer/class-fs-customizer-support-section.php:60
370
  msgid "Contact Us"
371
  msgstr ""
372
 
373
- #: includes/class-freemius.php:18965, includes/class-freemius.php:18967, includes/class-freemius.php:24166, templates/account.php:129, templates/account/partials/addon.php:44
374
  msgid "Add-Ons"
375
  msgstr ""
376
 
377
- #: includes/class-freemius.php:19001
378
  msgctxt "ASCII arrow left icon"
379
  msgid "&#x2190;"
380
  msgstr ""
381
 
382
- #: includes/class-freemius.php:19001
383
  msgctxt "ASCII arrow right icon"
384
  msgid "&#x27a4;"
385
  msgstr ""
386
 
387
- #: includes/class-freemius.php:19003, templates/pricing.php:109
388
  msgctxt "noun"
389
  msgid "Pricing"
390
  msgstr ""
391
 
392
- #: includes/class-freemius.php:19216, includes/customizer/class-fs-customizer-support-section.php:67
393
  msgid "Support Forum"
394
  msgstr ""
395
 
396
- #: includes/class-freemius.php:20212
397
  msgid "Your email has been successfully verified - you are AWESOME!"
398
  msgstr ""
399
 
400
- #: includes/class-freemius.php:20213
401
  msgctxt "a positive response"
402
  msgid "Right on"
403
  msgstr ""
404
 
405
- #: includes/class-freemius.php:20719
406
  msgid "seems like the key you entered doesn't match our records."
407
  msgstr ""
408
 
409
- #: includes/class-freemius.php:20743
410
  msgid "Debug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the \"Stop Debug\" link."
411
  msgstr ""
412
 
413
- #: includes/class-freemius.php:20978
414
  msgid "Your %s Add-on plan was successfully upgraded."
415
  msgstr ""
416
 
417
- #: includes/class-freemius.php:20980
418
  msgid "%s Add-on was successfully purchased."
419
  msgstr ""
420
 
421
- #: includes/class-freemius.php:20983
422
  msgid "Download the latest version"
423
  msgstr ""
424
 
425
- #: includes/class-freemius.php:21089
426
  msgid "Your server is blocking the access to Freemius' API, which is crucial for %1$s synchronization. Please contact your host to whitelist %2$s"
427
  msgstr ""
428
 
429
- #: includes/class-freemius.php:21095, includes/class-freemius.php:21109, includes/class-freemius.php:21578, includes/class-freemius.php:21667
430
  msgid "Error received from the server:"
431
  msgstr ""
432
 
433
- #: includes/class-freemius.php:21109
434
  msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again."
435
  msgstr ""
436
 
437
- #: includes/class-freemius.php:21340, includes/class-freemius.php:21583, includes/class-freemius.php:21638, includes/class-freemius.php:21745
438
  msgctxt "something somebody says when they are thinking about what you have just said."
439
  msgid "Hmm"
440
  msgstr ""
441
 
442
- #: includes/class-freemius.php:21353
443
  msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry."
444
  msgstr ""
445
 
446
- #: includes/class-freemius.php:21354, templates/account.php:131, templates/add-ons.php:250, templates/account/partials/addon.php:46
447
  msgctxt "trial period"
448
  msgid "Trial"
449
  msgstr ""
450
 
451
- #: includes/class-freemius.php:21359
452
  msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s."
453
  msgstr ""
454
 
455
- #: includes/class-freemius.php:21363, includes/class-freemius.php:21422
456
  msgid "Please contact us here"
457
  msgstr ""
458
 
459
- #: includes/class-freemius.php:21374
460
  msgid "Your plan was successfully activated."
461
  msgstr ""
462
 
463
- #: includes/class-freemius.php:21375
464
  msgid "Your plan was successfully upgraded."
465
  msgstr ""
466
 
467
- #: includes/class-freemius.php:21392
468
  msgid "Your plan was successfully changed to %s."
469
  msgstr ""
470
 
471
- #: includes/class-freemius.php:21408
472
  msgid "Your license has expired. You can still continue using the free %s forever."
473
  msgstr ""
474
 
475
- #: includes/class-freemius.php:21410
476
  msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions."
477
  msgstr ""
478
 
479
- #: includes/class-freemius.php:21418
480
  msgid "Your license has been cancelled. If you think it's a mistake, please contact support."
481
  msgstr ""
482
 
483
- #: includes/class-freemius.php:21431
484
  msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support."
485
  msgstr ""
486
 
487
- #: includes/class-freemius.php:21457
488
  msgid "Your free trial has expired. You can still continue using all our free features."
489
  msgstr ""
490
 
491
- #: includes/class-freemius.php:21459
492
  msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions."
493
  msgstr ""
494
 
495
- #: includes/class-freemius.php:21574
496
  msgid "It looks like the license could not be activated."
497
  msgstr ""
498
 
499
- #: includes/class-freemius.php:21616
500
  msgid "Your license was successfully activated."
501
  msgstr ""
502
 
503
- #: includes/class-freemius.php:21642
504
  msgid "It looks like your site currently doesn't have an active license."
505
  msgstr ""
506
 
507
- #: includes/class-freemius.php:21666
508
  msgid "It looks like the license deactivation failed."
509
  msgstr ""
510
 
511
- #: includes/class-freemius.php:21695
512
  msgid "Your %s license was successfully deactivated."
513
  msgstr ""
514
 
515
- #: includes/class-freemius.php:21696
516
  msgid "Your license was successfully deactivated, you are back to the %s plan."
517
  msgstr ""
518
 
519
- #: includes/class-freemius.php:21699
520
  msgid "O.K"
521
  msgstr ""
522
 
523
- #: includes/class-freemius.php:21752
524
  msgid "Seems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes."
525
  msgstr ""
526
 
527
- #: includes/class-freemius.php:21761
528
  msgid "Your subscription was successfully cancelled. Your %s plan license will expire in %s."
529
  msgstr ""
530
 
531
- #: includes/class-freemius.php:21803
532
  msgid "You are already running the %s in a trial mode."
533
  msgstr ""
534
 
535
- #: includes/class-freemius.php:21814
536
  msgid "You already utilized a trial before."
537
  msgstr ""
538
 
539
- #: includes/class-freemius.php:21828
540
  msgid "Plan %s do not exist, therefore, can't start a trial."
541
  msgstr ""
542
 
543
- #: includes/class-freemius.php:21839
544
  msgid "Plan %s does not support a trial period."
545
  msgstr ""
546
 
547
- #: includes/class-freemius.php:21850
548
  msgid "None of the %s's plans supports a trial period."
549
  msgstr ""
550
 
551
- #: includes/class-freemius.php:21900
552
  msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)"
553
  msgstr ""
554
 
555
- #: includes/class-freemius.php:21936
556
  msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes."
557
  msgstr ""
558
 
559
- #: includes/class-freemius.php:21955
560
  msgid "Your %s free trial was successfully cancelled."
561
  msgstr ""
562
 
563
- #: includes/class-freemius.php:22277
564
  msgid "Version %s was released."
565
  msgstr ""
566
 
567
- #: includes/class-freemius.php:22277
568
  msgid "Please download %s."
569
  msgstr ""
570
 
571
- #: includes/class-freemius.php:22284
572
  msgid "the latest %s version here"
573
  msgstr ""
574
 
575
- #: includes/class-freemius.php:22289
576
  msgid "New"
577
  msgstr ""
578
 
579
- #: includes/class-freemius.php:22294
580
  msgid "Seems like you got the latest release."
581
  msgstr ""
582
 
583
- #: includes/class-freemius.php:22295
584
  msgid "You are all good!"
585
  msgstr ""
586
 
587
- #: includes/class-freemius.php:22698
588
  msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box."
589
  msgstr ""
590
 
591
- #: includes/class-freemius.php:22838
592
  msgid "Site successfully opted in."
593
  msgstr ""
594
 
595
- #: includes/class-freemius.php:22839, includes/class-freemius.php:23862
596
  msgid "Awesome"
597
  msgstr ""
598
 
599
- #: includes/class-freemius.php:22855, templates/forms/optout.php:41
600
  msgid "We appreciate your help in making the %s better by letting us track some usage data."
601
  msgstr ""
602
 
603
- #: includes/class-freemius.php:22856
604
  msgid "Thank you!"
605
  msgstr ""
606
 
607
- #: includes/class-freemius.php:22863
608
  msgid "We will no longer be sending any usage data of %s on %s to %s."
609
  msgstr ""
610
 
611
- #: includes/class-freemius.php:23023
612
- msgid "A confirmation email was just sent to %s. The email owner must confirm the update within the next 4 hours."
613
- msgstr ""
614
-
615
- #: includes/class-freemius.php:23025
616
- msgid "A confirmation email was just sent to %s. You must confirm the update within the next 4 hours. If you cannot find the email, please check your spam folder."
617
  msgstr ""
618
 
619
- #: includes/class-freemius.php:23032
620
  msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval."
621
  msgstr ""
622
 
623
- #: includes/class-freemius.php:23037
624
  msgid "%s is the new owner of the account."
625
  msgstr ""
626
 
627
- #: includes/class-freemius.php:23039
628
  msgctxt "as congratulations"
629
  msgid "Congrats"
630
  msgstr ""
631
 
632
- #: includes/class-freemius.php:23056
 
 
 
 
633
  msgid "Please provide your full name."
634
  msgstr ""
635
 
636
- #: includes/class-freemius.php:23061
637
  msgid "Your name was successfully updated."
638
  msgstr ""
639
 
640
- #: includes/class-freemius.php:23122
641
  msgid "You have successfully updated your %s."
642
  msgstr ""
643
 
644
- #: includes/class-freemius.php:23181
645
  msgid "Is this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin."
646
  msgstr ""
647
 
648
- #: includes/class-freemius.php:23184
649
  msgid "Click here"
650
  msgstr ""
651
 
652
- #: includes/class-freemius.php:23282
653
  msgid "Just letting you know that the add-ons information of %s is being pulled from an external server."
654
  msgstr ""
655
 
656
- #: includes/class-freemius.php:23283
657
  msgctxt "advance notice of something that will need attention."
658
  msgid "Heads up"
659
  msgstr ""
660
 
661
- #: includes/class-freemius.php:23902
662
  msgctxt "exclamation"
663
  msgid "Hey"
664
  msgstr ""
665
 
666
- #: includes/class-freemius.php:23902
667
  msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial."
668
  msgstr ""
669
 
670
- #: includes/class-freemius.php:23910
671
  msgid "No commitment for %s days - cancel anytime!"
672
  msgstr ""
673
 
674
- #: includes/class-freemius.php:23911
675
  msgid "No credit card required"
676
  msgstr ""
677
 
678
- #: includes/class-freemius.php:23918, templates/forms/trial-start.php:53
679
  msgctxt "call to action"
680
  msgid "Start free trial"
681
  msgstr ""
682
 
683
- #: includes/class-freemius.php:23995
684
  msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!"
685
  msgstr ""
686
 
687
- #: includes/class-freemius.php:24004
688
  msgid "Learn more"
689
  msgstr ""
690
 
691
- #: includes/class-freemius.php:24190, templates/account.php:567, templates/account.php:719, templates/connect.php:188, templates/connect.php:465, includes/managers/class-fs-clone-manager.php:1123, templates/forms/license-activation.php:27, templates/account/partials/addon.php:321
692
  msgid "Activate License"
693
  msgstr ""
694
 
695
- #: includes/class-freemius.php:24191, templates/account.php:661, templates/account.php:718, templates/account/partials/addon.php:322, templates/account/partials/site.php:271
696
  msgid "Change License"
697
  msgstr ""
698
 
699
- #: includes/class-freemius.php:24315, templates/account/partials/site.php:169
700
  msgid "Opt Out"
701
  msgstr ""
702
 
703
- #: includes/class-freemius.php:24317, includes/class-freemius.php:24323, templates/account/partials/site.php:49, templates/account/partials/site.php:169
704
  msgid "Opt In"
705
  msgstr ""
706
 
707
- #: includes/class-freemius.php:24553
708
  msgid " The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s"
709
  msgstr ""
710
 
711
- #: includes/class-freemius.php:24561
712
  msgid "Activate %s features"
713
  msgstr ""
714
 
715
- #: includes/class-freemius.php:24574
716
  msgid "Please follow these steps to complete the upgrade"
717
  msgstr ""
718
 
719
- #: includes/class-freemius.php:24578
720
  msgid "Download the latest %s version"
721
  msgstr ""
722
 
723
- #: includes/class-freemius.php:24582
724
  msgid "Upload and activate the downloaded version"
725
  msgstr ""
726
 
727
- #: includes/class-freemius.php:24584
728
  msgid "How to upload and activate?"
729
  msgstr ""
730
 
731
- #: includes/class-freemius.php:24718
732
  msgid "%sClick here%s to choose the sites where you'd like to activate the license on."
733
  msgstr ""
734
 
735
- #: includes/class-freemius.php:24887
736
  msgid "Auto installation only works for opted-in users."
737
  msgstr ""
738
 
739
- #: includes/class-freemius.php:24897, includes/class-freemius.php:24930, includes/class-fs-plugin-updater.php:1263, includes/class-fs-plugin-updater.php:1277
740
  msgid "Invalid module ID."
741
  msgstr ""
742
 
743
- #: includes/class-freemius.php:24906, includes/class-fs-plugin-updater.php:1299
744
  msgid "Premium version already active."
745
  msgstr ""
746
 
747
- #: includes/class-freemius.php:24913
748
  msgid "You do not have a valid license to access the premium version."
749
  msgstr ""
750
 
751
- #: includes/class-freemius.php:24920
752
  msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version."
753
  msgstr ""
754
 
755
- #: includes/class-freemius.php:24938, includes/class-fs-plugin-updater.php:1298
756
  msgid "Premium add-on version already installed."
757
  msgstr ""
758
 
759
- #: includes/class-freemius.php:25288
760
  msgid "View paid features"
761
  msgstr ""
762
 
763
- #: includes/class-freemius.php:25610
764
  msgid "Thank you so much for using %s and its add-ons!"
765
  msgstr ""
766
 
767
- #: includes/class-freemius.php:25611
768
  msgid "Thank you so much for using %s!"
769
  msgstr ""
770
 
771
- #: includes/class-freemius.php:25617
772
  msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s."
773
  msgstr ""
774
 
775
- #: includes/class-freemius.php:25621
776
  msgid "Thank you so much for using our products!"
777
  msgstr ""
778
 
779
- #: includes/class-freemius.php:25622
780
  msgid "You've already opted-in to our usage-tracking, which helps us keep improving them."
781
  msgstr ""
782
 
783
- #: includes/class-freemius.php:25641
784
  msgid "%s and its add-ons"
785
  msgstr ""
786
 
787
- #: includes/class-freemius.php:25650
788
  msgid "Products"
789
  msgstr ""
790
 
791
- #: includes/class-freemius.php:25657, templates/connect.php:279
792
  msgid "Yes"
793
  msgstr ""
794
 
795
- #: includes/class-freemius.php:25658, templates/connect.php:280
796
  msgid "send me security & feature updates, educational content and offers."
797
  msgstr ""
798
 
799
- #: includes/class-freemius.php:25659, templates/connect.php:285
800
  msgid "No"
801
  msgstr ""
802
 
803
- #: includes/class-freemius.php:25661, templates/connect.php:287
804
  msgid "do %sNOT%s send me security & feature updates, educational content and offers."
805
  msgstr ""
806
 
807
- #: includes/class-freemius.php:25671
808
  msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)"
809
  msgstr ""
810
 
811
- #: includes/class-freemius.php:25673, templates/connect.php:294
812
  msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:"
813
  msgstr ""
814
 
815
- #: includes/class-freemius.php:25955
816
  msgid "License key is empty."
817
  msgstr ""
818
 
@@ -824,31 +816,31 @@ msgstr ""
824
  msgid "Buy license"
825
  msgstr ""
826
 
827
- #: includes/class-fs-plugin-updater.php:331, includes/class-fs-plugin-updater.php:364
828
  msgid "There is a %s of %s available."
829
  msgstr ""
830
 
831
- #: includes/class-fs-plugin-updater.php:333, includes/class-fs-plugin-updater.php:369
832
  msgid "new Beta version"
833
  msgstr ""
834
 
835
- #: includes/class-fs-plugin-updater.php:334, includes/class-fs-plugin-updater.php:370
836
  msgid "new version"
837
  msgstr ""
838
 
839
- #: includes/class-fs-plugin-updater.php:393
840
  msgid "Important Upgrade Notice:"
841
  msgstr ""
842
 
843
- #: includes/class-fs-plugin-updater.php:1328
844
  msgid "Installing plugin: %s"
845
  msgstr ""
846
 
847
- #: includes/class-fs-plugin-updater.php:1369
848
  msgid "Unable to connect to the filesystem. Please confirm your credentials."
849
  msgstr ""
850
 
851
- #: includes/class-fs-plugin-updater.php:1551
852
  msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work."
853
  msgstr ""
854
 
@@ -869,7 +861,7 @@ msgstr ""
869
  msgid "Install Free Version Update Now"
870
  msgstr ""
871
 
872
- #: includes/fs-plugin-info-dialog.php:745, templates/account.php:650
873
  msgid "Install Update Now"
874
  msgstr ""
875
 
@@ -886,7 +878,7 @@ msgctxt "as download latest version"
886
  msgid "Download Latest Free Version"
887
  msgstr ""
888
 
889
- #: includes/fs-plugin-info-dialog.php:772, templates/account.php:109, templates/add-ons.php:37, templates/account/partials/addon.php:25
890
  msgctxt "as download latest version"
891
  msgid "Download Latest"
892
  msgstr ""
@@ -895,11 +887,11 @@ msgstr ""
895
  msgid "Activate this add-on"
896
  msgstr ""
897
 
898
- #: includes/fs-plugin-info-dialog.php:789, templates/connect.php:462
899
  msgid "Activate Free Version"
900
  msgstr ""
901
 
902
- #: includes/fs-plugin-info-dialog.php:790, templates/account.php:133, templates/add-ons.php:330, templates/account/partials/addon.php:48
903
  msgid "Activate"
904
  msgstr ""
905
 
@@ -1028,7 +1020,7 @@ msgstr ""
1028
  msgid "Details"
1029
  msgstr ""
1030
 
1031
- #: includes/fs-plugin-info-dialog.php:1318, templates/account.php:120, templates/debug.php:211, templates/debug.php:248, templates/debug.php:465, templates/account/partials/addon.php:36
1032
  msgctxt "product version"
1033
  msgid "Version"
1034
  msgstr ""
@@ -1042,7 +1034,7 @@ msgstr ""
1042
  msgid "Last Updated"
1043
  msgstr ""
1044
 
1045
- #: includes/fs-plugin-info-dialog.php:1337, templates/account.php:536
1046
  msgctxt "x-ago"
1047
  msgid "%s ago"
1048
  msgstr ""
@@ -1151,293 +1143,293 @@ msgstr ""
1151
  msgid "Latest Free Version Installed"
1152
  msgstr ""
1153
 
1154
- #: templates/account.php:110, templates/forms/subscription-cancellation.php:96, templates/account/partials/addon.php:26, templates/account/partials/site.php:311
1155
  msgid "Downgrading your plan"
1156
  msgstr ""
1157
 
1158
- #: templates/account.php:111, templates/forms/subscription-cancellation.php:97, templates/account/partials/addon.php:27, templates/account/partials/site.php:312
1159
  msgid "Cancelling the subscription"
1160
  msgstr ""
1161
 
1162
  #. translators: %1$s: Either 'Downgrading your plan' or 'Cancelling the subscription'
1163
- #: templates/account.php:113, templates/forms/subscription-cancellation.php:99, templates/account/partials/site.php:314
1164
  msgid "%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s."
1165
  msgstr ""
1166
 
1167
- #: templates/account.php:114, templates/forms/subscription-cancellation.php:100, templates/account/partials/addon.php:30, templates/account/partials/site.php:315
1168
  msgid "Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price."
1169
  msgstr ""
1170
 
1171
- #: templates/account.php:115, templates/forms/subscription-cancellation.php:106, templates/account/partials/addon.php:31
1172
  msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?"
1173
  msgstr ""
1174
 
1175
- #: templates/account.php:116, templates/forms/subscription-cancellation.php:101, templates/account/partials/addon.php:32, templates/account/partials/site.php:316
1176
  msgid "You can still enjoy all %s features but you will not have access to %s security & feature updates, nor support."
1177
  msgstr ""
1178
 
1179
- #: templates/account.php:117, templates/forms/subscription-cancellation.php:102, templates/account/partials/addon.php:33, templates/account/partials/site.php:317
1180
  msgid "Once your license expires you can still use the Free version but you will NOT have access to the %s features."
1181
  msgstr ""
1182
 
1183
  #. translators: %s: Plan title (e.g. "Professional")
1184
- #: templates/account.php:119, templates/account/partials/activate-license-button.php:31, templates/account/partials/addon.php:35
1185
  msgid "Activate %s Plan"
1186
  msgstr ""
1187
 
1188
  #. translators: %s: Time period (e.g. Auto renews in "2 months")
1189
- #: templates/account.php:122, templates/account/partials/addon.php:38, templates/account/partials/site.php:291
1190
  msgid "Auto renews in %s"
1191
  msgstr ""
1192
 
1193
  #. translators: %s: Time period (e.g. Expires in "2 months")
1194
- #: templates/account.php:124, templates/account/partials/addon.php:40, templates/account/partials/site.php:293
1195
  msgid "Expires in %s"
1196
  msgstr ""
1197
 
1198
- #: templates/account.php:125
1199
  msgctxt "as synchronize license"
1200
  msgid "Sync License"
1201
  msgstr ""
1202
 
1203
- #: templates/account.php:126, templates/account/partials/addon.php:41
1204
  msgid "Cancel Trial"
1205
  msgstr ""
1206
 
1207
- #: templates/account.php:127, templates/account/partials/addon.php:42
1208
  msgid "Change Plan"
1209
  msgstr ""
1210
 
1211
- #: templates/account.php:128, templates/account/partials/addon.php:43
1212
  msgctxt "verb"
1213
  msgid "Upgrade"
1214
  msgstr ""
1215
 
1216
- #: templates/account.php:130, templates/account/partials/addon.php:45, templates/account/partials/site.php:318
1217
  msgctxt "verb"
1218
  msgid "Downgrade"
1219
  msgstr ""
1220
 
1221
- #: templates/account.php:132, templates/add-ons.php:246, templates/plugin-info/features.php:72, templates/account/partials/addon.php:47, templates/account/partials/site.php:33
1222
  msgid "Free"
1223
  msgstr ""
1224
 
1225
- #: templates/account.php:134, templates/debug.php:381, includes/customizer/class-fs-customizer-upsell-control.php:110, templates/account/partials/addon.php:49
1226
  msgctxt "as product pricing plan"
1227
  msgid "Plan"
1228
  msgstr ""
1229
 
1230
- #: templates/account.php:135
1231
  msgid "Bundle Plan"
1232
  msgstr ""
1233
 
1234
- #: templates/account.php:259
1235
  msgid "Free Trial"
1236
  msgstr ""
1237
 
1238
- #: templates/account.php:270
1239
  msgid "Account Details"
1240
  msgstr ""
1241
 
1242
- #: templates/account.php:277, templates/forms/data-debug-mode.php:33
1243
  msgid "Start Debug"
1244
  msgstr ""
1245
 
1246
- #: templates/account.php:279
1247
  msgid "Stop Debug"
1248
  msgstr ""
1249
 
1250
- #: templates/account.php:286
1251
  msgid "Billing & Invoices"
1252
  msgstr ""
1253
 
1254
- #: templates/account.php:297
1255
  msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?"
1256
  msgstr ""
1257
 
1258
- #: templates/account.php:299
1259
  msgid "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?"
1260
  msgstr ""
1261
 
1262
- #: templates/account.php:302
1263
  msgid "Delete Account"
1264
  msgstr ""
1265
 
1266
- #: templates/account.php:314, templates/account/partials/addon.php:231, templates/account/partials/deactivate-license-button.php:35
1267
  msgid "Deactivate License"
1268
  msgstr ""
1269
 
1270
- #: templates/account.php:337, templates/forms/subscription-cancellation.php:125
1271
  msgid "Are you sure you want to proceed?"
1272
  msgstr ""
1273
 
1274
- #: templates/account.php:337, templates/account/partials/addon.php:255
1275
  msgid "Cancel Subscription"
1276
  msgstr ""
1277
 
1278
- #: templates/account.php:366, templates/account/partials/addon.php:340
1279
  msgctxt "as synchronize"
1280
  msgid "Sync"
1281
  msgstr ""
1282
 
1283
- #: templates/account.php:381, templates/debug.php:522
1284
  msgid "Name"
1285
  msgstr ""
1286
 
1287
- #: templates/account.php:387, templates/debug.php:523
1288
  msgid "Email"
1289
  msgstr ""
1290
 
1291
- #: templates/account.php:394, templates/debug.php:379, templates/debug.php:572
1292
  msgid "User ID"
1293
  msgstr ""
1294
 
1295
- #: templates/account.php:412, templates/account.php:732, templates/account.php:783, templates/debug.php:246, templates/debug.php:373, templates/debug.php:462, templates/debug.php:521, templates/debug.php:570, templates/debug.php:649, templates/account/payments.php:35, templates/debug/logger.php:21
1296
  msgid "ID"
1297
  msgstr ""
1298
 
1299
- #: templates/account.php:419
1300
  msgid "Site ID"
1301
  msgstr ""
1302
 
1303
- #: templates/account.php:422
1304
  msgid "No ID"
1305
  msgstr ""
1306
 
1307
- #: templates/account.php:427, templates/debug.php:253, templates/debug.php:382, templates/debug.php:466, templates/debug.php:525, templates/account/partials/site.php:227
1308
  msgid "Public Key"
1309
  msgstr ""
1310
 
1311
- #: templates/account.php:433, templates/debug.php:383, templates/debug.php:467, templates/debug.php:526, templates/account/partials/site.php:239
1312
  msgid "Secret Key"
1313
  msgstr ""
1314
 
1315
- #: templates/account.php:436
1316
  msgctxt "as secret encryption key missing"
1317
  msgid "No Secret"
1318
  msgstr ""
1319
 
1320
- #: templates/account.php:463, templates/account/partials/site.php:120, templates/account/partials/site.php:122
1321
  msgid "Trial"
1322
  msgstr ""
1323
 
1324
- #: templates/account.php:490, templates/debug.php:578, templates/account/partials/site.php:260
1325
  msgid "License Key"
1326
  msgstr ""
1327
 
1328
- #: templates/account.php:521
1329
  msgid "Join the Beta program"
1330
  msgstr ""
1331
 
1332
- #: templates/account.php:527
1333
  msgid "not verified"
1334
  msgstr ""
1335
 
1336
- #: templates/account.php:536, templates/account/partials/addon.php:190
1337
  msgid "Expired"
1338
  msgstr ""
1339
 
1340
- #: templates/account.php:596
1341
  msgid "Premium version"
1342
  msgstr ""
1343
 
1344
- #: templates/account.php:598
1345
  msgid "Free version"
1346
  msgstr ""
1347
 
1348
- #: templates/account.php:610
1349
  msgid "Verify Email"
1350
  msgstr ""
1351
 
1352
- #: templates/account.php:624
1353
  msgid "Download %s Version"
1354
  msgstr ""
1355
 
1356
- #: templates/account.php:640
1357
  msgid "Download Paid Version"
1358
  msgstr ""
1359
 
1360
- #: templates/account.php:658, templates/account.php:921, templates/account/partials/site.php:248, templates/account/partials/site.php:270
1361
  msgctxt "verb"
1362
  msgid "Show"
1363
  msgstr ""
1364
 
1365
- #: templates/account.php:674
1366
  msgid "What is your %s?"
1367
  msgstr ""
1368
 
1369
- #: templates/account.php:682, templates/account/billing.php:21
1370
  msgctxt "verb"
1371
  msgid "Edit"
1372
  msgstr ""
1373
 
1374
- #: templates/account.php:687, templates/forms/user-change.php:27
1375
  msgid "Change User"
1376
  msgstr ""
1377
 
1378
- #: templates/account.php:711
1379
  msgid "Sites"
1380
  msgstr ""
1381
 
1382
- #: templates/account.php:724
1383
  msgid "Search by address"
1384
  msgstr ""
1385
 
1386
- #: templates/account.php:733, templates/debug.php:376
1387
  msgid "Address"
1388
  msgstr ""
1389
 
1390
- #: templates/account.php:734
1391
  msgid "License"
1392
  msgstr ""
1393
 
1394
- #: templates/account.php:735
1395
  msgid "Plan"
1396
  msgstr ""
1397
 
1398
- #: templates/account.php:786
1399
  msgctxt "as software license"
1400
  msgid "License"
1401
  msgstr ""
1402
 
1403
- #: templates/account.php:915
1404
  msgctxt "verb"
1405
  msgid "Hide"
1406
  msgstr ""
1407
 
1408
- #: templates/account.php:937, templates/forms/data-debug-mode.php:31, templates/forms/deactivation/form.php:358, templates/forms/deactivation/form.php:389
1409
  msgid "Processing"
1410
  msgstr ""
1411
 
1412
- #: templates/account.php:940
1413
  msgid "Get updates for bleeding edge Beta versions of %s."
1414
  msgstr ""
1415
 
1416
- #: templates/account.php:998
1417
  msgid "Cancelling %s"
1418
  msgstr ""
1419
 
1420
- #: templates/account.php:998, templates/account.php:1015, templates/forms/subscription-cancellation.php:27, templates/forms/deactivation/form.php:178
1421
  msgid "trial"
1422
  msgstr ""
1423
 
1424
- #: templates/account.php:1013, templates/forms/deactivation/form.php:195
1425
  msgid "Cancelling %s..."
1426
  msgstr ""
1427
 
1428
- #: templates/account.php:1016, templates/forms/subscription-cancellation.php:28, templates/forms/deactivation/form.php:179
1429
  msgid "subscription"
1430
  msgstr ""
1431
 
1432
- #: templates/account.php:1030
1433
  msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?"
1434
  msgstr ""
1435
 
1436
- #: templates/account.php:1104
1437
  msgid "Disabling white-label mode"
1438
  msgstr ""
1439
 
1440
- #: templates/account.php:1105
1441
  msgid "Enabling white-label mode"
1442
  msgstr ""
1443
 
@@ -1463,7 +1455,7 @@ msgctxt "installed add-on"
1463
  msgid "Installed"
1464
  msgstr ""
1465
 
1466
- #: templates/admin-notice.php:13, templates/forms/license-activation.php:250, templates/forms/resend-key.php:77
1467
  msgctxt "as close a window"
1468
  msgid "Dismiss"
1469
  msgstr ""
@@ -1497,198 +1489,198 @@ msgid "PCI compliant"
1497
  msgstr ""
1498
 
1499
  #. translators: %s: name (e.g. Hey John,)
1500
- #: templates/connect.php:121
1501
  msgctxt "greeting"
1502
  msgid "Hey %s,"
1503
  msgstr ""
1504
 
1505
- #: templates/connect.php:171
1506
  msgid "Allow & Continue"
1507
  msgstr ""
1508
 
1509
- #: templates/connect.php:175
1510
  msgid "Re-send activation email"
1511
  msgstr ""
1512
 
1513
- #: templates/connect.php:179
1514
  msgid "Thanks %s!"
1515
  msgstr ""
1516
 
1517
- #: templates/connect.php:189, templates/forms/license-activation.php:46
1518
  msgid "Agree & Activate License"
1519
  msgstr ""
1520
 
1521
- #: templates/connect.php:193
1522
  msgid "Welcome to %s! To get started, please enter your license key:"
1523
  msgstr ""
1524
 
1525
- #: templates/connect.php:200
1526
  msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s."
1527
  msgstr ""
1528
 
1529
- #: templates/connect.php:201
1530
  msgid "Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s."
1531
  msgstr ""
1532
 
1533
- #: templates/connect.php:207
1534
  msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine."
1535
  msgstr ""
1536
 
1537
- #: templates/connect.php:208
1538
  msgid "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine."
1539
  msgstr ""
1540
 
1541
- #: templates/connect.php:237
1542
  msgid "We're excited to introduce the Freemius network-level integration."
1543
  msgstr ""
1544
 
1545
- #: templates/connect.php:240
1546
  msgid "During the update process we detected %d site(s) that are still pending license activation."
1547
  msgstr ""
1548
 
1549
- #: templates/connect.php:242
1550
  msgid "If you'd like to use the %s on those sites, please enter your license key below and click the activation button."
1551
  msgstr ""
1552
 
1553
- #: templates/connect.php:244
1554
  msgid "%s's paid features"
1555
  msgstr ""
1556
 
1557
- #: templates/connect.php:249
1558
  msgid "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page."
1559
  msgstr ""
1560
 
1561
- #: templates/connect.php:251
1562
  msgid "During the update process we detected %s site(s) in the network that are still pending your attention."
1563
  msgstr ""
1564
 
1565
- #: templates/connect.php:260, templates/forms/data-debug-mode.php:35, templates/forms/license-activation.php:49
1566
  msgid "License key"
1567
  msgstr ""
1568
 
1569
- #: templates/connect.php:263, templates/forms/license-activation.php:22
1570
  msgid "Can't find your license key?"
1571
  msgstr ""
1572
 
1573
- #: templates/connect.php:322, templates/connect.php:709, templates/forms/deactivation/retry-skip.php:20
1574
  msgctxt "verb"
1575
  msgid "Skip"
1576
  msgstr ""
1577
 
1578
- #: templates/connect.php:325
1579
  msgid "Delegate to Site Admins"
1580
  msgstr ""
1581
 
1582
- #: templates/connect.php:325
1583
  msgid "If you click it, this decision will be delegated to the sites administrators."
1584
  msgstr ""
1585
 
1586
- #: templates/connect.php:350
1587
  msgid "License issues?"
1588
  msgstr ""
1589
 
1590
- #: templates/connect.php:366
1591
  msgid "Your Profile Overview"
1592
  msgstr ""
1593
 
1594
- #: templates/connect.php:367
1595
  msgid "Name and email address"
1596
  msgstr ""
1597
 
1598
- #: templates/connect.php:374
1599
  msgid "So you can manage and control your license remotely from the User Dashboard."
1600
  msgstr ""
1601
 
1602
- #: templates/connect.php:375
1603
  msgid "Your Site Overview"
1604
  msgstr ""
1605
 
1606
- #: templates/connect.php:376
1607
  msgid "Site URL, WP version, PHP info"
1608
  msgstr ""
1609
 
1610
- #: templates/connect.php:383
1611
  msgid "Admin Notices"
1612
  msgstr ""
1613
 
1614
- #: templates/connect.php:384, templates/connect.php:402
1615
  msgid "Updates, announcements, marketing, no spam"
1616
  msgstr ""
1617
 
1618
- #: templates/connect.php:391
1619
  msgid "So you can reuse the license when the %s is no longer active."
1620
  msgstr ""
1621
 
1622
- #: templates/connect.php:392
1623
  msgid "Current %s Status"
1624
  msgstr ""
1625
 
1626
- #: templates/connect.php:393
1627
  msgid "Active, deactivated, or uninstalled"
1628
  msgstr ""
1629
 
1630
- #: templates/connect.php:401
1631
  msgid "Newsletter"
1632
  msgstr ""
1633
 
1634
- #: templates/connect.php:409
1635
  msgid "Plugins & Themes"
1636
  msgstr ""
1637
 
1638
- #: templates/connect.php:409
1639
  msgid "optional"
1640
  msgstr ""
1641
 
1642
- #: templates/connect.php:410
1643
  msgid "To help us troubleshoot any potential issues that may arise from other plugin or theme conflicts."
1644
  msgstr ""
1645
 
1646
- #: templates/connect.php:411
1647
  msgid "Title, slug, version, and is active"
1648
  msgstr ""
1649
 
1650
- #: templates/connect.php:428
1651
  msgid "The %1$s will periodically send %2$s to %3$s for security & feature updates delivery, and license management."
1652
  msgstr ""
1653
 
1654
- #: templates/connect.php:430
1655
  msgid "diagnostic data"
1656
  msgstr ""
1657
 
1658
- #: templates/connect.php:431
1659
  msgid "Freemius is our licensing and software updates engine"
1660
  msgstr ""
1661
 
1662
- #: templates/connect.php:434
1663
  msgid "What permissions are being granted?"
1664
  msgstr ""
1665
 
1666
- #: templates/connect.php:461
1667
  msgid "Don't have a license key?"
1668
  msgstr ""
1669
 
1670
- #: templates/connect.php:464
1671
  msgid "Have a license key?"
1672
  msgstr ""
1673
 
1674
- #: templates/connect.php:472
1675
  msgid "Privacy Policy"
1676
  msgstr ""
1677
 
1678
- #: templates/connect.php:474
1679
  msgid "License Agreement"
1680
  msgstr ""
1681
 
1682
- #: templates/connect.php:474
1683
  msgid "Terms of Service"
1684
  msgstr ""
1685
 
1686
- #: templates/connect.php:875
1687
  msgctxt "as in the process of sending an email"
1688
  msgid "Sending email"
1689
  msgstr ""
1690
 
1691
- #: templates/connect.php:876
1692
  msgctxt "as activating plugin"
1693
  msgid "Activating"
1694
  msgstr ""
@@ -1716,7 +1708,7 @@ msgctxt "as code debugging"
1716
  msgid "Debugging"
1717
  msgstr ""
1718
 
1719
- #: templates/debug.php:52, templates/debug.php:258, templates/debug.php:384, templates/debug.php:527
1720
  msgid "Actions"
1721
  msgstr ""
1722
 
@@ -1736,210 +1728,206 @@ msgstr ""
1736
  msgid "Clear Updates Transients"
1737
  msgstr ""
1738
 
1739
- #: templates/debug.php:86
1740
- msgid "Reset Deactivation Snoozing"
1741
- msgstr ""
1742
-
1743
- #: templates/debug.php:94
1744
  msgid "Sync Data From Server"
1745
  msgstr ""
1746
 
1747
- #: templates/debug.php:103
1748
  msgid "Migrate Options to Network"
1749
  msgstr ""
1750
 
1751
- #: templates/debug.php:108
1752
  msgid "Load DB Option"
1753
  msgstr ""
1754
 
1755
- #: templates/debug.php:111
1756
  msgid "Set DB Option"
1757
  msgstr ""
1758
 
1759
- #: templates/debug.php:190
1760
  msgid "Key"
1761
  msgstr ""
1762
 
1763
- #: templates/debug.php:191
1764
  msgid "Value"
1765
  msgstr ""
1766
 
1767
- #: templates/debug.php:207
1768
  msgctxt "as software development kit versions"
1769
  msgid "SDK Versions"
1770
  msgstr ""
1771
 
1772
- #: templates/debug.php:212
1773
  msgid "SDK Path"
1774
  msgstr ""
1775
 
1776
- #: templates/debug.php:213, templates/debug.php:252
1777
  msgid "Module Path"
1778
  msgstr ""
1779
 
1780
- #: templates/debug.php:214
1781
  msgid "Is Active"
1782
  msgstr ""
1783
 
1784
- #: templates/debug.php:242, templates/debug/plugins-themes-sync.php:35
1785
  msgid "Plugins"
1786
  msgstr ""
1787
 
1788
- #: templates/debug.php:242, templates/debug/plugins-themes-sync.php:56
1789
  msgid "Themes"
1790
  msgstr ""
1791
 
1792
- #: templates/debug.php:247, templates/debug.php:378, templates/debug.php:464, templates/debug/scheduled-crons.php:80
1793
  msgid "Slug"
1794
  msgstr ""
1795
 
1796
- #: templates/debug.php:249, templates/debug.php:463
1797
  msgid "Title"
1798
  msgstr ""
1799
 
1800
- #: templates/debug.php:250
1801
  msgctxt "as application program interface"
1802
  msgid "API"
1803
  msgstr ""
1804
 
1805
- #: templates/debug.php:251
1806
  msgid "Freemius State"
1807
  msgstr ""
1808
 
1809
- #: templates/debug.php:255
1810
  msgid "Network Blog"
1811
  msgstr ""
1812
 
1813
- #: templates/debug.php:256
1814
  msgid "Network User"
1815
  msgstr ""
1816
 
1817
- #: templates/debug.php:293
1818
  msgctxt "as connection was successful"
1819
  msgid "Connected"
1820
  msgstr ""
1821
 
1822
- #: templates/debug.php:294
1823
  msgctxt "as connection blocked"
1824
  msgid "Blocked"
1825
  msgstr ""
1826
 
1827
- #: templates/debug.php:330
1828
  msgid "Simulate Trial Promotion"
1829
  msgstr ""
1830
 
1831
- #: templates/debug.php:342
1832
  msgid "Simulate Network Upgrade"
1833
  msgstr ""
1834
 
1835
- #: templates/debug.php:367
1836
  msgid "%s Installs"
1837
  msgstr ""
1838
 
1839
- #: templates/debug.php:369
1840
  msgctxt "like websites"
1841
  msgid "Sites"
1842
  msgstr ""
1843
 
1844
- #: templates/debug.php:375, templates/account/partials/site.php:156
1845
  msgid "Blog ID"
1846
  msgstr ""
1847
 
1848
- #: templates/debug.php:380
1849
  msgid "License ID"
1850
  msgstr ""
1851
 
1852
- #: templates/debug.php:444, templates/debug.php:550, templates/account/partials/addon.php:435
1853
  msgctxt "verb"
1854
  msgid "Delete"
1855
  msgstr ""
1856
 
1857
- #: templates/debug.php:458
1858
  msgid "Add Ons of module %s"
1859
  msgstr ""
1860
 
1861
- #: templates/debug.php:517
1862
  msgid "Users"
1863
  msgstr ""
1864
 
1865
- #: templates/debug.php:524
1866
  msgid "Verified"
1867
  msgstr ""
1868
 
1869
- #: templates/debug.php:566
1870
  msgid "%s Licenses"
1871
  msgstr ""
1872
 
1873
- #: templates/debug.php:571
1874
  msgid "Plugin ID"
1875
  msgstr ""
1876
 
1877
- #: templates/debug.php:573
1878
  msgid "Plan ID"
1879
  msgstr ""
1880
 
1881
- #: templates/debug.php:574
1882
  msgid "Quota"
1883
  msgstr ""
1884
 
1885
- #: templates/debug.php:575
1886
  msgid "Activated"
1887
  msgstr ""
1888
 
1889
- #: templates/debug.php:576
1890
  msgid "Blocking"
1891
  msgstr ""
1892
 
1893
- #: templates/debug.php:577, templates/debug.php:648, templates/debug/logger.php:22
1894
  msgid "Type"
1895
  msgstr ""
1896
 
1897
- #: templates/debug.php:579
1898
  msgctxt "as expiration date"
1899
  msgid "Expiration"
1900
  msgstr ""
1901
 
1902
- #: templates/debug.php:607
1903
  msgid "Debug Log"
1904
  msgstr ""
1905
 
1906
- #: templates/debug.php:611
1907
  msgid "All Types"
1908
  msgstr ""
1909
 
1910
- #: templates/debug.php:618
1911
  msgid "All Requests"
1912
  msgstr ""
1913
 
1914
- #: templates/debug.php:623, templates/debug.php:652, templates/debug/logger.php:25
1915
  msgid "File"
1916
  msgstr ""
1917
 
1918
- #: templates/debug.php:624, templates/debug.php:650, templates/debug/logger.php:23
1919
  msgid "Function"
1920
  msgstr ""
1921
 
1922
- #: templates/debug.php:625
1923
  msgid "Process ID"
1924
  msgstr ""
1925
 
1926
- #: templates/debug.php:626
1927
  msgid "Logger"
1928
  msgstr ""
1929
 
1930
- #: templates/debug.php:627, templates/debug.php:651, templates/debug/logger.php:24
1931
  msgid "Message"
1932
  msgstr ""
1933
 
1934
- #: templates/debug.php:629
1935
  msgid "Filter"
1936
  msgstr ""
1937
 
1938
- #: templates/debug.php:637
1939
  msgid "Download"
1940
  msgstr ""
1941
 
1942
- #: templates/debug.php:653, templates/debug/logger.php:26
1943
  msgid "Timestamp"
1944
  msgstr ""
1945
 
@@ -1964,120 +1952,6 @@ msgstr ""
1964
  msgid "Requests"
1965
  msgstr ""
1966
 
1967
- #: includes/managers/class-fs-clone-manager.php:703
1968
- msgid "Invalid clone resolution action."
1969
- msgstr ""
1970
-
1971
- #: includes/managers/class-fs-clone-manager.php:851
1972
- msgid "products"
1973
- msgstr ""
1974
-
1975
- #: includes/managers/class-fs-clone-manager.php:1033
1976
- msgid "%1$s has been placed into safe mode because we noticed that %2$s is an exact copy of %3$s."
1977
- msgstr ""
1978
-
1979
- #: includes/managers/class-fs-clone-manager.php:1039
1980
- msgid "The products below have been placed into safe mode because we noticed that %2$s is an exact copy of %3$s:%1$s"
1981
- msgstr ""
1982
-
1983
- #: includes/managers/class-fs-clone-manager.php:1040
1984
- msgid "The products below have been placed into safe mode because we noticed that %2$s is an exact copy of these sites:%3$s%1$s"
1985
- msgstr ""
1986
-
1987
- #: includes/managers/class-fs-clone-manager.php:1066
1988
- msgid "the above-mentioned sites"
1989
- msgstr ""
1990
-
1991
- #: includes/managers/class-fs-clone-manager.php:1079
1992
- msgid "Is %2$s a duplicate of %4$s?"
1993
- msgstr ""
1994
-
1995
- #: includes/managers/class-fs-clone-manager.php:1080
1996
- msgid "Yes, %2$s is a duplicate of %4$s for the purpose of testing, staging, or development."
1997
- msgstr ""
1998
-
1999
- #: includes/managers/class-fs-clone-manager.php:1085
2000
- msgid "Long-Term Duplicate"
2001
- msgstr ""
2002
-
2003
- #: includes/managers/class-fs-clone-manager.php:1090
2004
- msgid "Duplicate Website"
2005
- msgstr ""
2006
-
2007
- #: includes/managers/class-fs-clone-manager.php:1096
2008
- msgid "Is %2$s the new home of %4$s?"
2009
- msgstr ""
2010
-
2011
- #: includes/managers/class-fs-clone-manager.php:1098
2012
- msgid "Yes, %%2$s is replacing %%4$s. I would like to migrate my %s from %%4$s to %%2$s."
2013
- msgstr ""
2014
-
2015
- #: includes/managers/class-fs-clone-manager.php:1099, templates/forms/subscription-cancellation.php:52
2016
- msgid "license"
2017
- msgstr ""
2018
-
2019
- #: includes/managers/class-fs-clone-manager.php:1099
2020
- msgid "data"
2021
- msgstr ""
2022
-
2023
- #: includes/managers/class-fs-clone-manager.php:1105
2024
- msgid "Migrate License"
2025
- msgstr ""
2026
-
2027
- #: includes/managers/class-fs-clone-manager.php:1106
2028
- msgid "Migrate"
2029
- msgstr ""
2030
-
2031
- #: includes/managers/class-fs-clone-manager.php:1112
2032
- msgid "Is %2$s a new website?"
2033
- msgstr ""
2034
-
2035
- #: includes/managers/class-fs-clone-manager.php:1113
2036
- msgid "Yes, %2$s is a new and different website that is separate from %4$s."
2037
- msgstr ""
2038
-
2039
- #: includes/managers/class-fs-clone-manager.php:1115
2040
- msgid "It requires license activation."
2041
- msgstr ""
2042
-
2043
- #: includes/managers/class-fs-clone-manager.php:1122
2044
- msgid "New Website"
2045
- msgstr ""
2046
-
2047
- #: includes/managers/class-fs-clone-manager.php:1145
2048
- msgctxt "Clone resolution admin notice products list label"
2049
- msgid "Products"
2050
- msgstr ""
2051
-
2052
- #: includes/managers/class-fs-clone-manager.php:1230
2053
- msgid "You marked this website, %s, as a temporary duplicate of %s."
2054
- msgstr ""
2055
-
2056
- #: includes/managers/class-fs-clone-manager.php:1231
2057
- msgid "You marked this website, %s, as a temporary duplicate of these sites"
2058
- msgstr ""
2059
-
2060
- #: includes/managers/class-fs-clone-manager.php:1245
2061
- msgid "%s automatic security & feature updates and paid functionality will keep working without interruptions until %s (or when your license expires, whatever comes first)."
2062
- msgstr ""
2063
-
2064
- #: includes/managers/class-fs-clone-manager.php:1248
2065
- msgctxt "\"The <product_label>\", e.g.: \"The plugin\""
2066
- msgid "The %s's"
2067
- msgstr ""
2068
-
2069
- #: includes/managers/class-fs-clone-manager.php:1251
2070
- msgid "The following products'"
2071
- msgstr ""
2072
-
2073
- #: includes/managers/class-fs-clone-manager.php:1259
2074
- msgid "If this is a long term duplicate, to keep automatic updates and paid functionality after %s, please %s."
2075
- msgstr ""
2076
-
2077
- #: includes/managers/class-fs-clone-manager.php:1261
2078
- msgid "activate a license here"
2079
- msgstr ""
2080
-
2081
  #: templates/account/billing.php:22
2082
  msgctxt "verb"
2083
  msgid "Update"
@@ -2387,51 +2261,6 @@ msgstr ""
2387
  msgid "User key"
2388
  msgstr ""
2389
 
2390
- #: templates/forms/email-address-update.php:32
2391
- msgid "Email address update"
2392
- msgstr ""
2393
-
2394
- #: templates/forms/email-address-update.php:33, templates/forms/user-change.php:81
2395
- msgctxt "close window"
2396
- msgid "Dismiss"
2397
- msgstr ""
2398
-
2399
- #: templates/forms/email-address-update.php:38
2400
- msgid "Enter the new email address"
2401
- msgstr ""
2402
-
2403
- #: templates/forms/email-address-update.php:42
2404
- msgid "Are both %s and %s your email addresses?"
2405
- msgstr ""
2406
-
2407
- #: templates/forms/email-address-update.php:50
2408
- msgid "Yes - both addresses are mine"
2409
- msgstr ""
2410
-
2411
- #: templates/forms/email-address-update.php:57
2412
- msgid "%s is my client's email address"
2413
- msgstr ""
2414
-
2415
- #: templates/forms/email-address-update.php:66
2416
- msgid "%s is my email address"
2417
- msgstr ""
2418
-
2419
- #: templates/forms/email-address-update.php:75
2420
- msgid "Would you like to merge %s into %s?"
2421
- msgstr ""
2422
-
2423
- #: templates/forms/email-address-update.php:84
2424
- msgid "Yes - move all my data and assets from %s to %s"
2425
- msgstr ""
2426
-
2427
- #: templates/forms/email-address-update.php:94
2428
- msgid "No - only move this site's data to %s"
2429
- msgstr ""
2430
-
2431
- #: templates/forms/email-address-update.php:292, templates/forms/email-address-update.php:298
2432
- msgid "Update"
2433
- msgstr ""
2434
-
2435
  #: templates/forms/license-activation.php:23
2436
  msgid "Please enter the license key that you received in the email right after the purchase:"
2437
  msgstr ""
@@ -2444,7 +2273,7 @@ msgstr ""
2444
  msgid "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license."
2445
  msgstr ""
2446
 
2447
- #: templates/forms/license-activation.php:211
2448
  msgid "Associate with the license owner's account."
2449
  msgstr ""
2450
 
@@ -2527,6 +2356,10 @@ msgstr ""
2527
  msgid "In case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?"
2528
  msgstr ""
2529
 
 
 
 
 
2530
  #: templates/forms/subscription-cancellation.php:57
2531
  msgid "Cancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site."
2532
  msgstr ""
@@ -2547,7 +2380,7 @@ msgstr ""
2547
  msgid "Proceed"
2548
  msgstr ""
2549
 
2550
- #: templates/forms/subscription-cancellation.php:191, templates/forms/deactivation/form.php:216
2551
  msgid "Cancel %s & Proceed"
2552
  msgstr ""
2553
 
@@ -2571,6 +2404,11 @@ msgstr ""
2571
  msgid "Enter email address"
2572
  msgstr ""
2573
 
 
 
 
 
 
2574
  #: templates/js/style-premium-theme.php:39
2575
  msgid "Premium"
2576
  msgstr ""
@@ -2665,63 +2503,47 @@ msgstr ""
2665
  msgid "Contact Support"
2666
  msgstr ""
2667
 
2668
- #: templates/forms/deactivation/form.php:65
2669
  msgid "Anonymous feedback"
2670
  msgstr ""
2671
 
2672
- #: templates/forms/deactivation/form.php:71
2673
- msgid "hour"
2674
- msgstr ""
2675
-
2676
- #: templates/forms/deactivation/form.php:76
2677
- msgid "hours"
2678
- msgstr ""
2679
-
2680
- #: templates/forms/deactivation/form.php:81, templates/forms/deactivation/form.php:86
2681
- msgid "days"
2682
- msgstr ""
2683
-
2684
- #: templates/forms/deactivation/form.php:106
2685
  msgid "Deactivate"
2686
  msgstr ""
2687
 
2688
- #: templates/forms/deactivation/form.php:108
2689
  msgid "Activate %s"
2690
  msgstr ""
2691
 
2692
- #: templates/forms/deactivation/form.php:111
2693
- msgid "Submit & %s"
2694
- msgstr ""
2695
-
2696
- #: templates/forms/deactivation/form.php:130
2697
  msgid "Quick Feedback"
2698
  msgstr ""
2699
 
2700
- #: templates/forms/deactivation/form.php:134
2701
  msgid "If you have a moment, please let us know why you are %s"
2702
  msgstr ""
2703
 
2704
- #: templates/forms/deactivation/form.php:134
2705
  msgid "deactivating"
2706
  msgstr ""
2707
 
2708
- #: templates/forms/deactivation/form.php:134
2709
  msgid "switching"
2710
  msgstr ""
2711
 
2712
- #: templates/forms/deactivation/form.php:448
2713
- msgid "Kindly tell us the reason so we can improve."
2714
  msgstr ""
2715
 
2716
- #: templates/forms/deactivation/form.php:478
2717
- msgid "Snooze & %s"
2718
  msgstr ""
2719
 
2720
- #: templates/forms/deactivation/form.php:638
2721
  msgid "Yes - %s"
2722
  msgstr ""
2723
 
2724
- #: templates/forms/deactivation/form.php:645
2725
  msgid "Skip & %s"
2726
  msgstr ""
2727
 
1
+ # Copyright (C) 2021 freemius
2
  # This file is distributed under the same license as the freemius package.
3
  msgid ""
4
  msgstr ""
16
  "X-Poedit-SourceCharset: UTF-8\n"
17
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
18
 
19
+ #: includes/class-freemius.php:1919, templates/account.php:912
20
  msgid "An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned."
21
  msgstr ""
22
 
23
+ #: includes/class-freemius.php:1926
24
  msgid "Would you like to proceed with the update?"
25
  msgstr ""
26
 
27
+ #: includes/class-freemius.php:2138
28
  msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error."
29
  msgstr ""
30
 
31
+ #: includes/class-freemius.php:2140
32
  msgid "Error"
33
  msgstr ""
34
 
35
+ #: includes/class-freemius.php:2540
36
  msgid "I found a better %s"
37
  msgstr ""
38
 
39
+ #: includes/class-freemius.php:2542
40
  msgid "What's the %s's name?"
41
  msgstr ""
42
 
43
+ #: includes/class-freemius.php:2548
44
+ msgid "It's a temporary %s. I'm just debugging an issue."
45
  msgstr ""
46
 
47
+ #: includes/class-freemius.php:2550
48
  msgid "Deactivation"
49
  msgstr ""
50
 
51
+ #: includes/class-freemius.php:2551
52
  msgid "Theme Switch"
53
  msgstr ""
54
 
55
+ #: includes/class-freemius.php:2560, templates/forms/resend-key.php:24, templates/forms/user-change.php:29
56
  msgid "Other"
57
  msgstr ""
58
 
59
+ #: includes/class-freemius.php:2568
60
  msgid "I no longer need the %s"
61
  msgstr ""
62
 
63
+ #: includes/class-freemius.php:2575
64
  msgid "I only needed the %s for a short period"
65
  msgstr ""
66
 
67
+ #: includes/class-freemius.php:2581
68
  msgid "The %s broke my site"
69
  msgstr ""
70
 
71
+ #: includes/class-freemius.php:2588
72
  msgid "The %s suddenly stopped working"
73
  msgstr ""
74
 
75
+ #: includes/class-freemius.php:2598
76
  msgid "I can't pay for it anymore"
77
  msgstr ""
78
 
79
+ #: includes/class-freemius.php:2600
80
  msgid "What price would you feel comfortable paying?"
81
  msgstr ""
82
 
83
+ #: includes/class-freemius.php:2606
84
  msgid "I don't like to share my information with you"
85
  msgstr ""
86
 
87
+ #: includes/class-freemius.php:2627
88
  msgid "The %s didn't work"
89
  msgstr ""
90
 
91
+ #: includes/class-freemius.php:2637
92
  msgid "I couldn't understand how to make it work"
93
  msgstr ""
94
 
95
+ #: includes/class-freemius.php:2645
96
  msgid "The %s is great, but I need specific feature that you don't support"
97
  msgstr ""
98
 
99
+ #: includes/class-freemius.php:2647
100
  msgid "What feature?"
101
  msgstr ""
102
 
103
+ #: includes/class-freemius.php:2651
104
  msgid "The %s is not working"
105
  msgstr ""
106
 
107
+ #: includes/class-freemius.php:2653
108
  msgid "Kindly share what didn't work so we can fix it for future users..."
109
  msgstr ""
110
 
111
+ #: includes/class-freemius.php:2657
112
  msgid "It's not what I was looking for"
113
  msgstr ""
114
 
115
+ #: includes/class-freemius.php:2659
116
  msgid "What you've been looking for?"
117
  msgstr ""
118
 
119
+ #: includes/class-freemius.php:2663
120
  msgid "The %s didn't work as expected"
121
  msgstr ""
122
 
123
+ #: includes/class-freemius.php:2665
124
  msgid "What did you expect?"
125
  msgstr ""
126
 
127
+ #: includes/class-freemius.php:3520, templates/debug.php:20
128
  msgid "Freemius Debug"
129
  msgstr ""
130
 
131
+ #: includes/class-freemius.php:4272
132
  msgid "I don't know what is cURL or how to install it, help me!"
133
  msgstr ""
134
 
135
+ #: includes/class-freemius.php:4274
136
  msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update."
137
  msgstr ""
138
 
139
+ #: includes/class-freemius.php:4281
140
  msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again."
141
  msgstr ""
142
 
143
+ #: includes/class-freemius.php:4386
144
  msgid "Yes - do your thing"
145
  msgstr ""
146
 
147
+ #: includes/class-freemius.php:4391
148
  msgid "No - just deactivate"
149
  msgstr ""
150
 
151
+ #: includes/class-freemius.php:4436, includes/class-freemius.php:4930, includes/class-freemius.php:6191, includes/class-freemius.php:13368, includes/class-freemius.php:14110, includes/class-freemius.php:17542, includes/class-freemius.php:17647, includes/class-freemius.php:17822, includes/class-freemius.php:20056, includes/class-freemius.php:20414, includes/class-freemius.php:20424, includes/class-freemius.php:21109, includes/class-freemius.php:22015, includes/class-freemius.php:22148, includes/class-freemius.php:22304, templates/add-ons.php:57
152
  msgctxt "exclamation"
153
  msgid "Oops"
154
  msgstr ""
155
 
156
+ #: includes/class-freemius.php:4505
157
  msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience."
158
  msgstr ""
159
 
160
+ #: includes/class-freemius.php:4927
 
 
 
 
 
 
 
 
 
 
 
 
 
161
  msgctxt "addonX cannot run without pluginY"
162
  msgid "%s cannot run without %s."
163
  msgstr ""
164
 
165
+ #: includes/class-freemius.php:4928
166
  msgctxt "addonX cannot run..."
167
  msgid "%s cannot run without the plugin."
168
  msgstr ""
169
 
170
+ #: includes/class-freemius.php:5127, includes/class-freemius.php:5152, includes/class-freemius.php:21180
171
  msgid "Unexpected API error. Please contact the %s's author with the following error."
172
  msgstr ""
173
 
174
+ #: includes/class-freemius.php:5857
175
  msgid "Premium %s version was successfully activated."
176
  msgstr ""
177
 
178
+ #: includes/class-freemius.php:5869, includes/class-freemius.php:7774
179
  msgctxt "Used to express elation, enthusiasm, or triumph (especially in electronic communication)."
180
  msgid "W00t"
181
  msgstr ""
182
 
183
+ #: includes/class-freemius.php:5884
184
  msgid "You have a %s license."
185
  msgstr ""
186
 
187
+ #: includes/class-freemius.php:5888, includes/class-freemius.php:16947, includes/class-freemius.php:16958, includes/class-freemius.php:20325, includes/class-freemius.php:20689, includes/class-freemius.php:20758, includes/class-freemius.php:20930
188
+ msgctxt "interjection expressing joy or exuberance"
189
+ msgid "Yee-haw"
190
+ msgstr ""
191
+
192
+ #: includes/class-freemius.php:6174
193
  msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license."
194
  msgstr ""
195
 
196
+ #: includes/class-freemius.php:6178
197
  msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin."
198
  msgstr ""
199
 
200
+ #: includes/class-freemius.php:6187, templates/add-ons.php:186, templates/account/partials/addon.php:381
201
  msgid "More information about %s"
202
  msgstr ""
203
 
204
+ #: includes/class-freemius.php:6188
205
  msgid "Purchase License"
206
  msgstr ""
207
 
208
+ #: includes/class-freemius.php:7125, templates/connect.php:171
209
  msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s."
210
  msgstr ""
211
 
212
+ #: includes/class-freemius.php:7129
213
  msgid "start the trial"
214
  msgstr ""
215
 
216
+ #: includes/class-freemius.php:7130, templates/connect.php:175
217
  msgid "complete the install"
218
  msgstr ""
219
 
220
+ #: includes/class-freemius.php:7249
221
  msgid "You are just one step away - %s"
222
  msgstr ""
223
 
224
+ #: includes/class-freemius.php:7252
225
  msgctxt "%s - plugin name. As complete \"PluginX\" activation now"
226
  msgid "Complete \"%s\" Activation Now"
227
  msgstr ""
228
 
229
+ #: includes/class-freemius.php:7334
230
  msgid "We made a few tweaks to the %s, %s"
231
  msgstr ""
232
 
233
+ #: includes/class-freemius.php:7338
234
  msgid "Opt in to make \"%s\" better!"
235
  msgstr ""
236
 
237
+ #: includes/class-freemius.php:7773
238
  msgid "The upgrade of %s was successfully completed."
239
  msgstr ""
240
 
241
+ #: includes/class-freemius.php:10255, includes/class-fs-plugin-updater.php:1087, includes/class-fs-plugin-updater.php:1282, includes/class-fs-plugin-updater.php:1289, templates/auto-installation.php:32
242
  msgid "Add-On"
243
  msgstr ""
244
 
245
+ #: includes/class-freemius.php:10257, templates/account.php:394, templates/account.php:402, templates/debug.php:358, templates/debug.php:549
246
  msgid "Plugin"
247
  msgstr ""
248
 
249
+ #: includes/class-freemius.php:10258, templates/account.php:395, templates/account.php:403, templates/debug.php:358, templates/debug.php:549, templates/forms/deactivation/form.php:71
250
  msgid "Theme"
251
  msgstr ""
252
 
253
+ #: includes/class-freemius.php:13188
254
  msgid "An unknown error has occurred while trying to toggle the license's white-label mode."
255
  msgstr ""
256
 
257
+ #: includes/class-freemius.php:13202
258
  msgid "Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s."
259
  msgstr ""
260
 
261
+ #: includes/class-freemius.php:13207
262
  msgid "User Dashboard"
263
  msgstr ""
264
 
265
+ #: includes/class-freemius.php:13208
266
  msgid "revert it now"
267
  msgstr ""
268
 
269
+ #: includes/class-freemius.php:13266
270
  msgid "An unknown error has occurred while trying to set the user's beta mode."
271
  msgstr ""
272
 
273
+ #: includes/class-freemius.php:13339
274
  msgid "Invalid new user ID or email address."
275
  msgstr ""
276
 
277
+ #: includes/class-freemius.php:13369, includes/class-freemius.php:22259
278
  msgid "Sorry, we could not complete the email update. Another user with the same email is already registered."
279
  msgstr ""
280
 
281
+ #: includes/class-freemius.php:13370, includes/class-freemius.php:22260
282
  msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button."
283
  msgstr ""
284
 
285
+ #: includes/class-freemius.php:13377, includes/class-freemius.php:22267
286
  msgid "Change Ownership"
287
  msgstr ""
288
 
289
+ #: includes/class-freemius.php:13977
290
  msgid "Invalid site details collection."
291
  msgstr ""
292
 
293
+ #: includes/class-freemius.php:14097
294
  msgid "We couldn't find your email address in the system, are you sure it's the right address?"
295
  msgstr ""
296
 
297
+ #: includes/class-freemius.php:14099
298
  msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?"
299
  msgstr ""
300
 
301
+ #: includes/class-freemius.php:14373
302
  msgid "Account is pending activation."
303
  msgstr ""
304
 
305
+ #: includes/class-freemius.php:14485, templates/forms/premium-versions-upgrade-handler.php:47
306
  msgid "Buy a license now"
307
  msgstr ""
308
 
309
+ #: includes/class-freemius.php:14497, templates/forms/premium-versions-upgrade-handler.php:46
310
  msgid "Renew your license now"
311
  msgstr ""
312
 
313
+ #: includes/class-freemius.php:14501
314
  msgid "%s to access version %s security & feature updates, and support."
315
  msgstr ""
316
 
317
+ #: includes/class-freemius.php:16929
318
  msgid "%s activation was successfully completed."
319
  msgstr ""
320
 
321
+ #: includes/class-freemius.php:16943
322
  msgid "Your account was successfully activated with the %s plan."
323
  msgstr ""
324
 
325
+ #: includes/class-freemius.php:16954, includes/class-freemius.php:20754
326
  msgid "Your trial has been successfully started."
327
  msgstr ""
328
 
329
+ #: includes/class-freemius.php:17540, includes/class-freemius.php:17645, includes/class-freemius.php:17820
330
  msgid "Couldn't activate %s."
331
  msgstr ""
332
 
333
+ #: includes/class-freemius.php:17541, includes/class-freemius.php:17646, includes/class-freemius.php:17821
334
  msgid "Please contact us with the following message:"
335
  msgstr ""
336
 
337
+ #: includes/class-freemius.php:17642, templates/forms/data-debug-mode.php:162
338
  msgid "An unknown error has occurred."
339
  msgstr ""
340
 
341
+ #: includes/class-freemius.php:18178, includes/class-freemius.php:23340
342
  msgid "Upgrade"
343
  msgstr ""
344
 
345
+ #: includes/class-freemius.php:18184
346
  msgid "Start Trial"
347
  msgstr ""
348
 
349
+ #: includes/class-freemius.php:18186
350
  msgid "Pricing"
351
  msgstr ""
352
 
353
+ #: includes/class-freemius.php:18266, includes/class-freemius.php:18268
354
  msgid "Affiliation"
355
  msgstr ""
356
 
357
+ #: includes/class-freemius.php:18296, includes/class-freemius.php:18298, templates/account.php:242, templates/debug.php:324
358
  msgid "Account"
359
  msgstr ""
360
 
361
+ #: includes/class-freemius.php:18312, includes/class-freemius.php:18314, includes/customizer/class-fs-customizer-support-section.php:60
362
  msgid "Contact Us"
363
  msgstr ""
364
 
365
+ #: includes/class-freemius.php:18325, includes/class-freemius.php:18327, includes/class-freemius.php:23354, templates/account.php:121, templates/account/partials/addon.php:44
366
  msgid "Add-Ons"
367
  msgstr ""
368
 
369
+ #: includes/class-freemius.php:18361
370
  msgctxt "ASCII arrow left icon"
371
  msgid "&#x2190;"
372
  msgstr ""
373
 
374
+ #: includes/class-freemius.php:18361
375
  msgctxt "ASCII arrow right icon"
376
  msgid "&#x27a4;"
377
  msgstr ""
378
 
379
+ #: includes/class-freemius.php:18363, templates/pricing.php:109
380
  msgctxt "noun"
381
  msgid "Pricing"
382
  msgstr ""
383
 
384
+ #: includes/class-freemius.php:18576, includes/customizer/class-fs-customizer-support-section.php:67
385
  msgid "Support Forum"
386
  msgstr ""
387
 
388
+ #: includes/class-freemius.php:19550
389
  msgid "Your email has been successfully verified - you are AWESOME!"
390
  msgstr ""
391
 
392
+ #: includes/class-freemius.php:19551
393
  msgctxt "a positive response"
394
  msgid "Right on"
395
  msgstr ""
396
 
397
+ #: includes/class-freemius.php:20057
398
  msgid "seems like the key you entered doesn't match our records."
399
  msgstr ""
400
 
401
+ #: includes/class-freemius.php:20081
402
  msgid "Debug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the \"Stop Debug\" link."
403
  msgstr ""
404
 
405
+ #: includes/class-freemius.php:20316
406
  msgid "Your %s Add-on plan was successfully upgraded."
407
  msgstr ""
408
 
409
+ #: includes/class-freemius.php:20318
410
  msgid "%s Add-on was successfully purchased."
411
  msgstr ""
412
 
413
+ #: includes/class-freemius.php:20321
414
  msgid "Download the latest version"
415
  msgstr ""
416
 
417
+ #: includes/class-freemius.php:20407
418
  msgid "Your server is blocking the access to Freemius' API, which is crucial for %1$s synchronization. Please contact your host to whitelist %2$s"
419
  msgstr ""
420
 
421
+ #: includes/class-freemius.php:20413, includes/class-freemius.php:20423, includes/class-freemius.php:20889, includes/class-freemius.php:20978
422
  msgid "Error received from the server:"
423
  msgstr ""
424
 
425
+ #: includes/class-freemius.php:20423
426
  msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again."
427
  msgstr ""
428
 
429
+ #: includes/class-freemius.php:20651, includes/class-freemius.php:20894, includes/class-freemius.php:20949, includes/class-freemius.php:21056
430
  msgctxt "something somebody says when they are thinking about what you have just said."
431
  msgid "Hmm"
432
  msgstr ""
433
 
434
+ #: includes/class-freemius.php:20664
435
  msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry."
436
  msgstr ""
437
 
438
+ #: includes/class-freemius.php:20665, templates/account.php:123, templates/add-ons.php:250, templates/account/partials/addon.php:46
439
  msgctxt "trial period"
440
  msgid "Trial"
441
  msgstr ""
442
 
443
+ #: includes/class-freemius.php:20670
444
  msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s."
445
  msgstr ""
446
 
447
+ #: includes/class-freemius.php:20674, includes/class-freemius.php:20733
448
  msgid "Please contact us here"
449
  msgstr ""
450
 
451
+ #: includes/class-freemius.php:20685
452
  msgid "Your plan was successfully activated."
453
  msgstr ""
454
 
455
+ #: includes/class-freemius.php:20686
456
  msgid "Your plan was successfully upgraded."
457
  msgstr ""
458
 
459
+ #: includes/class-freemius.php:20703
460
  msgid "Your plan was successfully changed to %s."
461
  msgstr ""
462
 
463
+ #: includes/class-freemius.php:20719
464
  msgid "Your license has expired. You can still continue using the free %s forever."
465
  msgstr ""
466
 
467
+ #: includes/class-freemius.php:20721
468
  msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions."
469
  msgstr ""
470
 
471
+ #: includes/class-freemius.php:20729
472
  msgid "Your license has been cancelled. If you think it's a mistake, please contact support."
473
  msgstr ""
474
 
475
+ #: includes/class-freemius.php:20742
476
  msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support."
477
  msgstr ""
478
 
479
+ #: includes/class-freemius.php:20768
480
  msgid "Your free trial has expired. You can still continue using all our free features."
481
  msgstr ""
482
 
483
+ #: includes/class-freemius.php:20770
484
  msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions."
485
  msgstr ""
486
 
487
+ #: includes/class-freemius.php:20885
488
  msgid "It looks like the license could not be activated."
489
  msgstr ""
490
 
491
+ #: includes/class-freemius.php:20927
492
  msgid "Your license was successfully activated."
493
  msgstr ""
494
 
495
+ #: includes/class-freemius.php:20953
496
  msgid "It looks like your site currently doesn't have an active license."
497
  msgstr ""
498
 
499
+ #: includes/class-freemius.php:20977
500
  msgid "It looks like the license deactivation failed."
501
  msgstr ""
502
 
503
+ #: includes/class-freemius.php:21006
504
  msgid "Your %s license was successfully deactivated."
505
  msgstr ""
506
 
507
+ #: includes/class-freemius.php:21007
508
  msgid "Your license was successfully deactivated, you are back to the %s plan."
509
  msgstr ""
510
 
511
+ #: includes/class-freemius.php:21010
512
  msgid "O.K"
513
  msgstr ""
514
 
515
+ #: includes/class-freemius.php:21063
516
  msgid "Seems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes."
517
  msgstr ""
518
 
519
+ #: includes/class-freemius.php:21072
520
  msgid "Your subscription was successfully cancelled. Your %s plan license will expire in %s."
521
  msgstr ""
522
 
523
+ #: includes/class-freemius.php:21114
524
  msgid "You are already running the %s in a trial mode."
525
  msgstr ""
526
 
527
+ #: includes/class-freemius.php:21125
528
  msgid "You already utilized a trial before."
529
  msgstr ""
530
 
531
+ #: includes/class-freemius.php:21139
532
  msgid "Plan %s do not exist, therefore, can't start a trial."
533
  msgstr ""
534
 
535
+ #: includes/class-freemius.php:21150
536
  msgid "Plan %s does not support a trial period."
537
  msgstr ""
538
 
539
+ #: includes/class-freemius.php:21161
540
  msgid "None of the %s's plans supports a trial period."
541
  msgstr ""
542
 
543
+ #: includes/class-freemius.php:21211
544
  msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)"
545
  msgstr ""
546
 
547
+ #: includes/class-freemius.php:21247
548
  msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes."
549
  msgstr ""
550
 
551
+ #: includes/class-freemius.php:21266
552
  msgid "Your %s free trial was successfully cancelled."
553
  msgstr ""
554
 
555
+ #: includes/class-freemius.php:21582
556
  msgid "Version %s was released."
557
  msgstr ""
558
 
559
+ #: includes/class-freemius.php:21582
560
  msgid "Please download %s."
561
  msgstr ""
562
 
563
+ #: includes/class-freemius.php:21589
564
  msgid "the latest %s version here"
565
  msgstr ""
566
 
567
+ #: includes/class-freemius.php:21594
568
  msgid "New"
569
  msgstr ""
570
 
571
+ #: includes/class-freemius.php:21599
572
  msgid "Seems like you got the latest release."
573
  msgstr ""
574
 
575
+ #: includes/class-freemius.php:21600
576
  msgid "You are all good!"
577
  msgstr ""
578
 
579
+ #: includes/class-freemius.php:21903
580
  msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box."
581
  msgstr ""
582
 
583
+ #: includes/class-freemius.php:22043
584
  msgid "Site successfully opted in."
585
  msgstr ""
586
 
587
+ #: includes/class-freemius.php:22044, includes/class-freemius.php:23050
588
  msgid "Awesome"
589
  msgstr ""
590
 
591
+ #: includes/class-freemius.php:22060, templates/forms/optout.php:41
592
  msgid "We appreciate your help in making the %s better by letting us track some usage data."
593
  msgstr ""
594
 
595
+ #: includes/class-freemius.php:22061
596
  msgid "Thank you!"
597
  msgstr ""
598
 
599
+ #: includes/class-freemius.php:22068
600
  msgid "We will no longer be sending any usage data of %s on %s to %s."
601
  msgstr ""
602
 
603
+ #: includes/class-freemius.php:22226
604
+ msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder."
 
 
 
 
605
  msgstr ""
606
 
607
+ #: includes/class-freemius.php:22232
608
  msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval."
609
  msgstr ""
610
 
611
+ #: includes/class-freemius.php:22237
612
  msgid "%s is the new owner of the account."
613
  msgstr ""
614
 
615
+ #: includes/class-freemius.php:22239
616
  msgctxt "as congratulations"
617
  msgid "Congrats"
618
  msgstr ""
619
 
620
+ #: includes/class-freemius.php:22275
621
+ msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments."
622
+ msgstr ""
623
+
624
+ #: includes/class-freemius.php:22287
625
  msgid "Please provide your full name."
626
  msgstr ""
627
 
628
+ #: includes/class-freemius.php:22292
629
  msgid "Your name was successfully updated."
630
  msgstr ""
631
 
632
+ #: includes/class-freemius.php:22353
633
  msgid "You have successfully updated your %s."
634
  msgstr ""
635
 
636
+ #: includes/class-freemius.php:22412
637
  msgid "Is this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin."
638
  msgstr ""
639
 
640
+ #: includes/class-freemius.php:22415
641
  msgid "Click here"
642
  msgstr ""
643
 
644
+ #: includes/class-freemius.php:22513
645
  msgid "Just letting you know that the add-ons information of %s is being pulled from an external server."
646
  msgstr ""
647
 
648
+ #: includes/class-freemius.php:22514
649
  msgctxt "advance notice of something that will need attention."
650
  msgid "Heads up"
651
  msgstr ""
652
 
653
+ #: includes/class-freemius.php:23090
654
  msgctxt "exclamation"
655
  msgid "Hey"
656
  msgstr ""
657
 
658
+ #: includes/class-freemius.php:23090
659
  msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial."
660
  msgstr ""
661
 
662
+ #: includes/class-freemius.php:23098
663
  msgid "No commitment for %s days - cancel anytime!"
664
  msgstr ""
665
 
666
+ #: includes/class-freemius.php:23099
667
  msgid "No credit card required"
668
  msgstr ""
669
 
670
+ #: includes/class-freemius.php:23106, templates/forms/trial-start.php:53
671
  msgctxt "call to action"
672
  msgid "Start free trial"
673
  msgstr ""
674
 
675
+ #: includes/class-freemius.php:23183
676
  msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!"
677
  msgstr ""
678
 
679
+ #: includes/class-freemius.php:23192
680
  msgid "Learn more"
681
  msgstr ""
682
 
683
+ #: includes/class-freemius.php:23378, templates/account.php:558, templates/account.php:708, templates/connect.php:179, templates/connect.php:461, templates/forms/license-activation.php:27, templates/account/partials/addon.php:321
684
  msgid "Activate License"
685
  msgstr ""
686
 
687
+ #: includes/class-freemius.php:23379, templates/account.php:652, templates/account.php:707, templates/account/partials/addon.php:322, templates/account/partials/site.php:271
688
  msgid "Change License"
689
  msgstr ""
690
 
691
+ #: includes/class-freemius.php:23500, templates/account/partials/site.php:169
692
  msgid "Opt Out"
693
  msgstr ""
694
 
695
+ #: includes/class-freemius.php:23502, includes/class-freemius.php:23508, templates/account/partials/site.php:49, templates/account/partials/site.php:169
696
  msgid "Opt In"
697
  msgstr ""
698
 
699
+ #: includes/class-freemius.php:23738
700
  msgid " The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s"
701
  msgstr ""
702
 
703
+ #: includes/class-freemius.php:23746
704
  msgid "Activate %s features"
705
  msgstr ""
706
 
707
+ #: includes/class-freemius.php:23759
708
  msgid "Please follow these steps to complete the upgrade"
709
  msgstr ""
710
 
711
+ #: includes/class-freemius.php:23763
712
  msgid "Download the latest %s version"
713
  msgstr ""
714
 
715
+ #: includes/class-freemius.php:23767
716
  msgid "Upload and activate the downloaded version"
717
  msgstr ""
718
 
719
+ #: includes/class-freemius.php:23769
720
  msgid "How to upload and activate?"
721
  msgstr ""
722
 
723
+ #: includes/class-freemius.php:23903
724
  msgid "%sClick here%s to choose the sites where you'd like to activate the license on."
725
  msgstr ""
726
 
727
+ #: includes/class-freemius.php:24072
728
  msgid "Auto installation only works for opted-in users."
729
  msgstr ""
730
 
731
+ #: includes/class-freemius.php:24082, includes/class-freemius.php:24115, includes/class-fs-plugin-updater.php:1261, includes/class-fs-plugin-updater.php:1275
732
  msgid "Invalid module ID."
733
  msgstr ""
734
 
735
+ #: includes/class-freemius.php:24091, includes/class-fs-plugin-updater.php:1297
736
  msgid "Premium version already active."
737
  msgstr ""
738
 
739
+ #: includes/class-freemius.php:24098
740
  msgid "You do not have a valid license to access the premium version."
741
  msgstr ""
742
 
743
+ #: includes/class-freemius.php:24105
744
  msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version."
745
  msgstr ""
746
 
747
+ #: includes/class-freemius.php:24123, includes/class-fs-plugin-updater.php:1296
748
  msgid "Premium add-on version already installed."
749
  msgstr ""
750
 
751
+ #: includes/class-freemius.php:24473
752
  msgid "View paid features"
753
  msgstr ""
754
 
755
+ #: includes/class-freemius.php:24795
756
  msgid "Thank you so much for using %s and its add-ons!"
757
  msgstr ""
758
 
759
+ #: includes/class-freemius.php:24796
760
  msgid "Thank you so much for using %s!"
761
  msgstr ""
762
 
763
+ #: includes/class-freemius.php:24802
764
  msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s."
765
  msgstr ""
766
 
767
+ #: includes/class-freemius.php:24806
768
  msgid "Thank you so much for using our products!"
769
  msgstr ""
770
 
771
+ #: includes/class-freemius.php:24807
772
  msgid "You've already opted-in to our usage-tracking, which helps us keep improving them."
773
  msgstr ""
774
 
775
+ #: includes/class-freemius.php:24826
776
  msgid "%s and its add-ons"
777
  msgstr ""
778
 
779
+ #: includes/class-freemius.php:24835
780
  msgid "Products"
781
  msgstr ""
782
 
783
+ #: includes/class-freemius.php:24842, templates/connect.php:275
784
  msgid "Yes"
785
  msgstr ""
786
 
787
+ #: includes/class-freemius.php:24843, templates/connect.php:276
788
  msgid "send me security & feature updates, educational content and offers."
789
  msgstr ""
790
 
791
+ #: includes/class-freemius.php:24844, templates/connect.php:281
792
  msgid "No"
793
  msgstr ""
794
 
795
+ #: includes/class-freemius.php:24846, templates/connect.php:283
796
  msgid "do %sNOT%s send me security & feature updates, educational content and offers."
797
  msgstr ""
798
 
799
+ #: includes/class-freemius.php:24856
800
  msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)"
801
  msgstr ""
802
 
803
+ #: includes/class-freemius.php:24858, templates/connect.php:290
804
  msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:"
805
  msgstr ""
806
 
807
+ #: includes/class-freemius.php:25140
808
  msgid "License key is empty."
809
  msgstr ""
810
 
816
  msgid "Buy license"
817
  msgstr ""
818
 
819
+ #: includes/class-fs-plugin-updater.php:327, includes/class-fs-plugin-updater.php:360
820
  msgid "There is a %s of %s available."
821
  msgstr ""
822
 
823
+ #: includes/class-fs-plugin-updater.php:329, includes/class-fs-plugin-updater.php:365
824
  msgid "new Beta version"
825
  msgstr ""
826
 
827
+ #: includes/class-fs-plugin-updater.php:330, includes/class-fs-plugin-updater.php:366
828
  msgid "new version"
829
  msgstr ""
830
 
831
+ #: includes/class-fs-plugin-updater.php:389
832
  msgid "Important Upgrade Notice:"
833
  msgstr ""
834
 
835
+ #: includes/class-fs-plugin-updater.php:1326
836
  msgid "Installing plugin: %s"
837
  msgstr ""
838
 
839
+ #: includes/class-fs-plugin-updater.php:1367
840
  msgid "Unable to connect to the filesystem. Please confirm your credentials."
841
  msgstr ""
842
 
843
+ #: includes/class-fs-plugin-updater.php:1549
844
  msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work."
845
  msgstr ""
846
 
861
  msgid "Install Free Version Update Now"
862
  msgstr ""
863
 
864
+ #: includes/fs-plugin-info-dialog.php:745, templates/account.php:641
865
  msgid "Install Update Now"
866
  msgstr ""
867
 
878
  msgid "Download Latest Free Version"
879
  msgstr ""
880
 
881
+ #: includes/fs-plugin-info-dialog.php:772, templates/account.php:101, templates/add-ons.php:37, templates/account/partials/addon.php:25
882
  msgctxt "as download latest version"
883
  msgid "Download Latest"
884
  msgstr ""
887
  msgid "Activate this add-on"
888
  msgstr ""
889
 
890
+ #: includes/fs-plugin-info-dialog.php:789, templates/connect.php:458
891
  msgid "Activate Free Version"
892
  msgstr ""
893
 
894
+ #: includes/fs-plugin-info-dialog.php:790, templates/account.php:125, templates/add-ons.php:330, templates/account/partials/addon.php:48
895
  msgid "Activate"
896
  msgstr ""
897
 
1020
  msgid "Details"
1021
  msgstr ""
1022
 
1023
+ #: includes/fs-plugin-info-dialog.php:1318, templates/account.php:112, templates/debug.php:201, templates/debug.php:238, templates/debug.php:455, templates/account/partials/addon.php:36
1024
  msgctxt "product version"
1025
  msgid "Version"
1026
  msgstr ""
1034
  msgid "Last Updated"
1035
  msgstr ""
1036
 
1037
+ #: includes/fs-plugin-info-dialog.php:1337, templates/account.php:527
1038
  msgctxt "x-ago"
1039
  msgid "%s ago"
1040
  msgstr ""
1143
  msgid "Latest Free Version Installed"
1144
  msgstr ""
1145
 
1146
+ #: templates/account.php:102, templates/forms/subscription-cancellation.php:96, templates/account/partials/addon.php:26, templates/account/partials/site.php:311
1147
  msgid "Downgrading your plan"
1148
  msgstr ""
1149
 
1150
+ #: templates/account.php:103, templates/forms/subscription-cancellation.php:97, templates/account/partials/addon.php:27, templates/account/partials/site.php:312
1151
  msgid "Cancelling the subscription"
1152
  msgstr ""
1153
 
1154
  #. translators: %1$s: Either 'Downgrading your plan' or 'Cancelling the subscription'
1155
+ #: templates/account.php:105, templates/forms/subscription-cancellation.php:99, templates/account/partials/site.php:314
1156
  msgid "%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s."
1157
  msgstr ""
1158
 
1159
+ #: templates/account.php:106, templates/forms/subscription-cancellation.php:100, templates/account/partials/addon.php:30, templates/account/partials/site.php:315
1160
  msgid "Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price."
1161
  msgstr ""
1162
 
1163
+ #: templates/account.php:107, templates/forms/subscription-cancellation.php:106, templates/account/partials/addon.php:31
1164
  msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?"
1165
  msgstr ""
1166
 
1167
+ #: templates/account.php:108, templates/forms/subscription-cancellation.php:101, templates/account/partials/addon.php:32, templates/account/partials/site.php:316
1168
  msgid "You can still enjoy all %s features but you will not have access to %s security & feature updates, nor support."
1169
  msgstr ""
1170
 
1171
+ #: templates/account.php:109, templates/forms/subscription-cancellation.php:102, templates/account/partials/addon.php:33, templates/account/partials/site.php:317
1172
  msgid "Once your license expires you can still use the Free version but you will NOT have access to the %s features."
1173
  msgstr ""
1174
 
1175
  #. translators: %s: Plan title (e.g. "Professional")
1176
+ #: templates/account.php:111, templates/account/partials/activate-license-button.php:31, templates/account/partials/addon.php:35
1177
  msgid "Activate %s Plan"
1178
  msgstr ""
1179
 
1180
  #. translators: %s: Time period (e.g. Auto renews in "2 months")
1181
+ #: templates/account.php:114, templates/account/partials/addon.php:38, templates/account/partials/site.php:291
1182
  msgid "Auto renews in %s"
1183
  msgstr ""
1184
 
1185
  #. translators: %s: Time period (e.g. Expires in "2 months")
1186
+ #: templates/account.php:116, templates/account/partials/addon.php:40, templates/account/partials/site.php:293
1187
  msgid "Expires in %s"
1188
  msgstr ""
1189
 
1190
+ #: templates/account.php:117
1191
  msgctxt "as synchronize license"
1192
  msgid "Sync License"
1193
  msgstr ""
1194
 
1195
+ #: templates/account.php:118, templates/account/partials/addon.php:41
1196
  msgid "Cancel Trial"
1197
  msgstr ""
1198
 
1199
+ #: templates/account.php:119, templates/account/partials/addon.php:42
1200
  msgid "Change Plan"
1201
  msgstr ""
1202
 
1203
+ #: templates/account.php:120, templates/account/partials/addon.php:43
1204
  msgctxt "verb"
1205
  msgid "Upgrade"
1206
  msgstr ""
1207
 
1208
+ #: templates/account.php:122, templates/account/partials/addon.php:45, templates/account/partials/site.php:318
1209
  msgctxt "verb"
1210
  msgid "Downgrade"
1211
  msgstr ""
1212
 
1213
+ #: templates/account.php:124, templates/add-ons.php:246, templates/plugin-info/features.php:72, templates/account/partials/addon.php:47, templates/account/partials/site.php:33
1214
  msgid "Free"
1215
  msgstr ""
1216
 
1217
+ #: templates/account.php:126, templates/debug.php:371, includes/customizer/class-fs-customizer-upsell-control.php:110, templates/account/partials/addon.php:49
1218
  msgctxt "as product pricing plan"
1219
  msgid "Plan"
1220
  msgstr ""
1221
 
1222
+ #: templates/account.php:127
1223
  msgid "Bundle Plan"
1224
  msgstr ""
1225
 
1226
+ #: templates/account.php:250
1227
  msgid "Free Trial"
1228
  msgstr ""
1229
 
1230
+ #: templates/account.php:261
1231
  msgid "Account Details"
1232
  msgstr ""
1233
 
1234
+ #: templates/account.php:268, templates/forms/data-debug-mode.php:33
1235
  msgid "Start Debug"
1236
  msgstr ""
1237
 
1238
+ #: templates/account.php:270
1239
  msgid "Stop Debug"
1240
  msgstr ""
1241
 
1242
+ #: templates/account.php:277
1243
  msgid "Billing & Invoices"
1244
  msgstr ""
1245
 
1246
+ #: templates/account.php:288
1247
  msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?"
1248
  msgstr ""
1249
 
1250
+ #: templates/account.php:290
1251
  msgid "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?"
1252
  msgstr ""
1253
 
1254
+ #: templates/account.php:293
1255
  msgid "Delete Account"
1256
  msgstr ""
1257
 
1258
+ #: templates/account.php:305, templates/account/partials/addon.php:231, templates/account/partials/deactivate-license-button.php:35
1259
  msgid "Deactivate License"
1260
  msgstr ""
1261
 
1262
+ #: templates/account.php:328, templates/forms/subscription-cancellation.php:125
1263
  msgid "Are you sure you want to proceed?"
1264
  msgstr ""
1265
 
1266
+ #: templates/account.php:328, templates/account/partials/addon.php:255
1267
  msgid "Cancel Subscription"
1268
  msgstr ""
1269
 
1270
+ #: templates/account.php:357, templates/account/partials/addon.php:340
1271
  msgctxt "as synchronize"
1272
  msgid "Sync"
1273
  msgstr ""
1274
 
1275
+ #: templates/account.php:372, templates/debug.php:505
1276
  msgid "Name"
1277
  msgstr ""
1278
 
1279
+ #: templates/account.php:378, templates/debug.php:506
1280
  msgid "Email"
1281
  msgstr ""
1282
 
1283
+ #: templates/account.php:385, templates/debug.php:369, templates/debug.php:555
1284
  msgid "User ID"
1285
  msgstr ""
1286
 
1287
+ #: templates/account.php:403, templates/account.php:721, templates/account.php:754, templates/debug.php:236, templates/debug.php:363, templates/debug.php:452, templates/debug.php:504, templates/debug.php:553, templates/debug.php:632, templates/account/payments.php:35, templates/debug/logger.php:21
1288
  msgid "ID"
1289
  msgstr ""
1290
 
1291
+ #: templates/account.php:410
1292
  msgid "Site ID"
1293
  msgstr ""
1294
 
1295
+ #: templates/account.php:413
1296
  msgid "No ID"
1297
  msgstr ""
1298
 
1299
+ #: templates/account.php:418, templates/debug.php:243, templates/debug.php:372, templates/debug.php:456, templates/debug.php:508, templates/account/partials/site.php:227
1300
  msgid "Public Key"
1301
  msgstr ""
1302
 
1303
+ #: templates/account.php:424, templates/debug.php:373, templates/debug.php:457, templates/debug.php:509, templates/account/partials/site.php:239
1304
  msgid "Secret Key"
1305
  msgstr ""
1306
 
1307
+ #: templates/account.php:427
1308
  msgctxt "as secret encryption key missing"
1309
  msgid "No Secret"
1310
  msgstr ""
1311
 
1312
+ #: templates/account.php:454, templates/account/partials/site.php:120, templates/account/partials/site.php:122
1313
  msgid "Trial"
1314
  msgstr ""
1315
 
1316
+ #: templates/account.php:481, templates/debug.php:561, templates/account/partials/site.php:260
1317
  msgid "License Key"
1318
  msgstr ""
1319
 
1320
+ #: templates/account.php:512
1321
  msgid "Join the Beta program"
1322
  msgstr ""
1323
 
1324
+ #: templates/account.php:518
1325
  msgid "not verified"
1326
  msgstr ""
1327
 
1328
+ #: templates/account.php:527, templates/account/partials/addon.php:190
1329
  msgid "Expired"
1330
  msgstr ""
1331
 
1332
+ #: templates/account.php:587
1333
  msgid "Premium version"
1334
  msgstr ""
1335
 
1336
+ #: templates/account.php:589
1337
  msgid "Free version"
1338
  msgstr ""
1339
 
1340
+ #: templates/account.php:601
1341
  msgid "Verify Email"
1342
  msgstr ""
1343
 
1344
+ #: templates/account.php:615
1345
  msgid "Download %s Version"
1346
  msgstr ""
1347
 
1348
+ #: templates/account.php:631
1349
  msgid "Download Paid Version"
1350
  msgstr ""
1351
 
1352
+ #: templates/account.php:649, templates/account.php:892, templates/account/partials/site.php:248, templates/account/partials/site.php:270
1353
  msgctxt "verb"
1354
  msgid "Show"
1355
  msgstr ""
1356
 
1357
+ #: templates/account.php:664
1358
  msgid "What is your %s?"
1359
  msgstr ""
1360
 
1361
+ #: templates/account.php:672, templates/account/billing.php:21
1362
  msgctxt "verb"
1363
  msgid "Edit"
1364
  msgstr ""
1365
 
1366
+ #: templates/account.php:676, templates/forms/user-change.php:27
1367
  msgid "Change User"
1368
  msgstr ""
1369
 
1370
+ #: templates/account.php:700
1371
  msgid "Sites"
1372
  msgstr ""
1373
 
1374
+ #: templates/account.php:713
1375
  msgid "Search by address"
1376
  msgstr ""
1377
 
1378
+ #: templates/account.php:722, templates/debug.php:366
1379
  msgid "Address"
1380
  msgstr ""
1381
 
1382
+ #: templates/account.php:723
1383
  msgid "License"
1384
  msgstr ""
1385
 
1386
+ #: templates/account.php:724
1387
  msgid "Plan"
1388
  msgstr ""
1389
 
1390
+ #: templates/account.php:757
1391
  msgctxt "as software license"
1392
  msgid "License"
1393
  msgstr ""
1394
 
1395
+ #: templates/account.php:886
1396
  msgctxt "verb"
1397
  msgid "Hide"
1398
  msgstr ""
1399
 
1400
+ #: templates/account.php:908, templates/forms/data-debug-mode.php:31
1401
  msgid "Processing"
1402
  msgstr ""
1403
 
1404
+ #: templates/account.php:911
1405
  msgid "Get updates for bleeding edge Beta versions of %s."
1406
  msgstr ""
1407
 
1408
+ #: templates/account.php:969
1409
  msgid "Cancelling %s"
1410
  msgstr ""
1411
 
1412
+ #: templates/account.php:969, templates/account.php:986, templates/forms/subscription-cancellation.php:27, templates/forms/deactivation/form.php:133
1413
  msgid "trial"
1414
  msgstr ""
1415
 
1416
+ #: templates/account.php:984, templates/forms/deactivation/form.php:150
1417
  msgid "Cancelling %s..."
1418
  msgstr ""
1419
 
1420
+ #: templates/account.php:987, templates/forms/subscription-cancellation.php:28, templates/forms/deactivation/form.php:134
1421
  msgid "subscription"
1422
  msgstr ""
1423
 
1424
+ #: templates/account.php:1001
1425
  msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?"
1426
  msgstr ""
1427
 
1428
+ #: templates/account.php:1075
1429
  msgid "Disabling white-label mode"
1430
  msgstr ""
1431
 
1432
+ #: templates/account.php:1076
1433
  msgid "Enabling white-label mode"
1434
  msgstr ""
1435
 
1455
  msgid "Installed"
1456
  msgstr ""
1457
 
1458
+ #: templates/admin-notice.php:13, templates/forms/license-activation.php:222, templates/forms/resend-key.php:77
1459
  msgctxt "as close a window"
1460
  msgid "Dismiss"
1461
  msgstr ""
1489
  msgstr ""
1490
 
1491
  #. translators: %s: name (e.g. Hey John,)
1492
+ #: templates/connect.php:112
1493
  msgctxt "greeting"
1494
  msgid "Hey %s,"
1495
  msgstr ""
1496
 
1497
+ #: templates/connect.php:162
1498
  msgid "Allow & Continue"
1499
  msgstr ""
1500
 
1501
+ #: templates/connect.php:166
1502
  msgid "Re-send activation email"
1503
  msgstr ""
1504
 
1505
+ #: templates/connect.php:170
1506
  msgid "Thanks %s!"
1507
  msgstr ""
1508
 
1509
+ #: templates/connect.php:180, templates/forms/license-activation.php:46
1510
  msgid "Agree & Activate License"
1511
  msgstr ""
1512
 
1513
+ #: templates/connect.php:184
1514
  msgid "Welcome to %s! To get started, please enter your license key:"
1515
  msgstr ""
1516
 
1517
+ #: templates/connect.php:191
1518
  msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s."
1519
  msgstr ""
1520
 
1521
+ #: templates/connect.php:192
1522
  msgid "Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s."
1523
  msgstr ""
1524
 
1525
+ #: templates/connect.php:198
1526
  msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine."
1527
  msgstr ""
1528
 
1529
+ #: templates/connect.php:199
1530
  msgid "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine."
1531
  msgstr ""
1532
 
1533
+ #: templates/connect.php:233
1534
  msgid "We're excited to introduce the Freemius network-level integration."
1535
  msgstr ""
1536
 
1537
+ #: templates/connect.php:236
1538
  msgid "During the update process we detected %d site(s) that are still pending license activation."
1539
  msgstr ""
1540
 
1541
+ #: templates/connect.php:238
1542
  msgid "If you'd like to use the %s on those sites, please enter your license key below and click the activation button."
1543
  msgstr ""
1544
 
1545
+ #: templates/connect.php:240
1546
  msgid "%s's paid features"
1547
  msgstr ""
1548
 
1549
+ #: templates/connect.php:245
1550
  msgid "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page."
1551
  msgstr ""
1552
 
1553
+ #: templates/connect.php:247
1554
  msgid "During the update process we detected %s site(s) in the network that are still pending your attention."
1555
  msgstr ""
1556
 
1557
+ #: templates/connect.php:256, templates/forms/data-debug-mode.php:35, templates/forms/license-activation.php:49
1558
  msgid "License key"
1559
  msgstr ""
1560
 
1561
+ #: templates/connect.php:259, templates/forms/license-activation.php:22
1562
  msgid "Can't find your license key?"
1563
  msgstr ""
1564
 
1565
+ #: templates/connect.php:318, templates/connect.php:700, templates/forms/deactivation/retry-skip.php:20
1566
  msgctxt "verb"
1567
  msgid "Skip"
1568
  msgstr ""
1569
 
1570
+ #: templates/connect.php:321
1571
  msgid "Delegate to Site Admins"
1572
  msgstr ""
1573
 
1574
+ #: templates/connect.php:321
1575
  msgid "If you click it, this decision will be delegated to the sites administrators."
1576
  msgstr ""
1577
 
1578
+ #: templates/connect.php:346
1579
  msgid "License issues?"
1580
  msgstr ""
1581
 
1582
+ #: templates/connect.php:362
1583
  msgid "Your Profile Overview"
1584
  msgstr ""
1585
 
1586
+ #: templates/connect.php:363
1587
  msgid "Name and email address"
1588
  msgstr ""
1589
 
1590
+ #: templates/connect.php:370
1591
  msgid "So you can manage and control your license remotely from the User Dashboard."
1592
  msgstr ""
1593
 
1594
+ #: templates/connect.php:371
1595
  msgid "Your Site Overview"
1596
  msgstr ""
1597
 
1598
+ #: templates/connect.php:372
1599
  msgid "Site URL, WP version, PHP info"
1600
  msgstr ""
1601
 
1602
+ #: templates/connect.php:379
1603
  msgid "Admin Notices"
1604
  msgstr ""
1605
 
1606
+ #: templates/connect.php:380, templates/connect.php:398
1607
  msgid "Updates, announcements, marketing, no spam"
1608
  msgstr ""
1609
 
1610
+ #: templates/connect.php:387
1611
  msgid "So you can reuse the license when the %s is no longer active."
1612
  msgstr ""
1613
 
1614
+ #: templates/connect.php:388
1615
  msgid "Current %s Status"
1616
  msgstr ""
1617
 
1618
+ #: templates/connect.php:389
1619
  msgid "Active, deactivated, or uninstalled"
1620
  msgstr ""
1621
 
1622
+ #: templates/connect.php:397
1623
  msgid "Newsletter"
1624
  msgstr ""
1625
 
1626
+ #: templates/connect.php:405
1627
  msgid "Plugins & Themes"
1628
  msgstr ""
1629
 
1630
+ #: templates/connect.php:405
1631
  msgid "optional"
1632
  msgstr ""
1633
 
1634
+ #: templates/connect.php:406
1635
  msgid "To help us troubleshoot any potential issues that may arise from other plugin or theme conflicts."
1636
  msgstr ""
1637
 
1638
+ #: templates/connect.php:407
1639
  msgid "Title, slug, version, and is active"
1640
  msgstr ""
1641
 
1642
+ #: templates/connect.php:424
1643
  msgid "The %1$s will periodically send %2$s to %3$s for security & feature updates delivery, and license management."
1644
  msgstr ""
1645
 
1646
+ #: templates/connect.php:426
1647
  msgid "diagnostic data"
1648
  msgstr ""
1649
 
1650
+ #: templates/connect.php:427
1651
  msgid "Freemius is our licensing and software updates engine"
1652
  msgstr ""
1653
 
1654
+ #: templates/connect.php:430
1655
  msgid "What permissions are being granted?"
1656
  msgstr ""
1657
 
1658
+ #: templates/connect.php:457
1659
  msgid "Don't have a license key?"
1660
  msgstr ""
1661
 
1662
+ #: templates/connect.php:460
1663
  msgid "Have a license key?"
1664
  msgstr ""
1665
 
1666
+ #: templates/connect.php:468
1667
  msgid "Privacy Policy"
1668
  msgstr ""
1669
 
1670
+ #: templates/connect.php:470
1671
  msgid "License Agreement"
1672
  msgstr ""
1673
 
1674
+ #: templates/connect.php:470
1675
  msgid "Terms of Service"
1676
  msgstr ""
1677
 
1678
+ #: templates/connect.php:866
1679
  msgctxt "as in the process of sending an email"
1680
  msgid "Sending email"
1681
  msgstr ""
1682
 
1683
+ #: templates/connect.php:867
1684
  msgctxt "as activating plugin"
1685
  msgid "Activating"
1686
  msgstr ""
1708
  msgid "Debugging"
1709
  msgstr ""
1710
 
1711
+ #: templates/debug.php:52, templates/debug.php:248, templates/debug.php:374, templates/debug.php:510
1712
  msgid "Actions"
1713
  msgstr ""
1714
 
1728
  msgid "Clear Updates Transients"
1729
  msgstr ""
1730
 
1731
+ #: templates/debug.php:84
 
 
 
 
1732
  msgid "Sync Data From Server"
1733
  msgstr ""
1734
 
1735
+ #: templates/debug.php:93
1736
  msgid "Migrate Options to Network"
1737
  msgstr ""
1738
 
1739
+ #: templates/debug.php:98
1740
  msgid "Load DB Option"
1741
  msgstr ""
1742
 
1743
+ #: templates/debug.php:101
1744
  msgid "Set DB Option"
1745
  msgstr ""
1746
 
1747
+ #: templates/debug.php:180
1748
  msgid "Key"
1749
  msgstr ""
1750
 
1751
+ #: templates/debug.php:181
1752
  msgid "Value"
1753
  msgstr ""
1754
 
1755
+ #: templates/debug.php:197
1756
  msgctxt "as software development kit versions"
1757
  msgid "SDK Versions"
1758
  msgstr ""
1759
 
1760
+ #: templates/debug.php:202
1761
  msgid "SDK Path"
1762
  msgstr ""
1763
 
1764
+ #: templates/debug.php:203, templates/debug.php:242
1765
  msgid "Module Path"
1766
  msgstr ""
1767
 
1768
+ #: templates/debug.php:204
1769
  msgid "Is Active"
1770
  msgstr ""
1771
 
1772
+ #: templates/debug.php:232, templates/debug/plugins-themes-sync.php:35
1773
  msgid "Plugins"
1774
  msgstr ""
1775
 
1776
+ #: templates/debug.php:232, templates/debug/plugins-themes-sync.php:56
1777
  msgid "Themes"
1778
  msgstr ""
1779
 
1780
+ #: templates/debug.php:237, templates/debug.php:368, templates/debug.php:454, templates/debug/scheduled-crons.php:80
1781
  msgid "Slug"
1782
  msgstr ""
1783
 
1784
+ #: templates/debug.php:239, templates/debug.php:453
1785
  msgid "Title"
1786
  msgstr ""
1787
 
1788
+ #: templates/debug.php:240
1789
  msgctxt "as application program interface"
1790
  msgid "API"
1791
  msgstr ""
1792
 
1793
+ #: templates/debug.php:241
1794
  msgid "Freemius State"
1795
  msgstr ""
1796
 
1797
+ #: templates/debug.php:245
1798
  msgid "Network Blog"
1799
  msgstr ""
1800
 
1801
+ #: templates/debug.php:246
1802
  msgid "Network User"
1803
  msgstr ""
1804
 
1805
+ #: templates/debug.php:283
1806
  msgctxt "as connection was successful"
1807
  msgid "Connected"
1808
  msgstr ""
1809
 
1810
+ #: templates/debug.php:284
1811
  msgctxt "as connection blocked"
1812
  msgid "Blocked"
1813
  msgstr ""
1814
 
1815
+ #: templates/debug.php:320
1816
  msgid "Simulate Trial Promotion"
1817
  msgstr ""
1818
 
1819
+ #: templates/debug.php:332
1820
  msgid "Simulate Network Upgrade"
1821
  msgstr ""
1822
 
1823
+ #: templates/debug.php:357
1824
  msgid "%s Installs"
1825
  msgstr ""
1826
 
1827
+ #: templates/debug.php:359
1828
  msgctxt "like websites"
1829
  msgid "Sites"
1830
  msgstr ""
1831
 
1832
+ #: templates/debug.php:365, templates/account/partials/site.php:156
1833
  msgid "Blog ID"
1834
  msgstr ""
1835
 
1836
+ #: templates/debug.php:370
1837
  msgid "License ID"
1838
  msgstr ""
1839
 
1840
+ #: templates/debug.php:434, templates/debug.php:533, templates/account/partials/addon.php:435
1841
  msgctxt "verb"
1842
  msgid "Delete"
1843
  msgstr ""
1844
 
1845
+ #: templates/debug.php:448
1846
  msgid "Add Ons of module %s"
1847
  msgstr ""
1848
 
1849
+ #: templates/debug.php:500
1850
  msgid "Users"
1851
  msgstr ""
1852
 
1853
+ #: templates/debug.php:507
1854
  msgid "Verified"
1855
  msgstr ""
1856
 
1857
+ #: templates/debug.php:549
1858
  msgid "%s Licenses"
1859
  msgstr ""
1860
 
1861
+ #: templates/debug.php:554
1862
  msgid "Plugin ID"
1863
  msgstr ""
1864
 
1865
+ #: templates/debug.php:556
1866
  msgid "Plan ID"
1867
  msgstr ""
1868
 
1869
+ #: templates/debug.php:557
1870
  msgid "Quota"
1871
  msgstr ""
1872
 
1873
+ #: templates/debug.php:558
1874
  msgid "Activated"
1875
  msgstr ""
1876
 
1877
+ #: templates/debug.php:559
1878
  msgid "Blocking"
1879
  msgstr ""
1880
 
1881
+ #: templates/debug.php:560, templates/debug.php:631, templates/debug/logger.php:22
1882
  msgid "Type"
1883
  msgstr ""
1884
 
1885
+ #: templates/debug.php:562
1886
  msgctxt "as expiration date"
1887
  msgid "Expiration"
1888
  msgstr ""
1889
 
1890
+ #: templates/debug.php:590
1891
  msgid "Debug Log"
1892
  msgstr ""
1893
 
1894
+ #: templates/debug.php:594
1895
  msgid "All Types"
1896
  msgstr ""
1897
 
1898
+ #: templates/debug.php:601
1899
  msgid "All Requests"
1900
  msgstr ""
1901
 
1902
+ #: templates/debug.php:606, templates/debug.php:635, templates/debug/logger.php:25
1903
  msgid "File"
1904
  msgstr ""
1905
 
1906
+ #: templates/debug.php:607, templates/debug.php:633, templates/debug/logger.php:23
1907
  msgid "Function"
1908
  msgstr ""
1909
 
1910
+ #: templates/debug.php:608
1911
  msgid "Process ID"
1912
  msgstr ""
1913
 
1914
+ #: templates/debug.php:609
1915
  msgid "Logger"
1916
  msgstr ""
1917
 
1918
+ #: templates/debug.php:610, templates/debug.php:634, templates/debug/logger.php:24
1919
  msgid "Message"
1920
  msgstr ""
1921
 
1922
+ #: templates/debug.php:612
1923
  msgid "Filter"
1924
  msgstr ""
1925
 
1926
+ #: templates/debug.php:620
1927
  msgid "Download"
1928
  msgstr ""
1929
 
1930
+ #: templates/debug.php:636, templates/debug/logger.php:26
1931
  msgid "Timestamp"
1932
  msgstr ""
1933
 
1952
  msgid "Requests"
1953
  msgstr ""
1954
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1955
  #: templates/account/billing.php:22
1956
  msgctxt "verb"
1957
  msgid "Update"
2261
  msgid "User key"
2262
  msgstr ""
2263
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2264
  #: templates/forms/license-activation.php:23
2265
  msgid "Please enter the license key that you received in the email right after the purchase:"
2266
  msgstr ""
2273
  msgid "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license."
2274
  msgstr ""
2275
 
2276
+ #: templates/forms/license-activation.php:183
2277
  msgid "Associate with the license owner's account."
2278
  msgstr ""
2279
 
2356
  msgid "In case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?"
2357
  msgstr ""
2358
 
2359
+ #: templates/forms/subscription-cancellation.php:52
2360
+ msgid "license"
2361
+ msgstr ""
2362
+
2363
  #: templates/forms/subscription-cancellation.php:57
2364
  msgid "Cancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site."
2365
  msgstr ""
2380
  msgid "Proceed"
2381
  msgstr ""
2382
 
2383
+ #: templates/forms/subscription-cancellation.php:191, templates/forms/deactivation/form.php:171
2384
  msgid "Cancel %s & Proceed"
2385
  msgstr ""
2386
 
2404
  msgid "Enter email address"
2405
  msgstr ""
2406
 
2407
+ #: templates/forms/user-change.php:81
2408
+ msgctxt "close window"
2409
+ msgid "Dismiss"
2410
+ msgstr ""
2411
+
2412
  #: templates/js/style-premium-theme.php:39
2413
  msgid "Premium"
2414
  msgstr ""
2503
  msgid "Contact Support"
2504
  msgstr ""
2505
 
2506
+ #: templates/forms/deactivation/form.php:64
2507
  msgid "Anonymous feedback"
2508
  msgstr ""
2509
 
2510
+ #: templates/forms/deactivation/form.php:70
 
 
 
 
 
 
 
 
 
 
 
 
2511
  msgid "Deactivate"
2512
  msgstr ""
2513
 
2514
+ #: templates/forms/deactivation/form.php:72
2515
  msgid "Activate %s"
2516
  msgstr ""
2517
 
2518
+ #: templates/forms/deactivation/form.php:87
 
 
 
 
2519
  msgid "Quick Feedback"
2520
  msgstr ""
2521
 
2522
+ #: templates/forms/deactivation/form.php:91
2523
  msgid "If you have a moment, please let us know why you are %s"
2524
  msgstr ""
2525
 
2526
+ #: templates/forms/deactivation/form.php:91
2527
  msgid "deactivating"
2528
  msgstr ""
2529
 
2530
+ #: templates/forms/deactivation/form.php:91
2531
  msgid "switching"
2532
  msgstr ""
2533
 
2534
+ #: templates/forms/deactivation/form.php:369
2535
+ msgid "Submit & %s"
2536
  msgstr ""
2537
 
2538
+ #: templates/forms/deactivation/form.php:390
2539
+ msgid "Kindly tell us the reason so we can improve."
2540
  msgstr ""
2541
 
2542
+ #: templates/forms/deactivation/form.php:515
2543
  msgid "Yes - %s"
2544
  msgstr ""
2545
 
2546
+ #: templates/forms/deactivation/form.php:522
2547
  msgid "Skip & %s"
2548
  msgstr ""
2549
 
freemius/package.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "freemius-wordpress-sdk",
3
+ "description": "Monetization, analytics, and marketing automation platform for plugin & theme developers.",
4
+ "author": "Freemius, Inc.",
5
+ "license": "GPL-3.0",
6
+ "homepage": "https://freemius.com",
7
+ "version": "2.4.2",
8
+ "main": "gulpfile.js",
9
+ "dependencies": {},
10
+ "scripts": {
11
+ "test": "echo \"Error: no test specified\" && exit 1",
12
+ "prune": "rimraf .codeclimate.yml .git .github .gitignore .travis.yml gulpfile.js composer.json"
13
+ },
14
+ "repository": "Freemius/wordpress-sdk.git",
15
+ "devDependencies": {
16
+ "gulp": "^3.9.1",
17
+ "gulp-clean": "^0.3.2",
18
+ "gulp-fs": "0.0.2",
19
+ "gulp-gettext": "^0.3.0",
20
+ "gulp-path": "^3.0.3",
21
+ "gulp-pofill": "^1.0.0",
22
+ "gulp-rename": "^1.2.2",
23
+ "gulp-sort": "^2.0.0",
24
+ "gulp-transifex": "^0.1.17",
25
+ "gulp-wp-pot": "^1.3.5"
26
+ }
27
+ }
freemius/readme.txt ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === User Menus - Nav Menu Visibility ===
2
+ Contributors: codeatlantic, danieliser
3
+ Author URI: https://code-atlantic.com/
4
+ Plugin URI: https://wordpress.org/plugins/user-menus/
5
+ Donate link: https://code-atlantic.com/donate/
6
+ Tags: menu, menus, user-menu, logout, nav-menu, nav-menus, user, user-role, user-roles
7
+ Requires at least: 4.6
8
+ Tested up to: 5.8
9
+ Stable tag: 1.2.8
10
+ Requires PHP: 5.6
11
+ Freemius: 2.5.0
12
+ License: GPLv3 or Any Later Version
13
+
14
+ Show/hide menu items to logged in users, logged out users or specific user roles. Display logged in user details in menu. Add a logout link to menu.
15
+
16
+
17
+ == Description ==
18
+
19
+ User Menus is the perfect plugin for websites that have logged in users.
20
+
21
+ The plugin gives you more control over your nav menu by allowing you to apply visibility controls to menu items e.g., who can see each menu item (everyone, logged out users, logged in users, specific user roles).
22
+
23
+ It also enables you to display logged in user information in the navigation menu e.g., “Hello, John Doe”.
24
+
25
+ Lastly, the plugin allows you to add login, register, and logout links to your menu.
26
+
27
+ = Full Feature List =
28
+
29
+ User Menus allows you to do the following:
30
+
31
+ * Display menu items to everyone
32
+ * Display menu items to only logged out users
33
+ * Display menu items to only logged in users
34
+ * Display menu items to users with or without a specific user role.
35
+ * Show a logged in user’s {avatar} in a menu item with a custom size option.
36
+ * Show a logged in user’s {username} in a menu item
37
+ * Show a logged in user’s {first_name} in a menu item
38
+ * Show a logged in user’s {last_name} in a menu item
39
+ * Show a logged in user’s {display_name} in a menu item
40
+ * Show a logged in user’s nickname} in a menu item
41
+ * Show a logged in user’s {email} in a menu item
42
+ * Add a logout link to the menu (optional redirect settings)
43
+ * Add a register link to the menu (optional redirect settings)
44
+ * Add a login link to the menu (optional redirect settings)
45
+
46
+ ** Includes a custom Menu Importer that will allow migrating User Menus data with the normal menu export/import.
47
+
48
+ = Created by Code Atlantic =
49
+
50
+ User Menus is built by the [Code Atlantic][codeatlantic] team. We create high-quality WordPress plugins that help you grow your WordPress sites.
51
+
52
+ Check out some of our most popular plugins:
53
+
54
+ * [Popup Maker][popupmaker] - #1 Popup & Marketing Plugin for WordPress
55
+ * [Content Control][contentcontrol] - Restrict Access to Pages and Posts
56
+
57
+ **Requires WordPress 4.6 and PHP 5.6**
58
+
59
+ [codeatlantic]: https://code-atlantic.com "Code Atlantic - High Quality WordPress Plugins"
60
+
61
+ [popupmaker]: https://wppopupmaker.com "#1 Popup & Marketing Plugin for WordPress"
62
+
63
+ [contentcontrol]: https://wordpress.org/plugins/content-control/ "Control Who Can Access Content"
64
+
65
+ == Installation ==
66
+
67
+ = Minimum Requirements =
68
+
69
+ * WordPress 4.6 or greater
70
+ * PHP version 5.6 or greater
71
+
72
+ = Installation =
73
+
74
+ * Install User Menus either via the WordPress.org plugin repository or by uploading the files to your server.
75
+ * Activate User Menus.
76
+ * Go to wp-admin > Appearance > Menus and edit your menu.
77
+
78
+ If you need help getting started with User Menus, please see the [FAQs][faq page] that explain how to use the plugin.
79
+
80
+
81
+ [faq page]: https://wordpress.org/plugins/user-menus/faq/ "User Menus FAQ"
82
+
83
+
84
+ == Frequently Asked Questions ==
85
+
86
+ = How do I set up this plugin? =
87
+
88
+ * To setup the plugin, go to /wp-admin/ > **Appearance** > **Menus**.
89
+ * Add a **menu item** or choose an existing one to edit the User Menus settings.
90
+ * To see the User Menus settings, _expand_ the **menu item** that you chose in the **Menu structure** panel.
91
+ * Select **Everyone**, **Logged Out Users**, or **Logged In Users** from the **Who can see this link?** dropdown.
92
+ * **Logged In Users**: The **Choose which roles can see this link** radio button is selected by default. If no roles are selected, all roles can see the menu item by default. Once a role is checked, then only checked roles can see the menu item.
93
+ * **Logged In Users**: The **Choose which roles won't see this link** radio button is **not** selected by default. If no roles are selected, all roles still have visibility to the menu item by default. Once a role is checked, then only checked roles won't see the menu item.
94
+ * To show a logged in user’s information in a **menu item**, make a **menu item** only visible to logged in users. Click the grey arrow button to add a user tag (username, first_name, last_name, nickname, display_name, email) to the **menu item** label.
95
+ * To add a login or logout link to your menu, expand the **User Links** under the **Add menu items** panel, check **Login** or **Logout**, then click **Add to Menu**.
96
+
97
+ = Where can I get support? =
98
+
99
+ If you get stuck, you can ask for help in the [User Menu Plugin Forum](https://wordpress.org/support/plugin/user-menus).
100
+
101
+ = Where can I report bugs or contribute to the project? =
102
+
103
+ Bugs can be reported either in our support forum or preferably on the [User Menu GitHub repository](https://github.com/jungleplugins/user-menus/issues).
104
+
105
+
106
+ == Screenshots ==
107
+
108
+ 1. Limit menu item visibility based on logged in status, user role etc.
109
+ 2. Display user information such as username, first name etc in your menu text.
110
+ 3. Quickly insert login/logout links & choose where users will be taken afterwards.
111
+
112
+
113
+ == Changelog ==
114
+
115
+ = v1.2.8 - 03/02/2022 =
116
+
117
+ * Tweak: Update freemius sdk to the latest version.
118
+
119
+ = v1.2.7 - 07/21/2021 =
120
+
121
+ * Fix: Bug due to variable type mismatch which caused children of protected items to be rendered.
122
+
123
+ = v1.2.6 - 07/20/2021 =
124
+
125
+ * Improvement: Update Freemius to 2.4.2
126
+ * Improvement: Code styling clean up.
127
+ * Improvement: Compatibility with jQuery v3.
128
+
129
+ = v1.2.5 - 12/31/2020 =
130
+
131
+ * Improvement:Update Freemius to 2.4.1
132
+
133
+ = v1.2.4 - 08/20/2020 =
134
+
135
+ * Improvement: Removed class that could cause links to be disabled with some themes.
136
+ * Tweak: Update Freemius sdk to v2.4.0.1.
137
+ * Fix: Compatibility issue with some sites where duplicate fields were shown in the menu editor.
138
+
139
+ = v1.2.3 - 3/23/2020 =
140
+
141
+ * Tweak: Add compatibility fix for WP 5.4 menu walker
142
+
143
+ = v1.2.2 - 12/17/2019 =
144
+
145
+ * Improvement: Login, Register & Logout menu links now hint at who they will be visible for.
146
+ * Fix: Deprecation notice for sites using PHP 7.4
147
+
148
+ = v1.2.1 - 10/20/2019 =
149
+
150
+ * Fix: Bug in some sites where Menu Editor Description field was not shown.
151
+
152
+ = v1.2.0 - 10/10/2019 =
153
+
154
+ * Feature: Added option to *show* or *hide* the menu item for chosen roles.
155
+ * Feature: Added Register user link navigation menu type with optional redirect.
156
+ * Improvement: Added Freemius integration to allow for future premium offerings
157
+ * Tweak: Updates brand from Jungle Plugins to Code Atlantic (nothing has changed, just the name).
158
+ * Tweak: Minor text and design changes.
159
+ * Fix: Bug where missing data in menu items caused an error to be thrown in edge cases.
160
+
161
+ = v1.1.3 =
162
+
163
+ * Improvement: Corrected usage of get_avatar to ensure compatibility with 3rd party avatar plugins.
164
+
165
+ = v1.1.2 =
166
+
167
+ * Improvement: Made changes to the nav menu editor to make it more compatible with other plugins.
168
+
169
+ = v1.1.1 =
170
+
171
+ * Fix: Forgot to add new files during commit. Correcting this issue.
172
+
173
+ = v1.1.0 =
174
+
175
+ * Feature: Added ability to insert user avatar in menu items with size option to match your needs.
176
+ * Improvement: Added accessibility enhancements to menu editor. Includes keyboard support, proper focus, tabbing & titles.
177
+ * Improvement: Added proper labeling to the user code dropdown.
178
+ * Tweak: Restyled user code insert elements to better resemble default WP admin.
179
+
180
+ = v1.0.0 =
181
+
182
+ * Initial Release
freemius/require.php CHANGED
@@ -6,6 +6,10 @@
6
  * @since 1.1.9
7
  */
8
 
 
 
 
 
9
  // Configuration should be loaded first.
10
  require_once dirname( __FILE__ ) . '/config.php';
11
  require_once WP_FS__DIR_INCLUDES . '/fs-core-functions.php';
@@ -17,7 +21,6 @@
17
  // require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-abstract-manager.php';
18
  require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-option-manager.php';
19
  require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-gdpr-manager.php';
20
- require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-clone-manager.php';
21
  require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-cache-manager.php';
22
  require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-admin-notice-manager.php';
23
  require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-admin-menu-manager.php';
@@ -47,4 +50,4 @@
47
  require_once WP_FS__DIR_INCLUDES . '/class-fs-admin-notices.php';
48
  require_once WP_FS__DIR_INCLUDES . '/class-freemius-abstract.php';
49
  require_once WP_FS__DIR_INCLUDES . '/sdk/Exceptions/Exception.php';
50
- require_once WP_FS__DIR_INCLUDES . '/class-freemius.php';
6
  * @since 1.1.9
7
  */
8
 
9
+ if ( ! defined( 'ABSPATH' ) ) {
10
+ exit;
11
+ }
12
+
13
  // Configuration should be loaded first.
14
  require_once dirname( __FILE__ ) . '/config.php';
15
  require_once WP_FS__DIR_INCLUDES . '/fs-core-functions.php';
21
  // require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-abstract-manager.php';
22
  require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-option-manager.php';
23
  require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-gdpr-manager.php';
 
24
  require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-cache-manager.php';
25
  require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-admin-notice-manager.php';
26
  require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-admin-menu-manager.php';
50
  require_once WP_FS__DIR_INCLUDES . '/class-fs-admin-notices.php';
51
  require_once WP_FS__DIR_INCLUDES . '/class-freemius-abstract.php';
52
  require_once WP_FS__DIR_INCLUDES . '/sdk/Exceptions/Exception.php';
53
+ require_once WP_FS__DIR_INCLUDES . '/class-freemius.php';
freemius/start.php CHANGED
@@ -15,7 +15,7 @@
15
  *
16
  * @var string
17
  */
18
- $this_sdk_version = '2.5.0';
19
 
20
  #region SDK Selection Logic --------------------------------------------------------------------
21
 
15
  *
16
  * @var string
17
  */
18
+ $this_sdk_version = '2.4.3';
19
 
20
  #region SDK Selection Logic --------------------------------------------------------------------
21
 
freemius/templates/account.php CHANGED
@@ -46,7 +46,6 @@
46
  $site = $fs->get_site();
47
  $name = $user->get_name();
48
  $license = $fs->_get_license();
49
- $is_license_foreign = ( is_object( $license ) && $user->id != $license->user_id );
50
  $is_data_debug_mode = $fs->is_data_debug_mode();
51
  $is_whitelabeled = $fs->is_whitelabeled();
52
  $subscription = ( is_object( $license ) ?
@@ -63,10 +62,6 @@
63
  $fs->_add_license_activation_dialog_box();
64
  }
65
 
66
- if ( $fs->should_handle_user_change() ) {
67
- $fs->_add_email_address_update_dialog_box();
68
- }
69
-
70
  $ids_of_installs_activated_with_foreign_licenses = $fs->should_handle_user_change() ?
71
  $fs->get_installs_ids_with_foreign_licenses() :
72
  array();
@@ -91,15 +86,12 @@
91
  ) );
92
  }
93
 
94
- $show_billing = ( ! $is_whitelabeled && ! $fs->apply_filters( 'hide_billing_and_payments_info', false ) );
95
- if ( $show_billing ) {
96
- $payments = $fs->_fetch_payments();
97
 
98
- $show_billing = ( is_array( $payments ) && 0 < count( $payments ) );
99
- }
100
 
101
 
102
- $has_tabs = $fs->_add_tabs_before_content();
103
 
104
  if ( $has_tabs ) {
105
  $query_params['tabs'] = 'true';
@@ -148,7 +140,6 @@
148
  $install = $fs->get_install_by_blog_id( $site_info['blog_id'] );
149
  $view_params = array(
150
  'freemius' => $fs,
151
- 'user' => $fs->get_user(),
152
  'license' => $license,
153
  'site' => $site_info,
154
  'install' => $install,
@@ -375,7 +366,7 @@
375
 
376
  $profile = array();
377
 
378
- if ( ! $is_whitelabeled ) {
379
  $profile[] = array(
380
  'id' => 'user_name',
381
  'title' => fs_text_inline( 'Name', 'name', $slug ),
@@ -654,7 +645,7 @@
654
  <?php endif ?>
655
  <?php
656
  elseif ( in_array( $p['id'], array( 'license_key', 'site_secret_key' ) ) ) : ?>
657
- <?php if ( ! $is_whitelabeled && ( 'site_secret_key' === $p['id'] || ! $is_license_foreign ) ) : ?>
658
  <button class="button button-small fs-toggle-visibility"><?php fs_esc_html_echo_x_inline( 'Show', 'verb', 'show', $slug ) ?></button>
659
  <?php endif ?>
660
  <?php if ('license_key' === $p['id']) : ?>
@@ -667,7 +658,6 @@
667
  'user_name'
668
  ) ) )
669
  ) : ?>
670
- <?php if ( 'email' !== $p['id'] || ! fs_is_network_admin() ) : ?>
671
  <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"
672
  onsubmit="var val = prompt('<?php echo esc_attr( sprintf(
673
  /* translators: %s: User's account property (e.g. name, email) */
@@ -678,10 +668,9 @@
678
  <input type="hidden" name="fs_<?php echo $p['id'] ?>_<?php echo $fs->get_unique_affix() ?>"
679
  value="">
680
  <?php wp_nonce_field( 'update_' . $p['id'] ) ?>
681
- <input type="submit" class="button button-small <?php if ( 'email' === $p['id'] ) echo 'button-edit-email-address' ?>"
682
  value="<?php echo fs_esc_attr_x_inline( 'Edit', 'verb', 'edit', $slug ) ?>">
683
  </form>
684
- <?php endif ?>
685
  <?php elseif ( 'user_id' === $p['id'] && ! empty( $ids_of_installs_activated_with_foreign_licenses ) ) : ?>
686
  <input id="fs_change_user" type="submit" class="button button-small"
687
  value="<?php echo fs_esc_attr_inline( 'Change User', 'change-user', $slug ) ?>">
@@ -741,30 +730,12 @@
741
  <div class="fs-table-body">
742
  <table class="widefat">
743
  <?php
744
- $current_blog_id = get_current_blog_id();
745
-
746
  foreach ( $site_view_params as $view_params ) {
747
  fs_require_template(
748
  'account/partials/site.php',
749
  $view_params
750
  );
751
- }
752
-
753
- /**
754
- * It's possible for the `Freemius::switch_to_blog()` method to be called within the `site.php` template and this changes the Freemius instance's context, so this check is for restoring the previous context based on the previously retrieved site.
755
- *
756
- * @author Leo Fajardo (@leorw)
757
- * @since 2.5.0
758
- */
759
- $current_install = $fs->get_site();
760
-
761
- if (
762
- is_object( $site ) &&
763
- ( ! is_object( $current_install ) || $current_install->id != $site->id )
764
- ) {
765
- $fs->switch_to_blog( $current_blog_id, $site, true );
766
- }
767
- ?>
768
  </table>
769
  </div>
770
  </div>
@@ -868,7 +839,7 @@
868
 
869
  <?php
870
  if ( $show_billing ) {
871
- $view_params = array( 'id' => $VARS['id'], 'payments' => $payments );
872
  fs_require_once_template( 'account/billing.php', $view_params );
873
  fs_require_once_template( 'account/payments.php', $view_params );
874
  }
@@ -1124,4 +1095,4 @@
1124
  'module_slug' => $slug,
1125
  'module_version' => $fs->get_plugin_version(),
1126
  );
1127
- fs_require_template( 'powered-by.php', $params );
46
  $site = $fs->get_site();
47
  $name = $user->get_name();
48
  $license = $fs->_get_license();
 
49
  $is_data_debug_mode = $fs->is_data_debug_mode();
50
  $is_whitelabeled = $fs->is_whitelabeled();
51
  $subscription = ( is_object( $license ) ?
62
  $fs->_add_license_activation_dialog_box();
63
  }
64
 
 
 
 
 
65
  $ids_of_installs_activated_with_foreign_licenses = $fs->should_handle_user_change() ?
66
  $fs->get_installs_ids_with_foreign_licenses() :
67
  array();
86
  ) );
87
  }
88
 
89
+ $payments = $fs->_fetch_payments();
 
 
90
 
91
+ $show_billing = ( ! $is_whitelabeled && is_array( $payments ) && 0 < count( $payments ) );
 
92
 
93
 
94
+ $has_tabs = $fs->_add_tabs_before_content();
95
 
96
  if ( $has_tabs ) {
97
  $query_params['tabs'] = 'true';
140
  $install = $fs->get_install_by_blog_id( $site_info['blog_id'] );
141
  $view_params = array(
142
  'freemius' => $fs,
 
143
  'license' => $license,
144
  'site' => $site_info,
145
  'install' => $install,
366
 
367
  $profile = array();
368
 
369
+ if ( ! $is_whitelabeled ) {
370
  $profile[] = array(
371
  'id' => 'user_name',
372
  'title' => fs_text_inline( 'Name', 'name', $slug ),
645
  <?php endif ?>
646
  <?php
647
  elseif ( in_array( $p['id'], array( 'license_key', 'site_secret_key' ) ) ) : ?>
648
+ <?php if ( ! $is_whitelabeled ) : ?>
649
  <button class="button button-small fs-toggle-visibility"><?php fs_esc_html_echo_x_inline( 'Show', 'verb', 'show', $slug ) ?></button>
650
  <?php endif ?>
651
  <?php if ('license_key' === $p['id']) : ?>
658
  'user_name'
659
  ) ) )
660
  ) : ?>
 
661
  <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"
662
  onsubmit="var val = prompt('<?php echo esc_attr( sprintf(
663
  /* translators: %s: User's account property (e.g. name, email) */
668
  <input type="hidden" name="fs_<?php echo $p['id'] ?>_<?php echo $fs->get_unique_affix() ?>"
669
  value="">
670
  <?php wp_nonce_field( 'update_' . $p['id'] ) ?>
671
+ <input type="submit" class="button button-small"
672
  value="<?php echo fs_esc_attr_x_inline( 'Edit', 'verb', 'edit', $slug ) ?>">
673
  </form>
 
674
  <?php elseif ( 'user_id' === $p['id'] && ! empty( $ids_of_installs_activated_with_foreign_licenses ) ) : ?>
675
  <input id="fs_change_user" type="submit" class="button button-small"
676
  value="<?php echo fs_esc_attr_inline( 'Change User', 'change-user', $slug ) ?>">
730
  <div class="fs-table-body">
731
  <table class="widefat">
732
  <?php
 
 
733
  foreach ( $site_view_params as $view_params ) {
734
  fs_require_template(
735
  'account/partials/site.php',
736
  $view_params
737
  );
738
+ } ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
739
  </table>
740
  </div>
741
  </div>
839
 
840
  <?php
841
  if ( $show_billing ) {
842
+ $view_params = array( 'id' => $VARS['id'] );
843
  fs_require_once_template( 'account/billing.php', $view_params );
844
  fs_require_once_template( 'account/payments.php', $view_params );
845
  }
1095
  'module_slug' => $slug,
1096
  'module_version' => $fs->get_plugin_version(),
1097
  );
1098
+ fs_require_template( 'powered-by.php', $params );
freemius/templates/account/partials/addon.php CHANGED
@@ -1,4 +1,9 @@
1
  <?php
 
 
 
 
 
2
  /**
3
  * @var array $VARS
4
  * @var Freemius $fs
@@ -443,4 +448,4 @@
443
  </td>
444
  <!--/ Optional Delete Action -->
445
  <?php endif ?>
446
- </tr>
1
  <?php
2
+
3
+ if ( ! defined( 'ABSPATH' ) ) {
4
+ exit;
5
+ }
6
+
7
  /**
8
  * @var array $VARS
9
  * @var Freemius $fs
448
  </td>
449
  <!--/ Optional Delete Action -->
450
  <?php endif ?>
451
+ </tr>
freemius/templates/account/partials/site.php CHANGED
@@ -23,7 +23,7 @@
23
  $is_whitelabeled = $fs->is_whitelabeled();
24
  $has_paid_plan = $fs->has_paid_plan();
25
  $is_premium = $fs->is_premium();
26
- $main_user = $VARS['user'];
27
  $blog_id = $site['blog_id'];
28
 
29
  $install = $VARS['install'];
@@ -32,7 +32,7 @@
32
  $trial_plan = $fs->get_trial_plan();
33
  $free_text = fs_text_inline( 'Free', 'free', $slug );
34
 
35
- if ( $is_whitelabeled && is_object( $install ) && $fs->is_delegated_connection( $blog_id ) ) {
36
  $is_whitelabeled = $fs->is_whitelabeled( true, $blog_id );
37
  }
38
  ?>
@@ -174,7 +174,7 @@
174
  <?php $row_index ++ ?>
175
  <!--/ Blog ID -->
176
 
177
- <?php if ( $install->user_id != $main_user->id ) : ?>
178
  <?php
179
  /**
180
  * @var FS_User $user
23
  $is_whitelabeled = $fs->is_whitelabeled();
24
  $has_paid_plan = $fs->has_paid_plan();
25
  $is_premium = $fs->is_premium();
26
+ $main_user = $fs->get_user();
27
  $blog_id = $site['blog_id'];
28
 
29
  $install = $VARS['install'];
32
  $trial_plan = $fs->get_trial_plan();
33
  $free_text = fs_text_inline( 'Free', 'free', $slug );
34
 
35
+ if ( $is_whitelabeled && $fs->is_delegated_connection( $blog_id ) ) {
36
  $is_whitelabeled = $fs->is_whitelabeled( true, $blog_id );
37
  }
38
  ?>
174
  <?php $row_index ++ ?>
175
  <!--/ Blog ID -->
176
 
177
+ <?php if ( $is_registered && $install->user_id != $main_user->id ) : ?>
178
  <?php
179
  /**
180
  * @var FS_User $user
freemius/templates/account/payments.php CHANGED
@@ -10,19 +10,19 @@
10
  exit;
11
  }
12
 
13
- /**
14
- * @var array $VARS
15
- * @var Freemius $fs
16
- */
17
- $fs = freemius( $VARS['id'] );
18
-
19
- /**
20
- * @var FS_Payment[] $payments
21
- */
22
- $payments = $VARS['payments'];
23
 
24
  $slug = $fs->get_slug();
25
 
 
 
 
 
 
26
  ?>
27
  <div class="postbox">
28
  <div id="fs_payments">
@@ -56,3 +56,4 @@
56
  </div>
57
  </div>
58
  <?php
 
10
  exit;
11
  }
12
 
13
+ /**
14
+ * @var array $VARS
15
+ * @var Freemius $fs
16
+ */
17
+ $fs = freemius( $VARS['id'] );
 
 
 
 
 
18
 
19
  $slug = $fs->get_slug();
20
 
21
+ $payments = $fs->_fetch_payments();
22
+
23
+ $show_payments = ( is_array( $payments ) && 0 < count( $payments ) );
24
+
25
+ if ( $show_payments ) :
26
  ?>
27
  <div class="postbox">
28
  <div id="fs_payments">
56
  </div>
57
  </div>
58
  <?php
59
+ endif;
freemius/templates/admin-notice.php CHANGED
@@ -45,9 +45,6 @@
45
  case 'promotion':
46
  echo 'updated promotion';
47
  break;
48
- case 'warn':
49
- echo 'notice notice-warning';
50
- break;
51
  case 'update':
52
  // echo 'update-nag update';
53
  // break;
@@ -67,7 +64,7 @@
67
  } ?>"><?php if ( ! empty( $VARS['plugin'] ) ) : ?>
68
  <label class="fs-plugin-title"><?php echo $VARS['plugin'] ?></label>
69
  <?php endif ?>
70
- <?php if ( ! empty( $VARS['sticky'] ) && ( ! isset( $VARS['dismissible'] ) || false !== $VARS['dismissible'] ) ) : ?>
71
  <div class="fs-close"><i class="dashicons dashicons-no"
72
  title="<?php echo esc_attr( $dismiss_text ) ?>"></i> <span><?php echo esc_html( $dismiss_text ) ?></span>
73
  </div>
45
  case 'promotion':
46
  echo 'updated promotion';
47
  break;
 
 
 
48
  case 'update':
49
  // echo 'update-nag update';
50
  // break;
64
  } ?>"><?php if ( ! empty( $VARS['plugin'] ) ) : ?>
65
  <label class="fs-plugin-title"><?php echo $VARS['plugin'] ?></label>
66
  <?php endif ?>
67
+ <?php if ( ! empty( $VARS['sticky'] ) ) : ?>
68
  <div class="fs-close"><i class="dashicons dashicons-no"
69
  title="<?php echo esc_attr( $dismiss_text ) ?>"></i> <span><?php echo esc_html( $dismiss_text ) ?></span>
70
  </div>
freemius/templates/ajax-loader.php CHANGED
@@ -1 +1,6 @@
1
- <div class="fs-ajax-loader" style="display: none"><?php for ( $i = 1; $i <= 8; $i ++ ) : ?><div class="fs-ajax-loader-bar fs-ajax-loader-bar-<?php echo $i ?>"></div><?php endfor ?></div>
 
 
 
 
 
1
+ <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ exit;
4
+ }
5
+ ?>
6
+ <div class="fs-ajax-loader" style="display: none"><?php for ( $i = 1; $i <= 8; $i ++ ) : ?><div class="fs-ajax-loader-bar fs-ajax-loader-bar-<?php echo $i ?>"></div><?php endfor ?></div>
freemius/templates/clone-resolution-js.php DELETED
@@ -1,77 +0,0 @@
1
- <?php
2
- /**
3
- * @package Freemius
4
- * @copyright Copyright (c) 2015, Freemius, Inc.
5
- * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6
- * @since 2.5.0
7
- */
8
-
9
- if ( ! defined( 'ABSPATH' ) ) {
10
- exit;
11
- }
12
- ?>
13
- <script type="text/javascript">
14
- ( function( $ ) {
15
- var $errorMessage = null;
16
-
17
- $( document ).ready( function() {
18
- var $cloneResolutionNotice = $( 'div[data-id="clone_resolution_options_notice"], div[data-id="temporary_duplicate_notice"]' );
19
-
20
- if ( 0 === $cloneResolutionNotice.length ) {
21
- return;
22
- }
23
-
24
- $errorMessage = $cloneResolutionNotice.find( '#fs_clone_resolution_error_message' );
25
-
26
- /**
27
- * Triggers an AJAX request when the license activation link or any of the buttons on the clone resolution options notice is clicked. The AJAX request will then handle the action the user has chosen.
28
- */
29
- $cloneResolutionNotice.on( 'click', '.button, #fs_temporary_duplicate_license_activation_link', function( evt ) {
30
- evt.preventDefault();
31
-
32
- var $this = $( this ),
33
- $body = $( 'body' ),
34
- cursor = $body.css( 'cursor' );
35
-
36
- if ( $this.hasClass( 'disabled' ) ) {
37
- return;
38
- }
39
-
40
- var beforeUnload = function() {
41
- return '<?php fs_esc_js_echo_inline( 'Please wait', 'please-wait' ) ?>';
42
- };
43
-
44
- $.ajax( {
45
- // Get the parent options container from the child as `$cloneResolutionNotice` can have different AJAX URLs if both the manual clone resolution options and temporary duplicate notices are shown (for different subsites in a multisite network).
46
- url : $this.parents( '.fs-clone-resolution-options-container' ).data( 'ajax-url' ),
47
- method : 'POST',
48
- data : {
49
- action : '<?php echo $VARS['ajax_action'] ?>',
50
- security : '<?php echo wp_create_nonce( $VARS['ajax_action'] ) ?>',
51
- clone_action: $this.data( 'clone-action' )
52
- },
53
- beforeSend: function() {
54
- $body.css( { cursor: 'wait' } );
55
-
56
- $cloneResolutionNotice.find( '.button' ).addClass( 'disabled' );
57
-
58
- $( window ).on( 'beforeunload', beforeUnload );
59
- },
60
- success : function( resultObj ) {
61
- $( window ).off( 'beforeunload', beforeUnload );
62
-
63
- if ( resultObj.data.redirect_url && '' !== resultObj.data.redirect_url ) {
64
- window.location = resultObj.data.redirect_url;
65
- } else {
66
- window.location.reload();
67
- }
68
- },
69
- error : function() {
70
- $body.css( { cursor: cursor } );
71
- $cloneResolutionNotice.find( '.button' ).removeClass( 'disabled' );
72
- }
73
- } );
74
- } );
75
- } );
76
- } )( jQuery );
77
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
freemius/templates/connect.php CHANGED
@@ -25,15 +25,6 @@
25
 
26
  $fs->_enqueue_connect_essentials();
27
 
28
- /**
29
- * Enqueueing the styles in `_enqueue_connect_essentials()` is too late, as we need them in the HEADER. Therefore, inject the styles inline to avoid FOUC.
30
- *
31
- * @author Vova Feldman (@svovaf)
32
- */
33
- echo "<style>\n";
34
- include WP_FS__DIR_CSS . '/admin/connect.css';
35
- echo "</style>\n";
36
-
37
  $current_user = Freemius::_get_current_wp_user();
38
 
39
  $first_name = $current_user->user_firstname;
@@ -161,11 +152,11 @@
161
  fs_require_once_template( 'plugin-icon.php', $vars );
162
  ?>
163
  <i class="dashicons dashicons-plus fs-second"></i>
164
- <img class="fs-connect-logo" width="80" height="80" src="//img.freemius.com/logo/connect.svg"/>
165
  </div>
166
  <div class="fs-content">
167
  <?php if ( ! empty( $error ) ) : ?>
168
- <p class="fs-error"><?php echo $fs->apply_filters( 'connect_error_esc_html', esc_html( $error ) ) ?></p>
169
  <?php endif ?>
170
  <p><?php
171
  $button_label = fs_text_inline( 'Allow & Continue', 'opt-in-connect', $slug );
@@ -217,6 +208,11 @@
217
 
218
  $message = $fs->apply_filters(
219
  $filter,
 
 
 
 
 
220
  sprintf(
221
  esc_html( $default_optin_message ),
222
  '<b>' . esc_html( $fs->get_plugin_name() ) . '</b>',
@@ -605,11 +601,6 @@
605
  updatePrimaryCtaText( actionType );
606
  });
607
 
608
- $sitesListContainer.delegate( 'td:not(:first-child)', 'click', function() {
609
- // If a site row is clicked, trigger a click on the checkbox.
610
- $( this ).parent().find( 'td:first-child input' ).click();
611
- } );
612
-
613
  $sitesListContainer.delegate( '.action', 'click', function( evt ) {
614
  var $this = $( evt.target );
615
  if ( $this.hasClass( 'selected' ) ) {
25
 
26
  $fs->_enqueue_connect_essentials();
27
 
 
 
 
 
 
 
 
 
 
28
  $current_user = Freemius::_get_current_wp_user();
29
 
30
  $first_name = $current_user->user_firstname;
152
  fs_require_once_template( 'plugin-icon.php', $vars );
153
  ?>
154
  <i class="dashicons dashicons-plus fs-second"></i>
155
+ <img class="fs-connect-logo" width="80" height="80" src="//img.freemius.com/connect-logo.png"/>
156
  </div>
157
  <div class="fs-content">
158
  <?php if ( ! empty( $error ) ) : ?>
159
+ <p class="fs-error"><?php echo esc_html( $error ) ?></p>
160
  <?php endif ?>
161
  <p><?php
162
  $button_label = fs_text_inline( 'Allow & Continue', 'opt-in-connect', $slug );
208
 
209
  $message = $fs->apply_filters(
210
  $filter,
211
+ ($is_network_upgrade_mode ?
212
+ '' :
213
+ /* translators: %s: name (e.g. Hey John,) */
214
+ $hey_x_text . '<br>'
215
+ ) .
216
  sprintf(
217
  esc_html( $default_optin_message ),
218
  '<b>' . esc_html( $fs->get_plugin_name() ) . '</b>',
601
  updatePrimaryCtaText( actionType );
602
  });
603
 
 
 
 
 
 
604
  $sitesListContainer.delegate( '.action', 'click', function( evt ) {
605
  var $this = $( evt.target );
606
  if ( $this.hasClass( 'selected' ) ) {
freemius/templates/debug.php CHANGED
@@ -37,6 +37,8 @@
37
 
38
  $.post( ajaxurl, {
39
  action: 'fs_toggle_debug_mode',
 
 
40
  is_on : ($(this).hasClass( 'fs-on' ) ? 1 : 0)
41
  }, function ( response ) {
42
  if ( 1 == response ) {
@@ -77,16 +79,6 @@
77
  <button class="button"><?php fs_esc_html_echo_inline( 'Clear Updates Transients' ) ?></button>
78
  </form>
79
  </td>
80
- <?php if ( Freemius::is_deactivation_snoozed() ) : ?>
81
- <td>
82
- <!-- Reset Deactivation Snoozing -->
83
- <form action="" method="POST">
84
- <input type="hidden" name="fs_action" value="reset_deactivation_snoozing">
85
- <?php wp_nonce_field( 'reset_deactivation_snoozing' ) ?>
86
- <button class="button"><?php fs_esc_html_echo_inline( 'Reset Deactivation Snoozing' ) ?> (Expires in <?php echo ( Freemius::deactivation_snooze_expires_at() - time() ) ?> sec)</button>
87
- </form>
88
- </td>
89
- <?php endif ?>
90
  <td>
91
  <!-- Sync Data with Server -->
92
  <form action="" method="POST">
@@ -121,7 +113,8 @@
121
  if (optionName) {
122
  $.post(ajaxurl, {
123
  action : 'fs_get_db_option',
124
- _wpnonce : '<?php echo wp_create_nonce( 'fs_get_db_option' ) ?>',
 
125
  option_name: optionName
126
  }, function (response) {
127
  if (response.data.value)
@@ -141,7 +134,8 @@
141
  if (optionValue) {
142
  $.post(ajaxurl, {
143
  action : 'fs_set_db_option',
144
- _wpnonce : '<?php echo wp_create_nonce( 'fs_set_db_option' ) ?>',
 
145
  option_name : optionName,
146
  option_value: optionValue
147
  }, function () {
@@ -490,15 +484,8 @@
490
  * @var FS_User[] $users
491
  */
492
  $users = $VARS['users'];
493
- $user_ids_map = array();
494
  $users_with_developer_license_by_id = array();
495
 
496
- if ( is_array( $users ) && ! empty( $users ) ) {
497
- foreach ( $users as $user ) {
498
- $user_ids_map[ $user->id ] = true;
499
- }
500
- }
501
-
502
  foreach ( $module_types as $module_type ) {
503
  /**
504
  * @var FS_Plugin_License[] $licenses
@@ -591,7 +578,7 @@
591
  <td><?php echo $license->is_block_features ? 'Blocking' : 'Flexible' ?></td>
592
  <td><?php echo $license->is_whitelabeled ? 'Whitelabeled' : 'Normal' ?></td>
593
  <td><?php
594
- echo ( $license->is_whitelabeled || ! isset( $user_ids_map[ $license->user_id ] ) ) ?
595
  $license->get_html_escaped_masked_secret_key() :
596
  esc_html( $license->secret_key );
597
  ?></td>
@@ -741,6 +728,8 @@
741
 
742
  $.post(ajaxurl, {
743
  action : 'fs_get_debug_log',
 
 
744
  filters: filters,
745
  offset : offset,
746
  limit : limit
37
 
38
  $.post( ajaxurl, {
39
  action: 'fs_toggle_debug_mode',
40
+ // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
41
+ _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_toggle_debug_mode' ) ); ?>,
42
  is_on : ($(this).hasClass( 'fs-on' ) ? 1 : 0)
43
  }, function ( response ) {
44
  if ( 1 == response ) {
79
  <button class="button"><?php fs_esc_html_echo_inline( 'Clear Updates Transients' ) ?></button>
80
  </form>
81
  </td>
 
 
 
 
 
 
 
 
 
 
82
  <td>
83
  <!-- Sync Data with Server -->
84
  <form action="" method="POST">
113
  if (optionName) {
114
  $.post(ajaxurl, {
115
  action : 'fs_get_db_option',
116
+ // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
117
+ _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_get_db_option' ) ); ?>,
118
  option_name: optionName
119
  }, function (response) {
120
  if (response.data.value)
134
  if (optionValue) {
135
  $.post(ajaxurl, {
136
  action : 'fs_set_db_option',
137
+ // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
138
+ _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_set_db_option' ) ); ?>,
139
  option_name : optionName,
140
  option_value: optionValue
141
  }, function () {
484
  * @var FS_User[] $users
485
  */
486
  $users = $VARS['users'];
 
487
  $users_with_developer_license_by_id = array();
488
 
 
 
 
 
 
 
489
  foreach ( $module_types as $module_type ) {
490
  /**
491
  * @var FS_Plugin_License[] $licenses
578
  <td><?php echo $license->is_block_features ? 'Blocking' : 'Flexible' ?></td>
579
  <td><?php echo $license->is_whitelabeled ? 'Whitelabeled' : 'Normal' ?></td>
580
  <td><?php
581
+ echo $license->is_whitelabeled ?
582
  $license->get_html_escaped_masked_secret_key() :
583
  esc_html( $license->secret_key );
584
  ?></td>
728
 
729
  $.post(ajaxurl, {
730
  action : 'fs_get_debug_log',
731
+ // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
732
+ _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_get_debug_log' ) ); ?>,
733
  filters: filters,
734
  offset : offset,
735
  limit : limit
freemius/templates/firewall-issues-js.php CHANGED
@@ -22,10 +22,12 @@
22
  notice = $( this ).parents( '.fs-notice' ),
23
  ajaxActionSuffix = notice.attr( 'data-manager-id' ).replace( ':', '-' );
24
 
25
- var data = {
26
- action : 'fs_resolve_firewall_issues_' + ajaxActionSuffix,
27
- error_type: error_type
28
- };
 
 
29
 
30
  if ( 'squid' === error_type ) {
31
  data.hosting_company = prompt( 'What is the name or URL of your hosting company?' );
@@ -39,7 +41,9 @@
39
  }
40
 
41
  if ( 'retry_ping' === error_type ) {
42
- data.action = 'fs_retry_connectivity_test_' + ajaxActionSuffix;
 
 
43
  }
44
 
45
  $( this ).css({'cursor': 'wait'});
@@ -56,4 +60,4 @@
56
  });
57
  });
58
  });
59
- </script>
22
  notice = $( this ).parents( '.fs-notice' ),
23
  ajaxActionSuffix = notice.attr( 'data-manager-id' ).replace( ':', '-' );
24
 
25
+ var data = {
26
+ action : 'fs_resolve_firewall_issues_' + ajaxActionSuffix,
27
+ // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
28
+ _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_resolve_firewall_issues' ) ); ?>,
29
+ error_type: error_type
30
+ };
31
 
32
  if ( 'squid' === error_type ) {
33
  data.hosting_company = prompt( 'What is the name or URL of your hosting company?' );
41
  }
42
 
43
  if ( 'retry_ping' === error_type ) {
44
+ data.action = 'fs_retry_connectivity_test_' + ajaxActionSuffix;
45
+ // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
46
+ data._wpnonce = <?php echo wp_json_encode( wp_create_nonce( 'fs_retry_connectivity_test' ) ); ?>;
47
  }
48
 
49
  $( this ).css({'cursor': 'wait'});
60
  });
61
  });
62
  });
63
+ </script>
freemius/templates/forms/deactivation/form.php CHANGED
@@ -1,666 +1,543 @@
1
- <?php
2
- /**
3
- * @package Freemius
4
- * @copyright Copyright (c) 2015, Freemius, Inc.
5
- * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6
- * @since 1.1.2
7
- */
8
-
9
- if ( ! defined( 'ABSPATH' ) ) {
10
- exit;
11
- }
12
-
13
- /**
14
- * @var array $VARS
15
- */
16
- $fs = freemius( $VARS['id'] );
17
- $slug = $fs->get_slug();
18
-
19
- $subscription_cancellation_dialog_box_template_params = $VARS['subscription_cancellation_dialog_box_template_params'];
20
- $show_deactivation_feedback_form = $VARS['show_deactivation_feedback_form'];
21
- $confirmation_message = $VARS['uninstall_confirmation_message'];
22
-
23
- $is_anonymous = ( ! $fs->is_registered() );
24
- $anonymous_feedback_checkbox_html = '';
25
-
26
- $reasons_list_items_html = '';
27
- $snooze_select_html = '';
28
-
29
- if ( $show_deactivation_feedback_form ) {
30
- $reasons = $VARS['reasons'];
31
-
32
- foreach ( $reasons as $reason ) {
33
- $list_item_classes = 'reason' . ( ! empty( $reason['input_type'] ) ? ' has-input' : '' );
34
-
35
- if ( isset( $reason['internal_message'] ) && ! empty( $reason['internal_message'] ) ) {
36
- $list_item_classes .= ' has-internal-message';
37
- $reason_internal_message = $reason['internal_message'];
38
- } else {
39
- $reason_internal_message = '';
40
- }
41
-
42
- $reason_input_type = ( ! empty( $reason['input_type'] ) ? $reason['input_type'] : '' );
43
- $reason_input_placeholder = ( ! empty( $reason['input_placeholder'] ) ? $reason['input_placeholder'] : '' );
44
-
45
- $reason_list_item_html = <<< HTML
46
- <li class="{$list_item_classes}"
47
- data-input-type="{$reason_input_type}"
48
- data-input-placeholder="{$reason_input_placeholder}">
49
- <label>
50
- <span>
51
- <input type="radio" name="selected-reason" value="{$reason['id']}"/>
52
- </span>
53
- <span>{$reason['text']}</span>
54
- </label>
55
- <div class="internal-message">{$reason_internal_message}</div>
56
- </li>
57
- HTML;
58
-
59
- $reasons_list_items_html .= $reason_list_item_html;
60
- }
61
-
62
- if ( $is_anonymous ) {
63
- $anonymous_feedback_checkbox_html = sprintf(
64
- '<label class="anonymous-feedback-label"><input type="checkbox" class="anonymous-feedback-checkbox"> %s</label>',
65
- fs_esc_html_inline( 'Anonymous feedback', 'anonymous-feedback', $slug )
66
- );
67
- }
68
-
69
- $snooze_periods = array(
70
- array(
71
- 'increment' => fs_text_inline( 'hour', $slug ),
72
- 'quantity' => number_format_i18n(1),
73
- 'value' => 6 * WP_FS__TIME_10_MIN_IN_SEC,
74
- ),
75
- array(
76
- 'increment' => fs_text_inline( 'hours', $slug ),
77
- 'quantity' => number_format_i18n(24),
78
- 'value' => WP_FS__TIME_24_HOURS_IN_SEC,
79
- ),
80
- array(
81
- 'increment' => fs_text_inline( 'days', $slug ),
82
- 'quantity' => number_format_i18n(7),
83
- 'value' => WP_FS__TIME_WEEK_IN_SEC,
84
- ),
85
- array(
86
- 'increment' => fs_text_inline( 'days', $slug ),
87
- 'quantity' => number_format_i18n(30),
88
- 'value' => 30 * WP_FS__TIME_24_HOURS_IN_SEC,
89
- ),
90
- );
91
-
92
- $snooze_select_html = '<select>';
93
- foreach ($snooze_periods as $period) {
94
- $snooze_select_html .= sprintf(
95
- '<option value="%s">%s %s</option>',
96
- $period['value'],
97
- $period['quantity'],
98
- $period['increment']
99
- );
100
- }
101
-
102
- $snooze_select_html .= '</select>';
103
- }
104
-
105
- // Aliases.
106
- $deactivate_text = fs_text_inline( 'Deactivate', 'deactivate', $slug );
107
- $theme_text = fs_text_inline( 'Theme', 'theme', $slug );
108
- $activate_x_text = fs_text_inline( 'Activate %s', 'activate-x', $slug );
109
-
110
- $submit_deactivate_text = sprintf(
111
- fs_text_inline( 'Submit & %s', 'deactivation-modal-button-submit', $slug ),
112
- $fs->is_plugin() ?
113
- $deactivate_text :
114
- sprintf( $activate_x_text, $theme_text )
115
- );
116
-
117
- fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' );
118
-
119
- if ( ! empty( $subscription_cancellation_dialog_box_template_params ) ) {
120
- fs_require_template( 'forms/subscription-cancellation.php', $subscription_cancellation_dialog_box_template_params );
121
- }
122
- ?>
123
- <script type="text/javascript">
124
- (function ($) {
125
- var reasonsHtml = <?php echo json_encode( $reasons_list_items_html ) ?>,
126
- modalHtml =
127
- '<div class="fs-modal fs-modal-deactivation-feedback<?php echo empty( $confirmation_message ) ? ' no-confirmation-message' : ''; ?>">'
128
- + ' <div class="fs-modal-dialog">'
129
- + ' <div class="fs-modal-header">'
130
- + ' <h4><?php fs_esc_attr_echo_inline( 'Quick Feedback', 'quick-feedback' , $slug ) ?></h4>'
131
- + ' </div>'
132
- + ' <div class="fs-modal-body">'
133
- + ' <div class="fs-modal-panel" data-panel-id="confirm"><p><?php echo $confirmation_message; ?></p></div>'
134
- + ' <div class="fs-modal-panel active" data-panel-id="reasons"><h3><strong><?php echo esc_js( sprintf( fs_text_inline( 'If you have a moment, please let us know why you are %s', 'deactivation-share-reason' , $slug ), ( $fs->is_plugin() ? fs_text_inline( 'deactivating', 'deactivating', $slug ) : fs_text_inline( 'switching', 'switching', $slug ) ) ) ) ?>:</strong></h3><ul id="reasons-list">' + reasonsHtml + '</ul></div>'
135
- + ' </div>'
136
- + ' <div class="fs-modal-footer">'
137
- + ' <?php echo $anonymous_feedback_checkbox_html ?>'
138
- + ' <label style="display: none" class="feedback-from-snooze-label"><input type="checkbox" class="feedback-from-snooze-checkbox"> <span><?php fs_esc_js_echo_inline( 'Snooze this panel during troubleshooting', 'snooze-panel-during-troubleshooting', $slug ) ?></span><span style="display: none"><?php fs_esc_js_echo_inline( 'Snooze this panel for', 'snooze-panel-for', $slug ) ?> <?php echo $snooze_select_html ?></span></label>'
139
- + ' <a href="#" class="button button-secondary button-deactivate"></a>'
140
- + ' <a href="#" class="button button-secondary button-close"><?php fs_esc_js_echo_inline( 'Cancel', 'cancel', $slug ) ?></a>'
141
- + ' </div>'
142
- + ' </div>'
143
- + '</div>',
144
- $modal = $(modalHtml),
145
- selectedReasonID = false,
146
- redirectLink = '',
147
- $anonymousFeedback = $modal.find( '.anonymous-feedback-label' ),
148
- $feedbackSnooze = $modal.find( '.feedback-from-snooze-label' ),
149
- isAnonymous = <?php echo ( $is_anonymous ? 'true' : 'false' ); ?>,
150
- otherReasonID = <?php echo Freemius::REASON_OTHER; ?>,
151
- dontShareDataReasonID = <?php echo Freemius::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION; ?>,
152
- deleteThemeUpdateData = <?php echo $fs->is_theme() && $fs->is_premium() && ! $fs->has_any_active_valid_license() ? 'true' : 'false' ?>,
153
- $subscriptionCancellationModal = $( '.fs-modal-subscription-cancellation-<?php echo $fs->get_id() ?>' ),
154
- showDeactivationFeedbackForm = <?php echo ( $show_deactivation_feedback_form ? 'true' : 'false' ) ?>,
155
- $body = $( 'body' );
156
-
157
- $modal.appendTo( $body );
158
-
159
- if ( 0 !== $subscriptionCancellationModal.length ) {
160
- $subscriptionCancellationModal.on( '<?php echo $fs->get_action_tag( 'subscription_cancellation_action' ) ?>', function( evt, cancelSubscription ) {
161
- var shouldDeactivateModule = ( $modal.hasClass( 'no-confirmation-message' ) && ! showDeactivationFeedbackForm );
162
-
163
- if ( false === cancelSubscription ) {
164
- if ( ! shouldDeactivateModule ) {
165
- showModal();
166
- }
167
-
168
- $subscriptionCancellationModal.trigger( 'closeModal' );
169
-
170
- if ( shouldDeactivateModule ) {
171
- deactivateModule();
172
- }
173
- } else {
174
- var $errorMessage = $subscriptionCancellationModal.find( '.notice-error' );
175
-
176
- <?php
177
- $subscription_cancellation_context = $fs->is_paid_trial() ?
178
- fs_text_inline( 'trial', 'trial', $slug ) :
179
- fs_text_inline( 'subscription', 'subscription', $slug );
180
- ?>
181
-
182
- $.ajax({
183
- url : ajaxurl,
184
- method : 'POST',
185
- data : {
186
- action : '<?php echo $fs->get_ajax_action( 'cancel_subscription_or_trial' ) ?>',
187
- security : '<?php echo $fs->get_ajax_security( 'cancel_subscription_or_trial' ) ?>',
188
- module_id: '<?php echo $fs->get_id() ?>'
189
- },
190
- beforeSend: function() {
191
- $errorMessage.hide();
192
-
193
- $subscriptionCancellationModal.find( '.fs-modal-footer .button' ).addClass( 'disabled' );
194
- $subscriptionCancellationModal.find( '.fs-modal-footer .button-primary' ).text( '<?php echo esc_js(
195
- sprintf( fs_text_inline( 'Cancelling %s...', 'cancelling-x' , $slug ), $subscription_cancellation_context )
196
- ) ?>' );
197
- },
198
- success: function( result ) {
199
- if ( result.success ) {
200
- $subscriptionCancellationModal.removeClass( 'has-subscription-actions' );
201
- $subscriptionCancellationModal.find( '.fs-modal-footer .button-primary' ).removeClass( 'warn' );
202
-
203
- $subscriptionCancellationModal.remove();
204
-
205
- if ( ! shouldDeactivateModule ) {
206
- showModal();
207
- } else {
208
- deactivateModule();
209
- }
210
- } else {
211
- $errorMessage.find( '> p' ).html( result.error );
212
- $errorMessage.show();
213
-
214
- $subscriptionCancellationModal.find( '.fs-modal-footer .button' ).removeClass( 'disabled' );
215
- $subscriptionCancellationModal.find( '.fs-modal-footer .button-primary' ).html( <?php echo json_encode( sprintf(
216
- fs_text_inline( 'Cancel %s & Proceed', 'cancel-x-and-proceed', $slug ),
217
- ucfirst( $subscription_cancellation_context )
218
- ) ) ?> );
219
- }
220
- }
221
- });
222
- }
223
- });
224
- }
225
-
226
- registerEventHandlers();
227
-
228
- function registerEventHandlers() {
229
- $body.on( 'click', '#the-list .deactivate > a', function ( evt ) {
230
- if ( 0 === $( this ).next( '[data-module-id=<?php echo $fs->get_id() ?>].fs-module-id' ).length ) {
231
- return true;
232
- }
233
-
234
- evt.preventDefault();
235
-
236
- redirectLink = $(this).attr('href');
237
-
238
- if ( 0 == $subscriptionCancellationModal.length ) {
239
- showModal();
240
- } else {
241
- $subscriptionCancellationModal.trigger( 'showModal' );
242
- }
243
- });
244
-
245
- <?php
246
- if ( ! $fs->is_plugin() ) {
247
- /**
248
- * For "theme" module type, the modal is shown when the current user clicks on
249
- * the "Activate" button of any other theme. The "Activate" button is actually
250
- * a link to the "Themes" page (/wp-admin/themes.php) containing query params
251
- * that tell WordPress to deactivate the current theme and activate a different theme.
252
- *
253
- * @author Leo Fajardo (@leorw)
254
- * @since 1.2.2
255
- *
256
- * @since 1.2.2.7 Don't trigger the deactivation feedback form if activating the premium version of the theme.
257
- */
258
- ?>
259
- $('body').on('click', '.theme-browser .theme:not([data-slug=<?php echo $fs->get_premium_slug() ?>]) .theme-actions .button.activate', function (evt) {
260
- evt.preventDefault();
261
-
262
- redirectLink = $(this).attr('href');
263
-
264
- if ( 0 != $subscriptionCancellationModal.length ) {
265
- $subscriptionCancellationModal.trigger( 'showModal' );
266
- } else {
267
- if ( $modal.hasClass( 'no-confirmation-message' ) && ! showDeactivationFeedbackForm ) {
268
- deactivateModule();
269
- } else {
270
- showModal();
271
- }
272
- }
273
- });
274
- <?php
275
- } ?>
276
-
277
- $modal.on('input propertychange', '.reason-input input', function () {
278
- var reason = $(this).val().trim();
279
-
280
- /**
281
- * If reason is not empty, remove the error-message class of the message container
282
- * to change the message color back to default.
283
- */
284
- if (reason.length > 0) {
285
- $('.message').removeClass('error-message');
286
- }
287
-
288
- toggleDeactivationButtonPrimary( reason.length > 0 );
289
-
290
- changeDeactivateButtonText();
291
- });
292
-
293
- $modal.on('blur', '.reason-input input', function () {
294
- var $userReason = $(this);
295
-
296
- setTimeout(function () {
297
- if (!isOtherReasonSelected()) {
298
- return;
299
- }
300
-
301
- /**
302
- * If reason is empty, add the error-message class to the message container
303
- * to change the message color to red.
304
- */
305
- if (0 === $userReason.val().trim().length) {
306
- $('.message').addClass('error-message');
307
- changeDeactivateButtonText();
308
- }
309
- }, 150);
310
- });
311
-
312
- $modal.on('click', '.fs-modal-footer .button', function (evt) {
313
- evt.preventDefault();
314
-
315
- if ($(this).hasClass('disabled')) {
316
- return;
317
- }
318
-
319
- var _parent = $(this).parents('.fs-modal:first');
320
- var _this = $(this);
321
-
322
- if (_this.hasClass('allow-deactivate')) {
323
- var
324
- $radio = $modal.find('input[type="radio"]:checked'),
325
- isReasonSelected = (0 < $radio.length),
326
- userReason = '';
327
-
328
- if ( isReasonSelected ) {
329
- var $selectedReason = $radio.parents('li:first'),
330
- $reasonInput = $selectedReason.find('textarea, input[type="text"]');
331
-
332
- if ( 0 < $reasonInput.length ) {
333
- userReason = $reasonInput.val().trim();
334
- }
335
- }
336
-
337
- if ( otherReasonID == selectedReasonID && '' === userReason ) {
338
- // If the 'Other' is selected and a reason is not provided (aka it's empty), treat it as if a reason wasn't selected at all.
339
- isReasonSelected = false;
340
- }
341
-
342
- _parent.find( '.fs-modal-footer .button' ).addClass( 'disabled' );
343
-
344
- if ( ! isReasonSelected ) {
345
- if ( ! deleteThemeUpdateData ) {
346
- // If no selected reason, just deactivate the plugin.
347
- window.location.href = redirectLink;
348
- } else {
349
- $.ajax({
350
- url : ajaxurl,
351
- method : 'POST',
352
- data : {
353
- action : '<?php echo $fs->get_ajax_action( 'delete_theme_update_data' ) ?>',
354
- security : '<?php echo $fs->get_ajax_security( 'delete_theme_update_data' ) ?>',
355
- module_id: '<?php echo $fs->get_id() ?>'
356
- },
357
- beforeSend: function() {
358
- _parent.find( '.fs-modal-footer .button-deactivate' ).text( '<?php echo esc_js( fs_text_inline( 'Processing', 'processing', $slug ) ) ?>...' );
359
- },
360
- complete : function() {
361
- window.location.href = redirectLink;
362
- }
363
- });
364
- }
365
-
366
- return;
367
- }
368
-
369
- var snoozePeriod = 0;
370
-
371
- if ( <?php echo Freemius::REASON_TEMPORARY_DEACTIVATION ?> == selectedReasonID ) {
372
- snoozePeriod = parseInt($feedbackSnooze.find('select').val(), 10);
373
- }
374
-
375
-
376
- $.ajax({
377
- url : ajaxurl,
378
- method : 'POST',
379
- data : {
380
- action : '<?php echo $fs->get_ajax_action( 'submit_uninstall_reason' ) ?>',
381
- security : '<?php echo $fs->get_ajax_security( 'submit_uninstall_reason' ) ?>',
382
- module_id : '<?php echo $fs->get_id() ?>',
383
- reason_id : $radio.val(),
384
- reason_info : userReason,
385
- is_anonymous : isAnonymousFeedback(),
386
- snooze_period: snoozePeriod
387
- },
388
- beforeSend: function () {
389
- _parent.find('.fs-modal-footer .button-deactivate').text('<?php echo esc_js( fs_text_inline( 'Processing', 'processing', $slug ) ) ?>...');
390
- },
391
- complete : function () {
392
- // Do not show the dialog box, deactivate the plugin.
393
- window.location.href = redirectLink;
394
- }
395
- });
396
- } else if (_this.hasClass('button-deactivate')) {
397
- // Change the Deactivate button's text and show the reasons panel.
398
- _parent.find('.button-deactivate').addClass('allow-deactivate');
399
-
400
- if ( showDeactivationFeedbackForm ) {
401
- showPanel('reasons');
402
- } else {
403
- deactivateModule();
404
- }
405
- }
406
- });
407
-
408
- $modal.on('click', 'input[type="radio"]', function () {
409
- var $selectedReasonOption = $( this );
410
-
411
- // If the selection has not changed, do not proceed.
412
- if (selectedReasonID === $selectedReasonOption.val())
413
- return;
414
-
415
- selectedReasonID = $selectedReasonOption.val();
416
-
417
- if ( isAnonymous ) {
418
- if ( isReasonSelected( dontShareDataReasonID ) ) {
419
- $anonymousFeedback.hide();
420
- } else {
421
- $anonymousFeedback.show();
422
- }
423
- }
424
-
425
- var _parent = $(this).parents('li:first');
426
-
427
- $modal.find('.reason-input').remove();
428
- $modal.find( '.internal-message' ).hide();
429
- $modal.find('.button-deactivate').html('<?php echo esc_js( $submit_deactivate_text ) ?>');
430
-
431
- if ( _parent.hasClass( 'has-internal-message' ) ) {
432
- _parent.find( '.internal-message' ).show();
433
- }
434
-
435
- if ( ! _parent.hasClass('has-input') ) {
436
- toggleDeactivationButtonPrimary( true );
437
- } else {
438
- toggleDeactivationButtonPrimary( false );
439
-
440
- var inputType = _parent.data('input-type'),
441
- inputPlaceholder = _parent.data('input-placeholder'),
442
- reasonInputHtml = '<div class="reason-input"><span class="message"></span>' + ( ( 'textfield' === inputType ) ? '<input type="text" maxlength="128" />' : '<textarea rows="5" maxlength="128"></textarea>' ) + '</div>';
443
-
444
- _parent.append($(reasonInputHtml));
445
- _parent.find('input, textarea').attr('placeholder', inputPlaceholder).focus();
446
-
447
- if (isOtherReasonSelected()) {
448
- showMessage('<?php echo esc_js( fs_text_inline( 'Kindly tell us the reason so we can improve.', 'ask-for-reason-message' , $slug ) ); ?>');
449
- changeDeactivateButtonText();
450
- }
451
- }
452
-
453
- $anonymousFeedback.toggle( <?php echo Freemius::REASON_TEMPORARY_DEACTIVATION ?> != selectedReasonID );
454
- $feedbackSnooze.toggle( <?php echo Freemius::REASON_TEMPORARY_DEACTIVATION ?> == selectedReasonID );
455
-
456
- if ( <?php echo Freemius::REASON_TEMPORARY_DEACTIVATION ?> == selectedReasonID ) {
457
- updateDeactivationButtonOnTrouble();
458
- }
459
- });
460
-
461
- var toggleDeactivationButtonPrimary = function ( isPrimary ) {
462
- if ( isPrimary ) {
463
- $modal.find('.button-deactivate')
464
- .removeClass( 'button-secondary' )
465
- .addClass( 'button-primary' );
466
- } else {
467
- $modal.find('.button-deactivate')
468
- .addClass( 'button-secondary' )
469
- .removeClass( 'button-primary' );
470
- }
471
- };
472
-
473
- var snooze = false;
474
-
475
- var updateDeactivationButtonOnTrouble = function () {
476
- if ( snooze ) {
477
- $modal.find('.button-deactivate').html('<?php echo esc_js( sprintf(
478
- fs_text_inline( 'Snooze & %s', 'snooze-modal-button-submit' , $slug ),
479
- $fs->is_plugin() ?
480
- $deactivate_text :
481
- sprintf( $activate_x_text, $theme_text )
482
- ) ) ?>');
483
- } else {
484
- $modal.find('.button-deactivate').html('<?php echo esc_js(
485
- $fs->is_plugin() ?
486
- $deactivate_text :
487
- sprintf( $activate_x_text, $theme_text )
488
- ) ?>');
489
- }
490
- };
491
-
492
- $feedbackSnooze.on( 'click', 'input', function () {
493
- var $spans = $feedbackSnooze.find( 'span' );
494
-
495
- snooze = ( ! snooze );
496
-
497
- $( $spans[0] ).toggle();
498
- $( $spans[1] ).toggle();
499
-
500
- updateDeactivationButtonOnTrouble();
501
- });
502
-
503
- // If the user has clicked outside the window, cancel it.
504
- $modal.on('click', function (evt) {
505
- var $target = $(evt.target);
506
-
507
- // If the user has clicked anywhere in the modal dialog, just return.
508
- if ($target.hasClass('fs-modal-body') || $target.hasClass('fs-modal-footer')) {
509
- return;
510
- }
511
-
512
- // If the user has not clicked the close button and the clicked element is inside the modal dialog, just return.
513
- if (
514
- ! $target.hasClass( 'button-close' ) &&
515
- ( $target.parents( '.fs-modal-body' ).length > 0 || $target.parents( '.fs-modal-footer' ).length > 0 )
516
- ) {
517
- return;
518
- }
519
-
520
- closeModal();
521
-
522
- return false;
523
- });
524
- }
525
-
526
- function isAnonymousFeedback() {
527
- if ( ! isAnonymous ) {
528
- return false;
529
- }
530
-
531
- return ( isReasonSelected( dontShareDataReasonID ) || $anonymousFeedback.find( 'input' ).prop( 'checked' ) );
532
- }
533
-
534
- function isReasonSelected( reasonID ) {
535
- // Get the selected radio input element.
536
- var $selectedReasonOption = $modal.find('input[type="radio"]:checked');
537
-
538
- return ( reasonID == $selectedReasonOption.val() );
539
- }
540
-
541
- function isOtherReasonSelected() {
542
- return isReasonSelected( otherReasonID );
543
- }
544
-
545
- function showModal() {
546
- resetModal();
547
-
548
- // Display the dialog box.
549
- $modal.addClass('active');
550
-
551
- $('body').addClass('has-fs-modal');
552
- }
553
-
554
- function closeModal() {
555
- $modal.removeClass('active');
556
-
557
- $('body').removeClass('has-fs-modal');
558
- }
559
-
560
- function resetModal() {
561
- selectedReasonID = false;
562
-
563
- // Uncheck all radio buttons.
564
- $modal.find('input[type="radio"]').prop('checked', false);
565
-
566
- // Remove all input fields ( textfield, textarea ).
567
- $modal.find('.reason-input').remove();
568
-
569
- $modal.find('.message').hide();
570
-
571
- if ( isAnonymous ) {
572
- $anonymousFeedback.find( 'input' ).prop( 'checked', <?php echo $fs->apply_filters( 'default_to_anonymous_feedback', false ) ? 'true' : 'false' ?> );
573
-
574
- // Hide, since by default there is no selected reason.
575
- $anonymousFeedback.hide();
576
- }
577
-
578
- var $deactivateButton = $modal.find('.button-deactivate');
579
-
580
- /*
581
- * If the modal dialog has no confirmation message, that is, it has only one panel, then ensure
582
- * that clicking the deactivate button will actually deactivate the plugin.
583
- */
584
- if ( $modal.hasClass( 'no-confirmation-message' ) ) {
585
- $deactivateButton.addClass( 'allow-deactivate' );
586
-
587
- showPanel( 'reasons' );
588
- } else {
589
- $deactivateButton.removeClass( 'allow-deactivate' );
590
-
591
- showPanel( 'confirm' );
592
- }
593
- }
594
-
595
- function showMessage(message) {
596
- $modal.find('.message').text(message).show();
597
- }
598
-
599
- /**
600
- * @author Xiaheng Chen (@xhchen)
601
- *
602
- * @since 2.4.2
603
- */
604
- function changeDeactivateButtonText() {
605
- if ( ! isOtherReasonSelected()) {
606
- return;
607
- }
608
-
609
- var
610
- $userReason = $modal.find('.reason-input input'),
611
- $deactivateButton = $modal.find('.button-deactivate');
612
-
613
- if (0 === $userReason.val().trim().length) {
614
- // If the reason is empty, just change the text to 'Deactivate' (plugin) or 'Activate themeX' (theme).
615
- $deactivateButton.html('<?php echo
616
- $fs->is_plugin() ?
617
- $deactivate_text :
618
- sprintf( $activate_x_text, $theme_text )
619
- ?>');
620
- } else {
621
- $deactivateButton.html('<?php echo esc_js( $submit_deactivate_text ) ?>');
622
- }
623
- }
624
-
625
- function showPanel(panelType) {
626
- $modal.find( '.fs-modal-panel' ).removeClass( 'active' );
627
- $modal.find( '[data-panel-id="' + panelType + '"]' ).addClass( 'active' );
628
-
629
- updateButtonLabels();
630
- }
631
-
632
- function updateButtonLabels() {
633
- var $deactivateButton = $modal.find( '.button-deactivate' );
634
-
635
- // Reset the deactivate button's text.
636
- if ( 'confirm' === getCurrentPanel() ) {
637
- $deactivateButton.text( <?php echo json_encode( sprintf(
638
- fs_text_inline( 'Yes - %s', 'deactivation-modal-button-confirm', $slug ),
639
- $fs->is_plugin() ?
640
- $deactivate_text :
641
- sprintf( $activate_x_text, $theme_text )
642
- ) ) ?> );
643
- } else {
644
- $deactivateButton.html( <?php echo json_encode( sprintf(
645
- fs_text_inline('Skip & %s', 'skip-and-x', $slug ),
646
- $fs->is_plugin() ?
647
- $deactivate_text :
648
- sprintf( $activate_x_text, $theme_text )
649
- ) ) ?> );
650
- }
651
- }
652
-
653
- function getCurrentPanel() {
654
- return $modal.find('.fs-modal-panel.active').attr('data-panel-id');
655
- }
656
-
657
- /**
658
- * @author Leo Fajardo (@leorw)
659
- *
660
- * @since 2.3.0
661
- */
662
- function deactivateModule() {
663
- window.location.href = redirectLink;
664
- }
665
- })(jQuery);
666
- </script>
1
+ <?php
2
+ /**
3
+ * @package Freemius
4
+ * @copyright Copyright (c) 2015, Freemius, Inc.
5
+ * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6
+ * @since 1.1.2
7
+ */
8
+
9
+ if ( ! defined( 'ABSPATH' ) ) {
10
+ exit;
11
+ }
12
+
13
+ /**
14
+ * @var array $VARS
15
+ */
16
+ $fs = freemius( $VARS['id'] );
17
+ $slug = $fs->get_slug();
18
+
19
+ $subscription_cancellation_dialog_box_template_params = $VARS['subscription_cancellation_dialog_box_template_params'];
20
+ $show_deactivation_feedback_form = $VARS['show_deactivation_feedback_form'];
21
+ $confirmation_message = $VARS['uninstall_confirmation_message'];
22
+
23
+ $is_anonymous = ( ! $fs->is_registered() );
24
+ $anonymous_feedback_checkbox_html = '';
25
+
26
+ $reasons_list_items_html = '';
27
+
28
+ if ( $show_deactivation_feedback_form ) {
29
+ $reasons = $VARS['reasons'];
30
+
31
+ foreach ( $reasons as $reason ) {
32
+ $list_item_classes = 'reason' . ( ! empty( $reason['input_type'] ) ? ' has-input' : '' );
33
+
34
+ if ( isset( $reason['internal_message'] ) && ! empty( $reason['internal_message'] ) ) {
35
+ $list_item_classes .= ' has-internal-message';
36
+ $reason_internal_message = $reason['internal_message'];
37
+ } else {
38
+ $reason_internal_message = '';
39
+ }
40
+
41
+ $reason_input_type = ( ! empty( $reason['input_type'] ) ? $reason['input_type'] : '' );
42
+ $reason_input_placeholder = ( ! empty( $reason['input_placeholder'] ) ? $reason['input_placeholder'] : '' );
43
+
44
+ $reason_list_item_html = <<< HTML
45
+ <li class="{$list_item_classes}"
46
+ data-input-type="{$reason_input_type}"
47
+ data-input-placeholder="{$reason_input_placeholder}">
48
+ <label>
49
+ <span>
50
+ <input type="radio" name="selected-reason" value="{$reason['id']}"/>
51
+ </span>
52
+ <span>{$reason['text']}</span>
53
+ </label>
54
+ <div class="internal-message">{$reason_internal_message}</div>
55
+ </li>
56
+ HTML;
57
+
58
+ $reasons_list_items_html .= $reason_list_item_html;
59
+ }
60
+
61
+ if ( $is_anonymous ) {
62
+ $anonymous_feedback_checkbox_html = sprintf(
63
+ '<label class="anonymous-feedback-label"><input type="checkbox" class="anonymous-feedback-checkbox"> %s</label>',
64
+ fs_esc_html_inline( 'Anonymous feedback', 'anonymous-feedback', $slug )
65
+ );
66
+ }
67
+ }
68
+
69
+ // Aliases.
70
+ $deactivate_text = fs_text_inline( 'Deactivate', 'deactivate', $slug );
71
+ $theme_text = fs_text_inline( 'Theme', 'theme', $slug );
72
+ $activate_x_text = fs_text_inline( 'Activate %s', 'activate-x', $slug );
73
+
74
+ fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' );
75
+
76
+ if ( ! empty( $subscription_cancellation_dialog_box_template_params ) ) {
77
+ fs_require_template( 'forms/subscription-cancellation.php', $subscription_cancellation_dialog_box_template_params );
78
+ }
79
+ ?>
80
+ <script type="text/javascript">
81
+ (function ($) {
82
+ var reasonsHtml = <?php echo json_encode( $reasons_list_items_html ) ?>,
83
+ modalHtml =
84
+ '<div class="fs-modal fs-modal-deactivation-feedback<?php echo empty( $confirmation_message ) ? ' no-confirmation-message' : ''; ?>">'
85
+ + ' <div class="fs-modal-dialog">'
86
+ + ' <div class="fs-modal-header">'
87
+ + ' <h4><?php fs_esc_attr_echo_inline( 'Quick Feedback', 'quick-feedback' , $slug ) ?></h4>'
88
+ + ' </div>'
89
+ + ' <div class="fs-modal-body">'
90
+ + ' <div class="fs-modal-panel" data-panel-id="confirm"><p><?php echo $confirmation_message; ?></p></div>'
91
+ + ' <div class="fs-modal-panel active" data-panel-id="reasons"><h3><strong><?php echo esc_js( sprintf( fs_text_inline( 'If you have a moment, please let us know why you are %s', 'deactivation-share-reason' , $slug ), ( $fs->is_plugin() ? fs_text_inline( 'deactivating', 'deactivating', $slug ) : fs_text_inline( 'switching', 'switching', $slug ) ) ) ) ?>:</strong></h3><ul id="reasons-list">' + reasonsHtml + '</ul></div>'
92
+ + ' </div>'
93
+ + ' <div class="fs-modal-footer">'
94
+ + ' <?php echo $anonymous_feedback_checkbox_html ?>'
95
+ + ' <a href="#" class="button button-secondary button-deactivate"></a>'
96
+ + ' <a href="#" class="button button-secondary button-close"><?php fs_esc_js_echo_inline( 'Cancel', 'cancel', $slug ) ?></a>'
97
+ + ' </div>'
98
+ + ' </div>'
99
+ + '</div>',
100
+ $modal = $(modalHtml),
101
+ selectedReasonID = false,
102
+ redirectLink = '',
103
+ $anonymousFeedback = $modal.find( '.anonymous-feedback-label' ),
104
+ isAnonymous = <?php echo ( $is_anonymous ? 'true' : 'false' ); ?>,
105
+ otherReasonID = <?php echo Freemius::REASON_OTHER; ?>,
106
+ dontShareDataReasonID = <?php echo Freemius::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION; ?>,
107
+ deleteThemeUpdateData = <?php echo $fs->is_theme() && $fs->is_premium() && ! $fs->has_any_active_valid_license() ? 'true' : 'false' ?>,
108
+ $subscriptionCancellationModal = $( '.fs-modal-subscription-cancellation-<?php echo $fs->get_id() ?>' ),
109
+ showDeactivationFeedbackForm = <?php echo ( $show_deactivation_feedback_form ? 'true' : 'false' ) ?>,
110
+ $body = $( 'body' );
111
+
112
+ $modal.appendTo( $body );
113
+
114
+ if ( 0 !== $subscriptionCancellationModal.length ) {
115
+ $subscriptionCancellationModal.on( '<?php echo $fs->get_action_tag( 'subscription_cancellation_action' ) ?>', function( evt, cancelSubscription ) {
116
+ var shouldDeactivateModule = ( $modal.hasClass( 'no-confirmation-message' ) && ! showDeactivationFeedbackForm );
117
+
118
+ if ( false === cancelSubscription ) {
119
+ if ( ! shouldDeactivateModule ) {
120
+ showModal();
121
+ }
122
+
123
+ $subscriptionCancellationModal.trigger( 'closeModal' );
124
+
125
+ if ( shouldDeactivateModule ) {
126
+ deactivateModule();
127
+ }
128
+ } else {
129
+ var $errorMessage = $subscriptionCancellationModal.find( '.notice-error' );
130
+
131
+ <?php
132
+ $subscription_cancellation_context = $fs->is_paid_trial() ?
133
+ fs_text_inline( 'trial', 'trial', $slug ) :
134
+ fs_text_inline( 'subscription', 'subscription', $slug );
135
+ ?>
136
+
137
+ $.ajax({
138
+ url : ajaxurl,
139
+ method : 'POST',
140
+ data : {
141
+ action : '<?php echo $fs->get_ajax_action( 'cancel_subscription_or_trial' ) ?>',
142
+ security : '<?php echo $fs->get_ajax_security( 'cancel_subscription_or_trial' ) ?>',
143
+ module_id: '<?php echo $fs->get_id() ?>'
144
+ },
145
+ beforeSend: function() {
146
+ $errorMessage.hide();
147
+
148
+ $subscriptionCancellationModal.find( '.fs-modal-footer .button' ).addClass( 'disabled' );
149
+ $subscriptionCancellationModal.find( '.fs-modal-footer .button-primary' ).text( '<?php echo esc_js(
150
+ sprintf( fs_text_inline( 'Cancelling %s...', 'cancelling-x' , $slug ), $subscription_cancellation_context )
151
+ ) ?>' );
152
+ },
153
+ success: function( result ) {
154
+ if ( result.success ) {
155
+ $subscriptionCancellationModal.removeClass( 'has-subscription-actions' );
156
+ $subscriptionCancellationModal.find( '.fs-modal-footer .button-primary' ).removeClass( 'warn' );
157
+
158
+ $subscriptionCancellationModal.remove();
159
+
160
+ if ( ! shouldDeactivateModule ) {
161
+ showModal();
162
+ } else {
163
+ deactivateModule();
164
+ }
165
+ } else {
166
+ $errorMessage.find( '> p' ).html( result.error );
167
+ $errorMessage.show();
168
+
169
+ $subscriptionCancellationModal.find( '.fs-modal-footer .button' ).removeClass( 'disabled' );
170
+ $subscriptionCancellationModal.find( '.fs-modal-footer .button-primary' ).html( <?php echo json_encode( sprintf(
171
+ fs_text_inline( 'Cancel %s & Proceed', 'cancel-x-and-proceed', $slug ),
172
+ ucfirst( $subscription_cancellation_context )
173
+ ) ) ?> );
174
+ }
175
+ }
176
+ });
177
+ }
178
+ });
179
+ }
180
+
181
+ registerEventHandlers();
182
+
183
+ function registerEventHandlers() {
184
+ $body.on( 'click', '#the-list .deactivate > a', function ( evt ) {
185
+ if ( 0 === $( this ).next( '[data-module-id=<?php echo $fs->get_id() ?>].fs-module-id' ).length ) {
186
+ return true;
187
+ }
188
+
189
+ evt.preventDefault();
190
+
191
+ redirectLink = $(this).attr('href');
192
+
193
+ if ( 0 == $subscriptionCancellationModal.length ) {
194
+ showModal();
195
+ } else {
196
+ $subscriptionCancellationModal.trigger( 'showModal' );
197
+ }
198
+ });
199
+
200
+ <?php
201
+ if ( ! $fs->is_plugin() ) {
202
+ /**
203
+ * For "theme" module type, the modal is shown when the current user clicks on
204
+ * the "Activate" button of any other theme. The "Activate" button is actually
205
+ * a link to the "Themes" page (/wp-admin/themes.php) containing query params
206
+ * that tell WordPress to deactivate the current theme and activate a different theme.
207
+ *
208
+ * @author Leo Fajardo (@leorw)
209
+ * @since 1.2.2
210
+ *
211
+ * @since 1.2.2.7 Don't trigger the deactivation feedback form if activating the premium version of the theme.
212
+ */
213
+ ?>
214
+ $('body').on('click', '.theme-browser .theme:not([data-slug=<?php echo $fs->get_premium_slug() ?>]) .theme-actions .button.activate', function (evt) {
215
+ evt.preventDefault();
216
+
217
+ redirectLink = $(this).attr('href');
218
+
219
+ if ( 0 != $subscriptionCancellationModal.length ) {
220
+ $subscriptionCancellationModal.trigger( 'showModal' );
221
+ } else {
222
+ if ( $modal.hasClass( 'no-confirmation-message' ) && ! showDeactivationFeedbackForm ) {
223
+ deactivateModule();
224
+ } else {
225
+ showModal();
226
+ }
227
+ }
228
+ });
229
+ <?php
230
+ } ?>
231
+
232
+ $modal.on('input propertychange', '.reason-input input', function () {
233
+ if (!isOtherReasonSelected()) {
234
+ return;
235
+ }
236
+
237
+ var reason = $(this).val().trim();
238
+
239
+ /**
240
+ * If reason is not empty, remove the error-message class of the message container
241
+ * to change the message color back to default.
242
+ */
243
+ if (reason.length > 0) {
244
+ $('.message').removeClass('error-message');
245
+ enableDeactivateButton();
246
+ }
247
+ });
248
+
249
+ $modal.on('blur', '.reason-input input', function () {
250
+ var $userReason = $(this);
251
+
252
+ setTimeout(function () {
253
+ if (!isOtherReasonSelected()) {
254
+ return;
255
+ }
256
+
257
+ /**
258
+ * If reason is empty, add the error-message class to the message container
259
+ * to change the message color to red.
260
+ */
261
+ if (0 === $userReason.val().trim().length) {
262
+ $('.message').addClass('error-message');
263
+ disableDeactivateButton();
264
+ }
265
+ }, 150);
266
+ });
267
+
268
+ $modal.on('click', '.fs-modal-footer .button', function (evt) {
269
+ evt.preventDefault();
270
+
271
+ if ($(this).hasClass('disabled')) {
272
+ return;
273
+ }
274
+
275
+ var _parent = $(this).parents('.fs-modal:first');
276
+ var _this = $(this);
277
+
278
+ if (_this.hasClass('allow-deactivate')) {
279
+ var $radio = $modal.find('input[type="radio"]:checked');
280
+
281
+ if (0 === $radio.length) {
282
+ if ( ! deleteThemeUpdateData ) {
283
+ // If no selected reason, just deactivate the plugin.
284
+ window.location.href = redirectLink;
285
+ } else {
286
+ $.ajax({
287
+ url : ajaxurl,
288
+ method : 'POST',
289
+ data : {
290
+ action : '<?php echo $fs->get_ajax_action( 'delete_theme_update_data' ) ?>',
291
+ security : '<?php echo $fs->get_ajax_security( 'delete_theme_update_data' ) ?>',
292
+ module_id: '<?php echo $fs->get_id() ?>'
293
+ },
294
+ beforeSend: function() {
295
+ _parent.find( '.fs-modal-footer .button' ).addClass( 'disabled' );
296
+ _parent.find( '.fs-modal-footer .button-secondary' ).text( 'Processing...' );
297
+ },
298
+ complete : function() {
299
+ window.location.href = redirectLink;
300
+ }
301
+ });
302
+ }
303
+
304
+ return;
305
+ }
306
+
307
+ var $selected_reason = $radio.parents('li:first'),
308
+ $input = $selected_reason.find('textarea, input[type="text"]'),
309
+ userReason = ( 0 !== $input.length ) ? $input.val().trim() : '';
310
+
311
+ if (isOtherReasonSelected() && ( '' === userReason )) {
312
+ return;
313
+ }
314
+
315
+ $.ajax({
316
+ url : ajaxurl,
317
+ method : 'POST',
318
+ data : {
319
+ action : '<?php echo $fs->get_ajax_action( 'submit_uninstall_reason' ) ?>',
320
+ security : '<?php echo $fs->get_ajax_security( 'submit_uninstall_reason' ) ?>',
321
+ module_id : '<?php echo $fs->get_id() ?>',
322
+ reason_id : $radio.val(),
323
+ reason_info : userReason,
324
+ is_anonymous: isAnonymousFeedback()
325
+ },
326
+ beforeSend: function () {
327
+ _parent.find('.fs-modal-footer .button').addClass('disabled');
328
+ _parent.find('.fs-modal-footer .button-secondary').text('Processing...');
329
+ },
330
+ complete : function () {
331
+ // Do not show the dialog box, deactivate the plugin.
332
+ window.location.href = redirectLink;
333
+ }
334
+ });
335
+ } else if (_this.hasClass('button-deactivate')) {
336
+ // Change the Deactivate button's text and show the reasons panel.
337
+ _parent.find('.button-deactivate').addClass('allow-deactivate');
338
+
339
+ if ( showDeactivationFeedbackForm ) {
340
+ showPanel('reasons');
341
+ } else {
342
+ deactivateModule();
343
+ }
344
+ }
345
+ });
346
+
347
+ $modal.on('click', 'input[type="radio"]', function () {
348
+ var $selectedReasonOption = $( this );
349
+
350
+ // If the selection has not changed, do not proceed.
351
+ if (selectedReasonID === $selectedReasonOption.val())
352
+ return;
353
+
354
+ selectedReasonID = $selectedReasonOption.val();
355
+
356
+ if ( isAnonymous ) {
357
+ if ( isReasonSelected( dontShareDataReasonID ) ) {
358
+ $anonymousFeedback.hide();
359
+ } else {
360
+ $anonymousFeedback.show();
361
+ }
362
+ }
363
+
364
+ var _parent = $(this).parents('li:first');
365
+
366
+ $modal.find('.reason-input').remove();
367
+ $modal.find( '.internal-message' ).hide();
368
+ $modal.find('.button-deactivate').html('<?php echo esc_js( sprintf(
369
+ fs_text_inline( 'Submit & %s', 'deactivation-modal-button-submit' , $slug ),
370
+ $fs->is_plugin() ?
371
+ $deactivate_text :
372
+ sprintf( $activate_x_text, $theme_text )
373
+ ) ) ?>');
374
+
375
+ enableDeactivateButton();
376
+
377
+ if ( _parent.hasClass( 'has-internal-message' ) ) {
378
+ _parent.find( '.internal-message' ).show();
379
+ }
380
+
381
+ if (_parent.hasClass('has-input')) {
382
+ var inputType = _parent.data('input-type'),
383
+ inputPlaceholder = _parent.data('input-placeholder'),
384
+ reasonInputHtml = '<div class="reason-input"><span class="message"></span>' + ( ( 'textfield' === inputType ) ? '<input type="text" maxlength="128" />' : '<textarea rows="5" maxlength="128"></textarea>' ) + '</div>';
385
+
386
+ _parent.append($(reasonInputHtml));
387
+ _parent.find('input, textarea').attr('placeholder', inputPlaceholder).focus();
388
+
389
+ if (isOtherReasonSelected()) {
390
+ showMessage('<?php echo esc_js( fs_text_inline( 'Kindly tell us the reason so we can improve.', 'ask-for-reason-message' , $slug ) ); ?>');
391
+ disableDeactivateButton();
392
+ }
393
+ }
394
+ });
395
+
396
+ // If the user has clicked outside the window, cancel it.
397
+ $modal.on('click', function (evt) {
398
+ var $target = $(evt.target);
399
+
400
+ // If the user has clicked anywhere in the modal dialog, just return.
401
+ if ($target.hasClass('fs-modal-body') || $target.hasClass('fs-modal-footer')) {
402
+ return;
403
+ }
404
+
405
+ // If the user has not clicked the close button and the clicked element is inside the modal dialog, just return.
406
+ if (
407
+ ! $target.hasClass( 'button-close' ) &&
408
+ ( $target.parents( '.fs-modal-body' ).length > 0 || $target.parents( '.fs-modal-footer' ).length > 0 )
409
+ ) {
410
+ return;
411
+ }
412
+
413
+ closeModal();
414
+
415
+ return false;
416
+ });
417
+ }
418
+
419
+ function isAnonymousFeedback() {
420
+ if ( ! isAnonymous ) {
421
+ return false;
422
+ }
423
+
424
+ return ( isReasonSelected( dontShareDataReasonID ) || $anonymousFeedback.find( 'input' ).prop( 'checked' ) );
425
+ }
426
+
427
+ function isReasonSelected( reasonID ) {
428
+ // Get the selected radio input element.
429
+ var $selectedReasonOption = $modal.find('input[type="radio"]:checked');
430
+
431
+ return ( reasonID == $selectedReasonOption.val() );
432
+ }
433
+
434
+ function isOtherReasonSelected() {
435
+ return isReasonSelected( otherReasonID );
436
+ }
437
+
438
+ function showModal() {
439
+ resetModal();
440
+
441
+ // Display the dialog box.
442
+ $modal.addClass('active');
443
+
444
+ $('body').addClass('has-fs-modal');
445
+ }
446
+
447
+ function closeModal() {
448
+ $modal.removeClass('active');
449
+
450
+ $('body').removeClass('has-fs-modal');
451
+ }
452
+
453
+ function resetModal() {
454
+ selectedReasonID = false;
455
+
456
+ enableDeactivateButton();
457
+
458
+ // Uncheck all radio buttons.
459
+ $modal.find('input[type="radio"]').prop('checked', false);
460
+
461
+ // Remove all input fields ( textfield, textarea ).
462
+ $modal.find('.reason-input').remove();
463
+
464
+ $modal.find('.message').hide();
465
+
466
+ if ( isAnonymous ) {
467
+ $anonymousFeedback.find( 'input' ).prop( 'checked', false );
468
+
469
+ // Hide, since by default there is no selected reason.
470
+ $anonymousFeedback.hide();
471
+ }
472
+
473
+ var $deactivateButton = $modal.find('.button-deactivate');
474
+
475
+ /*
476
+ * If the modal dialog has no confirmation message, that is, it has only one panel, then ensure
477
+ * that clicking the deactivate button will actually deactivate the plugin.
478
+ */
479
+ if ( $modal.hasClass( 'no-confirmation-message' ) ) {
480
+ $deactivateButton.addClass( 'allow-deactivate' );
481
+
482
+ showPanel( 'reasons' );
483
+ } else {
484
+ $deactivateButton.removeClass( 'allow-deactivate' );
485
+
486
+ showPanel( 'confirm' );
487
+ }
488
+ }
489
+
490
+ function showMessage(message) {
491
+ $modal.find('.message').text(message).show();
492
+ }
493
+
494
+ function enableDeactivateButton() {
495
+ $modal.find('.button-deactivate').removeClass('disabled');
496
+ }
497
+
498
+ function disableDeactivateButton() {
499
+ $modal.find('.button-deactivate').addClass('disabled');
500
+ }
501
+
502
+ function showPanel(panelType) {
503
+ $modal.find( '.fs-modal-panel' ).removeClass( 'active' );
504
+ $modal.find( '[data-panel-id="' + panelType + '"]' ).addClass( 'active' );
505
+
506
+ updateButtonLabels();
507
+ }
508
+
509
+ function updateButtonLabels() {
510
+ var $deactivateButton = $modal.find( '.button-deactivate' );
511
+
512
+ // Reset the deactivate button's text.
513
+ if ( 'confirm' === getCurrentPanel() ) {
514
+ $deactivateButton.text( <?php echo json_encode( sprintf(
515
+ fs_text_inline( 'Yes - %s', 'deactivation-modal-button-confirm', $slug ),
516
+ $fs->is_plugin() ?
517
+ $deactivate_text :
518
+ sprintf( $activate_x_text, $theme_text )
519
+ ) ) ?> );
520
+ } else {
521
+ $deactivateButton.html( <?php echo json_encode( sprintf(
522
+ fs_text_inline('Skip & %s', 'skip-and-x', $slug ),
523
+ $fs->is_plugin() ?
524
+ $deactivate_text :
525
+ sprintf( $activate_x_text, $theme_text )
526
+ ) ) ?> );
527
+ }
528
+ }
529
+
530
+ function getCurrentPanel() {
531
+ return $modal.find('.fs-modal-panel.active').attr('data-panel-id');
532
+ }
533
+
534
+ /**
535
+ * @author Leo Fajardo (@leorw)
536
+ *
537
+ * @since 2.3.0
538
+ */
539
+ function deactivateModule() {
540
+ window.location.href = redirectLink;
541
+ }
542
+ })(jQuery);
543
+ </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
freemius/templates/forms/email-address-update.php DELETED
@@ -1,347 +0,0 @@
1
- <?php
2
- /**
3
- * @package Freemius
4
- * @copyright Copyright (c) 2015, Freemius, Inc.
5
- * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6
- *
7
- * @author Leo Fajardo (@leorw)
8
- * @since 2.5.0
9
- */
10
-
11
- if ( ! defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- /**
16
- * @var array $VARS
17
- */
18
- $fs = freemius( $VARS['id'] );
19
- $slug = $fs->get_slug();
20
-
21
- $user = $fs->get_user();
22
- $current_email_address = $user->email;
23
-
24
- fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' );
25
- ?>
26
- <script type="text/javascript">
27
- ( function ( $ ) {
28
- var modalHtml =
29
- '<div class="fs-modal fs-modal-email-address-update">'
30
- + ' <div class="fs-modal-dialog">'
31
- + ' <div class="fs-modal-header">'
32
- + ' <h4><?php fs_esc_attr_echo_inline( 'Email address update', 'email-address-update', $slug ) ?></h4>'
33
- + ' <a href="!#" class="fs-close"><i class="dashicons dashicons-no" title="<?php echo esc_js( fs_text_x_inline( 'Dismiss', 'close window', 'dismiss', $slug ) ) ?>"></i></a>'
34
- + ' </div>'
35
- + ' <div class="fs-modal-body">'
36
- + ' <div class="fs-modal-panel active">'
37
- + ' <div class="notice notice-error inline fs-update-error-message"><p></p></div>'
38
- + ' <p><?php fs_echo_inline( 'Enter the new email address', 'enter-new-email-address' , $slug ) ?>:</p>'
39
- + ' <input type="text" class="fs-new-email-address-input" />'
40
- + ' <div class="fs-email-addresses-ownership-options" style="display: none">'
41
- + ' <p><?php echo sprintf(
42
- fs_esc_html_inline( 'Are both %s and %s your email addresses?', 'email-addresses-ownership-confirmation' , $slug ),
43
- sprintf( '<strong>%s</strong>', $current_email_address ),
44
- '<strong class="fs-new-email-address"></strong>'
45
- ) ?></p>'
46
- + ' <ul>'
47
- + ' <li>'
48
- + ' <label>'
49
- + ' <span><input type="radio" name="email-addresses-ownership" value="both"/></span>'
50
- + ' <span><?php fs_echo_inline( 'Yes - both addresses are mine', 'both-addresses-are-mine', $slug ); ?></span>'
51
- + ' </label>'
52
- + ' </li>'
53
- + ' <li>'
54
- + ' <label>'
55
- + ' <span><input type="radio" name="email-addresses-ownership" value="current"/></span>'
56
- + ' <div><?php echo sprintf(
57
- fs_esc_html_inline( "%s is my client's email address", 'client-email-address-confirmation', $slug ),
58
- '<strong class="fs-new-email-address"></strong>'
59
- ) ?></span>'
60
- + ' </label>'
61
- + ' </li>'
62
- + ' <li>'
63
- + ' <label>'
64
- + ' <span><input type="radio" name="email-addresses-ownership" value="new"/></span>'
65
- + ' <div><?php echo sprintf(
66
- fs_esc_html_inline( "%s is my email address", 'email-address-ownership-confirmation', $slug ),
67
- '<strong class="fs-new-email-address"></strong>'
68
- ) ?></span>'
69
- + ' </label>'
70
- + ' </li>'
71
- + ' </ul>'
72
- + ' </div>'
73
- + ' <div class="fs-assets-transfership-options" style="display: none">'
74
- + ' <p><?php echo sprintf(
75
- fs_esc_html_inline( 'Would you like to merge %s into %s?', 'accounts-merge-confirmation' , $slug ),
76
- sprintf( '<strong>%s</strong>', $current_email_address ),
77
- '<strong class="fs-new-email-address"></strong>'
78
- ) ?></p>'
79
- + ' <ul>'
80
- + ' <li>'
81
- + ' <label>'
82
- + ' <span><input type="radio" name="assets-transfer-type" value="all" /></span>'
83
- + ' <span><?php echo sprintf(
84
- fs_esc_html_inline( 'Yes - move all my data and assets from %s to %s', 'move-all-data-and-assets-into-new-account', $slug ),
85
- sprintf( '<strong>%s</strong>', $current_email_address ),
86
- '<strong class="fs-new-email-address"></strong>'
87
- ) ?></span>'
88
- + ' </label>'
89
- + ' </li>'
90
- + ' <li>'
91
- + ' <label>'
92
- + ' <span><input type="radio" name="assets-transfer-type" value="plugin" /></span>'
93
- + ' <span><?php echo sprintf(
94
- fs_esc_html_inline( "No - only move this site's data to %s", 'move-only-plugin-data-into-new-account', $slug ),
95
- '<strong class="fs-new-email-address"></strong>'
96
- ) ?></span>'
97
- + ' </label>'
98
- + ' </li>'
99
- + ' </ul>'
100
- + ' </div>'
101
- + ' </div>'
102
- + ' </div>'
103
- + ' <div class="fs-modal-footer">'
104
- + ' <button class="button button-primary button-update" disabled><?php fs_esc_js_echo_inline( 'Update', 'update-email-address', $slug ) ?></button>'
105
- + ' <button class="button button-secondary button-close"><?php fs_esc_js_echo_inline( 'Cancel', 'cancel', $slug ) ?></button>'
106
- + ' </div>'
107
- + ' </div>'
108
- + '</div>',
109
- $modal = $( modalHtml ),
110
- $updateButton = $modal.find( '.button-update' ),
111
- $updateResultMessage = $modal.find( '.fs-update-error-message' ),
112
- selectedEmailAddressesOwnershipOption = null,
113
- selectedAssetsTransfershipOption = null,
114
- previousEmailAddress = '',
115
- $body = $( 'body' );
116
-
117
- $modal.appendTo( $body );
118
-
119
- registerEventHandlers();
120
-
121
- function registerEventHandlers() {
122
- $body.on( 'click', '#fs_account_details .button-edit-email-address', function ( evt ) {
123
- evt.preventDefault();
124
-
125
- showModal( evt );
126
- } );
127
-
128
- $modal.on( 'input propertychange keyup paste delete cut', '.fs-new-email-address-input', function () {
129
- var emailAddress = $( this ).val().trim();
130
-
131
- if ( emailAddress === previousEmailAddress ) {
132
- return;
133
- }
134
-
135
- var isValidEmailAddressInput = isValidEmailAddress( emailAddress );
136
-
137
- toggleOptions( isValidEmailAddressInput );
138
-
139
- if ( ! isValidEmailAddressInput ) {
140
- disableUpdateButton();
141
- } else {
142
- $modal.find( '.fs-new-email-address').text( emailAddress );
143
-
144
- maybeEnableUpdateButton();
145
- }
146
-
147
- previousEmailAddress = emailAddress;
148
- } );
149
-
150
- $modal.on( 'blur', '.fs-new-email-address-input', function() {
151
- var emailAddress = $( this ).val().trim(),
152
- isValidEmailAddressInput = isValidEmailAddress( emailAddress );
153
-
154
- toggleOptions( isValidEmailAddressInput );
155
-
156
- if ( ! isValidEmailAddressInput ) {
157
- disableUpdateButton();
158
- }
159
- } );
160
-
161
- $modal.on( 'click', '.fs-close, .button-secondary', function () {
162
- closeModal();
163
- return false;
164
- } );
165
-
166
- $modal.on( 'click', '.fs-modal-footer .button-update', function ( evt ) {
167
- if ( ! isValidEmailAddress( previousEmailAddress ) ) {
168
- return;
169
- }
170
-
171
- if ( previousEmailAddress === '<?php echo $current_email_address ?>' ) {
172
- closeModal();
173
- return;
174
- }
175
-
176
- var transferType = 'transfer';
177
-
178
- if ( 'current' === selectedEmailAddressesOwnershipOption ) {
179
- transferType = 'transfer_to_client';
180
- } else if (
181
- 'both' === selectedEmailAddressesOwnershipOption &&
182
- 'all' === selectedAssetsTransfershipOption
183
- ) {
184
- transferType = 'merge';
185
- }
186
-
187
- $.ajax( {
188
- url : ajaxurl,
189
- method : 'POST',
190
- data : {
191
- action : '<?php echo $fs->get_ajax_action( 'update_email_address' ) ?>',
192
- security : '<?php echo $fs->get_ajax_security( 'update_email_address' ) ?>',
193
- module_id : '<?php echo $fs->get_id() ?>',
194
- transfer_type: transferType,
195
- email_address: previousEmailAddress
196
- },
197
- beforeSend: function () {
198
- disableUpdateButton();
199
-
200
- $updateButton.find( '.fs-modal-footer .button' ).prop( 'disabled', true );
201
- $updateButton.text( 'Processing...' );
202
- },
203
- success : function( result ) {
204
- if ( result.success ) {
205
- // Redirect to the "Account" page.
206
- window.location.reload();
207
- } else {
208
- if ('change_ownership' === result.error.code) {
209
- window.location = result.error.url;
210
- } else {
211
- showError(result.error.message ? result.error.message : result.error);
212
- resetUpdateButton();
213
- }
214
- }
215
- },
216
- error : function () {
217
- showError( '<?php fs_esc_js_echo_inline( 'Unexpected error, try again in 5 minutes. If the error persists, please contact support.', 'unexpected-error', $slug ) ?>' );
218
-
219
- resetUpdateButton();
220
- }
221
- } );
222
- } );
223
-
224
- $modal.on( 'click', 'input[type="radio"]', function () {
225
- var $selectedOption = $( this ),
226
- selectedOptionValue = $selectedOption.val();
227
-
228
- // If the selection has not changed, do not proceed.
229
- if (
230
- selectedEmailAddressesOwnershipOption === selectedOptionValue ||
231
- selectedAssetsTransfershipOption === selectedOptionValue
232
- ) {
233
- return;
234
- }
235
-
236
- if ( 'assets-transfer-type' === $selectedOption.attr( 'name' ) ) {
237
- selectedAssetsTransfershipOption = selectedOptionValue;
238
- } else {
239
- selectedEmailAddressesOwnershipOption = selectedOptionValue;
240
-
241
- if ( 'both' !== selectedEmailAddressesOwnershipOption ) {
242
- $modal.find( '.fs-assets-transfership-options' ).hide();
243
- } else {
244
- $modal.find( '.fs-assets-transfership-options' ).show();
245
- $modal.find( '.fs-assets-transfership-options input[type="radio"]' ).prop('checked', false);
246
-
247
- selectedAssetsTransfershipOption = null;
248
-
249
- disableUpdateButton();
250
- }
251
- }
252
-
253
- if ( isValidEmailAddress( $( '.fs-new-email-address-input' ).val().trim() ) ) {
254
- maybeEnableUpdateButton();
255
- }
256
- });
257
- }
258
-
259
- function showModal() {
260
- resetModal();
261
-
262
- // Display the dialog box.
263
- $modal.addClass( 'active' );
264
- $modal.find( '.fs-new-email-address-input' ).focus();
265
-
266
- $( 'body' ).addClass( 'has-fs-modal' );
267
- }
268
-
269
- function closeModal() {
270
- selectedEmailAddressesOwnershipOption = null;
271
-
272
- disableUpdateButton();
273
-
274
- $modal.removeClass( 'active' );
275
-
276
- $( 'body' ).removeClass( 'has-fs-modal' );
277
- }
278
-
279
- function resetModal() {
280
- hideError();
281
-
282
- // Deselect all radio buttons.
283
- $modal.find( 'input[type="radio"]' ).prop( 'checked', false );
284
-
285
- // Clear the value of the email address text field.
286
- $modal.find( 'input[type="text"]' ).val( '' );
287
-
288
- toggleOptions( false );
289
-
290
- disableUpdateButton();
291
-
292
- $updateButton.text( <?php echo json_encode( fs_text_inline( 'Update', 'update-email-address', $slug ) ) ?> );
293
- }
294
-
295
- function resetUpdateButton() {
296
- maybeEnableUpdateButton();
297
-
298
- $updateButton.text( <?php echo json_encode( fs_text_inline( 'Update', 'update-email-address', $slug ) ) ?> );
299
- }
300
-
301
- function maybeEnableUpdateButton() {
302
- if ( null === selectedEmailAddressesOwnershipOption ) {
303
- return;
304
- }
305
-
306
- if (
307
- 'both' === selectedEmailAddressesOwnershipOption &&
308
- null === selectedAssetsTransfershipOption
309
- ) {
310
- return;
311
- }
312
-
313
- $updateButton.prop( 'disabled', false );
314
- }
315
-
316
- function disableUpdateButton() {
317
- $updateButton.prop( 'disabled', true );
318
- }
319
-
320
- function hideError() {
321
- $updateResultMessage.hide();
322
- }
323
-
324
- function showError( msg ) {
325
- $updateResultMessage.find( ' > p' ).html( msg );
326
- $updateResultMessage.show();
327
- }
328
-
329
- function isValidEmailAddress( emailAddress ) {
330
- if ( '' === emailAddress ) {
331
- return false;
332
- }
333
-
334
- return /[0-9a-zA-Z][a-zA-Z\+0-9\.\_\-]*@[0-9a-zA-Z\-]+(\.[a-zA-Z]{2,24}){1,3}/.test( emailAddress );
335
- }
336
-
337
- function toggleOptions( show ) {
338
- $modal.find( '.fs-email-addresses-ownership-options' ).toggle( show );
339
-
340
- if ( ! show ) {
341
- $modal.find( '.fs-assets-transfership-options' ).hide();
342
- } else if ( 'both' === selectedEmailAddressesOwnershipOption ) {
343
- $modal.find( '.fs-assets-transfership-options' ).show();
344
- }
345
- }
346
- } )( jQuery );
347
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
freemius/templates/forms/license-activation.php CHANGED
@@ -59,51 +59,23 @@
59
  if ( $is_network_activation ) {
60
  $all_sites = Freemius::get_sites();
61
 
62
- $subsite_data_by_install_id = array();
63
- $install_url_by_install_id = array();
64
-
65
  foreach ( $all_sites as $site ) {
66
  $site_details = $fs->get_site_info( $site );
67
 
68
- if ( FS_Clone_Manager::instance()->is_temporary_duplicate_by_blog_id( $site_details['blog_id'] ) ) {
69
- continue;
70
- }
71
-
72
  $blog_id = Freemius::get_site_blog_id( $site );
73
  $install = $fs->get_install_by_blog_id($blog_id);
74
 
75
- if ( is_object( $install ) ) {
76
- if ( isset( $subsite_data_by_install_id[ $install->id ] ) ) {
77
- $clone_subsite_data = $subsite_data_by_install_id[ $install->id ];
78
- $clone_install_url = $install_url_by_install_id[ $install->id ];
79
-
80
- if (
81
- /**
82
- * If we already have an install with the same URL as the subsite it's stored in, skip the current subsite. Otherwise, replace the existing install's data with the current subsite's install's data if the URLs match.
83
- *
84
- * @author Leo Fajardo (@leorw)
85
- * @since 2.5.0
86
- */
87
- fs_strip_url_protocol( untrailingslashit( $clone_install_url ) ) === fs_strip_url_protocol( untrailingslashit( $clone_subsite_data['url'] ) ) ||
88
- fs_strip_url_protocol( untrailingslashit( $install->url ) ) !== fs_strip_url_protocol( untrailingslashit( $site_details['url'] ) )
89
- ) {
90
- continue;
91
- }
92
- }
93
-
94
- if ( FS_Plugin_License::is_valid_id( $install->license_id ) ) {
95
- $site_details['license_id'] = $install->license_id;
96
- }
97
-
98
- $subsite_data_by_install_id[ $install->id ] = $site_details;
99
- $install_url_by_install_id[ $install->id ] = $install->url;
100
  }
 
 
101
  }
102
 
103
  if ( $is_network_activation ) {
104
  $vars = array(
105
  'id' => $fs->get_id(),
106
- 'sites' => array_values( $subsite_data_by_install_id ),
107
  'require_license_key' => true
108
  );
109
 
59
  if ( $is_network_activation ) {
60
  $all_sites = Freemius::get_sites();
61
 
 
 
 
62
  foreach ( $all_sites as $site ) {
63
  $site_details = $fs->get_site_info( $site );
64
 
 
 
 
 
65
  $blog_id = Freemius::get_site_blog_id( $site );
66
  $install = $fs->get_install_by_blog_id($blog_id);
67
 
68
+ if ( is_object( $install ) && FS_Plugin_License::is_valid_id( $install->license_id ) ) {
69
+ $site_details['license_id'] = $install->license_id;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  }
71
+
72
+ $sites_details[] = $site_details;
73
  }
74
 
75
  if ( $is_network_activation ) {
76
  $vars = array(
77
  'id' => $fs->get_id(),
78
+ 'sites' => $sites_details,
79
  'require_license_key' => true
80
  );
81
 
freemius/templates/partials/network-activation.php CHANGED
@@ -1,4 +1,9 @@
1
  <?php
 
 
 
 
 
2
  /**
3
  * @var array $VARS
4
  * @var Freemius $fs
@@ -86,4 +91,4 @@
86
  </tbody>
87
  </table>
88
  </div>
89
- </div>
1
  <?php
2
+
3
+ if ( ! defined( 'ABSPATH' ) ) {
4
+ exit;
5
+ }
6
+
7
  /**
8
  * @var array $VARS
9
  * @var Freemius $fs
91
  </tbody>
92
  </table>
93
  </div>
94
+ </div>
freemius/templates/plugin-info/features.php CHANGED
@@ -43,7 +43,7 @@
43
  $support_feature->title = fs_text_inline( 'Support', $plugin->slug );
44
  $features_plan_map[ $support_feature->id ] = array( 'feature' => $support_feature, 'plans' => array() );
45
  } else {
46
- $support_feature = $features_plan_map['support']['feature'];
47
  }
48
 
49
  $features_plan_map[ $support_feature->id ]['plans'][ $plan->id ] = $support_feature;
43
  $support_feature->title = fs_text_inline( 'Support', $plugin->slug );
44
  $features_plan_map[ $support_feature->id ] = array( 'feature' => $support_feature, 'plans' => array() );
45
  } else {
46
+ $support_feature = $features_plan_map['support'];
47
  }
48
 
49
  $features_plan_map[ $support_feature->id ]['plans'][ $plan->id ] = $support_feature;
freemius/templates/powered-by.php CHANGED
@@ -33,12 +33,12 @@
33
 
34
  $fs = freemius( $VARS['module_id'] );
35
 
36
- if ( ! $fs->is_whitelabeled() && ! $fs->apply_filters( 'hide_freemius_powered_by', false ) ) {
37
- wp_enqueue_script( 'jquery' );
38
- wp_enqueue_script( 'json2' );
39
- fs_enqueue_local_script( 'postmessage', 'nojquery.ba-postmessage.min.js' );
40
- fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' );
41
- ?>
42
  <div id="pframe"></div>
43
  <script type="text/javascript">
44
  (function ($) {
@@ -58,4 +58,4 @@
58
  });
59
  })(jQuery);
60
  </script>
61
- <?php } ?>
33
 
34
  $fs = freemius( $VARS['module_id'] );
35
 
36
+ wp_enqueue_script( 'jquery' );
37
+ wp_enqueue_script( 'json2' );
38
+ fs_enqueue_local_script( 'postmessage', 'nojquery.ba-postmessage.min.js' );
39
+ fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' );
40
+ ?>
41
+ <?php if ( ! $fs->is_whitelabeled() ) : ?>
42
  <div id="pframe"></div>
43
  <script type="text/javascript">
44
  (function ($) {
58
  });
59
  })(jQuery);
60
  </script>
61
+ <?php endif ?>
freemius/templates/pricing.php CHANGED
@@ -122,22 +122,21 @@
122
  <div id="fs_pricing_wrapper" data-public-url="<?php echo trailingslashit( dirname( $pricing_js_url ) ) ?>"></div>
123
  <?php
124
  $pricing_config = array_merge( array(
125
- 'contact_url' => $fs->contact_url(),
126
- 'is_network_admin' => fs_is_network_admin(),
127
- 'is_production' => ( defined( 'WP_FS__IS_PRODUCTION_MODE' ) ? WP_FS__IS_PRODUCTION_MODE : null ),
128
- 'menu_slug' => $fs->get_menu_slug(),
129
- 'mode' => 'dashboard',
130
- 'fs_wp_endpoint_url' => WP_FS__ADDRESS,
131
- 'request_handler_url' => admin_url(
132
  'admin-ajax.php?' . http_build_query( array(
133
  'module_id' => $fs->get_id(),
134
  'action' => $fs->get_ajax_action( 'pricing_ajax_action' ),
135
  'security' => $fs->get_ajax_security( 'pricing_ajax_action' )
136
  ) )
137
  ),
138
- 'selector' => '#fs_pricing_wrapper',
139
- 'unique_affix' => $fs->get_unique_affix(),
140
- 'show_annual_in_monthly' => $fs->apply_filters( 'pricing/show_annual_in_monthly', true ),
141
  ), $query_params );
142
 
143
  wp_add_inline_script( 'freemius-pricing', 'Freemius.pricing.new( ' . json_encode( $pricing_config ) . ' )' );
@@ -207,4 +206,4 @@
207
  'module_slug' => $slug,
208
  'module_version' => $fs->get_plugin_version(),
209
  );
210
- fs_require_template( 'powered-by.php', $params );
122
  <div id="fs_pricing_wrapper" data-public-url="<?php echo trailingslashit( dirname( $pricing_js_url ) ) ?>"></div>
123
  <?php
124
  $pricing_config = array_merge( array(
125
+ 'contact_url' => $fs->contact_url(),
126
+ 'is_network_admin' => fs_is_network_admin(),
127
+ 'is_production' => ( defined( 'WP_FS__IS_PRODUCTION_MODE' ) ? WP_FS__IS_PRODUCTION_MODE : null ),
128
+ 'menu_slug' => $fs->get_menu_slug(),
129
+ 'mode' => 'dashboard',
130
+ 'fs_wp_endpoint_url' => WP_FS__ADDRESS,
131
+ 'request_handler_url' => admin_url(
132
  'admin-ajax.php?' . http_build_query( array(
133
  'module_id' => $fs->get_id(),
134
  'action' => $fs->get_ajax_action( 'pricing_ajax_action' ),
135
  'security' => $fs->get_ajax_security( 'pricing_ajax_action' )
136
  ) )
137
  ),
138
+ 'selector' => '#fs_pricing_wrapper',
139
+ 'unique_affix' => $fs->get_unique_affix(),
 
140
  ), $query_params );
141
 
142
  wp_add_inline_script( 'freemius-pricing', 'Freemius.pricing.new( ' . json_encode( $pricing_config ) . ' )' );
206
  'module_slug' => $slug,
207
  'module_version' => $fs->get_plugin_version(),
208
  );
209
+ fs_require_template( 'powered-by.php', $params );
freemius/templates/sticky-admin-notice-js.php CHANGED
@@ -23,7 +23,9 @@
23
 
24
  notice.fadeOut( 'fast', function() {
25
  var data = {
26
- action : 'fs_dismiss_notice_action_' + ajaxActionSuffix,
 
 
27
  message_id: id
28
  };
29
 
@@ -36,4 +38,4 @@
36
  });
37
  });
38
  });
39
- </script>
23
 
24
  notice.fadeOut( 'fast', function() {
25
  var data = {
26
+ action : 'fs_dismiss_notice_action_' + ajaxActionSuffix,
27
+ // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
28
+ _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_dismiss_notice_action' ) ); ?>,
29
  message_id: id
30
  };
31
 
38
  });
39
  });
40
  });
41
+ </script>
readme.txt CHANGED
@@ -6,7 +6,7 @@ Donate link: https://code-atlantic.com/donate/
6
  Tags: menu, menus, user-menu, logout, nav-menu, nav-menus, user, user-role, user-roles
7
  Requires at least: 4.6
8
  Tested up to: 5.8
9
- Stable tag: 1.2.8
10
  Requires PHP: 5.6
11
  Freemius: 2.5.0
12
  License: GPLv3 or Any Later Version
@@ -112,6 +112,10 @@ Bugs can be reported either in our support forum or preferably on the [User Menu
112
 
113
  == Changelog ==
114
 
 
 
 
 
115
  = v1.2.8 - 03/02/2022 =
116
 
117
  * Tweak: Update freemius sdk to the latest version.
6
  Tags: menu, menus, user-menu, logout, nav-menu, nav-menus, user, user-role, user-roles
7
  Requires at least: 4.6
8
  Tested up to: 5.8
9
+ Stable tag: 1.2.9
10
  Requires PHP: 5.6
11
  Freemius: 2.5.0
12
  License: GPLv3 or Any Later Version
112
 
113
  == Changelog ==
114
 
115
+ = v1.2.9 - 03/02/2022 =
116
+
117
+ * Tweak: Downgrade freemius sdk to the latest stable (previously version was Release Candidate).
118
+
119
  = v1.2.8 - 03/02/2022 =
120
 
121
  * Tweak: Update freemius sdk to the latest version.
user-menus.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: User Menus
4
  * Plugin URI: https://wordpress.org/plugins/user-menus/
5
  * Description: Quickly customize your menus with a user's name & avatar, or show items based on user role.
6
- * Version: 1.2.8
7
  * Author: Code Atlantic
8
  * Author URI: https://code-atlantic.com/
9
  * License: GPL2 or later
@@ -83,7 +83,7 @@ class JP_User_Menus {
83
  *
84
  * @var string
85
  */
86
- public static $VER = '1.2.8';
87
 
88
  /**
89
  * Minimum PHP version
3
  * Plugin Name: User Menus
4
  * Plugin URI: https://wordpress.org/plugins/user-menus/
5
  * Description: Quickly customize your menus with a user's name & avatar, or show items based on user role.
6
+ * Version: 1.2.9
7
  * Author: Code Atlantic
8
  * Author URI: https://code-atlantic.com/
9
  * License: GPL2 or later
83
  *
84
  * @var string
85
  */
86
+ public static $VER = '1.2.9';
87
 
88
  /**
89
  * Minimum PHP version