Email Subscribers & Newsletters - Version 4.6.3

Version Description

Download this release

Release Info

Developer Icegram
Plugin Icon 128x128 Email Subscribers & Newsletters
Version 4.6.3
Comparing to
See all releases

Code changes from version 4.6.2 to 4.6.3

Files changed (34) hide show
  1. email-subscribers.php +4 -4
  2. lite/admin/class-email-subscribers-admin.php +12 -8
  3. lite/admin/class-ig-es-onboarding.php +13 -1
  4. lite/admin/css/email-subscribers-admin.css +14 -5
  5. lite/admin/dist/main.css +1 -1
  6. lite/admin/js/email-subscribers-admin.js +14 -2
  7. lite/admin/partials/onboarding.php +1 -1
  8. lite/includes/class-email-subscribers-i18n.php +2 -2
  9. lite/includes/class-email-subscribers.php +58 -25
  10. lite/includes/class-es-install.php +7 -0
  11. lite/includes/classes/class-es-admin-settings.php +2 -0
  12. lite/includes/classes/class-es-campaigns-table.php +14 -1
  13. lite/includes/classes/class-es-contacts-table.php +6 -2
  14. lite/includes/classes/class-es-forms-table.php +8 -5
  15. lite/includes/classes/class-es-handle-post-notification.php +42 -64
  16. lite/includes/classes/class-es-newsletters.php +48 -34
  17. lite/includes/classes/class-es-queue.php +130 -8
  18. lite/includes/classes/class-es-reports-table.php +1 -1
  19. lite/includes/classes/class-es-templates-table.php +5 -1
  20. lite/includes/classes/class-ig-es-background-process-helper.php +259 -0
  21. lite/includes/db/class-es-db-campaigns.php +37 -0
  22. lite/includes/db/class-es-db-contacts.php +115 -1
  23. lite/includes/db/class-es-db-mailing-queue.php +25 -0
  24. lite/includes/es-backward.php +2 -1
  25. lite/includes/notices/views/trial-consent.php +4 -3
  26. lite/includes/pro-features.php +2 -4
  27. lite/includes/upgrade/es-update-functions.php +42 -0
  28. lite/includes/workflows/abstracts/class-es-workflow-trigger.php +6 -1
  29. lite/includes/workflows/actions/class-es-action-add-to-list.php +1 -1
  30. lite/includes/workflows/admin/class-es-workflow-admin-edit.php +6 -6
  31. lite/includes/workflows/class-es-workflow.php +1 -1
  32. lite/includes/workflows/queue/class-es-workflow-queue-runner.php +2 -2
  33. lite/public/class-email-subscribers-public.php +3 -3
  34. readme.txt +9 -2
email-subscribers.php CHANGED
@@ -3,11 +3,11 @@
3
  * Plugin Name: Email Subscribers & Newsletters
4
  * Plugin URI: https://www.icegram.com/
5
  * Description: Add subscription forms on website, send HTML newsletters & automatically notify subscribers about new blog posts once it is published.
6
- * Version: 4.6.2
7
  * Author: Icegram
8
  * Author URI: https://www.icegram.com/
9
  * Requires at least: 3.9
10
- * Tested up to: 5.5.1
11
  * Requires PHP: 5.6
12
  * Text Domain: email-subscribers
13
  * Domain Path: /lite/languages/
@@ -119,7 +119,7 @@ if ( ! function_exists( 'deactivate_plugins' ) ) {
119
  $ig_es_plan = 'lite';
120
  if ( 'email-subscribers-premium.php' === basename( __FILE__ ) ) {
121
  $ig_es_plan = 'premium';
122
- } elseif ( 'marketing-automation-icegram.php' === basename( __FILE__ ) ) {
123
  $ig_es_plan = 'woo';
124
  }
125
 
@@ -175,7 +175,7 @@ if ( 'premium' === $ig_es_plan ) {
175
  /* ***************************** Initial Compatibility Work (End) ******************* */
176
 
177
  if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
178
- define( 'ES_PLUGIN_VERSION', '4.6.2' );
179
  }
180
 
181
  // Plugin Folder Path.
3
  * Plugin Name: Email Subscribers & Newsletters
4
  * Plugin URI: https://www.icegram.com/
5
  * Description: Add subscription forms on website, send HTML newsletters & automatically notify subscribers about new blog posts once it is published.
6
+ * Version: 4.6.3
7
  * Author: Icegram
8
  * Author URI: https://www.icegram.com/
9
  * Requires at least: 3.9
10
+ * Tested up to: 5.5.3
11
  * Requires PHP: 5.6
12
  * Text Domain: email-subscribers
13
  * Domain Path: /lite/languages/
119
  $ig_es_plan = 'lite';
120
  if ( 'email-subscribers-premium.php' === basename( __FILE__ ) ) {
121
  $ig_es_plan = 'premium';
122
+ } elseif ( 'icegram-marketing-automation.php' === basename( __FILE__ ) ) {
123
  $ig_es_plan = 'woo';
124
  }
125
 
175
  /* ***************************** Initial Compatibility Work (End) ******************* */
176
 
177
  if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
178
+ define( 'ES_PLUGIN_VERSION', '4.6.3' );
179
  }
180
 
181
  // Plugin Folder Path.
lite/admin/class-email-subscribers-admin.php CHANGED
@@ -165,9 +165,9 @@ class Email_Subscribers_Admin {
165
 
166
  wp_localize_script( $this->email_subscribers, 'ig_es_js_data', $ig_es_js_data );
167
 
168
- $page_prefix = 'woo' === IG_ES_PLUGIN_PLAN ? 'marketing-automation_page_' : 'email-subscribers_page_';
169
 
170
- if ( ES()->is_es_admin_screen( $page_prefix . 'es_workflows' ) ) {
171
 
172
  wp_enqueue_script( $this->email_subscribers . '-workflows', plugin_dir_url( __FILE__ ) . 'js/ig-es-workflows.js', array( 'jquery', 'jquery-ui-datepicker' ), $this->version, false );
173
 
@@ -224,12 +224,14 @@ class Email_Subscribers_Admin {
224
 
225
  if ( count( $accessible_sub_menus ) > 0 ) {
226
 
227
- if ( 'woo' !== IG_ES_PLUGIN_PLAN ) {
228
- // This adds the main menu page.
229
- add_menu_page( __( 'Email Subscribers', 'email-subscribers' ), __( 'Email Subscribers', 'email-subscribers' ), 'edit_posts', 'es_dashboard', array( $this, 'es_dashboard_callback' ), 'dashicons-email', 30 );
230
- } else {
231
- // This adds the main menu page.
232
- add_menu_page( __( 'Marketing Automation', 'email-subscribers' ), __( 'Marketing Automation', 'email-subscribers' ), 'edit_posts', 'es_dashboard', array( $this, 'es_dashboard_callback' ), 'dashicons-email', 30 );
 
 
233
  }
234
 
235
  // Submenu.
@@ -305,7 +307,9 @@ class Email_Subscribers_Admin {
305
  new ES_Handle_Post_Notification();
306
  ES_Handle_Sync_Wp_User::get_instance();
307
  new ES_Import_Subscribers();
 
308
  ES_Info::get_instance();
 
309
  ES_Newsletters::get_instance();
310
  ES_Tools::get_instance();
311
  new ES_Tracking();
165
 
166
  wp_localize_script( $this->email_subscribers, 'ig_es_js_data', $ig_es_js_data );
167
 
168
+ $page_prefix = ES()->get_admin_page_prefix();
169
 
170
+ if ( ES()->is_es_admin_screen( $page_prefix . '_page_es_workflows' ) ) {
171
 
172
  wp_enqueue_script( $this->email_subscribers . '-workflows', plugin_dir_url( __FILE__ ) . 'js/ig-es-workflows.js', array( 'jquery', 'jquery-ui-datepicker' ), $this->version, false );
173
 
224
 
225
  if ( count( $accessible_sub_menus ) > 0 ) {
226
 
227
+ $menu_title = ES()->get_admin_menu_title();
228
+
229
+ // This adds the main menu page.
230
+ add_menu_page( $menu_title, $menu_title, 'edit_posts', 'es_dashboard', array( $this, 'es_dashboard_callback' ), 'dashicons-email', 30 );
231
+
232
+ if ( 'woo' === IG_ES_PLUGIN_PLAN ) {
233
+ // Add Icegram submenu under WooCommerce marketing admin menu.
234
+ add_submenu_page( 'woocommerce-marketing', $menu_title, $menu_title, 'manage_woocommerce', 'es_dashboard', array( $this, 'es_dashboard_callback' ) );
235
  }
236
 
237
  // Submenu.
307
  new ES_Handle_Post_Notification();
308
  ES_Handle_Sync_Wp_User::get_instance();
309
  new ES_Import_Subscribers();
310
+ // Start-IG-Code.
311
  ES_Info::get_instance();
312
+ // End-IG-Code.
313
  ES_Newsletters::get_instance();
314
  ES_Tools::get_instance();
315
  new ES_Tracking();
lite/admin/class-ig-es-onboarding.php CHANGED
@@ -493,6 +493,7 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
493
  $admin_name = get_option( 'admin_email' );
494
  $user = get_user_by( 'email', $admin_email );
495
  $wp_user_id = 0;
 
496
  if ( $user instanceof WP_User ) {
497
  $wp_user_id = $user->ID;
498
  }
@@ -504,6 +505,7 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
504
  'last_name' => '',
505
  'email' => $admin_email,
506
  'source' => 'admin',
 
507
  'form_id' => 0,
508
  'status' => 'verified',
509
  'unsubscribed' => 0,
@@ -520,7 +522,7 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
520
  'status' => 'subscribed',
521
  'optin_type' => IG_SINGLE_OPTIN,
522
  'subscribed_at' => ig_get_current_date_time(),
523
- 'subscribed_ip' => null,
524
  );
525
 
526
  if ( ! empty( $default_list_id ) ) {
@@ -812,10 +814,17 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
812
  $from_email = ES_Common::get_ig_option( 'from_email' );
813
 
814
  // First Create Default Template.
 
815
  $sample = '<strong style="color: #990000">What can you achieve using Email Subscribers?</strong><p>Add subscription forms on website, send HTML newsletters & automatically notify subscribers about new blog posts once it is published.';
 
 
 
 
816
  $sample .= ' You can also Import or Export subscribers from any list to Email Subscribers.</p>';
817
  $sample .= ' <strong style="color: #990000">Plugin Features</strong><ol>';
 
818
  $sample .= ' <li>Send notification emails to subscribers when new blog posts are published.</li>';
 
819
  $sample .= ' <li>Subscribe form available with 3 options to setup.</li>';
820
  $sample .= ' <li>Double Opt-In and Single Opt-In support.</li>';
821
  $sample .= ' <li>Email notification to admin when a new user signs up (Optional).</li>';
@@ -827,6 +836,8 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
827
  $sample .= ' <strong>Thanks & Regards,</strong><br/>Admin<br/>';
828
 
829
  $title = esc_html__( 'Welcome To Email Subscribers', 'email-subscribers' );
 
 
830
  $es_post = array(
831
  'post_title' => $title,
832
  'post_content' => $sample,
@@ -851,6 +862,7 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
851
 
852
  $data['slug'] = sanitize_title( $title );
853
  $data['name'] = $title;
 
854
  $data['type'] = 'newsletter';
855
  $data['from_email'] = $from_email;
856
  $data['reply_to_email'] = $from_email;
493
  $admin_name = get_option( 'admin_email' );
494
  $user = get_user_by( 'email', $admin_email );
495
  $wp_user_id = 0;
496
+ $ip_address = ig_es_get_ip();
497
  if ( $user instanceof WP_User ) {
498
  $wp_user_id = $user->ID;
499
  }
505
  'last_name' => '',
506
  'email' => $admin_email,
507
  'source' => 'admin',
508
+ 'ip_address' => $ip_address,
509
  'form_id' => 0,
510
  'status' => 'verified',
511
  'unsubscribed' => 0,
522
  'status' => 'subscribed',
523
  'optin_type' => IG_SINGLE_OPTIN,
524
  'subscribed_at' => ig_get_current_date_time(),
525
+ 'subscribed_ip' => $ip_address,
526
  );
527
 
528
  if ( ! empty( $default_list_id ) ) {
814
  $from_email = ES_Common::get_ig_option( 'from_email' );
815
 
816
  // First Create Default Template.
817
+ // Start-IG-Code.
818
  $sample = '<strong style="color: #990000">What can you achieve using Email Subscribers?</strong><p>Add subscription forms on website, send HTML newsletters & automatically notify subscribers about new blog posts once it is published.';
819
+ // End-IG-Code.
820
+ // Start-Woo-Code.
821
+ $sample = '<strong style="color: #990000">What can you achieve using Email Subscribers?</strong><p>Add subscription forms on website, send HTML newsletters.';
822
+ // End-Woo-Code.
823
  $sample .= ' You can also Import or Export subscribers from any list to Email Subscribers.</p>';
824
  $sample .= ' <strong style="color: #990000">Plugin Features</strong><ol>';
825
+ // Start-IG-Code.
826
  $sample .= ' <li>Send notification emails to subscribers when new blog posts are published.</li>';
827
+ // End-IG-Code.
828
  $sample .= ' <li>Subscribe form available with 3 options to setup.</li>';
829
  $sample .= ' <li>Double Opt-In and Single Opt-In support.</li>';
830
  $sample .= ' <li>Email notification to admin when a new user signs up (Optional).</li>';
836
  $sample .= ' <strong>Thanks & Regards,</strong><br/>Admin<br/>';
837
 
838
  $title = esc_html__( 'Welcome To Email Subscribers', 'email-subscribers' );
839
+ $subject = esc_html__( 'Welcome To Email Subscribers', 'email-subscribers' );
840
+
841
  $es_post = array(
842
  'post_title' => $title,
843
  'post_content' => $sample,
862
 
863
  $data['slug'] = sanitize_title( $title );
864
  $data['name'] = $title;
865
+ $data['subject'] = $subject;
866
  $data['type'] = 'newsletter';
867
  $data['from_email'] = $from_email;
868
  $data['reply_to_email'] = $from_email;
lite/admin/css/email-subscribers-admin.css CHANGED
@@ -1496,7 +1496,7 @@ body[class*="_page_es_workflows"] #post-body .postbox .inside {
1496
 
1497
  .ig-es-action.js-open .ig-es-action__header h4,
1498
  .ig-es-action.js-open .ig-es-action__header a {
1499
- color: white;
1500
  }
1501
 
1502
  .ig-es-action__header {
@@ -1532,7 +1532,7 @@ body[class*="_page_es_workflows"] #post-body .postbox .inside {
1532
  text-indent: -999em;
1533
  display: block;
1534
  width: 2.25rem;
1535
- height: 1.25rem;
1536
  border-radius: 30px;
1537
  border: none;
1538
  position: relative;
@@ -1554,9 +1554,10 @@ body[class*="_page_es_workflows"] #post-body .postbox .inside {
1554
  content: '';
1555
  position: absolute;
1556
  display: block;
1557
- width: 1rem;
1558
- height: 1rem;
1559
- top: 2px;
 
1560
  left: 2px;
1561
  -webkit-transition: all .15s ease;
1562
  transition: all .15s ease;
@@ -1773,3 +1774,11 @@ div.broadcast_side_content{
1773
 
1774
  /* Upselling css : end */
1775
 
 
 
 
 
 
 
 
 
1496
 
1497
  .ig-es-action.js-open .ig-es-action__header h4,
1498
  .ig-es-action.js-open .ig-es-action__header a {
1499
+ color: #4a5568;
1500
  }
1501
 
1502
  .ig-es-action__header {
1532
  text-indent: -999em;
1533
  display: block;
1534
  width: 2.25rem;
1535
+ height: 1.2rem;
1536
  border-radius: 30px;
1537
  border: none;
1538
  position: relative;
1554
  content: '';
1555
  position: absolute;
1556
  display: block;
1557
+ margin-left:1px;
1558
+ width: 0.82rem ;
1559
+ height: 0.85rem;
1560
+ top: 2.7px;
1561
  left: 2px;
1562
  -webkit-transition: all .15s ease;
1563
  transition: all .15s ease;
1774
 
1775
  /* Upselling css : end */
1776
 
1777
+ .es-mail-toggle-dot{
1778
+ margin-top: 0.19rem !important;
1779
+ width: 0.85rem !important;
1780
+ height: 0.8rem !important;
1781
+ }
1782
+ .es-mail-toggle-line{
1783
+ height: 1.2rem !important;
1784
+ }
lite/admin/dist/main.css CHANGED
@@ -1 +1 @@
1
- /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box;border:0 solid #d2d6dc}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a0aec0}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}a{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}img{border-width:0}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.form-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-input::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-input::-moz-placeholder{color:#9fa6b2;opacity:1}.form-input::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-input::placeholder{color:#9fa6b2;opacity:1}.form-input:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-textarea::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-moz-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::placeholder{color:#9fa6b2;opacity:1}.form-textarea:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-multiselect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-multiselect:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;background-repeat:no-repeat;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem 2.5rem .5rem .75rem;font-size:1rem;line-height:1.5;background-position:right .5rem center;background-size:1.5em 1.5em}.form-select::-ms-expand{color:#9fa6b2;border:none}@media not print{.form-select::-ms-expand{display:none}}@media print and (-ms-high-contrast:active),print and (-ms-high-contrast:none){.form-select{padding-right:.75rem}}.form-select:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.25rem}.form-checkbox:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-checkbox::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-checkbox:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox:checked:focus{border-color:transparent}.form-radio{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;border-radius:100%;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px}.form-radio:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-radio::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-radio:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-radio:checked:focus{border-color:transparent}.ig-es-primary-button,.ig-es-send-queue-emails{border-color:transparent;padding:.5rem 1rem;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));color:#fff;color:rgba(255,255,255,var(--text-opacity));background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.ig-es-primary-button,.ig-es-send-queue-emails,.ig-es-title-button,.wp-heading-inline+.page-title-action{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;font-size:.875rem;line-height:1.25rem;font-weight:500;--text-opacity:1;--bg-opacity:1;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-title-button,.wp-heading-inline+.page-title-action{--border-opacity:1;border-color:#d2d6dc;border-color:rgba(210,214,220,var(--border-opacity));color:#374151;color:rgba(55,65,81,var(--text-opacity));background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));padding:.25rem .75rem}.wrap .wp-heading-inline+.page-title-action{margin-left:.5rem}.ig-es-title-button:hover,.wp-heading-inline+.page-title-action:hover{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity));--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity))}.ig-es-title-button:focus,.wp-heading-inline+.page-title-action:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45);--border-opacity:1;border-color:#a4cafe;border-color:rgba(164,202,254,var(--border-opacity))}.ig-es-primary-button:hover{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity));--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.ig-es-primary-button:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.ig-es-imp-button{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important;-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important;border-radius:.375rem!important;border-width:1px!important;border-color:transparent!important;background-color:#fff!important;background-color:rgba(255,255,255,var(--bg-opacity))!important;font-size:.875rem!important;line-height:1.25rem!important;font-weight:500!important;background-color:#0e9f6e!important;background-color:rgba(14,159,110,var(--bg-opacity))!important;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform!important;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;-webkit-transition-duration:.15s!important;transition-duration:.15s!important}.ig-es-imp-button,.ig-es-imp-button:hover{--text-opacity:1!important;color:#fff!important;color:rgba(255,255,255,var(--text-opacity))!important;--bg-opacity:1!important}.ig-es-imp-button:hover{background-color:#31c48d!important;background-color:rgba(49,196,141,var(--bg-opacity))!important}.ig-es-imp-button:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(132,225,188,.45)!important;box-shadow:0 0 0 3px rgba(132,225,188,.45)!important}.ig-es-link-button{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;border-color:transparent;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));font-size:.875rem;line-height:1.25rem;font-weight:500;background-color:#ff5a1f;background-color:rgba(255,90,31,var(--bg-opacity));-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-link-button,.ig-es-link-button:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity));--bg-opacity:1}.ig-es-link-button:hover{background-color:#ff8a4c;background-color:rgba(255,138,76,var(--bg-opacity))}.ig-es-link-button:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(253,186,140,.45);box-shadow:0 0 0 3px rgba(253,186,140,.45)}.ig-es-action.js-open .ig-es-action__header{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity));--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.form-input{--bg-opacity:1!important;background-color:#fff!important;background-color:rgba(255,255,255,var(--bg-opacity))!important;border-width:1px!important;border-radius:.375rem!important;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.05)!important;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)!important;--border-opacity:1!important;border-color:#d2d6dc!important;border-color:rgba(210,214,220,var(--border-opacity))!important}.form-input:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;box-shadow:0 0 0 3px rgba(164,202,254,.45)!important}.form-checkbox{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E")}.form-radio{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}.form-checkbox:checked,.form-radio:checked{--text-opacity:1!important;color:#5850ec!important;color:rgba(88,80,236,var(--text-opacity))!important}.form-select{font-size:.875rem!important;--border-opacity:1!important;border-color:#9fa6b2!important;border-color:rgba(159,166,178,var(--border-opacity))!important;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")!important}.form-select:focus,input[type=number]:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;--border-opacity:1!important;border-color:#a4cafe!important;border-color:rgba(164,202,254,var(--border-opacity))!important}.es-check-toggle:checked~.es-mail-toggle-line{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.es-check-toggle:checked~.es-mail-toggle-dot{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-translate-x:100%}.es-mail-toggle-line{width:2.25rem;height:1.25rem;background-color:#d2d6dc;background-color:rgba(210,214,220,var(--bg-opacity));-webkit-box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06);box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.es-mail-toggle-dot,.es-mail-toggle-line{display:block;--bg-opacity:1;border-radius:9999px}.es-mail-toggle-dot{width:1rem;height:1rem;margin-top:.125rem;margin-left:.125rem;position:absolute;top:0;bottom:0;-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.es-mail-toggle-dot:focus-within{-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45)}[type=radio]:checked+.es-mailer-logo{-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-scale-x:1.1;--transform-scale-y:1.1;-webkit-box-shadow:0 0 3px 1px #5a67d8;box-shadow:0 0 3px 1px #5a67d8}[type=radio]:checked+.es-mailer-logo:hover{border-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.wp-core-ui .button,.wp-core-ui .button-secondary{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity));color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{font-size:.875rem;border-radius:.375rem;border-width:1px;line-height:1.25rem;font-weight:500;--text-opacity:1}.wp-core-ui .button-primary{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity));color:#fff;color:rgba(255,255,255,var(--text-opacity));-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.wp-core-ui .button-primary:hover,.wp-core-ui .button:hover{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity));--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.wp-core-ui .search-box input[name=s],.wp-core-ui select{border-radius:.375rem}.wp-core-ui #bulk-action-selector-top,.wp-core-ui #doaction,.wp-core-ui #doaction2,.wp-core-ui #filter-by-date,.wp-core-ui #post-query-submit,.wp-core-ui #poststuff select,.wp-core-ui #search-submit{cursor:pointer;line-height:1.25rem;--text-opacity:1;color:#4b5563;color:rgba(75,85,99,var(--text-opacity));background-color:transparent;font-size:.875rem}.wp-core-ui #search-submit{margin-left:.375rem}.wp-core-ui #doaction2:hover .wp-core-ui #post-query-submit:hover,.wp-core-ui #doaction:hover,.wp-core-ui #search-submit:hover{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity));--border-opacity:1;border-color:#6b7280;border-color:rgba(107,114,128,var(--border-opacity))}.wp-core-ui #doaction2:focus .wp-core-ui #post-query-submit:focus,.wp-core-ui #doaction:focus,.wp-core-ui #search-submit:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(159,166,178,.45);box-shadow:0 0 0 3px rgba(159,166,178,.45)}.es-items-lists table.fixed,.post-type-es_template table.fixed{margin-top:1.5rem;margin-bottom:1rem;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);border-radius:.5rem;overflow:hidden}.es-items-lists table.fixed tfoot td,.es-items-lists table.fixed tfoot th,.es-items-lists table.fixed thead td,.es-items-lists table.fixed thead th,.post-type-es_template table.fixed tfoot th,.post-type-es_template table.fixed thead td,.post-type-es_template table.fixed thead th{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity));border-bottom-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity));--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity));font-weight:500;letter-spacing:.05em}.es-items-lists table.fixed tfoot th,.es-items-lists table.fixed thead th,.post-type-es_template table.fixed tfoot th,.post-type-es_template table.fixed thead th{padding-top:.5rem;padding-bottom:.5rem}.es-items-lists .widefat thead td input,.post-type-es_template .widefat thead td input{margin-right:1.5rem}.post-type-es_template .wrap{padding-top:1rem;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.post-type-es_template .wrap>h1{padding-top:0;font-weight:600;--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity));line-height:2.25rem}.es-items-lists .striped>tbody tr,.post-type-es_template .striped>tbody tr{border-bottom-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity));padding-top:.5rem;padding-bottom:.5rem}.es-items-lists .striped>tbody>:nth-child(odd),.post-type-es_template .striped>tbody>:nth-child(odd){--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.es_onboard_email{padding:.25rem .75rem!important}.es_reports_table_header{border-bottom-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity));--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity));text-align:left;font-size:.875rem;line-height:1rem;font-weight:500;--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity));letter-spacing:.05em}.space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.25rem*var(--space-y-reverse))}.space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.5rem*var(--space-y-reverse))}.space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.75rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.75rem*var(--space-y-reverse))}.space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0.75rem*var(--space-x-reverse));margin-left:calc(0.75rem*(1 - var(--space-x-reverse)))}.space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1rem*var(--space-y-reverse))}.space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem*var(--space-y-reverse))}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-50{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.bg-gray-200{--bg-opacity:1;background-color:#e5e7eb;background-color:rgba(229,231,235,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#d2d6dc;background-color:rgba(210,214,220,var(--bg-opacity))}.bg-red-50{--bg-opacity:1;background-color:#fdf2f2;background-color:rgba(253,242,242,var(--bg-opacity))}.bg-red-100{--bg-opacity:1;background-color:#fde8e8;background-color:rgba(253,232,232,var(--bg-opacity))}.bg-yellow-100{--bg-opacity:1;background-color:#fdf6b2;background-color:rgba(253,246,178,var(--bg-opacity))}.bg-green-100{--bg-opacity:1;background-color:#def7ec;background-color:rgba(222,247,236,var(--bg-opacity))}.bg-green-300{--bg-opacity:1;background-color:#84e1bc;background-color:rgba(132,225,188,var(--bg-opacity))}.bg-green-600{--bg-opacity:1;background-color:#057a55;background-color:rgba(5,122,85,var(--bg-opacity))}.bg-teal-50{--bg-opacity:1;background-color:#edfafa;background-color:rgba(237,250,250,var(--bg-opacity))}.bg-blue-50{--bg-opacity:1;background-color:#ebf5ff;background-color:rgba(235,245,255,var(--bg-opacity))}.bg-blue-300{--bg-opacity:1;background-color:#a4cafe;background-color:rgba(164,202,254,var(--bg-opacity))}.bg-indigo-200{--bg-opacity:1;background-color:#cddbfe;background-color:rgba(205,219,254,var(--bg-opacity))}.bg-indigo-500{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity))}.bg-indigo-600{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.bg-indigo-700{--bg-opacity:1;background-color:#5145cd;background-color:rgba(81,69,205,var(--bg-opacity))}.bg-indigo-800{--bg-opacity:1;background-color:#42389d;background-color:rgba(66,56,157,var(--bg-opacity))}.bg-pink-200{--bg-opacity:1;background-color:#fad1e8;background-color:rgba(250,209,232,var(--bg-opacity))}.group:focus .group-focus\:bg-gray-400,.group:hover .group-hover\:bg-gray-400{--bg-opacity:1;background-color:#9fa6b2;background-color:rgba(159,166,178,var(--bg-opacity))}.hover\:bg-gray-50:hover{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.hover\:bg-green-500:hover{--bg-opacity:1;background-color:#0e9f6e;background-color:rgba(14,159,110,var(--bg-opacity))}.hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity))}.hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.focus\:bg-gray-50:focus{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.border-collapse{border-collapse:collapse}.border-transparent{border-color:transparent}.border-gray-100{--border-opacity:1;border-color:#f4f5f7;border-color:rgba(244,245,247,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.border-gray-300{--border-opacity:1;border-color:#d2d6dc;border-color:rgba(210,214,220,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#9fa6b2;border-color:rgba(159,166,178,var(--border-opacity))}.border-indigo-300{--border-opacity:1;border-color:#b4c6fc;border-color:rgba(180,198,252,var(--border-opacity))}.border-indigo-500{--border-opacity:1;border-color:#6875f5;border-color:rgba(104,117,245,var(--border-opacity))}.border-indigo-600{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity))}.hover\:border-gray-200:hover{--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.hover\:border-gray-500:hover{--border-opacity:1;border-color:#6b7280;border-color:rgba(107,114,128,var(--border-opacity))}.hover\:border-red-400:hover{--border-opacity:1;border-color:#f98080;border-color:rgba(249,128,128,var(--border-opacity))}.hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity))}.focus\:border-blue-300:focus{--border-opacity:1;border-color:#a4cafe;border-color:rgba(164,202,254,var(--border-opacity))}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-0{border-width:0}.border-2{border-width:2px}.border{border-width:1px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.grid{display:grid}.contents{display:contents}.hidden{display:none}.flex-row{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.flex-col,.flex-row{-webkit-box-direction:normal}.flex-col{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.self-start{-ms-flex-item-align:start;align-self:flex-start}.justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.flex-1{-webkit-box-flex:1;-ms-flex:1 1 0%;flex:1 1 0%}.flex-auto{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.flex-none{-webkit-box-flex:0;-ms-flex:none;flex:none}.flex-shrink-0{-ms-flex-negative:0;flex-shrink:0}.float-right{float:right}.float-left{float:left}.font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.font-mono{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-thin{font-weight:200}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.h-0{height:0}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-15{height:3.75rem}.h-20{height:5rem}.h-48{height:12rem}.h-auto{height:auto}.h-1\.5{height:.375rem}.h-2\.5{height:.625rem}.h-full{height:100%}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-9{line-height:2.25rem}.leading-none{line-height:1}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.m-4{margin:1rem}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-8{margin-left:2rem;margin-right:2rem}.my-12{margin-top:3rem;margin-bottom:3rem}.mx-auto{margin-left:auto;margin-right:auto}.-my-4{margin-top:-1rem;margin-bottom:-1rem}.mt-0{margin-top:0}.mb-0{margin-bottom:0}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-5{margin-top:1.25rem}.ml-5{margin-left:1.25rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mt-7{margin-top:1.75rem}.mb-7{margin-bottom:1.75rem}.ml-7{margin-left:1.75rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.ml-8{margin-left:2rem}.mr-10{margin-right:2.5rem}.mt-12{margin-top:3rem}.ml-12{margin-left:3rem}.ml-14{margin-left:3.5rem}.mt-16{margin-top:4rem}.mr-16{margin-right:4rem}.ml-16{margin-left:4rem}.mt-0\.5{margin-top:.125rem}.mt-1\.5{margin-top:.375rem}.mr-1\.5{margin-right:.375rem}.mt-2\.5{margin-top:.625rem}.-mt-1{margin-top:-.25rem}.-mr-1{margin-right:-.25rem}.-mb-1{margin-bottom:-.25rem}.-mb-2{margin-bottom:-.5rem}.-mt-3{margin-top:-.75rem}.-mt-5{margin-top:-1.25rem}.-ml-6{margin-left:-1.5rem}.-ml-8{margin-left:-2rem}.-mb-0\.5{margin-bottom:-.125rem}.-mt-1\.5{margin-top:-.375rem}.max-h-full{max-height:100%}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.min-h-screen{min-height:100vh}.min-w-0{min-width:0}.min-w-full{min-width:100%}.object-cover{-o-object-fit:cover;object-fit:cover}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-100{opacity:1}.focus\:outline-none:focus{outline:0}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.p-0{padding:0}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-13{padding:3.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-12{padding-top:3rem;padding-bottom:3rem}.px-12{padding-left:3rem;padding-right:3rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.pt-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.pt-2{padding-top:.5rem}.pr-2{padding-right:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pt-3{padding-top:.75rem}.pr-3{padding-right:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.pt-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.pt-5{padding-top:1.25rem}.pb-5{padding-bottom:1.25rem}.pl-5{padding-left:1.25rem}.pt-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.pt-10{padding-top:2.5rem}.pl-10{padding-left:2.5rem}.pr-12{padding-right:3rem}.pb-12{padding-bottom:3rem}.pl-16{padding-left:4rem}.pt-0\.5{padding-top:.125rem}.pl-0\.5{padding-left:.125rem}.pt-1\.5{padding-top:.375rem}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{right:0;left:0}.inset-0,.inset-y-0{top:0;bottom:0}.top-0{top:0}.right-0{right:0}.left-0{left:0}.bottom-2{bottom:.5rem}.top-8{top:2rem}.resize{resize:both}.shadow-xs{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.05);box-shadow:0 0 0 1px rgba(0,0,0,.05)}.shadow-sm{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.05);box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.shadow{-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-xl{-webkit-box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.shadow-inner{-webkit-box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06);box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.hover\:shadow-md:hover{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.focus\:shadow-lg:focus{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.focus\:shadow-outline:focus{-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45)}.focus\:shadow-outline-blue:focus{-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.focus\:shadow-outline-red:focus{-webkit-box-shadow:0 0 0 3px rgba(248,180,180,.45);box-shadow:0 0 0 3px rgba(248,180,180,.45)}.focus\:shadow-outline-indigo:focus{-webkit-box-shadow:0 0 0 3px rgba(180,198,252,.45);box-shadow:0 0 0 3px rgba(180,198,252,.45)}.fill-current{fill:currentColor}.table-fixed{table-layout:fixed}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#9fa6b2;color:rgba(159,166,178,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#4b5563;color:rgba(75,85,99,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#252f3f;color:rgba(37,47,63,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.text-red-400{--text-opacity:1;color:#f98080;color:rgba(249,128,128,var(--text-opacity))}.text-red-500{--text-opacity:1;color:#f05252;color:rgba(240,82,82,var(--text-opacity))}.text-red-600{--text-opacity:1;color:#e02424;color:rgba(224,36,36,var(--text-opacity))}.text-red-800{--text-opacity:1;color:#9b1c1c;color:rgba(155,28,28,var(--text-opacity))}.text-orange-400{--text-opacity:1;color:#ff8a4c;color:rgba(255,138,76,var(--text-opacity))}.text-orange-500{--text-opacity:1;color:#ff5a1f;color:rgba(255,90,31,var(--text-opacity))}.text-yellow-400{--text-opacity:1;color:#e3a008;color:rgba(227,160,8,var(--text-opacity))}.text-green-400{--text-opacity:1;color:#31c48d;color:rgba(49,196,141,var(--text-opacity))}.text-green-600{--text-opacity:1;color:#057a55;color:rgba(5,122,85,var(--text-opacity))}.text-green-800{--text-opacity:1;color:#03543f;color:rgba(3,84,63,var(--text-opacity))}.text-teal-400{--text-opacity:1;color:#16bdca;color:rgba(22,189,202,var(--text-opacity))}.text-teal-700{--text-opacity:1;color:#036672;color:rgba(3,102,114,var(--text-opacity))}.text-teal-800{--text-opacity:1;color:#05505c;color:rgba(5,80,92,var(--text-opacity))}.text-blue-400{--text-opacity:1;color:#76a9fa;color:rgba(118,169,250,var(--text-opacity))}.text-blue-500{--text-opacity:1;color:#3f83f8;color:rgba(63,131,248,var(--text-opacity))}.text-blue-700{--text-opacity:1;color:#1a56db;color:rgba(26,86,219,var(--text-opacity))}.text-blue-800{--text-opacity:1;color:#1e429f;color:rgba(30,66,159,var(--text-opacity))}.text-indigo-100{--text-opacity:1;color:#e5edff;color:rgba(229,237,255,var(--text-opacity))}.text-indigo-400{--text-opacity:1;color:#8da2fb;color:rgba(141,162,251,var(--text-opacity))}.text-indigo-500{--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.text-indigo-600{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.text-indigo-700{--text-opacity:1;color:#5145cd;color:rgba(81,69,205,var(--text-opacity))}.text-indigo-800{--text-opacity:1;color:#42389d;color:rgba(66,56,157,var(--text-opacity))}.group:hover .group-hover\:text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.group:hover .group-hover\:text-indigo-800{--text-opacity:1;color:#42389d;color:rgba(66,56,157,var(--text-opacity))}.group:focus .group-focus\:text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.group:focus .group-focus\:text-indigo-800{--text-opacity:1;color:#42389d;color:rgba(66,56,157,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-800:hover{--text-opacity:1;color:#252f3f;color:rgba(37,47,63,var(--text-opacity))}.hover\:text-gray-900:hover{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.hover\:text-blue-700:hover{--text-opacity:1;color:#1a56db;color:rgba(26,86,219,var(--text-opacity))}.hover\:text-indigo-500:hover{--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.focus\:text-gray-900:focus{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.active\:text-indigo-600:active{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.text-opacity-75{--text-opacity:0.75}.italic{font-style:italic}.not-italic{font-style:normal}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.underline{text-decoration:underline}.no-underline{text-decoration:none}.hover\:underline:hover{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.visible{visibility:visible}.whitespace-no-wrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-0{width:0}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-12{width:3rem}.w-40{width:10rem}.w-56{width:14rem}.w-auto{width:auto}.w-1\.5{width:.375rem}.w-2\.5{width:.625rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-1\/12{width:8.333333%}.w-2\/12{width:16.666667%}.w-3\/12{width:25%}.w-4\/12{width:33.333333%}.w-5\/12{width:41.666667%}.w-9\/12{width:75%}.w-11\/12{width:91.666667%}.w-full{width:100%}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.gap-8{grid-gap:2rem;gap:2rem}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.origin-top-right{-webkit-transform-origin:top right;transform-origin:top right}.scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.scale-100{--transform-scale-x:1;--transform-scale-y:1}.transition-all{-webkit-transition-property:all;transition-property:all}.transition{-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform}.ease-in{-webkit-transition-timing-function:cubic-bezier(.4,0,1,1);transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-75{-webkit-transition-duration:75ms;transition-duration:75ms}.duration-100{-webkit-transition-duration:.1s;transition-duration:.1s}.duration-150{-webkit-transition-duration:.15s;transition-duration:.15s}.duration-300{-webkit-transition-duration:.3s;transition-duration:.3s}@-webkit-keyframes spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes ping{75%,to{-webkit-transform:scale(2);transform:scale(2);opacity:0}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{-webkit-transform:translateY(-25%);transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{-webkit-transform:none;transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@media (min-width:640px){.sm\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px*(1 - var(--space-y-reverse)));margin-bottom:calc(0px*var(--space-y-reverse))}.sm\:space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.75rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.75rem*var(--space-y-reverse))}.sm\:space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem*var(--space-x-reverse));margin-left:calc(1rem*(1 - var(--space-x-reverse)))}.sm\:rounded-md{border-radius:.375rem}.sm\:rounded-lg{border-radius:.5rem}.sm\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.sm\:grid{display:grid}.sm\:flex-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.sm\:items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.sm\:items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.sm\:h-10{height:2.5rem}.sm\:text-sm{font-size:.875rem}.sm\:text-2xl{font-size:1.5rem}.sm\:text-3xl{font-size:1.875rem}.sm\:leading-5{line-height:1.25rem}.sm\:leading-7{line-height:1.75rem}.sm\:leading-9{line-height:2.25rem}.sm\:my-0{margin-top:0;margin-bottom:0}.sm\:mx-0{margin-left:0;margin-right:0}.sm\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:my-12{margin-top:3rem;margin-bottom:3rem}.sm\:mt-0{margin-top:0}.sm\:ml-3{margin-left:.75rem}.sm\:ml-4{margin-left:1rem}.sm\:mt-5{margin-top:1.25rem}.sm\:max-w-lg{max-width:32rem}.sm\:p-6{padding:1.5rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-2{padding-left:.5rem;padding-right:.5rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pb-4{padding-bottom:1rem}.sm\:text-left{text-align:left}.sm\:align-middle{vertical-align:middle}.sm\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm\:w-10{width:2.5rem}.sm\:w-32{width:8rem}.sm\:w-auto{width:auto}.sm\:w-1\/2{width:50%}.sm\:w-1\/3{width:33.333333%}.sm\:w-2\/3{width:66.666667%}.sm\:w-full{width:100%}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:768px){.md\:rounded-lg{border-radius:.5rem}.md\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.md\:items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.md\:items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.md\:justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.md\:text-base{font-size:1rem}.md\:mx-0{margin-left:0;margin-right:0}.md\:my-2{margin-top:.5rem;margin-bottom:.5rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:mt-0{margin-top:0}.md\:ml-2{margin-left:.5rem}.md\:ml-4{margin-left:1rem}.md\:ml-8{margin-left:2rem}.md\:-mr-8{margin-right:-2rem}.md\:max-w-xl{max-width:36rem}.md\:max-w-5xl{max-width:64rem}.md\:p-2{padding:.5rem}.md\:p-6{padding:1.5rem}.md\:py-0{padding-top:0;padding-bottom:0}.md\:px-1{padding-left:.25rem;padding-right:.25rem}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:pb-2{padding-bottom:.5rem}.md\:pr-4{padding-right:1rem}.md\:pt-6{padding-top:1.5rem}.md\:shadow-xl{-webkit-box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.md\:w-3\/5{width:60%}}@media (min-width:1024px){.lg\:bg-transparent{background-color:transparent}.lg\:border-transparent{border-color:transparent}.lg\:rounded-full{border-radius:9999px}.lg\:block{display:block}.lg\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.lg\:inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.lg\:text-sm{font-size:.875rem}.lg\:text-lg{font-size:1.125rem}.lg\:my-0{margin-top:0;margin-bottom:0}.lg\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.lg\:my-24{margin-top:6rem;margin-bottom:6rem}.lg\:mx-auto{margin-left:auto;margin-right:auto}.lg\:ml-16{margin-left:4rem}.lg\:-mr-16{margin-right:-4rem}.lg\:max-w-3xl{max-width:48rem}.lg\:p-6{padding:1.5rem}.lg\:p-8{padding:2rem}.lg\:px-3{padding-left:.75rem;padding-right:.75rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pt-2{padding-top:.5rem}.lg\:pb-2{padding-bottom:.5rem}.lg\:pl-2{padding-left:.5rem}.lg\:top-1\/2{top:50%}.lg\:shadow-none{-webkit-box-shadow:none;box-shadow:none}.lg\:w-40{width:10rem}.lg\:w-48{width:12rem}.lg\:w-1\/2{width:50%}.lg\:w-3\/5{width:60%}.lg\:w-3\/12{width:25%}.lg\:w-7\/12{width:58.333333%}}@media (min-width:1280px){.xl\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.xl\:mr-0{margin-right:0}.xl\:ml-3{margin-left:.75rem}.xl\:ml-4{margin-left:1rem}.xl\:ml-20{margin-left:5rem}.xl\:max-w-4xl{max-width:56rem}.xl\:px-4{padding-left:1rem;padding-right:1rem}.xl\:pb-4{padding-bottom:1rem}.xl\:top-1\/3{top:33.333333%}.xl\:w-1\/4{width:25%}.xl\:w-2\/5{width:40%}.xl\:w-3\/5{width:60%}.xl\:w-2\/12{width:16.666667%}.xl\:w-7\/12{width:58.333333%}}
1
+ /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box;border:0 solid #d2d6dc}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a0aec0}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}a{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}img{border-width:0}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.form-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-input::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-input::-moz-placeholder{color:#9fa6b2;opacity:1}.form-input::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-input::placeholder{color:#9fa6b2;opacity:1}.form-input:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-textarea::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-moz-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::placeholder{color:#9fa6b2;opacity:1}.form-textarea:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-multiselect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-multiselect:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;background-repeat:no-repeat;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem 2.5rem .5rem .75rem;font-size:1rem;line-height:1.5;background-position:right .5rem center;background-size:1.5em 1.5em}.form-select::-ms-expand{color:#9fa6b2;border:none}@media not print{.form-select::-ms-expand{display:none}}@media print and (-ms-high-contrast:active),print and (-ms-high-contrast:none){.form-select{padding-right:.75rem}}.form-select:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.25rem}.form-checkbox:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-checkbox::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-checkbox:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox:checked:focus{border-color:transparent}.form-radio{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;border-radius:100%;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px}.form-radio:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-radio::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-radio:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-radio:checked:focus{border-color:transparent}.ig-es-primary-button,.ig-es-send-queue-emails{border-color:transparent;padding:.5rem 1rem;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));color:#fff;color:rgba(255,255,255,var(--text-opacity));background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.ig-es-primary-button,.ig-es-send-queue-emails,.ig-es-title-button,.wp-heading-inline+.page-title-action{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;font-size:.875rem;line-height:1.25rem;font-weight:500;--text-opacity:1;--bg-opacity:1;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-title-button,.wp-heading-inline+.page-title-action{--border-opacity:1;border-color:#d2d6dc;border-color:rgba(210,214,220,var(--border-opacity));color:#374151;color:rgba(55,65,81,var(--text-opacity));background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));padding:.25rem .75rem}.wrap .wp-heading-inline+.page-title-action{margin-left:.5rem}.ig-es-title-button:hover,.wp-heading-inline+.page-title-action:hover{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity));--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity))}.ig-es-title-button:focus,.wp-heading-inline+.page-title-action:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45);--border-opacity:1;border-color:#a4cafe;border-color:rgba(164,202,254,var(--border-opacity))}.ig-es-primary-button:hover{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity));--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.ig-es-primary-button:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.ig-es-imp-button{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important;-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important;border-radius:.375rem!important;border-width:1px!important;border-color:transparent!important;background-color:#fff!important;background-color:rgba(255,255,255,var(--bg-opacity))!important;font-size:.875rem!important;line-height:1.25rem!important;font-weight:500!important;background-color:#0e9f6e!important;background-color:rgba(14,159,110,var(--bg-opacity))!important;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform!important;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;-webkit-transition-duration:.15s!important;transition-duration:.15s!important}.ig-es-imp-button,.ig-es-imp-button:hover{--text-opacity:1!important;color:#fff!important;color:rgba(255,255,255,var(--text-opacity))!important;--bg-opacity:1!important}.ig-es-imp-button:hover{background-color:#31c48d!important;background-color:rgba(49,196,141,var(--bg-opacity))!important}.ig-es-imp-button:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(132,225,188,.45)!important;box-shadow:0 0 0 3px rgba(132,225,188,.45)!important}.ig-es-link-button{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;border-color:transparent;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));font-size:.875rem;line-height:1.25rem;font-weight:500;background-color:#ff5a1f;background-color:rgba(255,90,31,var(--bg-opacity));-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-link-button,.ig-es-link-button:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity));--bg-opacity:1}.ig-es-link-button:hover{background-color:#ff8a4c;background-color:rgba(255,138,76,var(--bg-opacity))}.ig-es-link-button:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(253,186,140,.45);box-shadow:0 0 0 3px rgba(253,186,140,.45)}.ig-es-action.js-open .ig-es-action__header{--bg-opacity:1;background-color:#d2d6dc;background-color:rgba(210,214,220,var(--bg-opacity));--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity));--border-opacity:1;border-color:#d2d6dc;border-color:rgba(210,214,220,var(--border-opacity))}.form-input{--bg-opacity:1!important;background-color:#fff!important;background-color:rgba(255,255,255,var(--bg-opacity))!important;border-width:1px!important;border-radius:.375rem!important;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.05)!important;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)!important;--border-opacity:1!important;border-color:#d2d6dc!important;border-color:rgba(210,214,220,var(--border-opacity))!important}.form-input:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;box-shadow:0 0 0 3px rgba(164,202,254,.45)!important}.form-checkbox{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E")}.form-radio{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}.form-checkbox:checked,.form-radio:checked{--text-opacity:1!important;color:#5850ec!important;color:rgba(88,80,236,var(--text-opacity))!important}.form-select{font-size:.875rem!important;--border-opacity:1!important;border-color:#9fa6b2!important;border-color:rgba(159,166,178,var(--border-opacity))!important;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")!important}.form-select:focus,input[type=number]:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;--border-opacity:1!important;border-color:#a4cafe!important;border-color:rgba(164,202,254,var(--border-opacity))!important}.es-check-toggle:checked~.es-mail-toggle-line{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.es-check-toggle:checked~.es-mail-toggle-dot{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-translate-x:100%}.es-mail-toggle-line{width:2.25rem;height:1.25rem;background-color:#d2d6dc;background-color:rgba(210,214,220,var(--bg-opacity));-webkit-box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06);box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.es-mail-toggle-dot,.es-mail-toggle-line{display:block;--bg-opacity:1;border-radius:9999px}.es-mail-toggle-dot{width:.875rem;height:.875rem;margin-left:.25rem;position:absolute;top:0;bottom:0;-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.es-mail-toggle-dot:focus-within{-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45)}[type=radio]:checked+.es-mailer-logo{-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-scale-x:1.1;--transform-scale-y:1.1;-webkit-box-shadow:0 0 3px 1px #5a67d8;box-shadow:0 0 3px 1px #5a67d8}[type=radio]:checked+.es-mailer-logo:hover{border-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.wp-core-ui .button,.wp-core-ui .button-secondary{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity));color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{font-size:.875rem;border-radius:.375rem;border-width:1px;line-height:1.25rem;font-weight:500;--text-opacity:1}.wp-core-ui .button-primary{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity));color:#fff;color:rgba(255,255,255,var(--text-opacity));-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.wp-core-ui .button-primary:hover,.wp-core-ui .button:hover{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity));--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.wp-core-ui .search-box input[name=s],.wp-core-ui select{border-radius:.375rem}.wp-core-ui #bulk-action-selector-top,.wp-core-ui #doaction,.wp-core-ui #doaction2,.wp-core-ui #filter-by-date,.wp-core-ui #post-query-submit,.wp-core-ui #poststuff select,.wp-core-ui #search-submit{cursor:pointer;line-height:1.25rem;--text-opacity:1;color:#4b5563;color:rgba(75,85,99,var(--text-opacity));background-color:transparent;font-size:.875rem}.wp-core-ui #search-submit{margin-left:.375rem}.wp-core-ui #doaction2:hover .wp-core-ui #post-query-submit:hover,.wp-core-ui #doaction:hover,.wp-core-ui #search-submit:hover{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity));--border-opacity:1;border-color:#6b7280;border-color:rgba(107,114,128,var(--border-opacity))}.wp-core-ui #doaction2:focus .wp-core-ui #post-query-submit:focus,.wp-core-ui #doaction:focus,.wp-core-ui #search-submit:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(159,166,178,.45);box-shadow:0 0 0 3px rgba(159,166,178,.45)}.es-items-lists table.fixed,.post-type-es_template table.fixed{margin-top:1.5rem;margin-bottom:1rem;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);border-radius:.5rem;overflow:hidden}.es-items-lists table.fixed tfoot td,.es-items-lists table.fixed tfoot th,.es-items-lists table.fixed thead td,.es-items-lists table.fixed thead th,.post-type-es_template table.fixed tfoot th,.post-type-es_template table.fixed thead td,.post-type-es_template table.fixed thead th{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity));border-bottom-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity));--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity));font-weight:500;letter-spacing:.05em}.es-items-lists table.fixed tfoot th,.es-items-lists table.fixed thead th,.post-type-es_template table.fixed tfoot th,.post-type-es_template table.fixed thead th{padding-top:.5rem;padding-bottom:.5rem}.es-items-lists .widefat thead td input,.post-type-es_template .widefat thead td input{margin-right:1.5rem}.post-type-es_template .wrap{padding-top:1rem;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.post-type-es_template .wrap>h1{padding-top:0;font-weight:600;--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity));line-height:2.25rem}.es-items-lists .striped>tbody tr,.post-type-es_template .striped>tbody tr{border-bottom-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity));padding-top:.5rem;padding-bottom:.5rem}.es-items-lists .striped>tbody>:nth-child(odd),.post-type-es_template .striped>tbody>:nth-child(odd){--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.es_onboard_email{padding:.25rem .75rem!important}.es_reports_table_header{border-bottom-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity));--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity));text-align:left;font-size:.875rem;line-height:1rem;font-weight:500;--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity));letter-spacing:.05em}.space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.25rem*var(--space-y-reverse))}.space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.5rem*var(--space-y-reverse))}.space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.75rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.75rem*var(--space-y-reverse))}.space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0.75rem*var(--space-x-reverse));margin-left:calc(0.75rem*(1 - var(--space-x-reverse)))}.space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1rem*var(--space-y-reverse))}.space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem*var(--space-y-reverse))}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-50{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.bg-gray-200{--bg-opacity:1;background-color:#e5e7eb;background-color:rgba(229,231,235,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#d2d6dc;background-color:rgba(210,214,220,var(--bg-opacity))}.bg-red-50{--bg-opacity:1;background-color:#fdf2f2;background-color:rgba(253,242,242,var(--bg-opacity))}.bg-red-100{--bg-opacity:1;background-color:#fde8e8;background-color:rgba(253,232,232,var(--bg-opacity))}.bg-yellow-100{--bg-opacity:1;background-color:#fdf6b2;background-color:rgba(253,246,178,var(--bg-opacity))}.bg-green-100{--bg-opacity:1;background-color:#def7ec;background-color:rgba(222,247,236,var(--bg-opacity))}.bg-green-300{--bg-opacity:1;background-color:#84e1bc;background-color:rgba(132,225,188,var(--bg-opacity))}.bg-green-600{--bg-opacity:1;background-color:#057a55;background-color:rgba(5,122,85,var(--bg-opacity))}.bg-teal-50{--bg-opacity:1;background-color:#edfafa;background-color:rgba(237,250,250,var(--bg-opacity))}.bg-blue-50{--bg-opacity:1;background-color:#ebf5ff;background-color:rgba(235,245,255,var(--bg-opacity))}.bg-blue-300{--bg-opacity:1;background-color:#a4cafe;background-color:rgba(164,202,254,var(--bg-opacity))}.bg-indigo-200{--bg-opacity:1;background-color:#cddbfe;background-color:rgba(205,219,254,var(--bg-opacity))}.bg-indigo-500{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity))}.bg-indigo-600{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.bg-indigo-700{--bg-opacity:1;background-color:#5145cd;background-color:rgba(81,69,205,var(--bg-opacity))}.bg-indigo-800{--bg-opacity:1;background-color:#42389d;background-color:rgba(66,56,157,var(--bg-opacity))}.bg-pink-200{--bg-opacity:1;background-color:#fad1e8;background-color:rgba(250,209,232,var(--bg-opacity))}.group:focus .group-focus\:bg-gray-400,.group:hover .group-hover\:bg-gray-400{--bg-opacity:1;background-color:#9fa6b2;background-color:rgba(159,166,178,var(--bg-opacity))}.hover\:bg-gray-50:hover{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.hover\:bg-green-500:hover{--bg-opacity:1;background-color:#0e9f6e;background-color:rgba(14,159,110,var(--bg-opacity))}.hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity))}.hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.focus\:bg-gray-50:focus{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.border-collapse{border-collapse:collapse}.border-transparent{border-color:transparent}.border-gray-100{--border-opacity:1;border-color:#f4f5f7;border-color:rgba(244,245,247,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.border-gray-300{--border-opacity:1;border-color:#d2d6dc;border-color:rgba(210,214,220,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#9fa6b2;border-color:rgba(159,166,178,var(--border-opacity))}.border-indigo-300{--border-opacity:1;border-color:#b4c6fc;border-color:rgba(180,198,252,var(--border-opacity))}.border-indigo-500{--border-opacity:1;border-color:#6875f5;border-color:rgba(104,117,245,var(--border-opacity))}.border-indigo-600{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity))}.hover\:border-gray-200:hover{--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.hover\:border-gray-500:hover{--border-opacity:1;border-color:#6b7280;border-color:rgba(107,114,128,var(--border-opacity))}.hover\:border-red-400:hover{--border-opacity:1;border-color:#f98080;border-color:rgba(249,128,128,var(--border-opacity))}.hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity))}.focus\:border-blue-300:focus{--border-opacity:1;border-color:#a4cafe;border-color:rgba(164,202,254,var(--border-opacity))}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-0{border-width:0}.border-2{border-width:2px}.border{border-width:1px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.grid{display:grid}.contents{display:contents}.hidden{display:none}.flex-row{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.flex-col,.flex-row{-webkit-box-direction:normal}.flex-col{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.self-start{-ms-flex-item-align:start;align-self:flex-start}.justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.flex-1{-webkit-box-flex:1;-ms-flex:1 1 0%;flex:1 1 0%}.flex-auto{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.flex-none{-webkit-box-flex:0;-ms-flex:none;flex:none}.flex-shrink-0{-ms-flex-negative:0;flex-shrink:0}.float-right{float:right}.float-left{float:left}.font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.font-mono{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-thin{font-weight:200}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.h-0{height:0}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-15{height:3.75rem}.h-20{height:5rem}.h-48{height:12rem}.h-auto{height:auto}.h-1\.5{height:.375rem}.h-2\.5{height:.625rem}.h-full{height:100%}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-9{line-height:2.25rem}.leading-none{line-height:1}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.m-4{margin:1rem}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-8{margin-left:2rem;margin-right:2rem}.my-12{margin-top:3rem;margin-bottom:3rem}.mx-auto{margin-left:auto;margin-right:auto}.-my-4{margin-top:-1rem;margin-bottom:-1rem}.mt-0{margin-top:0}.mb-0{margin-bottom:0}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-5{margin-top:1.25rem}.ml-5{margin-left:1.25rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mt-7{margin-top:1.75rem}.mb-7{margin-bottom:1.75rem}.ml-7{margin-left:1.75rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.ml-8{margin-left:2rem}.mr-10{margin-right:2.5rem}.mt-12{margin-top:3rem}.ml-12{margin-left:3rem}.ml-14{margin-left:3.5rem}.mt-16{margin-top:4rem}.mr-16{margin-right:4rem}.ml-16{margin-left:4rem}.mt-0\.5{margin-top:.125rem}.mt-1\.5{margin-top:.375rem}.mr-1\.5{margin-right:.375rem}.mt-2\.5{margin-top:.625rem}.-mt-1{margin-top:-.25rem}.-mr-1{margin-right:-.25rem}.-mb-1{margin-bottom:-.25rem}.-mb-2{margin-bottom:-.5rem}.-mt-3{margin-top:-.75rem}.-mt-5{margin-top:-1.25rem}.-ml-6{margin-left:-1.5rem}.-ml-8{margin-left:-2rem}.-mb-0\.5{margin-bottom:-.125rem}.-mt-1\.5{margin-top:-.375rem}.max-h-full{max-height:100%}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.min-h-screen{min-height:100vh}.min-w-0{min-width:0}.min-w-full{min-width:100%}.object-cover{-o-object-fit:cover;object-fit:cover}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-100{opacity:1}.focus\:outline-none:focus{outline:0}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.p-0{padding:0}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-13{padding:3.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-12{padding-top:3rem;padding-bottom:3rem}.px-12{padding-left:3rem;padding-right:3rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.pt-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.pt-2{padding-top:.5rem}.pr-2{padding-right:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pt-3{padding-top:.75rem}.pr-3{padding-right:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.pt-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.pt-5{padding-top:1.25rem}.pb-5{padding-bottom:1.25rem}.pl-5{padding-left:1.25rem}.pt-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.pt-10{padding-top:2.5rem}.pl-10{padding-left:2.5rem}.pr-12{padding-right:3rem}.pb-12{padding-bottom:3rem}.pl-16{padding-left:4rem}.pt-0\.5{padding-top:.125rem}.pl-0\.5{padding-left:.125rem}.pt-1\.5{padding-top:.375rem}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{right:0;left:0}.inset-0,.inset-y-0{top:0;bottom:0}.top-0{top:0}.right-0{right:0}.left-0{left:0}.bottom-2{bottom:.5rem}.top-8{top:2rem}.resize{resize:both}.shadow-xs{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.05);box-shadow:0 0 0 1px rgba(0,0,0,.05)}.shadow-sm{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.05);box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.shadow{-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-xl{-webkit-box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.shadow-inner{-webkit-box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06);box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.hover\:shadow-md:hover{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.focus\:shadow-lg:focus{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.focus\:shadow-outline:focus{-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45)}.focus\:shadow-outline-blue:focus{-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.focus\:shadow-outline-red:focus{-webkit-box-shadow:0 0 0 3px rgba(248,180,180,.45);box-shadow:0 0 0 3px rgba(248,180,180,.45)}.focus\:shadow-outline-indigo:focus{-webkit-box-shadow:0 0 0 3px rgba(180,198,252,.45);box-shadow:0 0 0 3px rgba(180,198,252,.45)}.fill-current{fill:currentColor}.table-fixed{table-layout:fixed}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#9fa6b2;color:rgba(159,166,178,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#4b5563;color:rgba(75,85,99,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#252f3f;color:rgba(37,47,63,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.text-red-400{--text-opacity:1;color:#f98080;color:rgba(249,128,128,var(--text-opacity))}.text-red-500{--text-opacity:1;color:#f05252;color:rgba(240,82,82,var(--text-opacity))}.text-red-600{--text-opacity:1;color:#e02424;color:rgba(224,36,36,var(--text-opacity))}.text-red-800{--text-opacity:1;color:#9b1c1c;color:rgba(155,28,28,var(--text-opacity))}.text-orange-400{--text-opacity:1;color:#ff8a4c;color:rgba(255,138,76,var(--text-opacity))}.text-orange-500{--text-opacity:1;color:#ff5a1f;color:rgba(255,90,31,var(--text-opacity))}.text-yellow-400{--text-opacity:1;color:#e3a008;color:rgba(227,160,8,var(--text-opacity))}.text-green-400{--text-opacity:1;color:#31c48d;color:rgba(49,196,141,var(--text-opacity))}.text-green-600{--text-opacity:1;color:#057a55;color:rgba(5,122,85,var(--text-opacity))}.text-green-800{--text-opacity:1;color:#03543f;color:rgba(3,84,63,var(--text-opacity))}.text-teal-400{--text-opacity:1;color:#16bdca;color:rgba(22,189,202,var(--text-opacity))}.text-teal-700{--text-opacity:1;color:#036672;color:rgba(3,102,114,var(--text-opacity))}.text-teal-800{--text-opacity:1;color:#05505c;color:rgba(5,80,92,var(--text-opacity))}.text-blue-400{--text-opacity:1;color:#76a9fa;color:rgba(118,169,250,var(--text-opacity))}.text-blue-500{--text-opacity:1;color:#3f83f8;color:rgba(63,131,248,var(--text-opacity))}.text-blue-700{--text-opacity:1;color:#1a56db;color:rgba(26,86,219,var(--text-opacity))}.text-blue-800{--text-opacity:1;color:#1e429f;color:rgba(30,66,159,var(--text-opacity))}.text-indigo-100{--text-opacity:1;color:#e5edff;color:rgba(229,237,255,var(--text-opacity))}.text-indigo-400{--text-opacity:1;color:#8da2fb;color:rgba(141,162,251,var(--text-opacity))}.text-indigo-500{--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.text-indigo-600{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.text-indigo-700{--text-opacity:1;color:#5145cd;color:rgba(81,69,205,var(--text-opacity))}.text-indigo-800{--text-opacity:1;color:#42389d;color:rgba(66,56,157,var(--text-opacity))}.group:hover .group-hover\:text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.group:hover .group-hover\:text-indigo-800{--text-opacity:1;color:#42389d;color:rgba(66,56,157,var(--text-opacity))}.group:focus .group-focus\:text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.group:focus .group-focus\:text-indigo-800{--text-opacity:1;color:#42389d;color:rgba(66,56,157,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-800:hover{--text-opacity:1;color:#252f3f;color:rgba(37,47,63,var(--text-opacity))}.hover\:text-gray-900:hover{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.hover\:text-blue-700:hover{--text-opacity:1;color:#1a56db;color:rgba(26,86,219,var(--text-opacity))}.hover\:text-indigo-500:hover{--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.focus\:text-gray-900:focus{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.active\:text-indigo-600:active{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.text-opacity-75{--text-opacity:0.75}.italic{font-style:italic}.not-italic{font-style:normal}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.underline{text-decoration:underline}.no-underline{text-decoration:none}.hover\:underline:hover{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.visible{visibility:visible}.whitespace-no-wrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-0{width:0}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-12{width:3rem}.w-24{width:6rem}.w-40{width:10rem}.w-56{width:14rem}.w-auto{width:auto}.w-1\.5{width:.375rem}.w-2\.5{width:.625rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-1\/12{width:8.333333%}.w-2\/12{width:16.666667%}.w-3\/12{width:25%}.w-4\/12{width:33.333333%}.w-5\/12{width:41.666667%}.w-9\/12{width:75%}.w-11\/12{width:91.666667%}.w-full{width:100%}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.gap-8{grid-gap:2rem;gap:2rem}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.origin-top-right{-webkit-transform-origin:top right;transform-origin:top right}.scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.scale-100{--transform-scale-x:1;--transform-scale-y:1}.transition-all{-webkit-transition-property:all;transition-property:all}.transition{-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform}.ease-in{-webkit-transition-timing-function:cubic-bezier(.4,0,1,1);transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-75{-webkit-transition-duration:75ms;transition-duration:75ms}.duration-100{-webkit-transition-duration:.1s;transition-duration:.1s}.duration-150{-webkit-transition-duration:.15s;transition-duration:.15s}.duration-300{-webkit-transition-duration:.3s;transition-duration:.3s}@-webkit-keyframes spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes ping{75%,to{-webkit-transform:scale(2);transform:scale(2);opacity:0}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{-webkit-transform:translateY(-25%);transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{-webkit-transform:none;transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@media (min-width:640px){.sm\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px*(1 - var(--space-y-reverse)));margin-bottom:calc(0px*var(--space-y-reverse))}.sm\:space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.75rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.75rem*var(--space-y-reverse))}.sm\:space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem*var(--space-x-reverse));margin-left:calc(1rem*(1 - var(--space-x-reverse)))}.sm\:rounded-md{border-radius:.375rem}.sm\:rounded-lg{border-radius:.5rem}.sm\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.sm\:grid{display:grid}.sm\:flex-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.sm\:items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.sm\:items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.sm\:h-10{height:2.5rem}.sm\:text-sm{font-size:.875rem}.sm\:text-2xl{font-size:1.5rem}.sm\:text-3xl{font-size:1.875rem}.sm\:leading-5{line-height:1.25rem}.sm\:leading-7{line-height:1.75rem}.sm\:leading-9{line-height:2.25rem}.sm\:my-0{margin-top:0;margin-bottom:0}.sm\:mx-0{margin-left:0;margin-right:0}.sm\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:my-12{margin-top:3rem;margin-bottom:3rem}.sm\:mt-0{margin-top:0}.sm\:ml-3{margin-left:.75rem}.sm\:ml-4{margin-left:1rem}.sm\:mt-5{margin-top:1.25rem}.sm\:max-w-lg{max-width:32rem}.sm\:p-6{padding:1.5rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-2{padding-left:.5rem;padding-right:.5rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pb-4{padding-bottom:1rem}.sm\:text-left{text-align:left}.sm\:align-middle{vertical-align:middle}.sm\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm\:w-10{width:2.5rem}.sm\:w-32{width:8rem}.sm\:w-auto{width:auto}.sm\:w-1\/2{width:50%}.sm\:w-1\/3{width:33.333333%}.sm\:w-2\/3{width:66.666667%}.sm\:w-full{width:100%}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:768px){.md\:rounded-lg{border-radius:.5rem}.md\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.md\:items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.md\:items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.md\:justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.md\:text-base{font-size:1rem}.md\:mx-0{margin-left:0;margin-right:0}.md\:my-2{margin-top:.5rem;margin-bottom:.5rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:mt-0{margin-top:0}.md\:ml-2{margin-left:.5rem}.md\:ml-4{margin-left:1rem}.md\:ml-8{margin-left:2rem}.md\:-mr-8{margin-right:-2rem}.md\:max-w-xl{max-width:36rem}.md\:max-w-5xl{max-width:64rem}.md\:p-2{padding:.5rem}.md\:p-6{padding:1.5rem}.md\:py-0{padding-top:0;padding-bottom:0}.md\:px-1{padding-left:.25rem;padding-right:.25rem}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:pb-2{padding-bottom:.5rem}.md\:pr-4{padding-right:1rem}.md\:pt-6{padding-top:1.5rem}.md\:shadow-xl{-webkit-box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.md\:w-3\/5{width:60%}}@media (min-width:1024px){.lg\:bg-transparent{background-color:transparent}.lg\:border-transparent{border-color:transparent}.lg\:rounded-full{border-radius:9999px}.lg\:block{display:block}.lg\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.lg\:inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.lg\:text-sm{font-size:.875rem}.lg\:text-lg{font-size:1.125rem}.lg\:my-0{margin-top:0;margin-bottom:0}.lg\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.lg\:my-24{margin-top:6rem;margin-bottom:6rem}.lg\:mx-auto{margin-left:auto;margin-right:auto}.lg\:ml-16{margin-left:4rem}.lg\:-mr-16{margin-right:-4rem}.lg\:max-w-3xl{max-width:48rem}.lg\:p-6{padding:1.5rem}.lg\:p-8{padding:2rem}.lg\:px-3{padding-left:.75rem;padding-right:.75rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pt-2{padding-top:.5rem}.lg\:pb-2{padding-bottom:.5rem}.lg\:pl-2{padding-left:.5rem}.lg\:top-1\/2{top:50%}.lg\:shadow-none{-webkit-box-shadow:none;box-shadow:none}.lg\:w-40{width:10rem}.lg\:w-48{width:12rem}.lg\:w-1\/2{width:50%}.lg\:w-3\/5{width:60%}.lg\:w-3\/12{width:25%}.lg\:w-7\/12{width:58.333333%}}@media (min-width:1280px){.xl\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.xl\:mr-0{margin-right:0}.xl\:ml-3{margin-left:.75rem}.xl\:ml-4{margin-left:1rem}.xl\:ml-20{margin-left:5rem}.xl\:max-w-4xl{max-width:56rem}.xl\:px-4{padding-left:1rem;padding-right:1rem}.xl\:pb-4{padding-bottom:1rem}.xl\:top-1\/3{top:33.333333%}.xl\:w-1\/4{width:25%}.xl\:w-2\/5{width:40%}.xl\:w-3\/5{width:60%}.xl\:w-2\/12{width:16.666667%}.xl\:w-7\/12{width:58.333333%}}
lite/admin/js/email-subscribers-admin.js CHANGED
@@ -55,15 +55,27 @@
55
 
56
  });
57
 
58
- $("input:radio[name='broadcast_data[scheduling_option]']").click(function() {
 
59
 
 
60
  let scheduling_option = $(this).val();
 
 
 
 
 
61
  if ( 'schedule_later' === scheduling_option ) {
62
  $('.display_schedule').removeClass('hidden');
 
 
63
  } else {
64
  $('.display_schedule').addClass('hidden');
 
65
  }
66
- });
 
 
67
 
68
  $('#preview_template').hide();
69
  $('#spam_score_modal').hide();
55
 
56
  });
57
 
58
+ let schedule_option = $('input:radio[name="broadcast_data[scheduling_option]"]:checked').val()
59
+ broadcast_send_option_change_text(schedule_option);
60
 
61
+ $("input:radio[name='broadcast_data[scheduling_option]']").click(function() {
62
  let scheduling_option = $(this).val();
63
+ broadcast_send_option_change_text(scheduling_option);
64
+
65
+ });
66
+
67
+ function broadcast_send_option_change_text( scheduling_option = 'Schedule' ) {
68
  if ( 'schedule_later' === scheduling_option ) {
69
  $('.display_schedule').removeClass('hidden');
70
+ $('.ig_es_broadcast_send_option_text').text('Schedule');
71
+
72
  } else {
73
  $('.display_schedule').addClass('hidden');
74
+ $('.ig_es_broadcast_send_option_text').text('Send');
75
  }
76
+ }
77
+
78
+
79
 
80
  $('#preview_template').hide();
81
  $('#spam_score_modal').hide();
lite/admin/partials/onboarding.php CHANGED
@@ -379,7 +379,7 @@
379
  type="button"
380
  id="es_delivery_check_processed"
381
  class="relative inline-flex items-center px-4 py-2 text-base font-medium leading-5 text-white bg-indigo-800 border border-transparent rounded-md hover:bg-indigo-600 focus:outline-none focus:shadow-outline"
382
- data-error-text="<?php echo esc_attr( 'Continue anyway →', 'email-subscribers' ); ?>"
383
  >
384
  <?php echo esc_html__('All good, let\'s finish up →', 'email-subscribers'); ?>
385
  </button>
379
  type="button"
380
  id="es_delivery_check_processed"
381
  class="relative inline-flex items-center px-4 py-2 text-base font-medium leading-5 text-white bg-indigo-800 border border-transparent rounded-md hover:bg-indigo-600 focus:outline-none focus:shadow-outline"
382
+ data-error-text="<?php echo esc_attr__( 'Continue anyway →', 'email-subscribers' ); ?>"
383
  >
384
  <?php echo esc_html__('All good, let\'s finish up →', 'email-subscribers'); ?>
385
  </button>
lite/includes/class-email-subscribers-i18n.php CHANGED
@@ -19,10 +19,10 @@ class Email_Subscribers_I18n {
19
  */
20
  public function load_plugin_textdomain() {
21
 
 
22
  load_plugin_textdomain(
23
- 'email-subscribers', false, dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/'
24
  );
25
-
26
  }
27
 
28
  }
19
  */
20
  public function load_plugin_textdomain() {
21
 
22
+ $plugin_text_domain = 'email-subscribers';
23
  load_plugin_textdomain(
24
+ $plugin_text_domain, false, dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/'
25
  );
 
26
  }
27
 
28
  }
lite/includes/class-email-subscribers.php CHANGED
@@ -688,7 +688,9 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
688
  'lite/includes/classes/class-es-form-widget.php',
689
  'lite/includes/classes/class-es-export-subscribers.php',
690
  'lite/includes/classes/class-es-import-subscribers.php',
 
691
  'lite/includes/classes/class-es-info.php',
 
692
  'lite/includes/classes/class-es-handle-post-notification.php',
693
  'lite/includes/classes/class-es-handle-subscription.php',
694
  'lite/includes/classes/class-es-handle-sync-wp-user.php',
@@ -722,13 +724,17 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
722
  // End-IG-Code.
723
  'lite/admin/class-email-subscribers-admin.php',
724
 
 
725
  // Pro Feature
726
  'lite/includes/pro-features.php',
 
727
 
728
  // Feedback Class
729
  'lite/includes/feedback/class-ig-tracker.php',
 
730
  'lite/includes/feedback/class-ig-feedback.php',
731
  'lite/includes/feedback.php',
 
732
 
733
  //Load Starter & Pro files if exists
734
  'starter/class-es-utils.php',
@@ -856,6 +862,9 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
856
 
857
  // Premium services ui components.
858
  'lite/includes/premium-services-ui/class-ig-es-premium-services-ui.php',
 
 
 
859
  );
860
 
861
  foreach ( $files_to_load as $file ) {
@@ -1148,11 +1157,7 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
1148
  public function get_es_admin_screens() {
1149
 
1150
  // TODO: Can be updated with a version check when https://core.trac.wordpress.org/ticket/18857 is fixed
1151
- if ( 'woo' === IG_ES_PLUGIN_PLAN ) {
1152
- $prefix = sanitize_title( __( 'Marketing Automation', 'email-subscribers' ) );
1153
- } else {
1154
- $prefix = sanitize_title( __( 'Email Subscribers', 'email-subscribers' ) );
1155
- }
1156
 
1157
  $screens = array(
1158
  'es_template',
@@ -1320,6 +1325,7 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
1320
  self::$instance->workflows_db = new ES_DB_Workflows();
1321
  self::$instance->trial = new IG_ES_Trial();
1322
 
 
1323
  if ( is_admin() ) {
1324
  $ig_es_feedback_class = 'IG_Feedback_V_' . str_replace( '.', '_', IG_ES_FEEDBACK_TRACKER_VERSION );
1325
 
@@ -1341,6 +1347,7 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
1341
 
1342
  $ig_es_feedback->render_deactivate_feedback();
1343
  }
 
1344
 
1345
  add_action( 'admin_init', array( self::$instance, 'add_admin_notice' ) );
1346
  add_action( 'admin_init', array( self::$instance, 'check_trial_optin_consent' ) );
@@ -1356,26 +1363,6 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
1356
  return self::$instance;
1357
  }
1358
 
1359
- /**
1360
- * Function to init action scheduler queue runner to allow immediate processing of Action Scheduler queue.
1361
- *
1362
- * @since 4.4.4
1363
- */
1364
- public function init_action_scheduler_queue_runner( $action = 'ig_es_init_queue_runner' ) {
1365
-
1366
- $admin_ajax_url = admin_url( 'admin-ajax.php' );
1367
- $admin_ajax_url = add_query_arg( 'action', $action, $admin_ajax_url );
1368
- $args = array(
1369
- 'timeout' => 0.01,
1370
- 'blocking' => false,
1371
- 'cookies' => $_COOKIE,
1372
- 'sslverify' => apply_filters( 'https_local_ssl_verify', false ),
1373
- );
1374
-
1375
- // Make a asynchronous request to our ajax handler function which in turn calls Action Schedulers' queue runner to start immediate processing in background.
1376
- wp_remote_get( esc_url_raw( $admin_ajax_url ), $args );
1377
- }
1378
-
1379
  /**
1380
  * Method to get plugin plan
1381
  *
@@ -1478,5 +1465,51 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
1478
  }
1479
  }
1480
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1481
  }
1482
  }
688
  'lite/includes/classes/class-es-form-widget.php',
689
  'lite/includes/classes/class-es-export-subscribers.php',
690
  'lite/includes/classes/class-es-import-subscribers.php',
691
+ // Start-IG-Code.
692
  'lite/includes/classes/class-es-info.php',
693
+ // End-IG-Code.
694
  'lite/includes/classes/class-es-handle-post-notification.php',
695
  'lite/includes/classes/class-es-handle-subscription.php',
696
  'lite/includes/classes/class-es-handle-sync-wp-user.php',
724
  // End-IG-Code.
725
  'lite/admin/class-email-subscribers-admin.php',
726
 
727
+ // Start-IG-Code.
728
  // Pro Feature
729
  'lite/includes/pro-features.php',
730
+ // End-IG-Code.
731
 
732
  // Feedback Class
733
  'lite/includes/feedback/class-ig-tracker.php',
734
+ // Start-IG-Code.
735
  'lite/includes/feedback/class-ig-feedback.php',
736
  'lite/includes/feedback.php',
737
+ // End-IG-Code.
738
 
739
  //Load Starter & Pro files if exists
740
  'starter/class-es-utils.php',
862
 
863
  // Premium services ui components.
864
  'lite/includes/premium-services-ui/class-ig-es-premium-services-ui.php',
865
+
866
+ // Background Process Helper
867
+ 'lite/includes/classes/class-ig-es-background-process-helper.php',
868
  );
869
 
870
  foreach ( $files_to_load as $file ) {
1157
  public function get_es_admin_screens() {
1158
 
1159
  // TODO: Can be updated with a version check when https://core.trac.wordpress.org/ticket/18857 is fixed
1160
+ $prefix = $this->get_admin_page_prefix();
 
 
 
 
1161
 
1162
  $screens = array(
1163
  'es_template',
1325
  self::$instance->workflows_db = new ES_DB_Workflows();
1326
  self::$instance->trial = new IG_ES_Trial();
1327
 
1328
+ // Start-IG-Code.
1329
  if ( is_admin() ) {
1330
  $ig_es_feedback_class = 'IG_Feedback_V_' . str_replace( '.', '_', IG_ES_FEEDBACK_TRACKER_VERSION );
1331
 
1347
 
1348
  $ig_es_feedback->render_deactivate_feedback();
1349
  }
1350
+ // End-IG-Code.
1351
 
1352
  add_action( 'admin_init', array( self::$instance, 'add_admin_notice' ) );
1353
  add_action( 'admin_init', array( self::$instance, 'check_trial_optin_consent' ) );
1363
  return self::$instance;
1364
  }
1365
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1366
  /**
1367
  * Method to get plugin plan
1368
  *
1465
  }
1466
  }
1467
 
1468
+ /**
1469
+ * Method to get admin menu title.
1470
+ *
1471
+ * @return string $menu_title Admin menu title
1472
+ *
1473
+ * @since 4.6.3
1474
+ */
1475
+ public function get_admin_menu_title() {
1476
+
1477
+ global $ig_es_tracker;
1478
+
1479
+ $menu_title = __( 'Email Subscribers', 'email-subscribers' );
1480
+
1481
+ if ( 'woo' === IG_ES_PLUGIN_PLAN ) {
1482
+ $menu_title = __( 'Icegram', 'email-subscribers' );
1483
+
1484
+ $icegram_lite_plugin_slug = 'icegram/icegram.php';
1485
+ $icegram_premium_plugin_slug = 'icegram-engage/icegram-engage.php';
1486
+
1487
+ $icegram_lite_installed = $ig_es_tracker::is_plugin_installed( $icegram_lite_plugin_slug );
1488
+ $icegram_premium_installed = $ig_es_tracker::is_plugin_installed( $icegram_premium_plugin_slug );
1489
+
1490
+ // Change Woo Plugin's menu name if Icegram or Icegram premium plugin is installed on the site.
1491
+ if ( $icegram_lite_installed || $icegram_premium_installed ) {
1492
+ $menu_title = __( 'Icegram WC', 'email-subscribers' );
1493
+ }
1494
+ }
1495
+
1496
+ return $menu_title;
1497
+ }
1498
+
1499
+ /**
1500
+ * Method to get admin menu page prefix.
1501
+ *
1502
+ * @return string $page_prefix Admin menu page prefix.
1503
+ *
1504
+ * @since 4.6.3
1505
+ */
1506
+ public function get_admin_page_prefix() {
1507
+
1508
+ $menu_title = $this->get_admin_menu_title();
1509
+ $page_prefix = sanitize_title( $menu_title );
1510
+
1511
+ return $page_prefix;
1512
+ }
1513
+
1514
  }
1515
  }
lite/includes/class-es-install.php CHANGED
@@ -225,6 +225,12 @@ if ( ! class_exists( 'ES_Install' ) ) {
225
  'ig_es_update_457_db_version',
226
  ),
227
 
 
 
 
 
 
 
228
  );
229
 
230
  /**
@@ -872,6 +878,7 @@ if ( ! class_exists( 'ES_Install' ) ) {
872
  `last_name` varchar(50) DEFAULT NULL,
873
  `email` varchar(50) NOT NULL,
874
  `source` varchar(50) DEFAULT NULL,
 
875
  `form_id` int(10) NOT NULL DEFAULT '0',
876
  `status` varchar(10) DEFAULT NULL,
877
  `unsubscribed` tinyint(1) NOT NULL DEFAULT '0',
225
  'ig_es_update_457_db_version',
226
  ),
227
 
228
+ '4.6.3' => array(
229
+ 'ig_es_update_463_alter_contacts_table',
230
+ 'ig_es_migrate_ip_from_list_contacts_to_contacts_table',
231
+ 'ig_es_update_463_db_version',
232
+ ),
233
+
234
  );
235
 
236
  /**
878
  `last_name` varchar(50) DEFAULT NULL,
879
  `email` varchar(50) NOT NULL,
880
  `source` varchar(50) DEFAULT NULL,
881
+ `ip_address` varchar(50) DEFAULT NULL,
882
  `form_id` int(10) NOT NULL DEFAULT '0',
883
  `status` varchar(10) DEFAULT NULL,
884
  `unsubscribed` tinyint(1) NOT NULL DEFAULT '0',
lite/includes/classes/class-es-admin-settings.php CHANGED
@@ -223,6 +223,7 @@ class ES_Admin_Settings {
223
  'default' => '',
224
  ),
225
 
 
226
  'ig_es_post_image_size' => array(
227
  'id' => 'ig_es_post_image_size',
228
  'name' => __( 'Image size', 'email-subscribers' ),
@@ -231,6 +232,7 @@ class ES_Admin_Settings {
231
  'desc' => __( 'Select image size for {{POSTIMAGE}} to be shown in the Post Notification emails.', 'email-subscribers' ),
232
  'default' => 'full',
233
  ),
 
234
 
235
  'ig_es_track_email_opens' => array(
236
  'id' => 'ig_es_track_email_opens',
223
  'default' => '',
224
  ),
225
 
226
+ // Start-IG-Code.
227
  'ig_es_post_image_size' => array(
228
  'id' => 'ig_es_post_image_size',
229
  'name' => __( 'Image size', 'email-subscribers' ),
232
  'desc' => __( 'Select image size for {{POSTIMAGE}} to be shown in the Post Notification emails.', 'email-subscribers' ),
233
  'default' => 'full',
234
  ),
235
+ // End-IG-Code.
236
 
237
  'ig_es_track_email_opens' => array(
238
  'id' => 'ig_es_track_email_opens',
lite/includes/classes/class-es-campaigns-table.php CHANGED
@@ -376,6 +376,8 @@ class ES_Campaigns_Table extends WP_List_Table {
376
  public function column_name( $item ) {
377
  global $wpdb;
378
 
 
 
379
  $type = $item['type'];
380
 
381
  $nonce = wp_create_nonce( 'es_post_notification' );
@@ -436,7 +438,15 @@ class ES_Campaigns_Table extends WP_List_Table {
436
  /* translators: 1: Slug 2: View Action 3: Hash 4. WP Nonce */
437
  $actions['report'] = sprintf( '<a href="?page=%s&action=%s&list=%s&_wpnonce=%s" class="text-indigo-600">%s</a>', esc_attr( 'es_reports' ), 'view', $report['hash'], $es_nonce, __( 'Report', 'email-subscribers' ) );
438
  }
 
 
439
  }
 
 
 
 
 
 
440
  /* translators: 1: Slug 2: Delete Action 3: ID 4. WP Nonce */
441
  $actions['delete'] = sprintf( __( '<a href="?page=%1$s&action=%2$s&list=%3$s&_wpnonce=%4$s" onclick="return checkDelete()">Delete</a>', 'email-subscribers' ), esc_attr( 'es_campaigns' ), 'delete', absint( $item['id'] ), $nonce );
442
 
@@ -684,6 +694,7 @@ class ES_Campaigns_Table extends WP_List_Table {
684
  }
685
 
686
  public function process_bulk_action() {
 
687
 
688
  if ( 'delete' === $this->current_action() ) {
689
 
@@ -694,7 +705,6 @@ class ES_Campaigns_Table extends WP_List_Table {
694
  $message = __( 'You are not allowed to delete campaign.', 'email-subscribers' );
695
  $status = 'error';
696
  } else {
697
- $campaign_id = ig_es_get_request_data( 'list' );
698
 
699
  $this->db->delete_campaigns( $campaign_id );
700
  $message = __( 'Campaign deleted successfully!', 'email-subscribers' );
@@ -703,6 +713,9 @@ class ES_Campaigns_Table extends WP_List_Table {
703
 
704
  ES_Common::show_message( $message, $status );
705
  }
 
 
 
706
 
707
  $action = ig_es_get_request_data( 'action' );
708
  $action2 = ig_es_get_request_data( 'action2' );
376
  public function column_name( $item ) {
377
  global $wpdb;
378
 
379
+ $actions = array();
380
+
381
  $type = $item['type'];
382
 
383
  $nonce = wp_create_nonce( 'es_post_notification' );
438
  /* translators: 1: Slug 2: View Action 3: Hash 4. WP Nonce */
439
  $actions['report'] = sprintf( '<a href="?page=%s&action=%s&list=%s&_wpnonce=%s" class="text-indigo-600">%s</a>', esc_attr( 'es_reports' ), 'view', $report['hash'], $es_nonce, __( 'Report', 'email-subscribers' ) );
440
  }
441
+
442
+
443
  }
444
+
445
+ $campaign_type = array( 'post_notification', 'post_digest' );
446
+ if ( ! in_array( $item['type'], $campaign_type ) ) {
447
+ $actions = apply_filters( 'ig_es_campaign_actions', $actions, $item );
448
+ }
449
+
450
  /* translators: 1: Slug 2: Delete Action 3: ID 4. WP Nonce */
451
  $actions['delete'] = sprintf( __( '<a href="?page=%1$s&action=%2$s&list=%3$s&_wpnonce=%4$s" onclick="return checkDelete()">Delete</a>', 'email-subscribers' ), esc_attr( 'es_campaigns' ), 'delete', absint( $item['id'] ), $nonce );
452
 
694
  }
695
 
696
  public function process_bulk_action() {
697
+ $campaign_id = ig_es_get_request_data( 'list' );
698
 
699
  if ( 'delete' === $this->current_action() ) {
700
 
705
  $message = __( 'You are not allowed to delete campaign.', 'email-subscribers' );
706
  $status = 'error';
707
  } else {
 
708
 
709
  $this->db->delete_campaigns( $campaign_id );
710
  $message = __( 'Campaign deleted successfully!', 'email-subscribers' );
713
 
714
  ES_Common::show_message( $message, $status );
715
  }
716
+ $campaign_action = $this->current_action();
717
+
718
+ do_action( 'ig_es_campaign_action', $campaign_id, $campaign_action );
719
 
720
  $action = ig_es_get_request_data( 'action' );
721
  $action2 = ig_es_get_request_data( 'action2' );
lite/includes/classes/class-es-contacts-table.php CHANGED
@@ -143,7 +143,7 @@ class ES_Contacts_Table extends WP_List_Table {
143
  'url' => add_query_arg( 'action', 'export', 'admin.php?page=es_subscribers' ),
144
  ),
145
  // Start-IG-Code.
146
- /*
147
  'sync' => array(
148
  'label' => __( 'Sync', 'email-subscribers' ),
149
  'indicator_option' => 'ig_es_show_sync_tab',
@@ -152,7 +152,7 @@ class ES_Contacts_Table extends WP_List_Table {
152
  'action' => 'sync',
153
  'url' => add_query_arg( 'action', 'sync', 'admin.php?page=es_subscribers' ),
154
  ),
155
- */
156
  // End-IG-Code.
157
  'manage_lists' => array(
158
  'label' => __( 'Manage Lists', 'email-subscribers' ),
@@ -862,6 +862,9 @@ class ES_Contacts_Table extends WP_List_Table {
862
  return $this->get_lists_to_show( $item['id'] );
863
  case 'created_at':
864
  return ig_es_format_date_time( $item[ $column_name ] );
 
 
 
865
  case 'first_name':
866
  case 'email':
867
  default:
@@ -1012,6 +1015,7 @@ class ES_Contacts_Table extends WP_List_Table {
1012
  'name' => __( 'Name', 'email-subscribers' ),
1013
  'email' => __( 'Email', 'email-subscribers' ),
1014
  'lists' => __( 'List(s)', 'email-subscribers' ),
 
1015
  'created_at' => __( 'Created', 'email-subscribers' ),
1016
  );
1017
 
143
  'url' => add_query_arg( 'action', 'export', 'admin.php?page=es_subscribers' ),
144
  ),
145
  // Start-IG-Code.
146
+ /*
147
  'sync' => array(
148
  'label' => __( 'Sync', 'email-subscribers' ),
149
  'indicator_option' => 'ig_es_show_sync_tab',
152
  'action' => 'sync',
153
  'url' => add_query_arg( 'action', 'sync', 'admin.php?page=es_subscribers' ),
154
  ),
155
+ */
156
  // End-IG-Code.
157
  'manage_lists' => array(
158
  'label' => __( 'Manage Lists', 'email-subscribers' ),
862
  return $this->get_lists_to_show( $item['id'] );
863
  case 'created_at':
864
  return ig_es_format_date_time( $item[ $column_name ] );
865
+ case 'ip':
866
+ $subscribed_ip = ! empty ( $item['ip_address'] ) ? $item['ip_address'] : '-' ;
867
+ return $subscribed_ip;
868
  case 'first_name':
869
  case 'email':
870
  default:
1015
  'name' => __( 'Name', 'email-subscribers' ),
1016
  'email' => __( 'Email', 'email-subscribers' ),
1017
  'lists' => __( 'List(s)', 'email-subscribers' ),
1018
+ 'ip' => __( 'IP', 'email-subscribers' ),
1019
  'created_at' => __( 'Created', 'email-subscribers' ),
1020
  );
1021
 
lite/includes/classes/class-es-forms-table.php CHANGED
@@ -463,7 +463,7 @@ class ES_Forms_Table extends WP_List_Table {
463
  <span><b class="text-sm font-normal text-gray-600 pb-2">
464
  <?php
465
  /* translators: %s: Create list page url */
466
- echo sprintf( esc_html__('List not found. Please %s', 'email-subscribers' ), '<a href="' . esc_url( $create_list_link ) . '"> ' . esc_html( 'create your first list', 'email-subscribers') . '</a>' );
467
  ?>
468
  </b></span>
469
  <?php } ?>
@@ -832,6 +832,8 @@ class ES_Forms_Table extends WP_List_Table {
832
 
833
  return '<code id="es-shortcode">' . $shortcode . '</code>';
834
  break;
 
 
835
  default:
836
  return '';
837
  }
@@ -883,10 +885,11 @@ class ES_Forms_Table extends WP_List_Table {
883
  */
884
  public function get_columns() {
885
  $columns = array(
886
- 'cb' => '<input type="checkbox" />',
887
- 'name' => __( 'Name', 'email-subscribers' ),
888
- 'shortcode' => __( 'Shortcode', 'email-subscribers' ),
889
- 'created_at' => __( 'Created', 'email-subscribers' ),
 
890
  );
891
 
892
  return $columns;
463
  <span><b class="text-sm font-normal text-gray-600 pb-2">
464
  <?php
465
  /* translators: %s: Create list page url */
466
+ echo sprintf( esc_html__('List not found. Please %s', 'email-subscribers' ), '<a href="' . esc_url( $create_list_link ) . '"> ' . esc_html__( 'create your first list', 'email-subscribers') . '</a>' );
467
  ?>
468
  </b></span>
469
  <?php } ?>
832
 
833
  return '<code id="es-shortcode">' . $shortcode . '</code>';
834
  break;
835
+ case 'total_active_subscribers':
836
+ return ES()->contacts_db->get_total_contacts_by_form_id( $item['id'] );
837
  default:
838
  return '';
839
  }
885
  */
886
  public function get_columns() {
887
  $columns = array(
888
+ 'cb' => '<input type="checkbox" />',
889
+ 'name' => __( 'Name', 'email-subscribers' ),
890
+ 'shortcode' => __( 'Shortcode', 'email-subscribers' ),
891
+ 'total_active_subscribers' => __( 'Subscribers', 'email-subscribers' ),
892
+ 'created_at' => __( 'Created', 'email-subscribers' ),
893
  );
894
 
895
  return $columns;
lite/includes/classes/class-es-handle-post-notification.php CHANGED
@@ -82,81 +82,59 @@ class ES_Handle_Post_Notification {
82
  $notifications = ES()->campaigns_db->get_campaigns_by_post_id( $post_id );
83
 
84
  if ( count( $notifications ) > 0 ) {
85
- $existing_contacts = array();
86
  foreach ( $notifications as $notification ) {
87
  $template_id = $notification['base_template_id'];
88
  $template = get_post( $template_id ); // to confirm if template exists in ES->Templates
89
  if ( is_object( $template ) ) {
90
  $list_id = $notification['list_ids'];
91
  $list_id = explode( ',', $list_id );
92
- $subscribers = ES()->contacts_db->get_active_contacts_by_list_id( $list_id );
93
 
94
- // schedule
95
- if ( count( $subscribers ) > 0 ) {
96
- /*
97
- * Prepare Subject
98
- * Prepare Body
99
- * Add entry into sent_details table
100
- * Add entry into deliverreport table
101
- */
102
-
103
- foreach ( $subscribers as $key => $subscriber ) {
104
- if ( in_array( $subscriber['id'], $existing_contacts ) ) {
105
- unset( $subscribers[ $key ] );
106
- } else {
107
- $existing_contacts[] = $subscriber['id'];
108
- }
109
- }
110
  /*
111
- check again for unique subscribers count
112
- if unique count it 0 then skip this report
 
113
  */
114
- if ( count( $subscribers ) <= 0 ) {
115
- continue;
116
- }
117
 
118
- $post = get_post( $post_id );
119
-
120
- if ( is_object( $post ) ) {
121
- // Prepare subject
122
- $post_subject = self::prepare_subject( $post, $template );
123
-
124
- // Prepare body
125
- $template_content = $template->post_content;
126
- $post_content = self::prepare_body( $template_content, $post_id, $template_id );
127
-
128
- $guid = ES_Common::generate_guid( 6 );
129
-
130
- $data = array(
131
- 'hash' => $guid,
132
- 'campaign_id' => $notification['id'],
133
- 'subject' => $post_subject,
134
- 'body' => $post_content,
135
- 'count' => count( $subscribers ),
136
- 'status' => 'In Queue',
137
- 'start_at' => '',
138
- 'finish_at' => '',
139
- 'created_at' => ig_get_current_date_time(),
140
- 'updated_at' => ig_get_current_date_time(),
141
- 'meta' => maybe_serialize(
142
- array(
143
- 'post_id' => $post_id,
144
- 'type' => 'post_notification',
145
- )
146
- ),
 
 
 
 
 
147
  );
148
-
149
- // Add entry into mailing queue table
150
- $insert = ES_DB_Mailing_Queue::add_notification( $data );
151
- if ( $insert ) {
152
- // Add entry into sending queue table
153
- $delivery_data = array();
154
- $delivery_data['hash'] = $guid;
155
- $delivery_data['subscribers'] = $subscribers;
156
- $delivery_data['campaign_id'] = $notification['id'];
157
- $delivery_data['mailing_queue_id'] = $insert;
158
- ES_DB_Sending_Queue::do_batch_insert( $delivery_data );
159
- }
160
  }
161
  }
162
  }
82
  $notifications = ES()->campaigns_db->get_campaigns_by_post_id( $post_id );
83
 
84
  if ( count( $notifications ) > 0 ) {
 
85
  foreach ( $notifications as $notification ) {
86
  $template_id = $notification['base_template_id'];
87
  $template = get_post( $template_id ); // to confirm if template exists in ES->Templates
88
  if ( is_object( $template ) ) {
89
  $list_id = $notification['list_ids'];
90
  $list_id = explode( ',', $list_id );
 
91
 
92
+ $post = get_post( $post_id );
93
+
94
+ if ( is_object( $post ) ) {
95
+
 
 
 
 
 
 
 
 
 
 
 
 
96
  /*
97
+ * Prepare Subject
98
+ * Prepare Body
99
+ * Add entry into mailing queue table
100
  */
 
 
 
101
 
102
+ // Prepare subject
103
+ $post_subject = self::prepare_subject( $post, $template );
104
+
105
+ // Prepare body
106
+ $template_content = $template->post_content;
107
+ $post_content = self::prepare_body( $template_content, $post_id, $template_id );
108
+
109
+ $guid = ES_Common::generate_guid( 6 );
110
+
111
+ $data = array(
112
+ 'hash' => $guid,
113
+ 'campaign_id' => $notification['id'],
114
+ 'subject' => $post_subject,
115
+ 'body' => $post_content,
116
+ 'count' => 0, // Subscribers count would be updated through background process when they are added in the sending_queue table.
117
+ 'status' => 'Queueing',
118
+ 'start_at' => '',
119
+ 'finish_at' => '',
120
+ 'created_at' => ig_get_current_date_time(),
121
+ 'updated_at' => ig_get_current_date_time(),
122
+ 'meta' => maybe_serialize(
123
+ array(
124
+ 'post_id' => $post_id,
125
+ 'type' => 'post_notification',
126
+ )
127
+ ),
128
+ );
129
+
130
+ // Add entry into mailing queue table
131
+ $mailing_queue_id = ES_DB_Mailing_Queue::add_notification( $data );
132
+ if ( $mailing_queue_id ) {
133
+ $action_args = array(
134
+ 'mailing_queue_id' => $mailing_queue_id,
135
+ 'list_ids' => $list_id,
136
  );
137
+ IG_ES_Background_Process_Helper::add_action_scheduler_task( 'ig_es_add_subscribers_to_sending_queue', $action_args );
 
 
 
 
 
 
 
 
 
 
 
138
  }
139
  }
140
  }
lite/includes/classes/class-es-newsletters.php CHANGED
@@ -29,9 +29,6 @@ class ES_Newsletters {
29
  // Ajax handler for broadcast preview
30
  add_action( 'wp_ajax_ig_es_preview_broadcast', array( $this, 'preview_broadcast' ) );
31
 
32
- // Ajax handler for starting processing of broadcast in background when 'Send Now' option is chosen while creating broadcast
33
- add_action( 'wp_ajax_ig_es_trigger_broadcast_processing', array( $this, 'trigger_broadcast_processing' ) );
34
-
35
  add_action( 'admin_init', array( $this, 'process_broadcast_submission' ) );
36
 
37
  // Add tracking fields data
@@ -84,10 +81,6 @@ class ES_Newsletters {
84
 
85
  self::es_send_email_callback( $broadcast_data );
86
 
87
- if ( 'schedule_now' === $meta['scheduling_option'] ) {
88
- ES()->init_action_scheduler_queue_runner( 'ig_es_trigger_broadcast_processing' );
89
- }
90
-
91
  $campaign_url = admin_url( 'admin.php?page=es_campaigns&action=broadcast_created' );
92
 
93
  wp_safe_redirect( $campaign_url );
@@ -320,11 +313,15 @@ class ES_Newsletters {
320
  // If broadcast is sent or being sent then don't allow scheduling to conflicts.
321
  if ( ! $is_broadcast_processing ) {
322
  ?>
323
- <button type="submit" id="ig_es_broadcast_submitted" name="ig_es_broadcast_submitted" class="inline-flex justify-center py-1.5 text-sm font-medium leading-5 text-white transition duration-150 ease-in-out bg-indigo-600 border border-transparent rounded-md md:px-2 lg:px-3 xl:px-4 hover:bg-indigo-500 hover:text-white"
324
  value="submitted">
325
  <?php
326
- if ( ES()->is_pro() ) {
327
- echo esc_html__( 'Schedule', 'email-subscribers' );
 
 
 
 
328
  } else {
329
  echo esc_html__( 'Send', 'email-subscribers' );
330
  }
@@ -396,6 +393,8 @@ class ES_Newsletters {
396
  echo wp_kses( $lists, $allowedtags );
397
  ?>
398
  </select>
 
 
399
  <div class="block mt-1">
400
  <span id="ig_es_total_contacts"></span>
401
  </div>
@@ -539,19 +538,24 @@ class ES_Newsletters {
539
 
540
  if ( ! empty( $campaign_id ) ) {
541
 
 
 
 
 
 
 
 
542
  ES()->campaigns_db->save_campaign( $data, $campaign_id );
543
 
544
  $notification = ES_DB_Mailing_Queue::get_notification_by_campaign_id( $campaign_id );
545
  $data['body'] = ES_Common::es_process_template_body( $data['body'], $data['base_template_id'], $campaign_id );
546
 
547
- $subscribers = ES()->contacts_db->get_active_contacts_by_list_id( $list_id );
548
  $guid = ES_Common::generate_guid( 6 );
549
  $data = array(
550
  'hash' => $guid,
551
  'campaign_id' => $campaign_id,
552
  'subject' => $data['subject'],
553
  'body' => $data['body'],
554
- 'count' => count( $subscribers ),
555
  'status' => 'In Queue',
556
  'start_at' => ! empty( $data['start_at'] ) ? $data['start_at'] : '',
557
  'finish_at' => '',
@@ -560,16 +564,16 @@ class ES_Newsletters {
560
  'meta' => maybe_serialize( array( 'type' => 'newsletter' ) ),
561
  );
562
 
 
 
 
 
563
  if ( empty( $notification ) ) {
564
- $last_report_id = ES_DB_Mailing_Queue::add_notification( $data );
565
- if ( ! empty( $subscribers ) && count( $subscribers ) > 0 ) {
566
- $delivery_data = array();
567
- $delivery_data['hash'] = $guid;
568
- $delivery_data['subscribers'] = $subscribers;
569
- $delivery_data['campaign_id'] = $campaign_id;
570
- $delivery_data['mailing_queue_id'] = $last_report_id;
571
- ES_DB_Sending_Queue::do_batch_insert( $delivery_data );
572
- }
573
  } else {
574
  $notification_id = $notification['id'];
575
  $notification_status = $notification['status'];
@@ -579,9 +583,32 @@ class ES_Newsletters {
579
  $data['hash'] = $notification['hash'];
580
  $data['campaign_id'] = $notification['campaign_id'];
581
  $data['created_at'] = $notification['created_at'];
 
 
 
 
 
 
 
 
 
 
 
582
  $notification = ES_DB_Mailing_Queue::update_notification( $notification_id, $data );
583
  }
584
  }
 
 
 
 
 
 
 
 
 
 
 
 
585
  }
586
  }
587
 
@@ -812,19 +839,6 @@ class ES_Newsletters {
812
  return $preview_data;
813
  }
814
 
815
- /**
816
- * Method to trigger immediate processing of broadcast with "Send Now" option.
817
- *
818
- * @return void
819
- *
820
- * @since 4.4.7
821
- */
822
- public function trigger_broadcast_processing() {
823
-
824
- // Start processing of broadcast which are scheduled for current date time.
825
- do_action( 'ig_es_cron_worker' );
826
- }
827
-
828
  /**
829
  * Function to add values of checkbox fields incase they are not checked.
830
  *
29
  // Ajax handler for broadcast preview
30
  add_action( 'wp_ajax_ig_es_preview_broadcast', array( $this, 'preview_broadcast' ) );
31
 
 
 
 
32
  add_action( 'admin_init', array( $this, 'process_broadcast_submission' ) );
33
 
34
  // Add tracking fields data
81
 
82
  self::es_send_email_callback( $broadcast_data );
83
 
 
 
 
 
84
  $campaign_url = admin_url( 'admin.php?page=es_campaigns&action=broadcast_created' );
85
 
86
  wp_safe_redirect( $campaign_url );
313
  // If broadcast is sent or being sent then don't allow scheduling to conflicts.
314
  if ( ! $is_broadcast_processing ) {
315
  ?>
316
+ <button type="submit" id="ig_es_broadcast_submitted" name="ig_es_broadcast_submitted" class="w-24 inline-flex justify-center py-1.5 text-sm font-medium leading-5 text-white transition duration-150 ease-in-out bg-indigo-600 border border-transparent rounded-md md:px-2 lg:px-3 xl:px-4 hover:bg-indigo-500 hover:text-white"
317
  value="submitted">
318
  <?php
319
+ if ( ES()->is_pro() ) {
320
+ ?>
321
+ <span class="ig_es_broadcast_send_option_text">
322
+ <?php echo esc_html__( 'Schedule', 'email-subscribers' ); ?>
323
+ </span>
324
+ <?php
325
  } else {
326
  echo esc_html__( 'Send', 'email-subscribers' );
327
  }
393
  echo wp_kses( $lists, $allowedtags );
394
  ?>
395
  </select>
396
+ <!-- Hidden field to detect whether admin has update campaign lists or not during editing of campaign -->
397
+ <input type="hidden" name="broadcast_data[existing_list_ids]" value="<?php echo esc_attr( $list_ids ); ?>">
398
  <div class="block mt-1">
399
  <span id="ig_es_total_contacts"></span>
400
  </div>
538
 
539
  if ( ! empty( $campaign_id ) ) {
540
 
541
+ $existing_list_ids = ! empty( $data['existing_list_ids'] ) ? $data['existing_list_ids'] : '';
542
+ $selected_list_ids = is_array( $list_id ) ? $list_id : array( $list_id );
543
+
544
+ if ( ! empty( $existing_list_ids ) ) {
545
+ $existing_list_ids = explode( ',', $existing_list_ids );
546
+ }
547
+
548
  ES()->campaigns_db->save_campaign( $data, $campaign_id );
549
 
550
  $notification = ES_DB_Mailing_Queue::get_notification_by_campaign_id( $campaign_id );
551
  $data['body'] = ES_Common::es_process_template_body( $data['body'], $data['base_template_id'], $campaign_id );
552
 
 
553
  $guid = ES_Common::generate_guid( 6 );
554
  $data = array(
555
  'hash' => $guid,
556
  'campaign_id' => $campaign_id,
557
  'subject' => $data['subject'],
558
  'body' => $data['body'],
 
559
  'status' => 'In Queue',
560
  'start_at' => ! empty( $data['start_at'] ) ? $data['start_at'] : '',
561
  'finish_at' => '',
564
  'meta' => maybe_serialize( array( 'type' => 'newsletter' ) ),
565
  );
566
 
567
+ $should_queue_emails = false;
568
+ $mailing_queue_id = 0;
569
+
570
+ // Add notification to mailing queue if not already added.
571
  if ( empty( $notification ) ) {
572
+ // We need to set mailing queue status to Queueing to ensure it is not picked by Cron(WP Cron or ES Cron) before all of its subscribers are added to the sending queue.
573
+ $data['status'] = 'Queueing';
574
+ $data['count'] = 0; // Count would be added in background process after all subscribers are added in the sending_queue table.
575
+ $mailing_queue_id = ES_DB_Mailing_Queue::add_notification( $data );
576
+ $should_queue_emails = true;
 
 
 
 
577
  } else {
578
  $notification_id = $notification['id'];
579
  $notification_status = $notification['status'];
583
  $data['hash'] = $notification['hash'];
584
  $data['campaign_id'] = $notification['campaign_id'];
585
  $data['created_at'] = $notification['created_at'];
586
+
587
+ // Check if list has been updated, if yes then we need to delete emails from existing lists and requeue the emails from the updated lists.
588
+ if ( $selected_list_ids !== $existing_list_ids ) {
589
+ $should_queue_emails = true;
590
+ $mailing_queue_id = $notification_id;
591
+ $data['count'] = 0;
592
+ $data['status'] = 'Queueing';
593
+ } else {
594
+ $data['count'] = $notification['count'];
595
+ }
596
+
597
  $notification = ES_DB_Mailing_Queue::update_notification( $notification_id, $data );
598
  }
599
  }
600
+
601
+ if ( ! empty( $mailing_queue_id ) && $should_queue_emails ) {
602
+
603
+ // Delete existing sending queue if any already present.
604
+ ES_DB_Sending_Queue::delete_sending_queue_by_mailing_id( array( $mailing_queue_id ) );
605
+
606
+ $action_args = array(
607
+ 'mailing_queue_id' => $mailing_queue_id,
608
+ 'list_ids' => $list_id,
609
+ );
610
+ IG_ES_Background_Process_Helper::add_action_scheduler_task( 'ig_es_add_subscribers_to_sending_queue', $action_args );
611
+ }
612
  }
613
  }
614
 
839
  return $preview_data;
840
  }
841
 
 
 
 
 
 
 
 
 
 
 
 
 
 
842
  /**
843
  * Function to add values of checkbox fields incase they are not checked.
844
  *
lite/includes/classes/class-es-queue.php CHANGED
@@ -41,6 +41,17 @@ if ( ! class_exists( 'ES_Queue' ) ) {
41
  // add_action( 'ig_es_email_sending_error', array( &$this, 'set_status_in_queue' ), 10, 4 );
42
  add_action( 'ig_es_message_sent', array( &$this, 'set_sent_status' ), 10, 3 );
43
  add_action( 'ig_es_message_sent', array( &$this, 'update_email_sent_count' ), 10, 3 );
 
 
 
 
 
 
 
 
 
 
 
44
  }
45
 
46
  /**
@@ -67,7 +78,7 @@ if ( ! class_exists( 'ES_Queue' ) ) {
67
  * Steps
68
  * 1. Fetch all active campaigns
69
  * 2. Loop over through and based on matched condition put campaign into mailing_queue table
70
- * 3. And also insert subscribers for respective campaign into sending_queue_table
71
  * 4. Call es cron to send emails from queue
72
  */
73
  static $campaigns_to_process;
@@ -154,10 +165,15 @@ if ( ! class_exists( 'ES_Queue' ) ) {
154
 
155
  if ( is_array( $result ) ) {
156
 
157
- $queue_id = $result['id'];
158
- $hash = $result['hash'];
159
-
160
- $this->add_contacts_to_queue( $campaign_id, $hash, $queue_id, $contacts );
 
 
 
 
 
161
  }
162
  }
163
  }
@@ -346,8 +362,8 @@ if ( ! class_exists( 'ES_Queue' ) ) {
346
  'campaign_id' => $campaign_id,
347
  'subject' => $subject,
348
  'body' => $content,
349
- 'count' => $total_contacts,
350
- 'status' => 'In Queue',
351
  'start_at' => ! empty( $campaign['start_at'] ) ? $campaign['start_at'] : '',
352
  'finish_at' => '',
353
  'created_at' => ig_get_current_date_time(),
@@ -368,7 +384,7 @@ if ( ! class_exists( 'ES_Queue' ) ) {
368
  }
369
 
370
  /**
371
- * Add contacts into sending_queue_table
372
  *
373
  * @param $campaign_id
374
  * @param $guid
@@ -805,7 +821,113 @@ if ( ! class_exists( 'ES_Queue' ) ) {
805
  $this->update_email_sent_status( $contact_id, $campaign_id, $message_id, 'In Queue' );
806
  }
807
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
808
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
809
  }
810
  }
811
 
41
  // add_action( 'ig_es_email_sending_error', array( &$this, 'set_status_in_queue' ), 10, 4 );
42
  add_action( 'ig_es_message_sent', array( &$this, 'set_sent_status' ), 10, 3 );
43
  add_action( 'ig_es_message_sent', array( &$this, 'update_email_sent_count' ), 10, 3 );
44
+
45
+ // Action scheduler action to add subscribers to sending_queue table in background. Called through Action Scheduler library.
46
+ add_action( 'ig_es_add_subscribers_to_sending_queue', array( &$this, 'add_subscribers_to_sending_queue' ) );
47
+
48
+ // Ajax handler for running action scheduler task.
49
+ add_action( 'wp_ajax_ig_es_run_action_scheduler_task', array( 'IG_ES_Background_Process_Helper', 'run_action_scheduler_task' ) );
50
+ add_action( 'wp_ajax_nopriv_ig_es_run_action_scheduler_task', array( 'IG_ES_Background_Process_Helper', 'run_action_scheduler_task' ) );
51
+
52
+ // Ajax handler for triggering email queue sending.
53
+ add_action( 'wp_ajax_ig_es_trigger_mailing_queue_sending', array( $this, 'trigger_mailing_queue_sending' ) );
54
+ add_action( 'wp_ajax_nopriv_ig_es_trigger_mailing_queue_sending', array( $this, 'trigger_mailing_queue_sending' ) );
55
  }
56
 
57
  /**
78
  * Steps
79
  * 1. Fetch all active campaigns
80
  * 2. Loop over through and based on matched condition put campaign into mailing_queue table
81
+ * 3. And also insert subscribers for respective campaign into sending_queue table
82
  * 4. Call es cron to send emails from queue
83
  */
84
  static $campaigns_to_process;
165
 
166
  if ( is_array( $result ) ) {
167
 
168
+ $mailing_queue_id = $result['id'];
169
+
170
+ if ( ! empty( $mailing_queue_id ) ) {
171
+ $action_args = array(
172
+ 'mailing_queue_id' => $mailing_queue_id,
173
+ 'list_ids' => $list_id,
174
+ );
175
+ IG_ES_Background_Process_Helper::add_action_scheduler_task( 'ig_es_add_subscribers_to_sending_queue', $action_args );
176
+ }
177
  }
178
  }
179
  }
362
  'campaign_id' => $campaign_id,
363
  'subject' => $subject,
364
  'body' => $content,
365
+ 'count' => 0,
366
+ 'status' => 'Queueing',
367
  'start_at' => ! empty( $campaign['start_at'] ) ? $campaign['start_at'] : '',
368
  'finish_at' => '',
369
  'created_at' => ig_get_current_date_time(),
384
  }
385
 
386
  /**
387
+ * Add contacts into sending_queue table
388
  *
389
  * @param $campaign_id
390
  * @param $guid
821
  $this->update_email_sent_status( $contact_id, $campaign_id, $message_id, 'In Queue' );
822
  }
823
  }
824
+
825
+ /**
826
+ * Method to add subscribers to the sending queue in background. Gets called through the Action Scheduler library.
827
+ *
828
+ * @param array $args action arguements.
829
+ *
830
+ * @since 4.6.3
831
+ */
832
+ public function add_subscribers_to_sending_queue( $args = array() ) {
833
+
834
+ if ( empty( $args['mailing_queue_id'] ) || ! is_numeric( $args['mailing_queue_id'] ) || empty( $args['list_ids'] ) ) {
835
+ return false;
836
+ }
837
+
838
+ $batch_start_time = time();
839
 
840
+ /**
841
+ * By subtracting the waiting time from $batch_start_time now,
842
+ * We are allowing timeout to happen in the background process loop 3 seconds earlier.
843
+ * This earlier timeout will ensure we get engough time to make another asynchrounous request
844
+ * since we need to wait for sometime before making the asynchronous request.
845
+ **/
846
+ $batch_start_time = $batch_start_time - IG_ES_Background_Process_Helper::get_wait_seconds();
847
+
848
+ $mailing_queue_id = $args['mailing_queue_id'];
849
+ $list_ids = $args['list_ids'];
850
+
851
+ $mailing_queue = ES_DB_Mailing_Queue::get_email_by_id( $mailing_queue_id );
852
+
853
+ // Check if mailing queue exists. May have been deleted manually.
854
+ if ( empty( $mailing_queue ) ) {
855
+ return false;
856
+ }
857
+
858
+ $mailing_queue_hash = $mailing_queue['hash'];
859
+ $campaign_id = $mailing_queue['campaign_id'];
860
+
861
+ $active_subscribers = ES()->contacts_db->get_active_contacts_by_list_and_mailing_queue_id( $list_ids, $mailing_queue_id );
862
+
863
+ if ( ! empty( $active_subscribers ) ) {
864
+ $subscribers_batch_size = 5000;
865
+
866
+ // Create batches of subscribers each containing maximum subscribers equal to $subscribers_batch_size.
867
+ $subscribers_batches = array_chunk( $active_subscribers, $subscribers_batch_size );
868
+
869
+ foreach ( $subscribers_batches as $key => $subscribers ) {
870
+
871
+ $delivery_data = array();
872
+ $delivery_data['hash'] = $mailing_queue_hash;
873
+ $delivery_data['subscribers'] = $subscribers;
874
+ $delivery_data['campaign_id'] = $campaign_id;
875
+ $delivery_data['mailing_queue_id'] = $mailing_queue_id;
876
+
877
+ ES_DB_Sending_Queue::do_batch_insert( $delivery_data );
878
+
879
+ // Remove the processed batch.
880
+ unset( $subscribers_batches[ $key ] );
881
+
882
+ // Check if time limit or memory limit has been reached.
883
+ if ( IG_ES_Background_Process_Helper::time_exceeded( $batch_start_time ) || IG_ES_Background_Process_Helper::memory_exceeded() ) {
884
+ break;
885
+ }
886
+ }
887
+
888
+ $total_contacts_added = ES_DB_Sending_Queue::get_total_email_count_by_hash( $mailing_queue_hash );
889
+ ES_DB_Mailing_Queue::update_subscribers_count( $mailing_queue_hash, $total_contacts_added );
890
+
891
+ // Check if there are no batches to process.
892
+ if ( empty( $subscribers_batches ) ) {
893
+
894
+ $mailing_queue_status = 'In Queue';
895
+ // Update status to 'In Queue' so that cron(ES Cron/WP Cron) can pick it up.
896
+ ES_DB_Mailing_Queue::update_sent_status( $mailing_queue_hash, $mailing_queue_status );
897
+ } else {
898
+ /**
899
+ * If all subscribers batches are not processed(i.e. there are still emails to be added in the sending_queue table)
900
+ * Create another action scheduler task to process remaining batches.
901
+ **/
902
+ $action_args = array(
903
+ 'mailing_queue_id' => $mailing_queue_id,
904
+ 'list_ids' => $list_ids,
905
+ );
906
+ IG_ES_Background_Process_Helper::add_action_scheduler_task( 'ig_es_add_subscribers_to_sending_queue', $action_args, true, true );
907
+ }
908
+ } else {
909
+ $total_contacts_added = ES_DB_Sending_Queue::get_total_email_count_by_hash( $mailing_queue_hash );
910
+ // Check if there are not any queued email for this mailing queue id. If yes, then delete the mailing queue also since there is no meaning in processing an empty mailing queue.
911
+ if ( empty( $total_contacts_added ) ) {
912
+ ES_DB_Mailing_Queue::delete_notifications( array( $mailing_queue_id ) );
913
+ }
914
+ }
915
+ }
916
+
917
+ /**
918
+ * Method to trigger email sending through 'ig_es_cron_worker' cron worker.
919
+ *
920
+ * @since 4.6.3
921
+ */
922
+ public function trigger_mailing_queue_sending() {
923
+
924
+ // Call cron action only when it is not locked.
925
+ if ( ! ES()->cron->is_locked() ) {
926
+
927
+ // Start processing of campaigns which are scheduled for current date time.
928
+ do_action( 'ig_es_cron_worker' );
929
+ }
930
+ }
931
  }
932
  }
933
 
lite/includes/classes/class-es-reports-table.php CHANGED
@@ -561,7 +561,7 @@ class ES_Reports_Table extends WP_List_Table {
561
  <?php esc_html_e( 'Preview Email', 'email-subscribers' ); ?>
562
  </h2>
563
  <p>
564
- <?php echo wp_kses_post( 'This is how the email you sent may look. <br>Note: Different email services (like gmail, yahoo etc) display email content differently. So there could be a slight variation on how your customer will view the email content.', 'email-subscribers' ); ?>
565
  </p>
566
  <div class="tool-box">
567
  <div style="padding:15px;background-color:#FFFFFF;">
561
  <?php esc_html_e( 'Preview Email', 'email-subscribers' ); ?>
562
  </h2>
563
  <p>
564
+ <?php echo wp_kses_post( __( 'This is how the email you sent may look. <br>Note: Different email services (like gmail, yahoo etc) display email content differently. So there could be a slight variation on how your customer will view the email content.', 'email-subscribers' ) ); ?>
565
  </p>
566
  <div class="tool-box">
567
  <div style="padding:15px;background-color:#FFFFFF;">
lite/includes/classes/class-es-templates-table.php CHANGED
@@ -34,7 +34,7 @@ class ES_Templates_Table {
34
  $template_type = ES_Common::get_campaign_types( array( 'sequence' ) );
35
  ?>
36
  <p class="mt-3">
37
- <label for="es_template_type"><span class="font-semibold text-sm text-gray-700"><?php esc_html_e( 'Select template type', 'email-subscirbers' ); ?></span></label><br/>
38
  <select style="margin: 0.20rem 0;" name="es_template_type" id="es_template_type">
39
  <?php
40
  if ( ! empty( $template_type ) ) {
@@ -59,19 +59,23 @@ class ES_Templates_Table {
59
  return;
60
  }
61
  ?>
 
62
  <p id="post_notification">
63
  <a href="https://www.icegram.com/documentation/es-what-are-the-available-keywords-in-the-post-notifications/?utm_source=es&amp;utm_medium=in_app&amp;utm_campaign=view_docs_help_page" target="_blank"><?php esc_html_e( 'Available Keywords', 'email-subscribers' ); ?></a> <?php esc_html_e( 'for Post Notification: ', 'email-subsribers' ); ?> {{FIRSTNAME}},
64
  {{LASTNAME}}, {{NAME}}, {{EMAIL}},
65
  {{DATE}}, {{POSTTITLE}}, {{POSTIMAGE}}, {{POSTEXCERPT}}, {{POSTDESC}},
66
  {{POSTAUTHOR}}, {{POSTLINK}}, {{POSTLINK-WITHTITLE}}, {{POSTLINK-ONLY}}, {{POSTFULL}} </p>
 
67
  <p id="newsletter">
68
  <a href="https://www.icegram.com/documentation/es-what-are-the-available-keywords-in-the-newsletters/?utm_source=es&amp;utm_medium=in_app&amp;utm_campaign=view_docs_help_page" target="_blank"><?php esc_html_e( 'Available Keywords', 'email-subscribers' ); ?></a> <?php esc_html_e( 'for Broadcast:', 'email-subscribers' ); ?> {{FIRSTNAME}}, {{LASTNAME}}, {{NAME}},
69
  {{EMAIL}} </p>
 
70
  <div id="post_digest">
71
  <span style="font-size: 0.8em; margin-left: 0.3em; padding: 2px; background: #e66060; color: #fff; border-radius: 2px; ">Pro</span>&nbsp;
72
  <a href="https://www.icegram.com/send-post-digest-using-email-subscribers-plugin/?utm_source=es&amp;utm_medium=in_app&amp;utm_campaign=view_post_digest_post" target="_blank"><?php esc_html_e( 'Available Keywords', 'email-subscribers' ); ?></a> <?php esc_html_e( 'for Post Digest:', 'email-subscribers' ); ?>
73
  {{FIRSTNAME}}, {{LASTNAME}}, {{NAME}}<div class="post_digest_block"> {{POSTDIGEST}} <br/><?php esc_html_e( 'Any keywords related Post Notification', 'email-subscribers' ); ?> <br/>{{/POSTDIGEST}} </div>
74
  </div>
 
75
  <?php
76
  }
77
 
34
  $template_type = ES_Common::get_campaign_types( array( 'sequence' ) );
35
  ?>
36
  <p class="mt-3">
37
+ <label for="es_template_type"><span class="font-semibold text-sm text-gray-700"><?php esc_html_e( 'Select template type', 'email-subscribers' ); ?></span></label><br/>
38
  <select style="margin: 0.20rem 0;" name="es_template_type" id="es_template_type">
39
  <?php
40
  if ( ! empty( $template_type ) ) {
59
  return;
60
  }
61
  ?>
62
+ <!-- Start-IG-Code -->
63
  <p id="post_notification">
64
  <a href="https://www.icegram.com/documentation/es-what-are-the-available-keywords-in-the-post-notifications/?utm_source=es&amp;utm_medium=in_app&amp;utm_campaign=view_docs_help_page" target="_blank"><?php esc_html_e( 'Available Keywords', 'email-subscribers' ); ?></a> <?php esc_html_e( 'for Post Notification: ', 'email-subsribers' ); ?> {{FIRSTNAME}},
65
  {{LASTNAME}}, {{NAME}}, {{EMAIL}},
66
  {{DATE}}, {{POSTTITLE}}, {{POSTIMAGE}}, {{POSTEXCERPT}}, {{POSTDESC}},
67
  {{POSTAUTHOR}}, {{POSTLINK}}, {{POSTLINK-WITHTITLE}}, {{POSTLINK-ONLY}}, {{POSTFULL}} </p>
68
+ <!-- End-IG-Code -->
69
  <p id="newsletter">
70
  <a href="https://www.icegram.com/documentation/es-what-are-the-available-keywords-in-the-newsletters/?utm_source=es&amp;utm_medium=in_app&amp;utm_campaign=view_docs_help_page" target="_blank"><?php esc_html_e( 'Available Keywords', 'email-subscribers' ); ?></a> <?php esc_html_e( 'for Broadcast:', 'email-subscribers' ); ?> {{FIRSTNAME}}, {{LASTNAME}}, {{NAME}},
71
  {{EMAIL}} </p>
72
+ <!-- Start-IG-Code -->
73
  <div id="post_digest">
74
  <span style="font-size: 0.8em; margin-left: 0.3em; padding: 2px; background: #e66060; color: #fff; border-radius: 2px; ">Pro</span>&nbsp;
75
  <a href="https://www.icegram.com/send-post-digest-using-email-subscribers-plugin/?utm_source=es&amp;utm_medium=in_app&amp;utm_campaign=view_post_digest_post" target="_blank"><?php esc_html_e( 'Available Keywords', 'email-subscribers' ); ?></a> <?php esc_html_e( 'for Post Digest:', 'email-subscribers' ); ?>
76
  {{FIRSTNAME}}, {{LASTNAME}}, {{NAME}}<div class="post_digest_block"> {{POSTDIGEST}} <br/><?php esc_html_e( 'Any keywords related Post Notification', 'email-subscribers' ); ?> <br/>{{/POSTDIGEST}} </div>
77
  </div>
78
+ <!-- End-IG-Code -->
79
  <?php
80
  }
81
 
lite/includes/classes/class-ig-es-background-process-helper.php ADDED
@@ -0,0 +1,259 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Helper class for background processing
4
+ *
5
+ * @author Icegram
6
+ * @since 4.6.3
7
+ * @version 1.0.0
8
+ *
9
+ * @package Email Subscribers
10
+ */
11
+
12
+ if ( ! defined( 'ABSPATH' ) ) {
13
+ exit; // Exit if accessed directly.
14
+ }
15
+
16
+ if ( ! class_exists( 'IG_ES_Background_Process_Helper' ) ) {
17
+
18
+ /**
19
+ * IG_ES_Background_Process_Helper Class.
20
+ */
21
+ class IG_ES_Background_Process_Helper {
22
+
23
+ /**
24
+ * Identifier
25
+ *
26
+ * @var mixed
27
+ */
28
+ protected static $identifier;
29
+
30
+ /**
31
+ * Variable to hold instance of IG_ES_Background_Process_Helper
32
+ *
33
+ * @var $instance
34
+ */
35
+ private static $instance = null;
36
+
37
+ /**
38
+ * Contructor
39
+ *
40
+ * @since 4.6.3
41
+ */
42
+ private function __construct() {
43
+
44
+ self::$identifier = 'ig_es_background_process';
45
+ }
46
+
47
+ /**
48
+ * Get single instance of IG_ES_Background_Process_Helper
49
+ *
50
+ * @return IG_ES_Background_Process_Helper Singleton object of IG_ES_Background_Process_Helper
51
+ *
52
+ * @since 4.6.3
53
+ */
54
+ public static function get_instance() {
55
+ // Check if instance is already exists.
56
+ if ( is_null( self::$instance ) ) {
57
+ self::$instance = new self();
58
+ }
59
+
60
+ return self::$instance;
61
+ }
62
+
63
+ /**
64
+ * Memory exceeded
65
+ *
66
+ * Ensures the batch process never exceeds 90%
67
+ * of the maximum WordPress memory.
68
+ *
69
+ * @return bool
70
+ *
71
+ * @since 4.6.3
72
+ */
73
+ public static function memory_exceeded() {
74
+ $memory_limit = self::get_memory_limit() * 0.9; // 90% of max memory
75
+ $current_memory = memory_get_usage( true );
76
+
77
+ if ( $current_memory >= $memory_limit ) {
78
+ return true;
79
+ }
80
+
81
+ return false;
82
+ }
83
+
84
+ /**
85
+ * Get memory limit.
86
+ *
87
+ * @return int
88
+ *
89
+ * @since 4.6.3
90
+ */
91
+ public static function get_memory_limit() {
92
+ if ( function_exists( 'ini_get' ) ) {
93
+ $memory_limit = ini_get( 'memory_limit' );
94
+ } else {
95
+ // Sensible default.
96
+ $memory_limit = '128M';
97
+ }
98
+
99
+ if ( ! $memory_limit || -1 === intval( $memory_limit ) ) {
100
+ // Unlimited, set to 32GB.
101
+ $memory_limit = '32G';
102
+ }
103
+
104
+ return wp_convert_hr_to_bytes( $memory_limit );
105
+ }
106
+
107
+ /**
108
+ * Time exceeded.
109
+ *
110
+ * Ensures the batch never exceeds a sensible time limit.
111
+ * A timeout limit of 30s is common on shared hosting.
112
+ *
113
+ * @param string $start_time start timestamp.
114
+ *
115
+ * @return bool
116
+ *
117
+ * @since 4.6.3
118
+ */
119
+ public static function time_exceeded( $start_time = 0 ) {
120
+
121
+ $finish = $start_time + ( self::get_time_limit() * 0.6 );
122
+ $return = false;
123
+
124
+ if ( time() >= $finish ) {
125
+ $return = true;
126
+ }
127
+
128
+ return apply_filters( self::$identifier . '_time_exceeded', $return );
129
+ }
130
+
131
+ /**
132
+ * Method to get Server time limit
133
+ *
134
+ * @return int $time_limit Server time limit.
135
+ *
136
+ * @since 4.6.3
137
+ */
138
+ public static function get_time_limit() {
139
+ if ( function_exists( 'ini_get' ) ) {
140
+ $time_limit = ini_get( 'max_execution_time' );
141
+ } else {
142
+ // Sensible default.
143
+ $time_limit = apply_filters( self::$identifier . '_default_time_limit', 20 );
144
+ }
145
+
146
+ $time_limit = (int) $time_limit;
147
+ return $time_limit;
148
+ }
149
+
150
+ /**
151
+ * Method to add new action scheduler task. Task added by this function are called by Action Scheduler library when execution time comes.
152
+ *
153
+ * @param string $action Action name.
154
+ * @param array $action_args Action arguements.
155
+ * @param bool $process_asynchronously Should process action asynchronously.
156
+ * @param bool $should_wait Should wait before making asynchronous request to process the action.
157
+ *
158
+ * @return int|bool $action_id Action ID on success or false on failure.
159
+ *
160
+ * @since 4.6.3
161
+ */
162
+ public static function add_action_scheduler_task( $action = '', $action_args = array(), $process_asynchronously = true, $should_wait = false ) {
163
+
164
+ if ( empty( $action ) || empty( $action_args ) ) {
165
+ return false;
166
+ }
167
+
168
+ if ( function_exists( 'as_schedule_single_action' ) ) {
169
+ $action_id = as_schedule_single_action( time(), $action, array( $action_args ), 'email-subscribers' );
170
+ if ( ! empty( $action_id ) ) {
171
+ if ( $process_asynchronously ) {
172
+ $request_args = array(
173
+ 'action' => 'ig_es_run_action_scheduler_task',
174
+ 'action_id' => $action_id,
175
+ );
176
+ self::send_async_ajax_request( $request_args, $should_wait );
177
+ }
178
+ return $action_id;
179
+ }
180
+ }
181
+
182
+ return false;
183
+ }
184
+
185
+ /**
186
+ * Method to trigger immediate processing of action scheduler task.
187
+ *
188
+ * @since 4.6.3
189
+ */
190
+ public static function run_action_scheduler_task() {
191
+
192
+ $action_id = ig_es_get_request_data( 'action_id' );
193
+
194
+ if ( ! empty( $action_id ) ) {
195
+ if ( class_exists( 'ActionScheduler_QueueRunner' ) ) {
196
+ $queue_runner = ActionScheduler_QueueRunner::instance();
197
+ $queue_runner->process_action( $action_id, 'email-subscribers' );
198
+ }
199
+ }
200
+ }
201
+
202
+ /**
203
+ * Method to get required waiting time in seconds before making async request.
204
+ * Chaining async requests can crash MySQL. A brief waiting period in PHP helps in preventing that.
205
+ *
206
+ * @return int Waiting time in seconds.
207
+ *
208
+ * @since 4.6.3
209
+ */
210
+ public static function get_wait_seconds() {
211
+ return apply_filters( 'ig_es_async_request_wait_seconds', 3 );
212
+ }
213
+
214
+ /**
215
+ * Method to send asynchronous background request to admin-ajax.
216
+ *
217
+ * @param array $request_args Async request's arguments.
218
+ * @param bool $should_wait Should wait before making this async request.
219
+ *
220
+ * @return array $response Async request's response.
221
+ *
222
+ * @since 4.6.3
223
+ */
224
+ public static function send_async_ajax_request( $request_args = array(), $should_wait = false ) {
225
+
226
+ $response = array();
227
+
228
+ if ( empty( $request_args ) ) {
229
+ return $response;
230
+ }
231
+
232
+ // Should wait before making async request.
233
+ if ( $should_wait ) {
234
+ $wait_seconds = self::get_wait_seconds();
235
+
236
+ if ( $wait_seconds ) {
237
+
238
+ // Sleep to prevent crashing of MYSQL due to chaining of async request.
239
+ sleep( $wait_seconds );
240
+ }
241
+ }
242
+
243
+ $admin_ajax_url = admin_url( 'admin-ajax.php' );
244
+ $admin_ajax_url = add_query_arg( $request_args, $admin_ajax_url );
245
+ $args = array(
246
+ 'timeout' => 0.01,
247
+ 'blocking' => false,
248
+ 'cookies' => $_COOKIE,
249
+ 'sslverify' => apply_filters( 'https_local_ssl_verify', false ),
250
+ );
251
+
252
+ // Make a asynchronous request.
253
+ $response = wp_remote_get( esc_url_raw( $admin_ajax_url ), $args );
254
+
255
+ return $response;
256
+ }
257
+ }
258
+ }
259
+
lite/includes/db/class-es-db-campaigns.php CHANGED
@@ -724,4 +724,41 @@ class ES_DB_Campaigns extends ES_DB {
724
  return $updated;
725
 
726
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
727
  }
724
  return $updated;
725
 
726
  }
727
+
728
+ /**
729
+ * Duplicate Campaign
730
+ *
731
+ * @param $id
732
+ *
733
+ * @since 4.6.3
734
+ */
735
+ public function duplicate_campaign( $id = null ) {
736
+
737
+ if ( ! empty( $id ) ) {
738
+
739
+ $campaign = $this->get( $id );
740
+ $campaign['status'] = IG_ES_CAMPAIGN_STATUS_IN_ACTIVE;
741
+ $campaign['name'] = __( 'Copy', 'email-subscribers' ) . ' - ' . $campaign['name'];
742
+
743
+ if ( 'newsletter' === $campaign['type'] ) {
744
+ $campaign['subject'] = __( 'Copy', 'email-subscribers' ) . ' - ' . $campaign['subject'];
745
+ }
746
+ $campaign_id = $campaign['id'];
747
+ unset( $campaign['id'] );
748
+ unset( $campaign['created_at'] );
749
+
750
+ $duplicate_campaign_id = $this->save_campaign( $campaign );
751
+
752
+ if ( 'sequence' === $campaign['type'] ) {
753
+ $sequence_campaigns = $this->get_campaign_by_parent_id( $campaign_id );
754
+
755
+ foreach ( $sequence_campaigns as $index => $child_campaign ) {
756
+ $child_campaign['parent_id'] = $duplicate_campaign_id;
757
+ unset( $child_campaign['id'] );
758
+ unset( $child_campaign['created_at'] );
759
+ $this->save_campaign( $child_campaign );
760
+ }
761
+ }
762
+ }
763
+ }
764
  }
lite/includes/db/class-es-db-contacts.php CHANGED
@@ -65,6 +65,7 @@ class ES_DB_Contacts extends ES_DB {
65
  'last_name' => '%s',
66
  'email' => '%s',
67
  'source' => '%s',
 
68
  'form_id' => '%d',
69
  'status' => '%s',
70
  'unsubscribed' => '%d',
@@ -93,6 +94,7 @@ class ES_DB_Contacts extends ES_DB {
93
  'last_name' => '',
94
  'email' => '',
95
  'source' => '',
 
96
  'form_id' => 0,
97
  'status' => 'verified',
98
  'unsubscribed' => 0,
@@ -260,7 +262,8 @@ class ES_DB_Contacts extends ES_DB {
260
  }
261
 
262
  global $wpdb;
263
-
 
264
  if ( is_array( $list_id ) ) {
265
  $list_ids_str = implode( ',', $list_id );
266
  $where = $wpdb->prepare(
@@ -275,6 +278,41 @@ class ES_DB_Contacts extends ES_DB {
275
 
276
  }
277
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
278
  /**
279
  * Get contacts by ids
280
  *
@@ -840,4 +878,80 @@ class ES_DB_Contacts extends ES_DB {
840
  }
841
 
842
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
843
  }
65
  'last_name' => '%s',
66
  'email' => '%s',
67
  'source' => '%s',
68
+ 'ip_address' => '%s',
69
  'form_id' => '%d',
70
  'status' => '%s',
71
  'unsubscribed' => '%d',
94
  'last_name' => '',
95
  'email' => '',
96
  'source' => '',
97
+ 'ip_address' => '',
98
  'form_id' => 0,
99
  'status' => 'verified',
100
  'unsubscribed' => 0,
262
  }
263
 
264
  global $wpdb;
265
+
266
+ // Check if we have got array of list ids.
267
  if ( is_array( $list_id ) ) {
268
  $list_ids_str = implode( ',', $list_id );
269
  $where = $wpdb->prepare(
278
 
279
  }
280
 
281
+ /**
282
+ * Get active contacts by list_id and excluding contacts from sending queue having given mailing_queue_id
283
+ *
284
+ * @param $list_id
285
+ * @param $mailing_queue_id
286
+ *
287
+ * @return array|object|null
288
+ *
289
+ * @since 4.6.3
290
+ *
291
+ */
292
+ public function get_active_contacts_by_list_and_mailing_queue_id( $list_id, $mailing_queue_id = 0 ) {
293
+
294
+ if ( empty( $list_id ) ) {
295
+ return array();
296
+ }
297
+
298
+ global $wpdb;
299
+
300
+ // Check if we have got array of list ids.
301
+ if ( is_array( $list_id ) ) {
302
+ $list_ids_str = implode( ',', $list_id );
303
+ $where = $wpdb->prepare(
304
+ "id IN (SELECT contact_id FROM {$wpdb->prefix}ig_lists_contacts WHERE FIND_IN_SET( list_id, %s ) AND status IN ('subscribed', 'confirmed')) AND id NOT IN(SELECT contact_id FROM {$wpdb->prefix}ig_sending_queue WHERE mailing_queue_id = %d )",
305
+ $list_ids_str,
306
+ $mailing_queue_id
307
+ );
308
+ } else {
309
+ $where = $wpdb->prepare( "id IN (SELECT contact_id FROM {$wpdb->prefix}ig_lists_contacts WHERE list_id = %d AND status IN ('subscribed', 'confirmed')) AND id NOT IN(SELECT contact_id FROM {$wpdb->prefix}ig_sending_queue WHERE mailing_queue_id = %d )", $list_id, $mailing_queue_id );
310
+ }
311
+
312
+ return $this->get_by_conditions( $where );
313
+ }
314
+
315
+
316
  /**
317
  * Get contacts by ids
318
  *
878
  }
879
 
880
 
881
+ /**
882
+ * Count contacts by Form id
883
+ *
884
+ * @param string $form_id
885
+ *
886
+ * @return string|null
887
+ *
888
+ * @since 4.6.3
889
+ */
890
+ public function get_total_contacts_by_form_id( $form_id = '', $status = 0 ) {
891
+
892
+ global $wpdb;
893
+
894
+ $total_subscribers = '';
895
+
896
+ if ( ! empty( $form_id ) ) {
897
+ $total_subscribers = $wpdb->get_var(
898
+ $wpdb->prepare(
899
+ "SELECT count(distinct(id)) as total_active_subscribers FROM {$wpdb->prefix}ig_contacts where form_id = %d AND unsubscribed = %d" ,
900
+ $form_id,
901
+ $status
902
+ )
903
+ );
904
+ }
905
+
906
+ return $total_subscribers;
907
+
908
+ }
909
+
910
+ /**
911
+ * Migrate Ip address of subscribers from lists_contacts to contacts table
912
+ *
913
+ * @since 4.6.3
914
+ */
915
+ public function migrate_ip_from_list_contacts_to_contacts_table() {
916
+ global $wpdb;
917
+
918
+ //Get Total count of subscribers
919
+ $total = $wpdb->get_var( "SELECT count(*) as total FROM {$wpdb->prefix}ig_contacts" );
920
+
921
+ // If we have subscribers?
922
+ if ( $total > 0 ) {
923
+
924
+ $wpdb->query(
925
+ "UPDATE {$wpdb->prefix}ig_contacts AS contact_data
926
+ LEFT JOIN {$wpdb->prefix}ig_lists_contacts AS list_data
927
+ ON contact_data.id = list_data.contact_id
928
+ SET contact_data.ip_address = list_data.subscribed_ip
929
+ WHERE contact_data.id = list_data.contact_id
930
+ AND list_data.subscribed_ip IS NOT NULL
931
+ AND list_data.subscribed_ip <> ''"
932
+ );
933
+ }
934
+ }
935
+
936
+
937
+ /**
938
+ * Insert IP along with subscriber data
939
+ *
940
+ * @param $data
941
+ * @param string $type
942
+ *
943
+ * @return array
944
+ *
945
+ * @since 4.6.3
946
+ */
947
+ public function insert( $data, $type = '' ) {
948
+ $source = array( 'admin','import' );
949
+ if ( empty( $data['ip_address'] ) && ! in_array( $data['source'], $source ) ) {
950
+ $data['ip_address'] = ig_es_get_ip();
951
+ }
952
+ return parent::insert( $data, $type );
953
+ }
954
+
955
+
956
+
957
  }
lite/includes/db/class-es-db-mailing-queue.php CHANGED
@@ -440,4 +440,29 @@ class ES_DB_Mailing_Queue {
440
  }
441
  }
442
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
443
  }
440
  }
441
  }
442
  }
443
+
444
+ /**
445
+ * Method to update subscribers count in mailing queue table.
446
+ *
447
+ * @param string $hash Mailing queue hash.
448
+ * @param int $count Subscribers count.
449
+ *
450
+ * @since 4.6.3
451
+ */
452
+ public static function update_subscribers_count( $hash = '', $count = 0 ) {
453
+
454
+ global $wpdb;
455
+
456
+ if ( empty( $hash ) ) {
457
+ return;
458
+ }
459
+
460
+ $wpdb->query(
461
+ $wpdb->prepare(
462
+ "UPDATE {$wpdb->prefix}ig_mailing_queue SET count = %d WHERE hash = %s",
463
+ $count,
464
+ $hash
465
+ )
466
+ );
467
+ }
468
  }
lite/includes/es-backward.php CHANGED
@@ -52,6 +52,7 @@ class es_cls_dbquery {
52
  'created_at' => ig_get_current_date_time(),
53
  );
54
  $contact_id = ES()->contacts_db->get_contact_id_by_email( $email );
 
55
  if ( ! $contact_id ) {
56
  $contact_id = ES()->contacts_db->insert( $sub_data );
57
  }
@@ -75,7 +76,7 @@ class es_cls_dbquery {
75
  'status' => $status,
76
  'optin_type' => $optin_type,
77
  'subscribed_at' => ig_get_current_date_time(),
78
- 'subscribed_ip' => ig_es_get_ip()
79
  );
80
 
81
  ES()->lists_contacts_db->add_contact_to_lists( $list_contact_data, $list_id );
52
  'created_at' => ig_get_current_date_time(),
53
  );
54
  $contact_id = ES()->contacts_db->get_contact_id_by_email( $email );
55
+
56
  if ( ! $contact_id ) {
57
  $contact_id = ES()->contacts_db->insert( $sub_data );
58
  }
76
  'status' => $status,
77
  'optin_type' => $optin_type,
78
  'subscribed_at' => ig_get_current_date_time(),
79
+ 'subscribed_ip' => ig_es_get_ip(),
80
  );
81
 
82
  ES()->lists_contacts_db->add_contact_to_lists( $list_contact_data, $list_id );
lite/includes/notices/views/trial-consent.php CHANGED
@@ -27,17 +27,18 @@ $optout_url = wp_nonce_url(
27
  <div class="notice notice-success">
28
  <p>
29
  <?php
30
- echo esc_html( sprintf( 'Start your %s days free trial of Email Subscribers’ premium services like email delivery check, spam protection, cron handling & lot more..', ES()->trial->get_trial_period( 'in_days' ) ), 'email-subscribers' );
 
31
  ?>
32
  <br/>
33
  <a href="<?php echo esc_url( $optin_url ); ?>" class="ig-es-primary-button px-3 py-1 mt-2 align-middle">
34
  <?php
35
- echo esc_html( 'Yes, start my free trial!', 'email-subscribers' );
36
  ?>
37
  </a>
38
  <a href="<?php echo esc_url( $optout_url ); ?>" class="ig-es-title-button px-3 py-1 mt-2 ml-2 align-middle">
39
  <?php
40
- echo esc_html( 'No, it’s ok!', 'email-subscribers' );
41
  ?>
42
  </a>
43
  </p>
27
  <div class="notice notice-success">
28
  <p>
29
  <?php
30
+ /* translators: %s: Trial period in days */
31
+ echo esc_html__( sprintf( 'Start your %s days free trial of Email Subscribers’ premium services like email delivery check, spam protection, cron handling & lot more..', ES()->trial->get_trial_period( 'in_days' ) ), 'email-subscribers' );
32
  ?>
33
  <br/>
34
  <a href="<?php echo esc_url( $optin_url ); ?>" class="ig-es-primary-button px-3 py-1 mt-2 align-middle">
35
  <?php
36
+ echo esc_html__( 'Yes, start my free trial!', 'email-subscribers' );
37
  ?>
38
  </a>
39
  <a href="<?php echo esc_url( $optout_url ); ?>" class="ig-es-title-button px-3 py-1 mt-2 ml-2 align-middle">
40
  <?php
41
+ echo esc_html__( 'No, it’s ok!', 'email-subscribers' );
42
  ?>
43
  </a>
44
  </p>
lite/includes/pro-features.php CHANGED
@@ -606,16 +606,14 @@ function ig_es_add_edd_tab_settings( $tab_options ) {
606
  function ig_es_workflows_integration_metabox( $page_prefix = '' ) {
607
  if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
608
 
609
- add_meta_box( 'ig_es_workflow_integration_information', 'ES PRO Integrations', 'ig_es_workflows_integration_upsell', $page_prefix . 'es_workflows', 'side', 'default' );
610
  }
611
  }
612
 
613
  function ig_es_show_hidden_workflow_metabox( $es_workflow_metaboxes ) {
614
 
615
  if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
616
- $es_workflow_metaboxes = array(
617
- 'ig_es_workflow_integration_description',
618
- );
619
  }
620
 
621
  return $es_workflow_metaboxes;
606
  function ig_es_workflows_integration_metabox( $page_prefix = '' ) {
607
  if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
608
 
609
+ add_meta_box( 'ig_es_workflow_integration_information', __( 'ES PRO Integrations', 'email-subscribers' ), 'ig_es_workflows_integration_upsell', $page_prefix . '_page_es_workflows', 'side', 'default' );
610
  }
611
  }
612
 
613
  function ig_es_show_hidden_workflow_metabox( $es_workflow_metaboxes ) {
614
 
615
  if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
616
+ $es_workflow_metaboxes[] = 'ig_es_workflow_integration_description';
 
 
617
  }
618
 
619
  return $es_workflow_metaboxes;
lite/includes/upgrade/es-update-functions.php CHANGED
@@ -1264,3 +1264,45 @@ function ig_es_update_457_db_version() {
1264
  ES_Install::update_db_version( '4.5.7' );
1265
  }
1266
  /* --------------------- ES 4.5.7(End)--------------------------- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1264
  ES_Install::update_db_version( '4.5.7' );
1265
  }
1266
  /* --------------------- ES 4.5.7(End)--------------------------- */
1267
+
1268
+
1269
+ /* --------------------- ES 4.6.3(Start)--------------------------- */
1270
+
1271
+ /**
1272
+ * Add Ip column in contacts table
1273
+ * Migrate existing Ip address from lists_contacts table to contacts table
1274
+ *
1275
+ * @since 4.6.3
1276
+ */
1277
+ function ig_es_update_463_alter_contacts_table() {
1278
+ global $wpdb;
1279
+
1280
+ $cols = $wpdb->get_col( "SHOW COLUMNS FROM {$wpdb->prefix}ig_contacts" );
1281
+
1282
+ if ( ! in_array( 'ip_address', $cols, true ) ) {
1283
+ $wpdb->query(
1284
+ "ALTER TABLE {$wpdb->prefix}ig_contacts
1285
+ ADD COLUMN `ip_address` varchar(50) NULL AFTER `source`"
1286
+ );
1287
+
1288
+ }
1289
+ }
1290
+
1291
+ /**
1292
+ * Migrate existing Ip address from lists_contacts table to contacts table
1293
+ *
1294
+ * @since 4.6.3
1295
+ */
1296
+ function ig_es_migrate_ip_from_list_contacts_to_contacts_table() {
1297
+ ES()->contacts_db->migrate_ip_from_list_contacts_to_contacts_table();
1298
+ }
1299
+
1300
+ /**
1301
+ * Update DB version
1302
+ *
1303
+ * @since 4.6.3
1304
+ */
1305
+ function ig_es_update_463_db_version() {
1306
+ ES_Install::update_db_version( '4.6.3' );
1307
+ }
1308
+ /* --------------------- ES 4.6.3(End)--------------------------- */
lite/includes/workflows/abstracts/class-es-workflow-trigger.php CHANGED
@@ -310,7 +310,12 @@ abstract class ES_Workflow_Trigger {
310
  }
311
 
312
  if ( $process_immediately ) {
313
- ES()->init_action_scheduler_queue_runner();
 
 
 
 
 
314
  }
315
  }
316
 
310
  }
311
 
312
  if ( $process_immediately ) {
313
+
314
+ $request_args = array(
315
+ 'action' => 'ig_es_trigger_workflow_queue_processing',
316
+ );
317
+
318
+ IG_ES_Background_Process_Helper::send_async_ajax_request( $request_args );
319
  }
320
  }
321
 
lite/includes/workflows/actions/class-es-action-add-to-list.php CHANGED
@@ -42,7 +42,7 @@ class ES_Action_Add_To_List extends ES_Workflow_Action {
42
 
43
  $list_field = new ES_Select();
44
  $list_field->set_name( 'ig-es-list' );
45
- $list_field->set_title( 'Select List', 'email-subscribers' );
46
  $list_field->set_options( $lists );
47
  $list_field->set_required();
48
  $this->add_field( $list_field );
42
 
43
  $list_field = new ES_Select();
44
  $list_field->set_name( 'ig-es-list' );
45
+ $list_field->set_title( __( 'Select List', 'email-subscribers' ) );
46
  $list_field->set_options( $lists );
47
  $list_field->set_required();
48
  $this->add_field( $list_field );
lite/includes/workflows/admin/class-es-workflow-admin-edit.php CHANGED
@@ -249,7 +249,7 @@ class ES_Workflow_Admin_Edit {
249
  */
250
  public static function add_metaboxes() {
251
 
252
- $page_prefix = 'woo' === IG_ES_PLUGIN_PLAN ? 'marketing-automation_page_' : 'email-subscribers_page_';
253
 
254
  $meta_box_title_for_trigger = __( 'Trigger', 'email-subscribers' );
255
  $meta_box_title_for_actions = __( 'Actions', 'email-subscribers' );
@@ -257,14 +257,14 @@ class ES_Workflow_Admin_Edit {
257
  $meta_box_title_for_options = __( 'Options', 'email-subscribers' );
258
  // $meta_box_title_for_timing = __( 'Timing', 'email-subscribers' );
259
 
260
- add_meta_box( 'ig_es_workflow_trigger', $meta_box_title_for_trigger, array( __CLASS__, 'trigger_metabox' ), $page_prefix . 'es_workflows', 'normal', 'default' );
261
- add_meta_box( 'ig_es_workflow_actions', $meta_box_title_for_actions, array( __CLASS__, 'actions_metabox' ), $page_prefix . 'es_workflows', 'normal', 'default' );
262
- add_meta_box( 'ig_es_workflow_save', $meta_box_title_for_save, array( __CLASS__, 'save_metabox' ), $page_prefix . 'es_workflows', 'side', 'default' );
263
  if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
264
  do_action( 'ig_es_workflows_integration', $page_prefix );
265
  }
266
- // add_meta_box( 'ig_es_workflow_options', $meta_box_title_for_options, array( __CLASS__, 'options_metabox' ), $page_prefix . 'es_workflows', 'side', 'default' ); // phpcs:ignore
267
- // add_meta_box( 'ig_es_workflow_timing', $meta_box_title_for_timing, array( __CLASS__, 'timing_metabox' ), $page_prefix . 'es_workflows', 'side', 'default' ); // phpcs:ignore
268
  }
269
 
270
  /**
249
  */
250
  public static function add_metaboxes() {
251
 
252
+ $page_prefix = ES()->get_admin_page_prefix();
253
 
254
  $meta_box_title_for_trigger = __( 'Trigger', 'email-subscribers' );
255
  $meta_box_title_for_actions = __( 'Actions', 'email-subscribers' );
257
  $meta_box_title_for_options = __( 'Options', 'email-subscribers' );
258
  // $meta_box_title_for_timing = __( 'Timing', 'email-subscribers' );
259
 
260
+ add_meta_box( 'ig_es_workflow_trigger', $meta_box_title_for_trigger, array( __CLASS__, 'trigger_metabox' ), $page_prefix . '_page_es_workflows', 'normal', 'default' );
261
+ add_meta_box( 'ig_es_workflow_actions', $meta_box_title_for_actions, array( __CLASS__, 'actions_metabox' ), $page_prefix . '_page_es_workflows', 'normal', 'default' );
262
+ add_meta_box( 'ig_es_workflow_save', $meta_box_title_for_save, array( __CLASS__, 'save_metabox' ), $page_prefix . '_page_es_workflows', 'side', 'default' );
263
  if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
264
  do_action( 'ig_es_workflows_integration', $page_prefix );
265
  }
266
+ // add_meta_box( 'ig_es_workflow_options', $meta_box_title_for_options, array( __CLASS__, 'options_metabox' ), $page_prefix . '_page_es_workflows', 'side', 'default' ); // phpcs:ignore
267
+ // add_meta_box( 'ig_es_workflow_timing', $meta_box_title_for_timing, array( __CLASS__, 'timing_metabox' ), $page_prefix . '_page_es_workflows', 'side', 'default' ); // phpcs:ignore
268
  }
269
 
270
  /**
lite/includes/workflows/class-es-workflow.php CHANGED
@@ -341,7 +341,7 @@ class ES_Workflow {
341
  'queue_id' => $queue_id,
342
  );
343
  if ( function_exists( 'as_schedule_single_action' ) ) {
344
- as_schedule_single_action( $queue_scheduled_at, 'ig_es_process_workflow_queue', array( $action_args ) );
345
  }
346
  }
347
  }
341
  'queue_id' => $queue_id,
342
  );
343
  if ( function_exists( 'as_schedule_single_action' ) ) {
344
+ as_schedule_single_action( $queue_scheduled_at, 'ig_es_process_workflow_queue', array( $action_args ), 'email-subscribers' );
345
  }
346
  }
347
  }
lite/includes/workflows/queue/class-es-workflow-queue-runner.php CHANGED
@@ -35,8 +35,8 @@ class ES_Workflow_Queue_Runner {
35
  * Init queue runner to process workflow queue
36
  */
37
  public static function init() {
38
- add_action( 'wp_ajax_ig_es_init_queue_runner', array( __CLASS__, 'init_queue_runner' ) );
39
- add_action( 'wp_ajax_nopriv_ig_es_init_queue_runner', array( __CLASS__, 'init_queue_runner' ) );
40
  }
41
 
42
  /**
35
  * Init queue runner to process workflow queue
36
  */
37
  public static function init() {
38
+ add_action( 'wp_ajax_ig_es_trigger_workflow_queue_processing', array( __CLASS__, 'init_queue_runner' ) );
39
+ add_action( 'wp_ajax_nopriv_ig_es_trigger_workflow_queue_processing', array( __CLASS__, 'init_queue_runner' ) );
40
  }
41
 
42
  /**
lite/public/class-email-subscribers-public.php CHANGED
@@ -298,8 +298,8 @@ class Email_Subscribers_Public {
298
 
299
  public function add_contact( $contact_data, $list_id ) {
300
 
301
- $email = $contact_data['email'];
302
-
303
  $default_data = array(
304
  'status' => 'verified',
305
  'hash' => ES_Common::generate_guid(),
@@ -325,7 +325,7 @@ class Email_Subscribers_Public {
325
  'status' => 'subscribed',
326
  'subscribed_at' => ig_get_current_date_time(),
327
  'optin_type' => $optin_type,
328
- 'subscribed_ip' => null
329
  );
330
 
331
  ES()->lists_contacts_db->remove_contacts_from_lists( $contact_id, $list_id );
298
 
299
  public function add_contact( $contact_data, $list_id ) {
300
 
301
+ $email = $contact_data['email'];
302
+
303
  $default_data = array(
304
  'status' => 'verified',
305
  'hash' => ES_Common::generate_guid(),
325
  'status' => 'subscribed',
326
  'subscribed_at' => ig_get_current_date_time(),
327
  'optin_type' => $optin_type,
328
+ 'subscribed_ip' => ig_es_get_ip(),
329
  );
330
 
331
  ES()->lists_contacts_db->remove_contacts_from_lists( $contact_id, $list_id );
readme.txt CHANGED
@@ -4,9 +4,9 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_i
4
  Author URI: https://www.icegram.com/
5
  Tags: email marketing, subscription, autoresponder, post notification, welcome email
6
  Requires at least: 3.9
7
- Tested up to: 5.5.1
8
  Requires PHP: 5.6
9
- Stable tag: 4.6.2
10
  License: GPLv3
11
  License URI: http://www.gnu.org/licenses
12
 
@@ -304,6 +304,13 @@ Refer [here](https://www.icegram.com/documentation/es-faq/).
304
 
305
  == Changelog ==
306
 
 
 
 
 
 
 
 
307
  **4.6.2 (27.10.2020)**
308
 
309
  * Fix: UTM tracking related issue [PRO]
4
  Author URI: https://www.icegram.com/
5
  Tags: email marketing, subscription, autoresponder, post notification, welcome email
6
  Requires at least: 3.9
7
+ Tested up to: 5.5.3
8
  Requires PHP: 5.6
9
+ Stable tag: 4.6.3
10
  License: GPLv3
11
  License URI: http://www.gnu.org/licenses
12
 
304
 
305
  == Changelog ==
306
 
307
+ **4.6.3 (09.11.2020)**
308
+
309
+ * New: Duplicate Broadcasts and Sequences [PRO]
310
+ * New: Added IP address of contacts on audience
311
+ * New: Show total contacts subscribed from a specific form
312
+ * Update: Improve email sending queue
313
+
314
  **4.6.2 (27.10.2020)**
315
 
316
  * Fix: UTM tracking related issue [PRO]